[
  {
    "path": ".dumi/pages/index/index.tsx",
    "content": "/* .dumi/pages/index.tsx */\nimport HomeBaseLayout from '../../theme/layouts/HomePageLayout';\n\nconst CustomHomePage = () => {\n  return (\n    <div>\n      <HomeBaseLayout />\n    </div>\n  );\n};\n\nexport default CustomHomePage;"
  },
  {
    "path": ".dumi/pages/index-en/index.tsx",
    "content": "import CustomHomePage from '../index';\n\nexport default CustomHomePage;"
  },
  {
    "path": ".dumi/theme/builtins/.gitkeep",
    "content": ""
  },
  {
    "path": ".dumi/theme/builtins/HomeBaseLayout/components/Banner/index.tsx",
    "content": "import { css } from '@emotion/react';\nimport Atropos from 'atropos/react';\nimport useLocaleValue from \"../../../../../theme/hooks/useLocaleValue\";\nimport useSiteToken from \"../../../../../theme/hooks/useSiteToken\";\nimport 'atropos/css'\n\nconst bgLight = 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/X8TvQKnc1MQAAAAAAAAAAAAADoEQAQFr/fmt.webp'\nconst bgDark = 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/3o3ASIN3QeEAAAAAAAAAAAAADoEQAQFr/fmt.webp'\nconst contentLight = 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/Q47ITaa7OkIAAAAAAAAAAAAADoEQAQFr/fmt.webp'\nconst contentDark = 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/CtzWRYHofh0AAAAAAAAAAAAADoEQAQFr/fmt.webp'\n\nconst icon1Light = 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/wF0aRYXHJYQAAAAAAAAAAAAADoEQAQFr/original';\nconst icon1Dark = 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/y0d7RaMUp3MAAAAAAAAAAAAADoEQAQFr/original';\n\nconst icon2Light = 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/GFR1QKB9oLEAAAAAAAAAAAAADoEQAQFr/original';\nconst icon2Dark = 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/MUY2SKAUDN8AAAAAAAAAAAAADoEQAQFr/original';\n\nconst icon3Light = 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/ublASKWCoCsAAAAAAAAAAAAADoEQAQFr/original';\nconst icon3Dark = 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/SpnxRLyYUI8AAAAAAAAAAAAADoEQAQFr/original';\n\nconst icon4Light = 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/2ccdRLZwLdAAAAAAAAAAAAAADoEQAQFr/fmt.webp';\nconst icon4Dark = 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/kMErRLYmniEAAAAAAAAAAAAADoEQAQFr/fmt.webp';\n\nconst icon5Light = 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/gdJFRppwDWQAAAAAAAAAAAAADoEQAQFr/original';\nconst icon5Dark = 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/Oy5tSKE-DYwAAAAAAAAAAAAADoEQAQFr/original';\n\nconst icon6Light = 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/v2FXQ5zpGfkAAAAAAAAAAAAADoEQAQFr/original';\nconst icon6Dark = 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/iFYgR7GDoksAAAAAAAAAAAAADoEQAQFr/original';\n\nconst useStyle = ({\n  isDark,\n  isMobile,\n }) => {\n\n  const { token } = useSiteToken();\n  const { fontFamily } = token;\n\n  return {\n    mainContainer: css`\n      width: 100%;\n      height: 662px;\n      background: url(${isDark ? bgDark : bgLight}) no-repeat center center;\n      background-size: cover;\n      position: relative;\n      font-family: PuHuiTi, ${fontFamily}, sans-serif;\n      display: flex;\n      justify-content: center;\n    `,\n    mainContent: css`\n      width: 100%;\n      height: 602px;\n      position: relative;\n      padding-top: 60px;\n\n      @media (min-width: 1600px) {\n        max-width: 1600px;\n      }\n    `,\n    featureContainer: css`\n      width: 100%;\n      height: 602px;\n      position: relative;\n\n      & .atropos-shadow {\n        display: none;\n      }\n\n      @media (max-width: 900px) {\n        display: none;\n      }\n    `,\n    featureWrap: css`\n      width: 100%;\n      height: 602px;\n      position: relative;\n    `,\n    featureContentMainImg: css`\n      height: 602px;\n      z-index: 90;\n      position: absolute;\n      right: 0;\n      top: 0;\n      pointer-events: none;\n    `,\n    featureIcon1: css`\n      position: absolute;\n      z-index: 100;\n      right: 610px;\n      bottom: 170px;\n      width: 84px;\n      pointer-events: none;\n    `,\n    featureIcon2: css`\n      position: absolute;\n      z-index: 100;\n      top: 200px;\n      right: 0px;\n      width: 166px;\n      pointer-events: none;\n    `,\n    featureIcon3: css`\n      position: absolute;\n      z-index: 100;\n      right: 700px;\n      top: 246px;\n      width: 44px;\n      pointer-events: none;\n    `,\n    featureIcon4: css`\n      position: absolute;\n      z-index: 90;\n      right: 0px;\n      top: 150px;\n      width: 715px;\n      pointer-events: none;\n    `,\n    featureIcon4Light: css`\n      position: absolute;\n      z-index: 90;\n      right: 10px;\n      top: 150px;\n      width: 690px;\n      pointer-events: none;\n    `,\n    featureIcon5: css`\n      position: absolute;\n      z-index: 100;\n      right: 150px;\n      top: 0px;\n      width: 90px;\n      pointer-events: none;\n    `,\n    featureIcon6: css`\n      position: absolute;\n      z-index: 80;\n      right: 520px;\n      top: -10px;\n      width: 106px;\n      pointer-events: none;\n    `,\n    actionWrap: css`\n      position: absolute;\n      text-align: left;\n      top: 192px;\n      left: 100px;\n      z-index: 80;\n\n      @media (max-width: 900px) {\n        right: 24px;\n        text-align: center;\n        left: 24px;\n      }\n    `,\n    actionTitle: css`\n      font-size: 52px;\n      font-weight: bold;\n    `,\n    actionSubTitle: css`\n      font-size: 22px;\n    `,\n    actionMainBtn: css`\n      all: initial;\n      width: 136px;\n      height: 41px;\n      font-size: 16px;\n      font-weight: 500;\n      line-height: 41px;\n      background: #fff;\n      border-radius: 21px;\n      box-shadow: 1px 1px 7px 0px #012a6526;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      cursor: pointer;\n      margin-top: 50px;\n    `,\n    actionMainBtnImage: css`\n      width: 9px;\n      height: 13px;\n      margin-left: 10px;\n    `,\n    actionSubBtn: css`\n      all: initial;\n      width: 136px;\n      height: 41px;\n      font-size: 16px;\n\n      line-height: 41px;\n      background: #738ba466;\n      border: 1px solid #ffffff;\n      border-radius: 21px;\n      box-shadow: 1px 1px 7px 0px #012a6526;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      cursor: pointer;\n      margin-top: 50px;\n      margin-left: 13px;\n      color: #fff;\n    `,\n  };\n};\n\nconst actionHref = {\n  'zh-CN': {\n    quickStart: '/guide/quick-start',\n    tryComponent: '/components/overview',\n  },\n  'en': {\n    quickStart: '/guide/quick-start-en',\n    tryComponent: '/components/overview-en',\n  }\n}\n\nexport default ({\n  isDark,\n  isMobile,\n}) => {\n  const lang = useLocaleValue('bannerLocales');\n  const style = useStyle({\n    isDark,\n    isMobile,\n  });\n\n  return (\n    <div css={style.mainContainer}>\n      <div css={style.mainContent}>\n        <div css={style.featureContainer}>\n          <Atropos\n            css={style.featureWrap}\n            highlight={false}\n            activeOffset={0}\n            rotateXMax={0.5}\n            rotateYMax={0.5}\n          >\n            <img\n              css={style.featureContentMainImg}\n              src={isDark ? contentDark : contentLight}\n              data-atropos-offset={0.5}\n            />\n\n            <img\n              css={style.featureIcon1}\n              src={isDark ? icon1Dark : icon1Light}\n              data-atropos-offset={20}\n            />\n            <img\n              css={style.featureIcon2}\n              src={isDark ? icon2Dark : icon2Light}\n              data-atropos-offset={18}\n            />\n            <img\n              css={style.featureIcon3}\n              src={isDark ? icon3Dark : icon3Light}\n              data-atropos-offset={16}\n            />\n            <img\n              css={isDark ? style.featureIcon4 : style.featureIcon4Light}\n              src={isDark ? icon4Dark : icon4Light}\n              data-atropos-offset={2}\n            />\n            <img\n              css={style.featureIcon5}\n              src={isDark ? icon5Dark : icon5Light}\n              data-atropos-offset={14}\n            />\n            <img\n              css={style.featureIcon6}\n              src={isDark ? icon6Dark : icon6Light}\n              data-atropos-offset={12}\n            />\n          </Atropos>\n        </div>\n        <div css={style.actionWrap}>\n          <h1 css={style.actionTitle}>Ant Design Mini</h1>\n          <div css={style.actionSubTitle}>\n            {lang.desc}\n          </div>\n          <div>\n            <a\n              css={style.actionMainBtn}\n              href={actionHref[lang.key].quickStart}\n            >\n              <span>\n                {lang.integration}\n              </span>\n              <img\n                css={style.actionMainBtnImage}\n                src=\"https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/FU4JTap3m3QAAAAAAAAAAAAADoEQAQFr/original\"\n              />\n            </a>\n            <a\n              css={style.actionSubBtn}\n              href={actionHref[lang.key].tryComponent}\n            >\n              {lang.try}\n            </a>\n          </div>\n        </div>\n      </div>\n    </div>\n  )\n}\n"
  },
  {
    "path": ".dumi/theme/builtins/HomeBaseLayout/components/Frame/index.tsx",
    "content": "import { css } from '@emotion/react';\nimport useLocaleValue from \"../../../../../theme/hooks/useLocaleValue\";\nimport useSiteToken from \"../../../../../theme/hooks/useSiteToken\";\nimport Title from \"../Title\";\n\nconst frameList = {\n  'zh-CN': [\n    {\n      title: 'Ant Design',\n      subTitle: '企业级产品设计体系',\n      logo: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/BdagQ4iT8TMAAAAAAAAAAAAADoEQAQFr/original',\n      href: 'https://ant.design/',\n    },\n    {\n      title: 'AntV',\n      subTitle: '全新一代数据可视化解决方案',\n      logo: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/j-PwR5GHEWYAAAAAAAAAAAAADoEQAQFr/original',\n      href: 'https://antv.antgroup.com/'\n    },\n    {\n      title: 'Ant Design Mobile',\n      subTitle: 'Ant Design 移动端 UI 组件库',\n      logo: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/6gdISLFqBBAAAAAAAAAAAAAADoEQAQFr/original',\n      href: 'https://mobile.ant.design/'\n    },\n    {\n      title: 'Kitchen',\n      subTitle: '一款为设计者提升效率的工具集',\n      logo: 'https://gw.alipayobjects.com/zos/bmw-prod/af1ea898-bf02-45d1-9f30-8ca851c70a5b.svg',\n      href: 'https://kitchen.alipay.com/'\n    }\n  ],\n  'en': [\n    {\n      title: 'Ant Design',\n      subTitle: 'Design System',\n      logo: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/BdagQ4iT8TMAAAAAAAAAAAAADoEQAQFr/original',\n      href: 'https://ant.design/',\n    },\n    {\n      title: 'AntV',\n      subTitle: 'Data Visualization Solution',\n      logo: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/j-PwR5GHEWYAAAAAAAAAAAAADoEQAQFr/original',\n      href: 'https://antv.antgroup.com/'\n    },\n    {\n      title: 'Ant Design Mobile',\n      subTitle: 'Mobile UI Component Library',\n      logo: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/6gdISLFqBBAAAAAAAAAAAAAADoEQAQFr/original',\n      href: 'https://mobile.ant.design/'\n    },\n    {\n      title: 'Kitchen',\n      subTitle: 'Enhance Efficiency for Designers',\n      logo: 'https://gw.alipayobjects.com/zos/bmw-prod/af1ea898-bf02-45d1-9f30-8ca851c70a5b.svg',\n      href: 'https://kitchen.alipay.com/'\n    }\n  ]\n}\n\nconst useStyle = ({\n  isDark,\n  isMobile,\n }) => {\n\n  const { token } = useSiteToken();\n  const { fontFamily } = token;\n\n  return {\n    container: css`\n      width: 100%;\n      min-height: 476px;\n      font-family: PuHuiTi, ${fontFamily}, sans-serif;\n      padding-top: 80px;\n      padding-bottom: 100px;\n      padding-left: 24px;\n      padding-right: 24px;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      box-sizing: border-box;\n    `,\n    contentWrap: css`\n      width: 100%;\n      max-width: 1200px;\n      padding-top: 50px;\n      display: flex;\n      justify-content: space-between;\n      flex-wrap: wrap;\n    `,\n    itemWrap: css`\n      all: initial;\n      margin-bottom: 24px;\n      min-width: 271px;\n      height: 163px;\n      border-radius: 12px;\n      box-shadow: ${\n        isDark ? 'unset' : '0px 10px 28px 0px #718ecc1f'\n      };\n      background: ${\n        isDark ? '#26272e' : '#ffffff'\n      };\n      box-sizing: border-box;\n      padding: 22px;\n      text-align: left;\n      margin-right: 24px;\n      cursor: pointer;\n\n      &:last-of-type {\n        margin-right: 0;\n      }\n\n      @media (max-width: 1220px) {\n        width: 48%;\n        margin-right:0;\n      }\n\n      @media (max-width: 600px) {\n        width: 100%;\n        margin-right:0;\n      }\n\n      cursor: pointer;\n    `,\n    itemImg: css`\n      height: 50px;\n      margin-bottom: 15px;\n    `,\n    itemTitle: css`\n      font-size: 20px;\n      font-weight: medium;\n      color: ${\n        isDark ? '#c5cad1' : 'rgba(0, 0, 0, 0.85)'\n      };\n      margin-bottom: 6px;\n    `,\n    itemSubTitle: css`\n      font-size: 14px;\n      color: ${\n        isDark ? '#808080' : 'rgba(0, 0, 0, 0.65)'\n      }\n    `\n  };\n};\n\nexport default ({\n  isDark,\n  isMobile,\n}) => {\n  const lang = useLocaleValue('frameLocales');\n  const style = useStyle({\n    isDark,\n    isMobile,\n  });\n\n  return (\n    <div css={style.container}>\n      <Title\n        title={lang.title}\n        subTitle={lang.subTitle}\n        isDark={isDark}\n      />\n      <div css={style.contentWrap}>\n        {\n          (frameList[lang.key] || []).map((item) => {\n            return (\n              <a\n                css={style.itemWrap}\n                key={item.title}\n                href={item.href}\n              >\n                <img\n                  src={item.logo}\n                  css={style.itemImg}\n                />\n                <div css={style.itemTitle}>\n                  {item.title}\n                </div>\n                <div css={style.itemSubTitle}>\n                  {item.subTitle}\n                </div>\n              </a>\n            )\n          })\n        }\n      </div>\n    </div>\n  )\n}\n"
  },
  {
    "path": ".dumi/theme/builtins/HomeBaseLayout/components/Gallery/ItemBox/index.tsx",
    "content": "import { css } from '@emotion/react';\nimport useSiteToken from \"../../../../../../theme/hooks/useSiteToken\";\nimport useLocaleValue from \"../../../../../../theme/hooks/useLocaleValue\";\nimport { Tag } from 'antd';\n\nconst useStyle = ({\n  isDark,\n  isMobile,\n }) => {\n\n  const { token } = useSiteToken();\n  const { fontFamily } = token;\n\n  return {\n    container: css`\n      font-family: PuHuiTi, ${fontFamily}, sans-serif;\n      background: ${\n        isDark ?\n          '#26272e' :\n          'linear-gradient(105deg, #f5f8ffcc 8%, #f2f5fccc 37%, #e7f0fecc 71%, #e6effecc 107%)'\n      };\n      border-radius: 8px;\n      height: 380px;\n      padding: 24px;\n      margin-right: 24px;\n      margin-bottom: 24px;\n      padding-left: 24px;\n      padding-right: 24px;\n      position: relative;\n      display: flex;\n      flex-direction: column;\n      box-sizing: border-box;\n      flex-wrap: wrap-all;\n\n      &:last-of-type {\n        margin-right: 0;\n      }\n\n      @media (max-width: 1400px) {\n        width: 46%;\n        &:nth-of-type(2n) {\n          margin-right: 0;\n        }\n      }\n\n      @media (max-width: 600px) {\n        width: 100%;\n        margin-right: 24px;\n        margin-left: 24px;\n        &:nth-of-type(2n) {\n          margin-right: 24px;\n        }\n      }\n    `,\n    titleWrap: css`\n      display: flex;\n      align-items: center;\n    `,\n    title: css`\n      font-size: 20px;\n      font-weight: medium;\n      margin-right: 8px;\n    `,\n    imgWrap: css`\n      flex: 1;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n    `,\n    img: css`\n      pointer-events: none;\n    `\n  };\n};\n\nexport default ({\n  children,\n  data,\n  isDark,\n  isMobile,\n}) => {\n  const style = useStyle({\n    isDark,\n    isMobile,\n  });\n\n  return (\n    <div css={style.container}>\n      <div css={style.titleWrap}>\n        <span css={style.title}>\n          {data.title}\n        </span>\n        <Tag\n          color={data.isNew ? 'blue' : 'orange'}\n        >\n          {data.tag}\n        </Tag>\n      </div>\n      <div css={style.imgWrap}>\n        <img\n          css={style.img}\n          src={isDark ? data.dark : data.light}\n          width={data.width}\n        />\n      </div>\n    </div>\n  )\n}\n"
  },
  {
    "path": ".dumi/theme/builtins/HomeBaseLayout/components/Gallery/index.tsx",
    "content": "import { css } from '@emotion/react';\nimport useLocaleValue from \"../../../../../theme/hooks/useLocaleValue\";\nimport useSiteToken from \"../../../../../theme/hooks/useSiteToken\";\nimport Title from \"../Title\";\nimport ItemBox from './ItemBox';\n\nconst componentList = {\n  'zh-CN': [\n    {\n      title: '筛选',\n      tag: '新增',\n      isNew: true,\n      dark: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/AsAYR6Ppeh4AAAAAAAAAAAAADoEQAQFr/fmt.webp',\n      light: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/Up6kR4FSEbEAAAAAAAAAAAAADoEQAQFr/fmt.webp',\n      width: 300,\n    },\n    {\n      title: '反馈菜单',\n      tag: '新增',\n      isNew: true,\n      dark: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/Ue6ISoWoCSwAAAAAAAAAAAAADoEQAQFr/fmt.webp',\n      light: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/MWKcSIUJ_yQAAAAAAAAAAAAADoEQAQFr/fmt.webp',\n      width: 227,\n    },\n    {\n      title: '宫格',\n      tag: '更新',\n      dark: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/_vCuQ7g10ykAAAAAAAAAAAAADoEQAQFr/original',\n      light: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/HyFJRYNQX2YAAAAAAAAAAAAADoEQAQFr/original',\n      width: 300,\n    },\n    {\n      title: '弹窗',\n      tag: '更新',\n      dark: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/ASJORa_fgK0AAAAAAAAAAAAADoEQAQFr/original',\n      light: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/bjnWQbPPz6sAAAAAAAAAAAAADoEQAQFr/original',\n      width: 240,\n    },\n  ],\n  'en': [\n    {\n      title: 'Filter',\n      tag: 'New',\n      isNew: true,\n      dark: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/UH1UT6hvmV4AAAAAAAAAAAAADoEQAQFr/fmt.webp',\n      light: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/fj-qRIzRNxIAAAAAAAAAAAAADoEQAQFr/original',\n      width: 300,\n    },\n    {\n      title: 'Feedback',\n      tag: 'New',\n      isNew: true,\n      dark: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/rSKaQrWB2mUAAAAAAAAAAAAADoEQAQFr/fmt.webp',\n      light: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/RFoKS5D1XhcAAAAAAAAAAAAADoEQAQFr/fmt.webp',\n      width: 227,\n    },\n    {\n      title: 'Grid',\n      tag: 'Update',\n      dark: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/OOtIRLHJSNIAAAAAAAAAAAAADoEQAQFr/original',\n      light: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/oAG3SI8Eq0MAAAAAAAAAAAAADoEQAQFr/original',\n      width: 300,\n    },\n    {\n      title: 'Modal',\n      tag: 'Update',\n      dark: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/IjTYSalsOJIAAAAAAAAAAAAADoEQAQFr/original',\n      light: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/KZp7Sq0kceYAAAAAAAAAAAAADoEQAQFr/original',\n      width: 240,\n    },\n  ]\n}\n\nconst useStyle = ({\n  isDark,\n  isMobile,\n }) => {\n\n  const { token } = useSiteToken();\n  const { fontFamily } = token;\n\n  return {\n    container: css`\n      width: 100%;\n      min-height: 693px;\n      font-family: PuHuiTi, ${fontFamily}, sans-serif;\n      padding-top: 80px;\n      padding-bottom: 100px;\n      display: flex;\n      flex-direction: column;\n      justify-content: center;\n      align-items: center;\n      box-sizing: border-box;\n    `,\n    contentWrap: css`\n      width: 100%;\n      padding-top: 50px;\n      display: flex;\n      justify-content: center;\n      flex-wrap: wrap;\n\n      @media (min-width: 1600px) {\n        max-width: 1600px;\n      }\n    `\n  };\n};\n\nexport default ({\n  isDark,\n  isMobile,\n}) => {\n  const lang = useLocaleValue('galleryLocales');\n  const style = useStyle({\n    isDark,\n    isMobile,\n  });\n\n  return (\n    <div css={style.container}>\n      <Title\n        title={lang.title}\n        subTitle={lang.subTitle}\n        isDark={isDark}\n      />\n      <div css={style.contentWrap}>\n        {\n          (componentList[lang.key] || []).map((item) => {\n            return (\n              <ItemBox\n                key={item.title}\n                data={item}\n                isDark={isDark}\n                isMobile={isMobile}\n              />\n            )\n          })\n        }\n      </div>\n    </div>\n  )\n}\n"
  },
  {
    "path": ".dumi/theme/builtins/HomeBaseLayout/components/Notice/index.tsx",
    "content": "import useLocaleValue from \"../../../../../theme/hooks/useLocaleValue\";\n\nexport default ({ config }) => {\n  const lang = useLocaleValue('frameLocales');\n\n  return <div>\n    Notice - 是否是移动端: {config.isMobile + ''} - 主题模式：{config.theme}\n    <button>\n      {lang.button}\n    </button>\n    <div>\n      ----------------------------\n    </div>\n  </div>\n}\n"
  },
  {
    "path": ".dumi/theme/builtins/HomeBaseLayout/components/Theme/index.tsx",
    "content": "import { css } from '@emotion/react';\nimport Atropos from 'atropos/react';\nimport useLocaleValue from \"../../../../../theme/hooks/useLocaleValue\";\nimport useSiteToken from \"../../../../../theme/hooks/useSiteToken\";\nimport Title from \"../Title\";\nimport 'atropos/css'\nimport { Button } from 'antd';\nimport { useContext } from 'react';\nimport { SwapOutlined } from '@ant-design/icons';\nimport SiteContext from '../../../../../theme/slots/SiteContext';\nimport { history } from 'dumi';\n\nconst lightBg = 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/zBllT4iUaJsAAAAAAAAAAAAADoEQAQFr/fmt.webp';\nconst darkBg = 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/pgE1TJxC04UAAAAAAAAAAAAADoEQAQFr/fmt.webp';\n\nconst componentList = {\n  'zh-CN': [\n    {\n      dark: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/QjFTR5kfTYcAAAAAAAAAAAAADoEQAQFr/original',\n      light: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/b3HpTI5EcCcAAAAAAAAAAAAADoEQAQFr/original',\n      width: 225,\n      left: 200,\n      top: 10,\n    },\n    {\n      dark: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/-IF1RbuTd2gAAAAAAAAAAAAADoEQAQFr/original',\n      light: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/xOMxRrX_QR4AAAAAAAAAAAAADoEQAQFr/fmt.webp',\n      width: 84,\n      left: 550,\n      top: 50,\n    },\n    {\n      dark: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/8EhnSpjjRU0AAAAAAAAAAAAADoEQAQFr/fmt.webp',\n      light: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/xQrURLJoIuEAAAAAAAAAAAAADoEQAQFr/fmt.webp',\n      width: 180,\n      right: 430,\n      top: 1,\n    },\n    {\n      dark: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/v7U7RZvZp4gAAAAAAAAAAAAADoEQAQFr/fmt.webp',\n      light: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/vsHXR72JvIYAAAAAAAAAAAAADoEQAQFr/fmt.webp',\n      width: 220,\n      left: 289,\n      bottom: 1,\n    },\n    {\n      dark: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/Go4iQaJZ2cMAAAAAAAAAAAAADoEQAQFr/fmt.webp',\n      light: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/aZQgR5ipEcEAAAAAAAAAAAAADoEQAQFr/fmt.webp',\n      width: 200,\n      right: 550,\n      bottom: 180,\n    },\n    {\n      dark: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/zgbaTa7YGg4AAAAAAAAAAAAADoEQAQFr/fmt.webp',\n      light: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/C4Z0T49uhRIAAAAAAAAAAAAADoEQAQFr/fmt.webp',\n      width: 225,\n      right: 220,\n      bottom: 50,\n    }\n  ],\n  'en': [\n    {\n      dark: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/8OhhTq-HAZEAAAAAAAAAAAAADoEQAQFr/original',\n      light: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/p2awRb3Tb4QAAAAAAAAAAAAADoEQAQFr/original',\n      width: 225,\n      left: 200,\n      top: 10,\n    },\n    {\n      dark: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/akgcToUvzGEAAAAAAAAAAAAADoEQAQFr/original',\n      light: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/HNlmQpepfRgAAAAAAAAAAAAADoEQAQFr/fmt.webp',\n      width: 84,\n      left: 550,\n      top: 50,\n    },\n    {\n      dark: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/ztdYTrOnHRwAAAAAAAAAAAAADoEQAQFr/fmt.webp',\n      light: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/wyKSSbyBj0sAAAAAAAAAAAAADoEQAQFr/fmt.webp',\n      width: 180,\n      right: 430,\n      top: 1,\n    },\n    {\n      dark: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/maFaSK0Zz8sAAAAAAAAAAAAADoEQAQFr/fmt.webp',\n      light: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/T2N8R72pevMAAAAAAAAAAAAADoEQAQFr/original',\n      width: 220,\n      left: 289,\n      bottom: 1,\n    },\n    {\n      dark: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/OETGRLpfrpcAAAAAAAAAAAAADoEQAQFr/original',\n      light: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/zeGhSYYOx1MAAAAAAAAAAAAADoEQAQFr/fmt.webp',\n      width: 200,\n      right: 550,\n      bottom: 180,\n    },\n    {\n      dark: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/cFqQQqDs_oQAAAAAAAAAAAAADoEQAQFr/fmt.webp',\n      light: 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/g9_bRZ9xX4EAAAAAAAAAAAAADoEQAQFr/fmt.webp',\n      width: 225,\n      right: 220,\n      bottom: 50,\n    }\n  ]\n}\n\nconst useStyle = ({\n  isDark,\n  isMobile,\n }) => {\n\n  const { token } = useSiteToken();\n  const { fontFamily } = token;\n\n  return {\n    container: css`\n      width: 100%;\n      height: 782px;\n      font-family: PuHuiTi, ${fontFamily}, sans-serif;\n      padding-top: 80px;\n      padding-bottom: 100px;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      box-sizing: border-box;\n      position: relative;\n\n      background-color: ${\n        isDark ?\n          '#0a0a0a' :\n          '#f1f5ff'\n      };\n\n      background-image: url(${isDark ? darkBg : lightBg});\n      background-position: center 50px;\n      background-size: 900px;\n      background-repeat: no-repeat;\n    `,\n    contentWrap: css`\n      width: 100%;\n      height: 400px;\n      max-width: 1600px;\n      margin-top: 50px;\n      display: flex;\n      position: relative;\n\n      & .atropos-shadow {\n        display: none;\n      }\n    `,\n    compImg: css`\n      @media (max-width: 1200px) {\n        display: none;\n      }\n    `\n  };\n};\n\nexport default ({\n  isDark,\n  isMobile,\n}) => {\n  const lang = useLocaleValue('themeLocales');\n  const style = useStyle({\n    isDark,\n    isMobile,\n  });\n\n  const { updateSiteConfig } = useContext(SiteContext);\n  const isEn = lang.key === 'en';\n\n  return (\n    <div css={style.container}>\n      <Title\n        title={lang.title}\n        subTitle={lang.subTitle}\n        isDark={isDark}\n      >\n        <div>\n          <Button\n            type='primary'\n            size='large'\n            icon={<SwapOutlined />}\n            iconPosition='end'\n            style={{\n              margin: 24\n            }}\n            onClick={\n              () => {\n                const themeValue = isDark ? 'light' : 'dark';\n                updateSiteConfig({ theme: [themeValue] });\n              }\n            }\n          >\n            {isDark ? lang.light : lang.dark}\n          </Button>\n\n          <Button\n            type='primary'\n            size='large'\n            icon={<SwapOutlined />}\n            iconPosition='end'\n            onClick={\n              () => {\n                history.push({\n                  pathname: isEn ? '/' : '/index-en',\n                });\n              }\n            }\n          >\n            {lang.langDesc}\n          </Button>\n        </div>\n      </Title>\n\n      <Atropos\n        css={style.contentWrap}\n        highlight={false}\n        activeOffset={0}\n        rotateXMax={2}\n        rotateYMax={2}\n      >\n        {\n          (componentList[lang.key] || []).map((item, index) => {\n            let clientWidth = document.documentElement.clientWidth;\n            if (clientWidth > 1600) {\n              clientWidth = 1600;\n            }\n            const rate = clientWidth / 1600;\n\n            return (\n              <img\n                data-atropos-offset={(index + 1) * 1.5}\n                key={item.dark}\n                src={isDark ? item.dark : item.light}\n                css={style.compImg}\n                style={{\n                  zIndex: 90,\n                  pointerEvents: 'none',\n                  width: item.width,\n                  position: 'absolute',\n                  left: item.left * rate || 'unset',\n                  right: item.right * rate || 'unset',\n                  top: item.top || 'unset',\n                  bottom: item.bottom || 'unset',\n                }}\n              />\n            )\n          })\n        }\n      </Atropos>\n    </div>\n  )\n}\n"
  },
  {
    "path": ".dumi/theme/builtins/HomeBaseLayout/components/Title/index.tsx",
    "content": "import { css } from '@emotion/react';\nimport useSiteToken from \"../../../../../theme/hooks/useSiteToken\";\n\nconst useStyle = ({ isDark }) => {\n  const { token } = useSiteToken();\n  const { fontFamily } = token;\n  return {\n    container: css`\n      text-align: center;\n    `,\n    title: css`\n      font-family: PuHuiTi, ${fontFamily}, sans-serif;\n      font-size: 34px;\n      margin-bottom: 4px;\n    `,\n    subTitle: css`\n      font-family: PuHuiTi, ${fontFamily}, sans-serif;\n      font-size: 16px;\n      color: ${isDark ? '#808080' : '#697A8C'};\n    `,\n  };\n};\nexport default ({ title, subTitle, isDark , children }) => {\n  const style = useStyle({ isDark });\n\n  return (\n    <div css={style.container}>\n      <h2 css={style.title}>{title}</h2>\n      <div css={style.subTitle}>{subTitle}</div>\n      { children }\n    </div>\n  )\n}\n"
  },
  {
    "path": ".dumi/theme/builtins/HomeBaseLayout/components/Users/index.tsx",
    "content": "import { css } from '@emotion/react';\nimport useLocaleValue from \"../../../../../theme/hooks/useLocaleValue\";\nimport useSiteToken from \"../../../../../theme/hooks/useSiteToken\";\n\nconst lightLogos = [\n  'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/rYmkS4S3-2YAAAAAAAAAAAAADoEQAQFr/original',\n  'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/rlkkR4luEpAAAAAAAAAAAAAADoEQAQFr/fmt.webp',\n  'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/CI-RRYHHGmoAAAAAAAAAAAAADoEQAQFr/fmt.webp',\n  'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/X1KRTbLoQMsAAAAAAAAAAAAADoEQAQFr/original',\n  'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/wSHKRoozEE4AAAAAAAAAAAAADoEQAQFr/fmt.webp',\n  'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/LwlER4SjL_AAAAAAAAAAAAAADoEQAQFr/original',\n  'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/zSMkRp7RNfMAAAAAAAAAAAAADoEQAQFr/original',\n  'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/E2jUT5GhF30AAAAAAAAAAAAADoEQAQFr/fmt.webp'\n]\n\nconst darkLogos = [\n  'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/W8O-QqPKw0YAAAAAAAAAAAAADoEQAQFr/original',\n  'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/9VzgSIlhDd8AAAAAAAAAAAAADoEQAQFr/original',\n  'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/zB90Q7-Wz0sAAAAAAAAAAAAADoEQAQFr/original',\n  'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/zpgEQJKFV-kAAAAAAAAAAAAADoEQAQFr/original',\n  'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/vHcDSa-L-a8AAAAAAAAAAAAADoEQAQFr/original',\n  'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/mfSjRr_6ti8AAAAAAAAAAAAADoEQAQFr/original',\n  'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/PMj4S4ve5tAAAAAAAAAAAAAADoEQAQFr/original',\n  'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/RUL4SZC87fAAAAAAAAAAAAAADoEQAQFr/original'\n]\n\nconst useStyle = ({\n  isDark,\n  isMobile,\n }) => {\n\n  const { token } = useSiteToken();\n  const { fontFamily } = token;\n\n  return {\n    mainContainer: css`\n      width: 100%;\n      min-height: 195px;\n      font-family: PuHuiTi, ${fontFamily}, sans-serif;\n      display: flex;\n      background-color: ${isDark ? '#161616' : '#fff'};\n      flex-direction: column;\n      justify-content: center;\n      align-items: center;\n    `,\n    title: css`\n      font-size: 20px;\n      margin-bottom: 35px;\n      margin-top: 35px;\n      color: ${isDark ? '#808080' : '#697A8C'};\n    `,\n    logoWrap: css`\n      padding-left: 100px;\n      padding-right: 100px;\n      box-sizing: border-box;\n      width: 100%;\n      display: flex;\n      justify-content: space-between;\n      flex-wrap: wrap;\n\n      @media (min-width: 1600px) {\n        max-width: 1600px;\n      }\n\n      @media (max-width: 1440px) {\n        justify-content: center;\n      }\n    `,\n    logoItemWrap: css`\n      margin-bottom: 24px;\n\n      &:last-of-type {\n        margin-right: 0;\n      }\n\n      @media (max-width: 1500px) {\n        width: 25%;\n        text-align: center;\n        min-width: 184px;\n      }\n\n      @media (max-width: 780px) {\n        width: 30%;\n        text-align: center;\n        min-width: 184px;\n      }\n    `,\n    logo: css`\n      height: 38px;\n      pointer-events: none;\n    `\n  };\n};\n\nexport default ({\n  isDark,\n  isMobile,\n}) => {\n  const lang = useLocaleValue('userLocales');\n  const style = useStyle({\n    isDark,\n    isMobile,\n  });\n\n  return (\n    <div css={style.mainContainer}>\n      <div css={style.title}>{lang.title}</div>\n      <div css={style.logoWrap}>\n        {\n          (isDark ? darkLogos : lightLogos).map((item) => {\n            return (\n              <div css={style.logoItemWrap}>\n                <img\n                  src={item}\n                  key={item}\n                  css={style.logo}\n                />\n              </div>\n            )\n          })\n        }\n      </div>\n    </div>\n  )\n}\n"
  },
  {
    "path": ".dumi/theme/builtins/HomeBaseLayout/index.tsx",
    "content": "import { css } from '@emotion/react';\nimport { useContext, type FC } from 'react';\nimport SiteContext from '../../slots/SiteContext';\nimport type { SiteContextProps } from '../../slots/SiteContext';\n\nimport Banner from './components/Banner';\nimport Users from './components/Users';\nimport Gallery from './components/Gallery';\nimport Theme from './components/Theme';\nimport Frame from './components/Frame';\n// import Notice from './components/Notice';\n\nconst useStyle = () => {\n  return {\n    mainContent: css`\n      position: relative;\n      text-align: center;\n      flex: 1;\n      padding-top: 64px;\n    `,\n  };\n};\n\nconst HomeBaseLayout: FC = () => {\n  const style = useStyle();\n  const siteConfig = useContext<SiteContextProps>(SiteContext);\n  const isDark = siteConfig.theme.includes('dark');\n  const isMobile = !!siteConfig.isMobile;\n\n  return (\n    <div css={style.mainContent}>\n      {/* 公告 */}\n      {/* <Notice\n        config={siteConfig}\n      /> */}\n      {/* 顶部 Banner */}\n      <Banner\n        config={siteConfig}\n        isDark={isDark}\n        isMobile={isMobile}\n      />\n      {/* 谁在使用 */}\n      <Users\n        config={siteConfig}\n        isDark={isDark}\n        isMobile={isMobile}\n      />\n      {/* 组件模块 */}\n      <Gallery\n        config={siteConfig}\n        isDark={isDark}\n        isMobile={isMobile}\n      />\n      {/* 主题和多语言模块 */}\n      <Theme\n        config={siteConfig}\n        isDark={isDark}\n        isMobile={isMobile}\n      />\n      {/* 设计语言与研发框架模块 */}\n      <Frame\n        config={siteConfig}\n        isDark={isDark}\n        isMobile={isMobile}\n      />\n    </div>\n  );\n};\n\nexport default HomeBaseLayout;\n"
  },
  {
    "path": ".dumi/theme/builtins/Icon.less",
    "content": "@font-face {\n    font-family: antdmini-icon;\n    src: url(\"https://gw.alipayobjects.com/os/bmw-prod/578c472b-19a7-44ab-a92d-adc367ee2fe2.ttf?v=20210115\") format(\"truetype\");\n  }\n  \n  \n  .list-icons {\n    display: flex;\n    flex-wrap:wrap;\n  }\n  \n  .list-icon {\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    width: 16.66%;\n    height: 100px;\n    margin: 3px 0;\n    padding: 10px;\n    text-align: center;\n    border-radius: 4px;\n    cursor: pointer;\n  \n    &:hover {\n      color: #fff;\n      background-color: #1677ff;\n    }\n    \n    transition: color 0.3s ease-in-out,background-color 0.3s ease-in-out;\n  }\n  \n  .icontype {\n    margin-top: 8px;\n    font-size: 12px;\n  }\n  \n  @iconPrefix: ant-icon;\n  \n  .@{iconPrefix} {\n     /* stylelint-disable font-family-no-missing-generic-family-keyword */\n     font-family: antdmini-icon !important;\n     font-style: normal;\n     -webkit-font-smoothing: antialiased;\n     line-height: 1;\n     font-size: 40px;\n  \n    &-MinusOutline:before {\n      content: \"\\e66f\";\n    }\n  \n    &-AlipayCircleFill:before {\n      content: \"\\e670\";\n    }\n  \n    &-CheckCircleFill:before {\n      content: \"\\e671\";\n    }\n  \n    &-FireFill:before {\n      content: \"\\e672\";\n    }\n  \n    &-FaceRecognitionOutline:before {\n      content: \"\\e673\";\n    }\n  \n    &-StarFill:before {\n      content: \"\\e674\";\n    }\n  \n    &-EyeInvisibleFill:before {\n      content: \"\\e675\";\n    }\n  \n    &-SmileFill:before {\n      content: \"\\e676\";\n    }\n  \n    &-FrownFill:before {\n      content: \"\\e677\";\n    }\n  \n    &-BankcardOutline:before {\n      content: \"\\e678\";\n    }\n  \n    &-HeartOutline:before {\n      content: \"\\e679\";\n    }\n  \n    &-EyeFill:before {\n      content: \"\\e67a\";\n    }\n  \n    &-HeartFill:before {\n      content: \"\\e67b\";\n    }\n  \n    &-DownFill:before {\n      content: \"\\e67c\";\n    }\n  \n    &-CloseCircleFill:before {\n      content: \"\\e67d\";\n    }\n  \n    &-VideoOutline:before {\n      content: \"\\e67e\";\n    }\n  \n    &-CouponOutline:before {\n      content: \"\\e67f\";\n    }\n  \n    &-ReceiptOutline:before {\n      content: \"\\e680\";\n    }\n  \n    &-AntOutline:before {\n      content: \"\\e681\";\n    }\n  \n    &-UserCircleOutline:before {\n      content: \"\\e682\";\n    }\n  \n    &-PayCircleOutline:before {\n      content: \"\\e683\";\n    }\n  \n    &-BillOutline:before {\n      content: \"\\e684\";\n    }\n  \n    &-PlayOutline:before {\n      content: \"\\e685\";\n    }\n  \n    &-PayOutline:before {\n      content: \"\\e686\";\n    }\n  \n    &-MoreOutline:before {\n      content: \"\\e687\";\n    }\n  \n    &-ShrinkOutline:before {\n      content: \"\\e688\";\n    }\n  \n    &-ArrowsAltOutline:before {\n      content: \"\\e689\";\n    }\n  \n    &-StarOutline:before {\n      content: \"\\e68a\";\n    }\n  \n    &-CheckOutline:before {\n      content: \"\\e68b\";\n    }\n  \n    &-DeleteOutline:before {\n      content: \"\\e68c\";\n    }\n  \n    &-LinkOutline:before {\n      content: \"\\e68d\";\n    }\n  \n    &-InformationCircleOutline:before {\n      content: \"\\e68e\";\n    }\n  \n    &-GlobalOutline:before {\n      content: \"\\e68f\";\n    }\n  \n    &-InformationCircleFill:before {\n      content: \"\\e690\";\n    }\n  \n    &-ExclamationCircleFill:before {\n      content: \"\\e691\";\n    }\n  \n    &-CheckCircleOutline:before {\n      content: \"\\e692\";\n    }\n  \n    &-CloseCircleOutline:before {\n      content: \"\\e693\";\n    }\n  \n    &-SetOutline:before {\n      content: \"\\e694\";\n    }\n  \n    &-QuestionCircleFill:before {\n      content: \"\\e695\";\n    }\n  \n    &-QuestionCircleOutline:before {\n      content: \"\\e696\";\n    }\n  \n    &-UpCircleOutline:before {\n      content: \"\\e697\";\n    }\n  \n    &-FrownOutline:before {\n      content: \"\\e698\";\n    }\n  \n    &-DownCircleOutline:before {\n      content: \"\\e699\";\n    }\n  \n    &-ExclamationCircleOutline:before {\n      content: \"\\e69a\";\n    }\n  \n    &-MinusCircleOutline:before {\n      content: \"\\e69b\";\n    }\n  \n    &-RedoOutline:before {\n      content: \"\\e69c\";\n    }\n  \n    &-UndoOutline:before {\n      content: \"\\e69d\";\n    }\n  \n    &-EyeInvisibleOutline:before {\n      content: \"\\e69e\";\n    }\n  \n    &-ForbidFill:before {\n      content: \"\\e69f\";\n    }\n  \n    &-PicturesOutline:before {\n      content: \"\\e6a0\";\n    }\n  \n    &-PictureOutline:before {\n      content: \"\\e6a1\";\n    }\n  \n    &-PictureWrongOutline:before {\n      content: \"\\e6a2\";\n    }\n  \n    &-EyeOutline:before {\n      content: \"\\e6a3\";\n    }\n  \n    &-AddCircleOutline:before {\n      content: \"\\e6a4\";\n    }\n  \n    &-ClockCircleFill:before {\n      content: \"\\e6a5\";\n    }\n  \n    &-ClockCircleOutline:before {\n      content: \"\\e6a6\";\n    }\n  \n    &-BellMuteOutline:before {\n      content: \"\\e6a7\";\n    }\n  \n    &-KeyOutline:before {\n      content: \"\\e6a8\";\n    }\n  \n    &-BellOutline:before {\n      content: \"\\e6a9\";\n    }\n  \n    &-SearchOutline:before {\n      content: \"\\e6aa\";\n    }\n  \n    &-CollectMoneyOutline:before {\n      content: \"\\e6ab\";\n    }\n  \n    &-UnorderedListOutline:before {\n      content: \"\\e6ac\";\n    }\n  \n    &-AppstoreOutline:before {\n      content: \"\\e6ad\";\n    }\n  \n    &-ExclamationTriangleOutline:before {\n      content: \"\\e6ae\";\n    }\n  \n    &-AddOutline:before {\n      content: \"\\e6af\";\n    }\n  \n    &-ScanningOutline:before {\n      content: \"\\e6b0\";\n    }\n  \n    &-ScanCodeOutline:before {\n      content: \"\\e6b1\";\n    }\n  \n    &-ExclamationOutline:before {\n      content: \"\\e6b2\";\n    }\n  \n    &-CloseOutline:before {\n      content: \"\\e6b3\";\n    }\n  \n    &-ScanningFaceOutline:before {\n      content: \"\\e6b4\";\n    }\n  \n    &-LeftOutline:before {\n      content: \"\\e6b5\";\n    }\n  \n    &-DownOutline:before {\n      content: \"\\e6b6\";\n    }\n  \n    &-UpOutline:before {\n      content: \"\\e6b7\";\n    }\n  \n    &-RightOutline:before {\n      content: \"\\e6b8\";\n    }\n  \n    &-KoubeiOutline:before {\n      content: \"\\e6b9\";\n    }\n  \n    &-KoubeiFill:before {\n      content: \"\\e6ba\";\n    }\n  \n    &-AAOutline:before {\n      content: \"\\e6bb\";\n    }\n  \n    &-ArrowDownCircleOutline:before {\n      content: \"\\e6bc\";\n    }\n  \n    &-MovieOutline:before {\n      content: \"\\e6bd\";\n    }\n  \n    &-CompassOutline:before {\n      content: \"\\e6be\";\n    }\n  \n    &-LoopOutline:before {\n      content: \"\\e6bf\";\n    }\n  \n    &-TextOutline:before {\n      content: \"\\e6c0\";\n    }\n  \n    &-TagOutline:before {\n      content: \"\\e6c1\";\n    }\n  \n    &-FlagOutline:before {\n      content: \"\\e6c2\";\n    }\n  \n    &-EnvironmentOutline:before {\n      content: \"\\e6c3\";\n    }\n  \n    &-CalendarOutline:before {\n      content: \"\\e6c4\";\n    }\n  \n    &-LocationFill:before {\n      content: \"\\e6c5\";\n    }\n  \n    &-PhoneFill:before {\n      content: \"\\e6c6\";\n    }\n  \n    &-PhonebookOutline:before {\n      content: \"\\e6c7\";\n    }\n  \n    &-SmileOutline:before {\n      content: \"\\e6c8\";\n    }\n  \n    &-UserAddOutline:before {\n      content: \"\\e6c9\";\n    }\n  \n    &-FileWrongOutline:before {\n      content: \"\\e6ca\";\n    }\n  \n    &-SoundMuteFill:before {\n      content: \"\\e6cb\";\n    }\n  \n    &-SoundMuteOutline:before {\n      content: \"\\e6cc\";\n    }\n  \n    &-LockOutline:before {\n      content: \"\\e6cd\";\n    }\n  \n    &-UnlockOutline:before {\n      content: \"\\e6ce\";\n    }\n  \n    &-EditSOutline:before {\n      content: \"\\e6cf\";\n    }\n  \n    &-UploadOutline:before {\n      content: \"\\e6d0\";\n    }\n  \n    &-SoundOutline:before {\n      content: \"\\e6d1\";\n    }\n  \n    &-DownlandOutline:before {\n      content: \"\\e6d2\";\n    }\n  \n    &-SendOutline:before {\n      content: \"\\e6d3\";\n    }\n  \n    &-FillinOutline:before {\n      content: \"\\e6d4\";\n    }\n  \n    &-AudioMutedOutline:before {\n      content: \"\\e6d5\";\n    }\n  \n    &-AudioOutline:before {\n      content: \"\\e6d6\";\n    }\n  \n    &-UserOutline:before {\n      content: \"\\e6d7\";\n    }\n  \n    &-UserContactOutline:before {\n      content: \"\\e6d8\";\n    }\n  \n    &-TeamOutline:before {\n      content: \"\\e6d9\";\n    }\n  \n    &-UserSetOutline:before {\n      content: \"\\e6da\";\n    }\n  \n    &-FileOutline:before {\n      content: \"\\e6db\";\n    }\n  \n    &-MailOutline:before {\n      content: \"\\e6dc\";\n    }\n  \n    &-TruckOutline:before {\n      content: \"\\e6dd\";\n    }\n  \n    &-MailOpenOutline:before {\n      content: \"\\e6de\";\n    }\n  \n    &-ChatCheckOutline:before {\n      content: \"\\e6df\";\n    }\n  \n    &-ChatAddOutline:before {\n      content: \"\\e6e0\";\n    }\n  \n    &-ChatWrongOutline:before {\n      content: \"\\e6e1\";\n    }\n  \n    &-PhonebookFill:before {\n      content: \"\\e6e2\";\n    }\n  \n    &-AddressBookFill:before {\n      content: \"\\e6e3\";\n    }\n  \n    &-CalculatorOutline:before {\n      content: \"\\e6e4\";\n    }\n  \n    &-PieOutline:before {\n      content: \"\\e6e5\";\n    }\n  \n    &-HandPayCircleOutline:before {\n      content: \"\\e6e6\";\n    }\n  \n    &-GiftOutline:before {\n      content: \"\\e6e7\";\n    }\n  \n    &-TransportQRcodeOutline:before {\n      content: \"\\e6e8\";\n    }\n  \n    &-FolderOutline:before {\n      content: \"\\e6e9\";\n    }\n  \n    &-AlipaySquareFill:before {\n      content: \"\\e6ea\";\n    }\n  \n    &-TravelOutline:before {\n      content: \"\\e6eb\";\n    }\n  \n    &-AppOutline:before {\n      content: \"\\e6ec\";\n    }\n  \n    &-HistogramOutline:before {\n      content: \"\\e6ed\";\n    }\n  \n    &-MailFill:before {\n      content: \"\\e6ee\";\n    }\n  \n    &-CameraOutline:before {\n      content: \"\\e6ef\";\n    }\n  \n    &-EditFill:before {\n      content: \"\\e6f0\";\n    }\n  \n    &-SystemQRcodeOutline:before {\n      content: \"\\e6f1\";\n    }\n  \n    &-LockFill:before {\n      content: \"\\e6f2\";\n    }\n  \n    &-AudioFill:before {\n      content: \"\\e6f3\";\n    }\n  \n    &-TeamFill:before {\n      content: \"\\e6f4\";\n    }\n  \n    &-FilterOutline:before {\n      content: \"\\e6f5\";\n    }\n  \n    &-EditSFill:before {\n      content: \"\\e6f6\";\n    }\n  \n    &-LikeOutline:before {\n      content: \"\\e6f7\";\n    }\n  \n    &-TextDeletionOutline:before {\n      content: \"\\e6f8\";\n    }\n  \n    &-StopOutline:before {\n      content: \"\\e6f9\";\n    }\n  \n    &-FingerdownOutline:before {\n      content: \"\\e6fa\";\n    }\n  \n    &-MessageFill:before {\n      content: \"\\e6fb\";\n    }\n  \n    &-LocationOutline:before {\n      content: \"\\e6fc\";\n    }\n  \n    &-ContentOutline:before {\n      content: \"\\e6fd\";\n    }\n  \n    &-ExclamationShieldFill:before {\n      content: \"\\e6fe\";\n    }\n  \n    &-ReceivePaymentOutline:before {\n      content: \"\\e6ff\";\n    }\n  \n    &-ExclamationShieldOutline:before {\n      content: \"\\e700\";\n    }\n  \n    &-AddSquareOutline:before {\n      content: \"\\e701\";\n    }\n  \n    &-CloseShieldOutline:before {\n      content: \"\\e702\";\n    }\n  \n    &-CheckShieldOutline:before {\n      content: \"\\e703\";\n    }\n  \n    &-CheckShieldFill:before {\n      content: \"\\e704\";\n    }\n  \n    &-ShopbagOutline:before {\n      content: \"\\e705\";\n    }\n  \n    &-MessageOutline:before {\n      content: \"\\e706\";\n    }\n  }"
  },
  {
    "path": ".dumi/theme/builtins/Icon.tsx",
    "content": "import React, { useState } from 'react';\nimport { Input } from 'antd';\nimport copy from 'copy-to-clipboard';\nimport { FormattedMessage } from 'dumi';\nimport './Icon.less';\n\nconst { Search } = Input;\n\nconst iconTypes = [\n  'MinusOutline',\n  'AlipayCircleFill',\n  'CheckCircleFill',\n  'FireFill',\n  'FaceRecognitionOutline',\n  'StarFill',\n  'EyeInvisibleFill',\n  'SmileFill',\n  'FrownFill',\n  'BankcardOutline',\n  'HeartOutline',\n  'EyeFill',\n  'HeartFill',\n  'DownFill',\n  'CloseCircleFill',\n  'VideoOutline',\n  'CouponOutline',\n  'ReceiptOutline',\n  'AntOutline',\n  'UserCircleOutline',\n  'PayCircleOutline',\n  'BillOutline',\n  'PlayOutline',\n  'PayOutline',\n  'MoreOutline',\n  'ShrinkOutline',\n  'ArrowsAltOutline',\n  'StarOutline',\n  'CheckOutline',\n  'DeleteOutline',\n  'LinkOutline',\n  'InformationCircleOutline',\n  'GlobalOutline',\n  'InformationCircleFill',\n  'ExclamationCircleFill',\n  'CheckCircleOutline',\n  'CloseCircleOutline',\n  'SetOutline',\n  'QuestionCircleFill',\n  'QuestionCircleOutline',\n  'UpCircleOutline',\n  'FrownOutline',\n  'DownCircleOutline',\n  'ExclamationCircleOutline',\n  'MinusCircleOutline',\n  'RedoOutline',\n  'UndoOutline',\n  'EyeInvisibleOutline',\n  'ForbidFill',\n  'PicturesOutline',\n  'PictureOutline',\n  'PictureWrongOutline',\n  'EyeOutline',\n  'AddCircleOutline',\n  'ClockCircleFill',\n  'ClockCircleOutline',\n  'BellMuteOutline',\n  'KeyOutline',\n  'BellOutline',\n  'SearchOutline',\n  'CollectMoneyOutline',\n  'UnorderedListOutline',\n  'AppstoreOutline',\n  'ExclamationTriangleOutline',\n  'AddOutline',\n  'ScanningOutline',\n  'ScanCodeOutline',\n  'ExclamationOutline',\n  'CloseOutline',\n  'ScanningFaceOutline',\n  'LeftOutline',\n  'DownOutline',\n  'UpOutline',\n  'RightOutline',\n  'KoubeiOutline',\n  'KoubeiFill',\n  'AAOutline',\n  'ArrowDownCircleOutline',\n  'MovieOutline',\n  'CompassOutline',\n  'LoopOutline',\n  'TextOutline',\n  'TagOutline',\n  'FlagOutline',\n  'EnvironmentOutline',\n  'CalendarOutline',\n  'LocationFill',\n  'PhoneFill',\n  'PhonebookOutline',\n  'SmileOutline',\n  'UserAddOutline',\n  'FileWrongOutline',\n  'SoundMuteFill',\n  'SoundMuteOutline',\n  'LockOutline',\n  'UnlockOutline',\n  'EditSOutline',\n  'UploadOutline',\n  'SoundOutline',\n  'DownlandOutline',\n  'SendOutline',\n  'FillinOutline',\n  'AudioMutedOutline',\n  'AudioOutline',\n  'UserOutline',\n  'UserContactOutline',\n  'TeamOutline',\n  'UserSetOutline',\n  'FileOutline',\n  'MailOutline',\n  'TruckOutline',\n  'MailOpenOutline',\n  'ChatCheckOutline',\n  'ChatAddOutline',\n  'ChatWrongOutline',\n  'PhonebookFill',\n  'AddressBookFill',\n  'CalculatorOutline',\n  'PieOutline',\n  'HandPayCircleOutline',\n  'GiftOutline',\n  'TransportQRcodeOutline',\n  'FolderOutline',\n  'AlipaySquareFill',\n  'TravelOutline',\n  'AppOutline',\n  'HistogramOutline',\n  'MailFill',\n  'CameraOutline',\n  'EditFill',\n  'SystemQRcodeOutline',\n  'LockFill',\n  'AudioFill',\n  'TeamFill',\n  'FilterOutline',\n  'EditSFill',\n  'LikeOutline',\n  'TextDeletionOutline',\n  'StopOutline',\n  'FingerdownOutline',\n  'MessageFill',\n  'LocationOutline',\n  'ContentOutline',\n  'ExclamationShieldFill',\n  'ReceivePaymentOutline',\n  'ExclamationShieldOutline',\n  'AddSquareOutline',\n  'CloseShieldOutline',\n  'CheckShieldOutline',\n  'CheckShieldFill',\n  'ShopbagOutline',\n  'MessageOutline',\n];\n\nconst iconLowerCaseTypes = iconTypes.map(item => item.toLowerCase());\n\nfunction Copy(props) {\n  const type = props.type;\n  const [copied, setCopied] = useState(false);\n  return <div className=\"list-icon\" onClick={() => {\n    copy(type);\n    setCopied(true);\n  }} onMouseLeave={() => {\n    setCopied(false);\n  }}>\n    <div>\n      {\n        copied ? <div className='copied'>copied</div> : <>\n          <span className={`ant-icon ant-icon-${type}`} />\n          <div className=\"icontype\">{type}</div>\n        </>\n      }\n    </div>\n  </div>\n}\n\n\nfunction Icon() {\n  const [list, setList] = useState(iconTypes);\n  const outlineList = list.filter(item => item.includes('Outline'));\n  const fillList = list.filter(item => item.includes('Fill'));\n\n  const onInput = (e: any) => {\n    const value = e.target.value.toLowerCase();\n    setList(iconTypes.filter((_, index) => iconLowerCaseTypes[index].includes(value)));\n  }\n\n  const onSearch = (v) => {\n    setList(iconTypes.filter((_, index) => iconLowerCaseTypes[index].includes(v.toLowerCase())));\n  }\n\n  return <>\n    <div style={{ marginTop: 20 }}>\n      <Search placeholder=\"search Icons\" allowClear onInput={onInput} onSearch={onSearch} />\n    </div>\n    <div className=\"list-icons\">\n      {\n        outlineList.map(item => <Copy key={item} type={item} />)\n      }\n      {\n        fillList.map(item => <Copy key={item} type={item} />)\n      }\n    </div>\n  </>\n};\n\n\n\nexport default Icon;"
  },
  {
    "path": ".dumi/theme/builtins/OverviewCard.tsx",
    "content": "import { css } from '@emotion/react';\nimport { Card, ConfigProvider, Tag, theme } from 'antd';\nimport { history, useLocale } from 'dumi';\nimport { useContext } from 'react';\nimport { ComponentSampleImages } from '../common/config/overview';\nimport useMenu from '../hooks/useMenu';\nimport useSiteToken from '../hooks/useSiteToken';\nimport SiteContext from '../slots/SiteContext';\n\nconst useStyle = ({ isDark, isMobile }) => {\n  const { token } = useSiteToken();\n  const { fontFamily } = token;\n\n  return {\n    mainContainer: css`\n      font-family: ${fontFamily};\n    `,\n    groupContainer: css``,\n    groupTitle: css`\n      font-size: 24px;\n      font-weight: 500;\n      display: inline-flex;\n      align-items: center;\n    `,\n    cardWrap: css`\n      padding-top: 24px;\n      padding-bottom: 24px;\n      display: flex;\n      width: 100%;\n      flex-wrap: wrap;\n    `,\n    card: css`\n      display: block;\n      width: 25%;\n      min-width: 300px;\n      padding-right: 24px;\n      padding-bottom: 24px;\n      box-sizing: border-box;\n      cursor: pointer;\n      text-align: center;\n\n      @media only screen and (max-width: 1600px) {\n        width: 33.333%;\n      }\n\n      @media only screen and (max-width: 1200px) {\n        width: 50%;\n      }\n\n      @media only screen and (max-width: 880px) {\n        width: 100%;\n        padding-right: 0;\n      }\n\n      a {\n        all: initial;\n        cursor: pointer;\n        color: ${isDark ? '#fff' : '#333'};\n      }\n\n      .ant-card-head-title a {\n        font-weight: 500;\n      }\n    `,\n    antCardWrap: css``,\n    image: css`\n      height: 100px;\n    `,\n  };\n};\n\nexport default ({ lang }) => {\n  const [menuItems] = useMenu();\n  const siteConfig = useContext(SiteContext);\n  const isDark = siteConfig.theme.includes('dark');\n  const isMobile = !!siteConfig.isMobile;\n  const style = useStyle({ isDark, isMobile });\n  const locale = useLocale();\n  const isEn = locale.id === 'en';\n\n  const imageConfig = isDark\n    ? ComponentSampleImages.dark\n    : ComponentSampleImages.light;\n\n  return (\n    <ConfigProvider\n      theme={{\n        algorithm: isDark ? theme.darkAlgorithm : theme.defaultAlgorithm,\n      }}\n    >\n      <div css={style.mainContainer}>\n        {menuItems?.slice(1)?.map((parent) => {\n          return (\n            <div key={parent.key}>\n              <span css={style.groupTitle}>\n                {parent.label}\n                <Tag\n                  style={{\n                    marginLeft: 8,\n                  }}\n                >\n                  {(parent.children || []).length}\n                </Tag>\n              </span>\n\n              <div css={style.cardWrap}>\n                {(parent.children || []).map((item) => {\n                  return (\n                    <a\n                      key={item.key}\n                      css={style.card}\n                      onClick={() => {\n                        history.push({\n                          pathname: isEn ? item.key + '-en' : item.key,\n                        });\n                      }}\n                    >\n                      <Card\n                        hoverable\n                        title={item.label}\n                        css={style.antCardWrap}\n                      >\n                        <img\n                          src={\n                            (\n                              imageConfig[\n                                item.key.replace('/components/', '')\n                              ] ||\n                              imageConfig.default ||\n                              {}\n                            ).imageUrl\n                          }\n                          css={style.image}\n                        />\n                      </Card>\n                    </a>\n                  );\n                })}\n              </div>\n            </div>\n          );\n        })}\n      </div>\n    </ConfigProvider>\n  );\n};\n"
  },
  {
    "path": ".dumi/theme/builtins/Previewer/index.less",
    "content": ".sourceCode {\n  position: relative;\n  height: calc(100vh - 200px);\n  overflow: hidden;\n  border-radius: 0 0 8px 8px;\n  iframe {\n    height: 100%;\n    border: none;\n    width: 100%;\n  }\n  &-loading {\n    width: 100px;\n    height: 100px;\n    position: absolute;\n    left: 0;\n    right: 0;\n    top: 0;\n    bottom: 0;\n    margin: auto;\n    background-color: rgba(22, 119, 255, 0.8);\n    border-radius: 100%;\n    animation: sk-scaleout 1s infinite ease-in-out;\n  }\n}\n\n.previewer-collapse {\n  &.light {\n    border: 1px solid rgba(5, 5, 5, 0.06) !important;\n    .ant-collapse-content {\n      border-top: 1px solid rgba(5, 5, 5, 0.06) !important;\n    }\n  }\n}\n\n@keyframes sk-scaleout {\n  0% {\n    transform: scale(0);\n    opacity: 1;\n  }\n  100% {\n    transform: scale(1);\n    opacity: 0;\n  }\n}\n"
  },
  {
    "path": ".dumi/theme/builtins/Previewer/index.tsx",
    "content": "import { Collapse, ConfigProvider } from 'antd';\nimport { FormattedMessage } from 'dumi';\nimport React, { useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport type { SiteContextProps } from '../../slots/SiteContext';\nimport SiteContext from '../../slots/SiteContext';\nimport './index.less';\n\ninterface IProps {\n  herboxUrl: string;\n}\n\nfunction buildUrl(\n  basic: string,\n  options: {\n    platform: string;\n    theme: string;\n  }\n) {\n  const urlObj = new URL(basic);\n  const searchParams = urlObj.searchParams;\n\n  const page = searchParams.get('page');\n  const { platform: supportPlatform, disablePlatformSwitch } =\n    getSupportPlatform(options.platform);\n  searchParams.set('platform', supportPlatform);\n  searchParams.set('theme', options.theme);\n\n  return {\n    url: urlObj.toString(),\n    page,\n    supportPlatform,\n    disablePlatformSwitch,\n  };\n}\n\nconst DefaultPlatform = 'alipay';\n\nfunction getSupportPlatform(platform: string) {\n  const supportWechat = true;\n  if (!supportWechat && platform === 'wechat') {\n    return {\n      platform: DefaultPlatform,\n      disablePlatformSwitch: true,\n    };\n  }\n  return {\n    platform,\n    disablePlatformSwitch: false,\n  };\n}\n\nconst Previewer: React.FC<IProps> = (props) => {\n  const { theme, platform, updateSiteConfig } =\n    useContext<SiteContextProps>(SiteContext);\n\n  useEffect(() => {\n    updateSiteConfig({\n      herboxUrl: props.herboxUrl,\n    });\n  }, [props.herboxUrl]);\n\n  const [sourceCodeLoaded, setSourceCodeLoaded] = useState(false);\n\n  const sourceCodeRef = useRef<any>(null);\n\n  const basicUrl =\n    window.location.protocol + '//' + window.location.host + props.herboxUrl;\n  const { url, page } = useMemo(() => {\n    return buildUrl(basicUrl, {\n      theme: theme?.find((t) => ['dark', 'light'].includes(t)) || 'light',\n      platform,\n    });\n  }, [basicUrl, theme, platform]);\n\n  function sendMsgToSourceCode(theme) {\n    const sourceCodeiframe = sourceCodeRef.current;\n    if (!sourceCodeiframe) return;\n    const setThemeColor = function () {\n      sourceCodeiframe?.contentWindow?.postMessage({\n        type: 'setIsDarkMode',\n        data: theme.includes('dark'),\n      });\n    };\n    sourceCodeiframe.onload = () => {\n      setThemeColor();\n      setTimeout(setThemeColor, 500);\n      setTimeout(setThemeColor, 1000);\n    };\n    setThemeColor();\n  }\n\n  useEffect(() => {\n    sendMsgToSourceCode(theme);\n  }, [theme, page, platform]);\n\n  return (\n    // @ts-ignore\n    <ConfigProvider\n      theme={{\n        components: {\n          Collapse: {\n            contentPadding: '0 !important',\n            headerPadding: '8px !important',\n            headerBg: theme.includes('dark') ? 'transparent' : '#f7f7f7',\n          },\n        },\n      }}\n    >\n      {/* @ts-ignore */}\n      <Collapse\n        className={`previewer-collapse ${\n          theme.includes('dark') ? 'dark' : 'light'\n        }`}\n        size=\"large\"\n        items={[\n          {\n            key: '1',\n            label: <FormattedMessage id=\"app.previewer.collapse.label\" />,\n            forceRender: true,\n            children: (\n              <div className=\"sourceCode\">\n                {!sourceCodeLoaded && <div className=\"previewer-loading\" />}\n                <iframe\n                  ref={sourceCodeRef}\n                  src={url.replace('preview.html', 'code.html')}\n                  onLoad={() => setSourceCodeLoaded(true)}\n                  allow=\"clipboard-read; clipboard-write\"\n                />\n              </div>\n            ),\n          },\n        ]}\n        onChange={(openList) => {\n          const setMsgToSim = window.setMsgToSim;\n          if (openList.length === 0) {\n            // 关闭\n            setMsgToSim &&\n              setMsgToSim(`\n                my.navigateBack();\n            `);\n            return;\n          }\n          // 打开\n          setMsgToSim &&\n            setMsgToSim(`\n              const currentPage = getCurrentPages()[0].route\n              if(currentPage !== '${page}') {\n                my.navigateTo({\n                  url: '/${page}'\n                });\n              }\n            `);\n        }}\n      />\n    </ConfigProvider>\n  );\n};\n\nexport default Previewer;\n"
  },
  {
    "path": ".dumi/theme/builtins/ResourceCard.less",
    "content": ".card {\n  border: solid 1px #d9d9d9;\n  border-radius: 12px;\n  display: inline-flex;\n  width: 360px;\n  min-height: 108px;\n  padding: 8px 16px;\n  justify-content: flex-start;\n  align-items: center;\n  text-decoration: none;\n  margin: 12px 12px 12px 0;\n  transition: background-color ease 0.5s;\n  &:hover {\n    background-color: #f5f5f5;\n\n    [data-prefers-color='dark'] & {\n      background-color: #333;\n    }\n  }\n  img {\n    flex: none;\n    display: block;\n    height: 72px;\n    width: 72px;\n    border-radius: 8px;\n  }\n  .content {\n    flex: auto;\n    margin-left: 16px;\n  }\n  .title {\n    font-size: 20px;\n    font-weight: 400;\n    color: rgba(0, 0, 0, 0.85);\n    margin-bottom: 4px;\n\n    [data-prefers-color='dark'] & {\n      color: rgba(255, 255, 255, 0.65);\n    }\n  }\n  .description {\n    font-size: 14px;\n    color: rgba(0, 0, 0, 0.65);\n\n    [data-prefers-color='dark'] & {\n      color: rgba(255, 255, 255, 0.65);\n    }\n  }\n}"
  },
  {
    "path": ".dumi/theme/builtins/ResourceCard.tsx",
    "content": "import { FC } from 'react';\nimport './ResourceCard.less'\n\ntype Props = {\n  image?: string;\n  title: string;\n  description: string;\n  link: string;\n};\n\nconst ResourceCard: FC<Props> = (props) => {\n  return (\n    <a className={'card'} href={props.link} target=\"_blank\">\n      {props.image && <img src={props.image} alt={props.title} />}\n      <div className={'content'}>\n        <div className={'title'}>{props.title}</div>\n        <div className={'description'}>{props.description}</div>\n      </div>\n    </a>\n  );\n};\n\nexport default ResourceCard;\n"
  },
  {
    "path": ".dumi/theme/builtins/SourceCode/index.less",
    "content": "@import (reference) '../../styles/variables.less';\n\n// override prism theme for dark mode\n@{dark-selector} {\n  .token.doctype,\n  .token.punctuation,\n  .token.entity,\n  code[class*='language-'],\n  pre[class*='language-'] {\n    color: @c-text-secondary-dark;\n  }\n\n  .token.comment,\n  .token.prolog,\n  .token.cdata {\n    color: @c-text-note-dark;\n  }\n}\n\n.@{prefix}-source-code {\n  @bg-color: tint(@c-site-bg, 50%);\n\n  position: relative;\n  background-color: @bg-color;\n  border-radius: 8px;\n\n  &-scroll-container {\n    overflow: auto;\n    width: 100%;\n    height: 100%;\n  }\n\n  &-scroll-content {\n    position: relative;\n    width: max-content;\n    height: max-content;\n    min-width: 100%;\n    min-height: 100%;\n\n    > pre.prism-code {\n      width: max-content;\n      position: relative;\n      overflow: visible;\n    }\n  }\n\n  &.dark > pre.prism-code {\n    border: 1px solid rgba(253, 253, 253, 0.12);\n    background: #282c34;\n  }\n\n  &.light > pre.prism-code {\n    border: 1px solid rgba(5, 5, 5, 0.06);\n    background: #f7f7f7;\n  }\n\n  > pre.prism-code {\n    overflow: auto;\n    &:not(:first-child) {\n      margin-top: 16px;\n    }\n  }\n\n  > pre.prism-code,\n  &-scroll-content > pre.prism-code {\n    margin: 0;\n    padding: 18px 24px;\n    font-size: 14px;\n    line-height: 1.58;\n    direction: ltr;\n    background: transparent;\n\n    // remove shadow from coy theme\n    &::before,\n    &::after {\n      content: none;\n    }\n\n    // highlight line\n    & > .highlighted {\n      position: relative;\n      width: calc(100% + 24px);\n      background-color: shade(@bg-color, 5%);\n\n      .line-cell {\n        position: relative;\n\n        &::after {\n          content: '';\n          position: absolute;\n          top: 0;\n          right: -24px;\n          bottom: 0;\n          width: 24px;\n          background-color: shade(@bg-color, 5%);\n        }\n      }\n\n      &::after {\n        content: '';\n        position: absolute;\n        top: 0;\n        left: -24px;\n        bottom: 0;\n        width: 24px;\n        background-color: shade(@bg-color, 5%);\n      }\n    }\n\n    & > .wrap {\n      display: table-row;\n\n      & > .token-line-num {\n        display: table-cell;\n        text-align: right;\n        padding-right: 1em;\n        user-select: none;\n        opacity: 0.5;\n      }\n\n      & > .line-cell {\n        display: table-cell;\n        width: 100%;\n      }\n    }\n  }\n\n  &-copy {\n    position: absolute;\n    z-index: 2;\n    top: 9px;\n    right: 12px;\n    display: inline-block;\n    padding: 8px 12px;\n    background-color: fade(@bg-color, 80%);\n    border: 0;\n    border-radius: 2px;\n    cursor: pointer;\n    transition: all 0.2s;\n\n    > svg {\n      width: 16px;\n      fill: darken(@c-border, 20%);\n      transition: fill 0.2s;\n\n      @{dark-selector} & {\n        fill: lighten(@c-border-dark, 20%);\n      }\n    }\n\n    &:hover > svg {\n      fill: darken(@c-border, 30%);\n\n      @{dark-selector} & {\n        fill: lighten(@c-border-dark, 30%);\n      }\n    }\n\n    &[data-copied] > svg {\n      fill: @c-success;\n\n      @{dark-selector} & {\n        fill: @c-success-dark;\n      }\n    }\n  }\n\n  &:not(:hover) &-copy {\n    opacity: 0;\n    visibility: hidden;\n  }\n\n  @{dark-selector} & {\n    @bg-color: shade(@c-site-bg-dark, 50%);\n\n    background-color: @bg-color;\n\n    &-copy {\n      background-color: fadeout(@bg-color, 80%);\n    }\n\n    & > pre.prism-code > .highlighted {\n      background-color: tint(@bg-color, 10%);\n\n      &::after {\n        background-color: tint(@bg-color, 10%);\n      }\n\n      .line-cell {\n        &::after {\n          background-color: tint(@bg-color, 10%);\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": ".dumi/theme/builtins/SourceCode/index.tsx",
    "content": "import { ReactComponent as IconCheck } from '@ant-design/icons-svg/inline-svg/outlined/check.svg';\nimport { ReactComponent as IconCopy } from '@ant-design/icons-svg/inline-svg/outlined/copy.svg';\nimport classNames from 'classnames';\nimport { useSiteData } from 'dumi';\nimport Highlight, { defaultProps, type Language } from 'prism-react-renderer';\nimport prismTheme from 'prism-react-renderer/themes/oceanicNext';\nimport 'prism-themes/themes/prism-one-light.css';\nimport {\n  useContext,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n  type FC,\n  type ReactNode,\n} from 'react';\nimport { CopyToClipboard } from 'react-copy-to-clipboard';\nimport type { SiteContextProps } from '../../slots/SiteContext';\nimport SiteContext from '../../slots/SiteContext';\nimport './index.less';\n\nconst MARKUP_REGEX = {\n  all: /[\\n]*?#if ALIPAY[\\n]*?|[\\n]*?#if WECHAT[\\n]*?|[\\n]*?#endif[\\n]*?/g, // 支持的所有平台\n  alipay: /[\\n]*?#if WECHAT[\\s\\S?]*?#endif[\\n]*?/g, // 支付宝平台时，需要去掉微信标记的内容\n  wechat: /[\\n]*?#if ALIPAY[\\s\\S]*?#endif[\\n]*?/g, // 微信平台时，需要去掉支付宝标记的内容\n};\n\nconst COMMENTS_MARKUP_REGEX = {\n  if: /#comments\\s+if/g,\n  endif: /#comments\\s+endif/g,\n};\n\n/**\n * define DSL which can be highlighted as similar language\n */\nconst SIMILAR_DSL: Record<string, Language> = {\n  acss: 'css',\n  axml: 'markup',\n  vue: 'markup',\n};\n\nexport interface ISourceCodeProps {\n  children: string;\n  lang: Language;\n  highlightLines?: number[];\n  extra?: ReactNode;\n  textarea?: ReactNode;\n  title?: string;\n}\n\nconst SourceCode: FC<ISourceCodeProps> = (props) => {\n  const { children: pChildren = '', lang, highlightLines = [] } = props;\n  const { platform, theme } = useContext<SiteContextProps>(SiteContext);\n\n  const isDarkTheme = useMemo(() => theme.includes('dark'), [theme]);\n\n  const children = useMemo(() => {\n    // 支付宝平台时： 去掉 #if WECHAT 和 #endif 之间的文本\n    let result = pChildren.replace(MARKUP_REGEX[platform], '');\n\n    // 去掉所有的 #if ALIPAY, #endif 等标记\n    result = result.replace(MARKUP_REGEX.all, '');\n\n    // 如果comments if 或 comments endif 需要处理一下\n    result = result.replace(COMMENTS_MARKUP_REGEX.if, '#if');\n    result = result.replace(COMMENTS_MARKUP_REGEX.endif, '#endif');\n    return result;\n  }, [pChildren, platform, MARKUP_REGEX, COMMENTS_MARKUP_REGEX]);\n\n  const timer = useRef<number>();\n  const [isCopied, setIsCopied] = useState(false);\n  const [text, setText] = useState(children);\n  const { themeConfig } = useSiteData();\n\n  useEffect(() => {\n    const isShell = /shellscript|shell|bash|sh|zsh/.test(lang);\n    if (isShell) {\n      const text = children.replace(/^(\\$|>)\\s/gm, '');\n      setText(text);\n    }\n  }, [lang, children]);\n\n  const code = (\n    <Highlight\n      {...defaultProps}\n      code={props.textarea ? children : children.trim()}\n      language={SIMILAR_DSL[lang] || lang}\n      theme={isDarkTheme ? prismTheme : undefined}\n    >\n      {({ className, style, tokens, getLineProps, getTokenProps }) => (\n        <pre className={className} style={style}>\n          {tokens.map((line, i) => (\n            <div\n              key={String(i)}\n              className={classNames({\n                highlighted: highlightLines.includes(i + 1),\n                wrap: themeConfig.showLineNum,\n              })}\n            >\n              {themeConfig.showLineNum && (\n                <span className=\"token-line-num\">{i + 1}</span>\n              )}\n              <div\n                {...getLineProps({\n                  line,\n                  key: i,\n                })}\n                className={classNames({\n                  'line-cell': themeConfig.showLineNum,\n                })}\n              >\n                {line.map((token, key) => (\n                  // getTokenProps 返回值包含 key\n                  // eslint-disable-next-line react/jsx-key\n                  <span {...getTokenProps({ token, key })} />\n                ))}\n              </div>\n            </div>\n          ))}\n        </pre>\n      )}\n    </Highlight>\n  );\n\n  return (\n    <div\n      className={`dumi-theme-antd-source-code ${\n        isDarkTheme ? 'dark' : 'light'\n      }`}\n    >\n      <CopyToClipboard\n        text={text}\n        onCopy={() => {\n          setIsCopied(true);\n          clearTimeout(timer.current);\n          timer.current = window.setTimeout(() => setIsCopied(false), 2000);\n        }}\n      >\n        <button\n          type=\"button\"\n          className=\"dumi-theme-antd-source-code-copy\"\n          data-copied={isCopied || undefined}\n        >\n          {isCopied ? <IconCheck /> : <IconCopy />}\n        </button>\n      </CopyToClipboard>\n      {props.textarea ? (\n        <div className=\"dumi-theme-antd-source-code-scroll-container\">\n          <div className=\"dumi-theme-antd-source-code-scroll-content\">\n            {code}\n            {props.textarea}\n          </div>\n        </div>\n      ) : (\n        code\n      )}\n      {props.extra}\n    </div>\n  );\n};\n\nexport default SourceCode;\n"
  },
  {
    "path": ".dumi/theme/builtins/Table/index.less",
    "content": "@import (reference) '../../styles/variables.less';\n\n.dumi-default-table {\n  margin: 24px 0 32px;\n  transform: translate(0, 0);\n\n  &-content {\n    overflow: auto;\n\n    &::before,\n    &::after {\n      content: '';\n      display: block;\n      position: fixed;\n      z-index: 1;\n      top: 0;\n      bottom: 0;\n      width: 6px;\n      pointer-events: none;\n    }\n\n    &[data-left-folded]::before {\n      left: 0;\n      background-image: linear-gradient(\n        to right,\n        rgba(0, 0, 0, 10%),\n        rgba(0, 0, 0, 0%)\n      );\n\n      @{dark-selector} & {\n        background-image: linear-gradient(\n          to right,\n          rgba(0, 0, 0, 50%),\n          rgba(0, 0, 0, 0%)\n        );\n      }\n    }\n\n    &[data-right-folded]::after {\n      right: 0;\n      background-image: linear-gradient(\n        to left,\n        rgba(0, 0, 0, 10%),\n        rgba(0, 0, 0, 0%)\n      );\n\n      @{dark-selector} & {\n        background-image: linear-gradient(\n          to left,\n          rgba(0, 0, 0, 50%),\n          rgba(0, 0, 0, 0%)\n        );\n      }\n    }\n\n    > table > thead > tr > th,\n    > table > tr > th {\n      white-space: nowrap;\n    }\n  }\n}\n"
  },
  {
    "path": ".dumi/theme/builtins/Table/index.tsx",
    "content": "import throttle from 'lodash.throttle';\nimport React, {\n  ReactNode,\n  useCallback,\n  useContext,\n  useEffect,\n  useRef,\n  useState,\n} from 'react';\nimport type { SiteContextProps } from '../../slots/SiteContext';\nimport SiteContext from '../../slots/SiteContext';\nimport './index.less';\n\ninterface IProps {\n  children: ReactNode;\n}\n\nconst MARKUP_REGEX = {\n  all: /#if ALIPAY|#if WECHAT/, // 支持的所有平台\n  alipay: /#if WECHAT/, // 支付宝平台时，需要去掉微信标记表格项\n  wechat: /#if ALIPAY/, // 微信平台时，需要去掉支付宝标记表格项\n};\n\nconst Table: React.FC<IProps> = ({ children, ...props }) => {\n  const { platform } = useContext<SiteContextProps>(SiteContext);\n\n  const container = useRef<HTMLDivElement>(null);\n  const [leftFolded, setLeftFolded] = useState(false);\n  const [rightFolded, setRightFolded] = useState(false);\n\n  // watch content scroll to render folded shadow\n  useEffect(() => {\n    const elm = container.current;\n    if (elm) {\n      const handler = throttle(() => {\n        setLeftFolded(elm.scrollLeft > 0);\n        setRightFolded(elm.scrollLeft < elm.scrollWidth - elm.offsetWidth);\n      }, 100);\n\n      handler();\n      elm.addEventListener('scroll', handler);\n      window.addEventListener('resize', handler);\n\n      return () => {\n        elm.removeEventListener('scroll', handler);\n        window.removeEventListener('resize', handler);\n      };\n    }\n  }, []);\n\n  // 处理表格标签，做条件编译\n  const processReactNode = useCallback(\n    (node) => {\n      if (Array.isArray(node)) {\n        let containsAlipay = false;\n\n        // 遍历节点数组，检测是否包含 #if ALIPAY\n        node.forEach((child) => {\n          if (typeof child === 'string' && MARKUP_REGEX[platform].test(child)) {\n            containsAlipay = true;\n          } else if (\n            React.isValidElement(child) &&\n            typeof child.props.children === 'string' &&\n            MARKUP_REGEX[platform].test(child.props.children)\n          ) {\n            containsAlipay = true;\n          }\n        });\n\n        // 如果包含 #if ALIPAY，返回空数组以舍弃整个节点和其兄弟\n        return containsAlipay\n          ? []\n          : node.map(processReactNode).filter((child) => child !== null);\n      } else if (React.isValidElement(node)) {\n        const { children } = node.props;\n        const processedChildren = processReactNode(children);\n\n        return React.cloneElement(node, {\n          children: processedChildren,\n        });\n      } else {\n        node =\n          typeof node === 'string' ? node.replace(MARKUP_REGEX.all, '') : node;\n        return node;\n      }\n    },\n    [children, platform, MARKUP_REGEX]\n  );\n\n  return (\n    <div className=\"dumi-default-table\">\n      <div\n        className=\"dumi-default-table-content\"\n        ref={container}\n        data-left-folded={leftFolded || undefined}\n        data-right-folded={rightFolded || undefined}\n      >\n        <table {...props}>{processReactNode(children)}</table>\n      </div>\n    </div>\n  );\n};\n\nexport default Table;\n"
  },
  {
    "path": ".dumi/theme/builtins/code.html",
    "content": "\n<!doctype html>\n<html>\n<head>\n  <link rel=\"shortcut icon\" href=\"https://gw.alipayobjects.com/zos/rmsportal/wNkELvnLHXPAlmqutRPI.png\" type=\"image/x-icon\">\n  <meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no\">\n  <link rel=\"stylesheet\" type=\"text/css\" href=\"https://gw.alipayobjects.com/render/p/yuyan_npm/@alipay_antd-mini-code/1.0.0/web/preview.css\" />\n  <link rel=\"preload\" href=\"/preview.json\" as=\"fetch\" crossorigin>\n  <style>\n    body {\n      margin: 0;\n    }\n    #root {\n      width: 100vw;\n      height: 100vh;\n      box-sizing: border-box;\n      --preview-header-dark: rgba(255, 255, 255, 0.04);\n    }\n  </style>\n</head>\n\n<body>\n\n  <script>\n     // When the iframe is just created, you need to set the background color according to the dark mode.\n     window.addEventListener('message', (event)=>{\n      if (event.data.type === 'setIsDarkMode') {\n        window.LyraIsDefalutDarkMode = event.data.data;\n        const element = document.getElementsByTagName('body')?.[0];\n        if (element) {\n          element.style.setProperty(\n            'background-color',\n            window.LyraIsDefalutDarkMode ? '#141414' : '#f9fafb'\n          );\n        }\n      }\n    })\n  </script>\n\n  <div id=\"root\">\n  </div>\n  <script type=\"text/javascript\" src=\"https://gw.alipayobjects.com/os/lib/react/18.0.0/umd/react.production.min.js\"></script>\n  <script type=\"text/javascript\" src=\"https://gw.alipayobjects.com/os/lib/react-dom/18.0.0/umd/react-dom.production.min.js\"></script>\n  <script src=\"https://gw.alipayobjects.com/render/p/yuyan_npm/@alipay_antd-mini-code/1.0.0/web/preview.js\"></script>\n  <script>\n    const searchParams = new URL(location.href).searchParams;\n    const theme = searchParams.get('theme');\n    const page = searchParams.get('page');\n    const platform = searchParams.get('platform');\n    const server = searchParams.get('compilerServer');\n\n\n    function getSourceCode() {\n      return fetch(`/sourceCode/${page}?theme=${theme}&platform=${platform}`).then(res => res.json());\n    }\n\n    function getExtName(name) {\n      const arr = name.split('.');\n      return `.${arr[arr.length - 1]}`;\n    }\n\n    function sortMiniPageFile(files) {\n      const map = {\n        '.axml': 0,\n        '.wxml': 0,\n        '.js': 1,\n        '.acss': 2,\n        '.wxss': 2,\n        '.sjs': 3,\n        '.wxs': 3,\n        '.json': 4,\n      };\n      files.sort((a, b) => {\n        const arrA = a.split('/');\n        const arrB = b.split('/');\n        const lenA = arrA.length;\n        const lenB = arrB.length;\n        if (lenA === lenB) {\n          const nameA = arrA.slice(0, -1).join('/');\n          const nameB = arrB.slice(0, -1).join('/');\n          if (nameA === nameB) {\n            const result = map[getExtName(a)] - map[getExtName(b)];\n            if (result === 0) {\n              if (arrA[arrA.length - 1].startsWith('index')) {\n                return -1;\n              }\n              if (arrB[arrB.length - 1].startsWith('index')) {\n                return 1;\n              }\n              if (arrA[arrA.length - 1] < arrB[arrB.length - 1]) {\n                return -1;\n              }\n              return 1;\n            }\n            return result;\n          }\n          return nameA < nameB ? -1 : 1;\n        }\n        if (lenA < lenB) {\n          return -1;\n        }\n        return 1;\n      });\n      return files;\n    }\n\n    async function startWebOpenBoxPreviewApp() {\n      let sourceCode;\n      if (server) {\n        sourceCode = await getSourceCode();\n      } else {\n        const obj = await fetch('/preview.json').then(res => res.json());\n        sourceCode = {};\n        const str = page.replace('index', '');\n        Object.keys(obj.sourceCode[platform]).forEach(item => {\n          if (item.startsWith(str)) {\n            sourceCode[item] = obj.sourceCode[platform][item];\n          }\n        });\n      }\n      sourceCode['mini.project.json'] = JSON.stringify({\n        enableAppxNg: true,\n        component2: true,\n      }, null, 2);\n      sourceCode['app.json'] = JSON.stringify({\n        \"pages\": [\n          `${searchParams.get('folder')}index`\n        ],\n        \"window\": {\n          \"enableWK\": \"YES\",\n          \"enableDSL\": \"YES\",\n          \"enableJSC\": \"YES\",\n          \"defaultTitle\": \"小程序版 antd-mini 库\",\n          \"titleBarColor\": \"#FFFFFF\",\n          \"pullRefresh\": false,\n          \"allowsBounceVertical\": false,\n          \"enableInPageRenderInput\": \"YES\"\n        },\n      }, null, 2);\n      window.OpenBoxPreview.StartWebOpenBoxPreviewApp({\n        containerStyle: {\n          width: '100%',\n          height: '100%',\n        },\n        sourceCode,\n        isShowToolbar: true,\n        toolbarOptions: {\n          isShowDownload: true,\n        },\n        isShowHeaderLogo: false,\n        sortMiniPageFile\n      });\n      sourceCode['package.json'] = JSON.stringify({\n        \"private\": true,\n        \"dependencies\": {\n          \"antd-mini\": \"latest\"\n        },\n      }, null, 2);\n      sourceCode['app.js'] = `App({})`;\n      sourceCode['README.md'] = '需要先npm i';\n    }\n    startWebOpenBoxPreviewApp();\n  </script>\n</body>\n</html>\n"
  },
  {
    "path": ".dumi/theme/builtins/iframe.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <link rel=\"shortcut icon\" href=\"https://gw.alipayobjects.com/zos/rmsportal/wNkELvnLHXPAlmqutRPI.png\"\n    type=\"image/x-icon\">\n  <meta charset=\"utf-8\">\n  <meta name=\"viewport\" content=\"width=device-width,initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no\">\n  <link rel=\"stylesheet\" type=\"text/css\"\n    href=\"https://gw.alipayobjects.com/render/p/yuyan_npm/@alipay_antd-mini-lyra/1.0.1/web/lyra.css\" />\n  <link rel=\"preload\" href=\"/preview.json\" as=\"fetch\" crossorigin>\n</head>\n\n<style>\n  body {\n    margin: 0;\n    background-color: transparent;\n  }\n</style>\n\n<body>\n\n  <script>\n    // When the iframe is just created, you need to set the background color according to the dark mode.\n    window.addEventListener('message', (event)=>{\n      if (event.data.type === 'setIsDarkMode') {\n        window.LyraIsDefalutDarkMode = event.data.data;\n        const element = document.getElementsByTagName('body')?.[0];\n        if (element) {\n          element.style.setProperty(\n            'background-color',\n            window.LyraIsDefalutDarkMode ? '#141414' : '#f9fafb'\n          );\n        }\n      }\n    })\n\n  </script>\n\n  <div id=\"root\"></div>\n  <script type=\"text/javascript\"\n    src=\"https://gw.alipayobjects.com/os/lib/react/18.0.0/umd/react.production.min.js\"></script>\n  <script type=\"text/javascript\"\n    src=\"https://gw.alipayobjects.com/os/lib/react-dom/18.0.0/umd/react-dom.production.min.js\"></script>\n  <script src=\"https://gw.alipayobjects.com/render/p/yuyan_npm/@alipay_antd-mini-lyra/1.0.1/web/lyra.js\"></script>\n  <script>\n    const searchParams = new URL(location.href).searchParams;\n    const page = searchParams.get('page');\n    const platform = searchParams.get('platform');\n    const server = searchParams.get('compilerServer');\n\n\n    function getDist() {\n      const list = ['appConfig.json', 'index.js', 'index.worker.js', 'index.html'];\n      return Promise.all(list.map(item => fetch(`${server}/${item}`).then(res => res.text()))).then(arr => {\n        const dist = {};\n        list.forEach((item, index) => {\n          dist[item] = arr[index];\n        });\n        return dist;\n      });\n    }\n\n    async function startWebOpenBoxLyraApp() {\n      let dist;\n\n      if (server) {\n        dist = await getDist()\n      } else {\n        const obj = await fetch('/preview.json').then(res => res.json());\n        dist = obj.dist;\n\n      }\n      window.OpenBoxLyra.StartWebOpenBoxLyraApp(\n        {\n          dist,\n          enableAppxNg: true,\n          maskThemeColor: {\n            dark: '#141414',\n            light: '#f9fafb',\n          },\n          defalutDarkMode: window.LyraIsDefalutDarkMode,\n          lyraKey: 'unique-identifier-key',\n          simulatorStyle: {\n            width: 292,\n            height: 633,\n          },\n          lyraConfig: {\n            zoom: 0.75,\n            layoutHeight: 'match_parent',\n            layoutWidth: 'match_parent',\n            defaultDeviceName: 'iPhone 13',\n            initWithAutoZoom: false,\n            transparentBackground: true,\n            hideTopBar: true,\n            hideBottomBar: true,\n            enableDeviceSkin: false,\n            hideTitleBar: true,\n            liteMode: false,\n            launchParams: { page: decodeURIComponent(page) }\n          },\n          onPageReady:() => {\n            console.log('onPageReady,123');\n            window.parent && window.parent.postMessage({ type:'onPageReady', data: true })\n          },\n          onAppReady:() => {\n            window.parent && window.parent.postMessage({ type:'onAppReady', data: true })\n          }\n        },\n      )\n\n    }\n    startWebOpenBoxLyraApp();\n  </script>\n</body>\n\n</html>\n"
  },
  {
    "path": ".dumi/theme/common/CommonHelmet.tsx",
    "content": "import { Helmet, useRouteMeta } from 'dumi';\nimport { useMemo } from 'react';\nimport useLocaleValue from '../hooks/useLocaleValue';\nimport { removeTitleCode } from '../utils';\n\nconst CommonHelmet = () => {\n  const meta = useRouteMeta();\n  const configTitle = useLocaleValue('title');\n\n  const [title, description] = useMemo(() => {\n    const helmetTitle = `${removeTitleCode(meta.frontmatter.subtitle) || ''} ${removeTitleCode(\n      meta.frontmatter?.title\n    )} - ${configTitle}`;\n    const helmetDescription = meta.frontmatter.description;\n    return [helmetTitle, helmetDescription];\n  }, [meta, configTitle]);\n\n  return (\n    <Helmet>\n      <title>{title}</title>\n      <meta property=\"og:title\" content={title} />\n      {description && <meta name=\"description\" content={description} />}\n    </Helmet>\n  );\n};\n\nexport default CommonHelmet;\n"
  },
  {
    "path": ".dumi/theme/common/EditLink.tsx",
    "content": "import { useRouteMeta, useIntl, FormattedMessage } from 'dumi';\nimport { EditOutlined } from '@ant-design/icons';\nimport useAdditionalThemeConfig from '../hooks/useAdditionalThemeConfig';\n\nconst EditLink = () => {\n  const { frontmatter } = useRouteMeta();\n  const { editLink } = useAdditionalThemeConfig();\n  const intl = useIntl();\n\n  const showEditLink = editLink && frontmatter.filename;\n  return showEditLink ? (\n    <div>\n      <a\n        target=\"_blank\"\n        href={`${intl.formatMessage(\n          { id: '$internal.edit.link' },\n          { filename: frontmatter.filename }\n        )}`}\n        rel=\"noreferrer\"\n      >\n        <EditOutlined />\n        <FormattedMessage id=\"app.footer.actions.edit\" />\n      </a>\n    </div>\n  ) : null;\n};\n\nexport default EditLink;\n"
  },
  {
    "path": ".dumi/theme/common/GlobalStyles.tsx",
    "content": "import React from 'react';\nimport {\n  Common,\n  DumiDefaultStyleOverride,\n  HeadingAnchor,\n  Highlight,\n  Markdown,\n  Reset,\n  Responsive,\n  SearchBar,\n  PreviewImage\n} from './styles';\n\nconst GlobalStyles = () => (\n  <React.Fragment>\n    <Reset />\n    <Common />\n    <Markdown />\n    <Highlight />\n    <Responsive />\n    <HeadingAnchor />\n    <SearchBar />\n    <PreviewImage />\n    <DumiDefaultStyleOverride />\n  </React.Fragment>\n);\n\nexport default GlobalStyles;\n"
  },
  {
    "path": ".dumi/theme/common/LastUpdated.tsx",
    "content": "// 最后更新时间\nimport React, { useEffect, useState } from 'react';\nimport { css } from '@emotion/react';\nimport { FormattedMessage } from 'dumi';\nimport { ClockCircleOutlined } from '@ant-design/icons';\nimport useSiteToken from '../hooks/useSiteToken';\nimport useAdditionalThemeConfig from '../hooks/useAdditionalThemeConfig';\n\nconst useStyle = () => {\n  const { token } = useSiteToken();\n\n  const { colorTextTertiary, marginXXS } = token;\n\n  return {\n    lastUpdatedWrap: css`\n      color: ${colorTextTertiary};\n      display: flex;\n    `,\n    lastUpdatedLabel: css`\n      margin-inline-start: ${marginXXS}px;\n      margin-inline-end: ${marginXXS}px;\n    `\n  };\n};\n\nconst LastUpdated: React.FC<{ time?: number }> = ({ time }) => {\n  const styles = useStyle();\n  const { lastUpdated } = useAdditionalThemeConfig();\n  const [isoLastUpdated, setIsoLastUpdated] = useState('');\n  const [lastUpdatedTime, setLastUpdatedTime] = useState('');\n  const showLastUpdated = lastUpdated && time;\n\n  useEffect(() => {\n    if (showLastUpdated) {\n      setIsoLastUpdated(new Date(time!).toISOString());\n      setLastUpdatedTime(\n        new Intl.DateTimeFormat(undefined, {\n          dateStyle: 'short',\n          timeStyle: 'short'\n        }).format(time)\n      );\n    }\n  }, [showLastUpdated, time]);\n\n  return lastUpdated && time ? (\n    <div css={styles.lastUpdatedWrap}>\n      <ClockCircleOutlined />\n      <span css={styles.lastUpdatedLabel}>\n        <FormattedMessage id=\"content.footer.last.updated\" />\n      </span>\n      <time dateTime={isoLastUpdated}>{lastUpdatedTime}</time>\n    </div>\n  ) : null;\n};\n\nexport default LastUpdated;\n"
  },
  {
    "path": ".dumi/theme/common/Loading/index.tsx",
    "content": "import React, { useCallback } from 'react';\nimport { Skeleton, Space, Spin } from 'antd';\nimport { useLocation } from 'dumi';\nimport type { IAllThemeConfig } from '../../types';\nimport useAdditionalThemeConfig from '../../hooks/useAdditionalThemeConfig';\n\nconst defaultLoadingConfig: IAllThemeConfig['loading'] = {\n  skeleton: []\n};\n\nconst Loading: React.FC = () => {\n  const { pathname } = useLocation();\n  const { loading = defaultLoadingConfig } = useAdditionalThemeConfig();\n\n  const skeletonLoadingRenderRule = useCallback(() => {\n    const pathnameReg = loading.skeleton;\n    if (pathnameReg) {\n      return (\n        pathnameReg.filter((rule) => {\n          return pathname.startsWith(rule);\n        }).length > 0\n      );\n    }\n    return false;\n  }, [loading, pathname]);\n\n  if (skeletonLoadingRenderRule()) {\n    return (\n      <div style={{ maxWidth: '70vw', width: '100%', margin: '80px auto 0', textAlign: 'center' }}>\n        <img\n          src=\"https://gw.alipayobjects.com/zos/rmsportal/KDpgvguMpGfqaHPjicRK.svg\"\n          width={40}\n          alt=\"loading\"\n          style={{ marginBottom: 24, filter: 'grayscale(1)', opacity: 0.33 }}\n        />\n        <Skeleton active paragraph={{ rows: 3 }} />\n        <Skeleton active paragraph={{ rows: 4 }} style={{ marginTop: 32 }} />\n      </div>\n    );\n  }\n\n  return (\n    <Space style={{ width: '100%', margin: '120px 0', justifyContent: 'center' }} align=\"center\">\n      <Spin size=\"large\" />\n    </Space>\n  );\n};\n\nexport default Loading;\n"
  },
  {
    "path": ".dumi/theme/common/PrevAndNext.tsx",
    "content": "import { LeftOutlined, RightOutlined } from '@ant-design/icons';\nimport { ClassNames, css } from '@emotion/react';\nimport type { MenuProps } from 'antd';\nimport type { MenuItemType } from 'antd/lib/menu/hooks/useItems';\nimport type { ReactElement } from 'react';\nimport React, { useContext, useMemo } from 'react';\nimport useMenu from '../hooks/useMenu';\nimport useSiteToken from '../hooks/useSiteToken';\nimport type { SiteContextProps } from '../slots/SiteContext';\nimport SiteContext from '../slots/SiteContext';\n\nconst useStyle = ({ isShowSim }) => {\n  const { token } = useSiteToken();\n\n  const { colorSplit, iconCls, fontSizeIcon } = token;\n\n  return {\n    prevNextNav: css`\n      overflow: hidden;\n      font-size: 14px;\n      border-top: 1px solid ${colorSplit};\n      display: flex;\n\n      padding: ${isShowSim ? '0 412px 32px 64px' : '0 164px 32px 64px'};\n\n      &.rtl {\n        padding: 0 64px 144px 170px;\n      }\n\n      @media only screen and (max-width: ${token.screenLG}px) {\n        &,\n        &.rtl {\n          padding-right: 24px;\n          padding-left: 24px;\n        }\n      }\n    `,\n    pageNav: `\n      flex: 1;\n      height: 72px;\n      line-height: 72px;\n      text-decoration: none;\n\n      ${iconCls} {\n        color: #999;\n        font-size: ${fontSizeIcon}px;\n        transition: all 0.3s;\n      }\n\n      .chinese {\n        margin-inline-start: 4px;\n      }\n    `,\n    prevNav: `\n      text-align: start;\n      display: flex;\n      justify-content: flex-start;\n      align-item: center;\n\n      .footer-nav-icon-after {\n        display: none;\n      }\n\n      .footer-nav-icon-before {\n        position: relative;\n        line-height: 0;\n        vertical-align: middle;\n        transition: inset-inline-end 0.3s;\n        margin-inline-end: 1em;\n        inset-inline-end: 0;\n      }\n\n      &:hover .footer-nav-icon-before {\n        inset-inline-end: 0.2em;\n      }\n    `,\n    nextNav: `\n      text-align: end;\n      display: flex;\n      justify-content: flex-end;\n      align-items: center;\n\n      .footer-nav-icon-before {\n        display: none;\n      }\n\n      .footer-nav-icon-after {\n        position: relative;\n        margin-inline-start: 1em;\n        margin-bottom: 1px;\n        vertical-align: middle;\n        line-height: 0;\n        left: 0;\n        transition: left 0.3s;\n      }\n\n      &:hover .footer-nav-icon-after {\n        inset-inline-start: 0.2em;\n      }\n    `,\n  };\n};\n\nconst flattenMenu = (\n  menuItems: MenuProps['items']\n): MenuProps['items'] | null => {\n  if (Array.isArray(menuItems)) {\n    return menuItems.reduce<Exclude<MenuProps['items'], undefined>>(\n      (acc, item) => {\n        if (!item) {\n          return acc;\n        }\n        if ('children' in item && item.children) {\n          return acc.concat(flattenMenu(item.children) ?? []);\n        }\n        return acc.concat(item);\n      },\n      []\n    );\n  }\n  return null;\n};\n\nconst PrevAndNext: React.FC<{ rtl: boolean; isShowSim?: boolean }> = ({\n  rtl,\n  isShowSim,\n}) => {\n  const styles = useStyle({ isShowSim });\n\n  const beforeProps = { className: 'footer-nav-icon-before' };\n  const afterProps = { className: 'footer-nav-icon-after' };\n\n  const before = rtl ? (\n    <RightOutlined {...beforeProps} />\n  ) : (\n    <LeftOutlined {...beforeProps} />\n  );\n  const after = rtl ? (\n    <LeftOutlined {...afterProps} />\n  ) : (\n    <RightOutlined {...afterProps} />\n  );\n\n  const [menuItems, selectedKey] = useMenu({ before, after });\n\n  const { isMobile } = useContext<SiteContextProps>(SiteContext);\n\n  const [prev, next] = useMemo(() => {\n    const flatMenu = flattenMenu(menuItems);\n    if (!flatMenu) {\n      return [null, null];\n    }\n    let activeMenuItemIndex = -1;\n    flatMenu.forEach((menuItem, i) => {\n      if (menuItem && menuItem.key === selectedKey) {\n        activeMenuItemIndex = i;\n      }\n    });\n    return [\n      flatMenu[activeMenuItemIndex - 1] as MenuItemType,\n      flatMenu[activeMenuItemIndex + 1] as MenuItemType,\n    ];\n  }, [menuItems, selectedKey]);\n\n  if (isMobile) {\n    return null;\n  }\n\n  return (\n    <section css={styles.prevNextNav}>\n      <ClassNames>\n        {({ css: classCss, cx }) => (\n          <>\n            {prev &&\n              React.cloneElement(prev.label as ReactElement, {\n                className: cx(\n                  classCss(styles.pageNav),\n                  classCss(styles.prevNav)\n                ),\n              })}\n            {next &&\n              React.cloneElement(next.label as ReactElement, {\n                className: cx(\n                  classCss(styles.pageNav),\n                  classCss(styles.nextNav)\n                ),\n              })}\n          </>\n        )}\n      </ClassNames>\n    </section>\n  );\n};\n\nexport default PrevAndNext;\n"
  },
  {
    "path": ".dumi/theme/common/Sim/index.less",
    "content": ".previewer {\n  position: fixed;\n  top: calc((100% - 633px + 60px) / 2);\n  right: 24px;\n  width: 292px;\n  height: 633px;\n  z-index: 1;\n  margin-right: 20px;\n  border-radius: 40px;\n\n  &.hide {\n    right: -9999px;\n    opacity: 0;\n  }\n\n  &::before {\n    display: block;\n    content: '';\n    width: calc(100% + 24px);\n    height: calc(100% + 10px);\n    z-index: 1;\n    position: absolute;\n    top: -5px;\n    left: -12px;\n    pointer-events: none;\n  }\n  &::after {\n    display: block;\n    content: '';\n    width: 500px;\n    height: calc(200vh + 100px);\n    z-index: -1;\n    position: absolute;\n    top: -100vh;\n    left: -50px;\n    border-left: 1px solid rgba(5, 5, 5, 0.06);\n  }\n\n  &.theme-light {\n    &::before {\n      background: url(https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*vJX0SK7L5g0AAAAAAAAAAAAADtF8AQ/original)\n        no-repeat;\n      background-size: 100% 100%;\n    }\n    &::after {\n      background-color: #fff;\n    }\n  }\n  &.theme-dark {\n    &::before {\n      background: url(https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*EWiARK8lIdYAAAAAAAAAAAAADtF8AQ/original)\n        no-repeat;\n      background-size: 100% 100%;\n    }\n    &::after {\n      background-color: #141414;\n    }\n  }\n\n  iframe {\n    height: 100%;\n    border: none;\n    width: 100%;\n    border-radius: 40px;\n    position: relative;\n\n    &::after {\n      display: block;\n      content: '';\n      background-color: #000;\n      width: 500px;\n      height: calc(100vh + 100px);\n      z-index: 1;\n      position: absolute;\n      top: -100px;\n      left: -36px;\n      border-left: 1px solid rgba(149, 149, 149, 0.2);\n    }\n  }\n  &-loading {\n    width: 40px;\n    height: 40px;\n    position: absolute;\n    left: 0;\n    right: 0;\n    top: 0;\n    bottom: 0;\n    margin: auto;\n    background-color: rgba(22, 119, 255, 0.8);\n    border-radius: 100%;\n    animation: sk-scaleout 1s infinite ease-in-out;\n  }\n}\n"
  },
  {
    "path": ".dumi/theme/common/Sim/index.tsx",
    "content": "import { css } from '@emotion/react';\nimport { useMatchedRoute } from 'dumi';\nimport React, { useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport useSiteToken from '../../hooks/useSiteToken';\nimport type { SiteContextProps } from '../../slots/SiteContext';\nimport SiteContext from '../../slots/SiteContext';\nimport './index.less';\n\ninterface IProps {}\n\nfunction buildUrl(\n  basic: string,\n  options: {\n    platform: string;\n    theme: string;\n  }\n) {\n  const urlObj = new URL(basic);\n  const searchParams = urlObj.searchParams;\n\n  const page = searchParams.get('page');\n  const { platform: supportPlatform, disablePlatformSwitch } =\n    getSupportPlatform(options.platform);\n  searchParams.set('platform', supportPlatform);\n  searchParams.set('theme', options.theme);\n\n  // http://localhost:8000/preview.html\n  // 为了不让iframe的url变化，导致重新渲染iframe，这里去掉url中的变量参数，通过iframe通信的方式，让小程序实现去跳转页面\n  const originPathUrl = new URL(urlObj.origin + urlObj.pathname);\n  originPathUrl.searchParams.set(\n    'compilerServer',\n    searchParams.get('compilerServer') || ''\n  );\n  originPathUrl.searchParams.set('page', '');\n  return {\n    url: urlObj.toString(),\n    originPath: originPathUrl.toString(),\n    page,\n    supportPlatform,\n    disablePlatformSwitch,\n  };\n}\n\nconst DefaultPlatform = 'alipay';\n\nfunction getSupportPlatform(platform: string) {\n  const supportWechat = true;\n  if (!supportWechat && platform === 'wechat') {\n    return {\n      platform: DefaultPlatform,\n      disablePlatformSwitch: true,\n    };\n  }\n  return {\n    platform,\n    disablePlatformSwitch: false,\n  };\n}\nconst useStyle = () => {\n  const { token } = useSiteToken();\n  return {\n    // not show simulator\n    previewerWrapper: css`\n      @media only screen and (max-width: ${token.screenLG}px) {\n        display: none;\n      }\n    `,\n    dark: css`\n      background-color: #141414;\n    `,\n    light: css`\n      background-color: #f9fafb;\n    `,\n  };\n};\n\nconst Previewer: React.FC<IProps> = () => {\n  const styles = useStyle();\n  const { theme, platform, herboxUrl } =\n    useContext<SiteContextProps>(SiteContext);\n  const [previewerLoaded, setPreviewerLoaded] = useState(false);\n  const previewerRef = useRef<any>(null);\n  const matchedRoute = useMatchedRoute();\n\n  const isShowSim = useMemo(() => {\n    return (\n      matchedRoute?.meta?.frontmatter?.nav?.path === '/components' ||\n      matchedRoute?.meta?.frontmatter?.nav?.path === '/copilot'\n    );\n  }, [matchedRoute]);\n\n  const basicUrl =\n    window.location.protocol + '//' + window.location.host + herboxUrl;\n  const { originPath, page } = useMemo(() => {\n    return buildUrl(basicUrl, {\n      theme: theme?.find((t) => ['dark', 'light'].includes(t)) || 'light',\n      platform,\n    });\n  }, [basicUrl, theme, platform]);\n\n  // 改主题\n  function sendThemeToPreviewer() {\n    const previeweriframe = previewerRef.current;\n    if (!previeweriframe) return;\n    const setThemeColor = function () {\n      previeweriframe?.contentWindow?.postMessage({\n        type: 'setIsDarkMode',\n        data: theme.includes('dark'),\n      });\n      const color = theme.includes('dark') ? '#000' : '#fff';\n      previeweriframe?.contentWindow?.postMessage({\n        type: 'evaluateJavaScriptInWorkerCode',\n        data: `\n          my.setNavigationBar({\n            backgroundColor: '${color}',\n            borderBottomColor: '${color}',\n          });\n      `,\n      });\n    };\n\n    setThemeColor();\n  }\n\n  // 跳转页面\n  function sendPageToPreviewer() {\n    const previeweriframe = previewerRef.current;\n    if (!previeweriframe) return;\n\n    const color = theme.includes('dark') ? '#000' : '#fff';\n    function redirect() {\n      previeweriframe?.contentWindow?.postMessage({\n        type: 'evaluateJavaScriptInWorkerCode',\n        data: `\n        console.log('跳转页面','/${page}');\n        my.redirectTo({\n          url: '/${page}',\n          success: () => {\n            setTimeout(()=>{\n              my.setNavigationBar({\n                backgroundColor: '${color}',\n                borderBottomColor: '${color}',\n              });\n            }, 500);\n          },\n      });\n      `,\n      });\n    }\n    redirect();\n  }\n\n  function setMsgToPreviewer(miniCode) {\n    const previeweriframe = previewerRef.current;\n    if (!previeweriframe || !miniCode) return;\n    previeweriframe?.contentWindow?.postMessage({\n      type: 'evaluateJavaScriptInWorkerCode',\n      data: miniCode,\n    });\n  }\n\n  useEffect(() => {\n    if (theme.length > 0) {\n      sendThemeToPreviewer();\n    }\n  }, [theme]);\n\n  useEffect(() => {\n    if (page) {\n      sendPageToPreviewer();\n    }\n  }, [page]);\n\n  useEffect(() => {\n    const previeweriframe = previewerRef.current;\n    if (!previeweriframe) return;\n    previeweriframe.onload = () => {\n      sendThemeToPreviewer();\n      window.setMsgToSim = setMsgToPreviewer;\n    };\n  }, [previewerRef.current]);\n\n  function handleIframeMessage(event) {\n    if (event.data.type === 'onAppReady') {\n      const value = event.data.data;\n      if (value) {\n        sendThemeToPreviewer();\n        sendPageToPreviewer();\n      }\n    }\n  }\n\n  useEffect(() => {\n    window.addEventListener('message', handleIframeMessage);\n    return () => {\n      window.removeEventListener('message', handleIframeMessage);\n    };\n  }, [page]);\n\n  return (\n    <div\n      className={`previewer ${!herboxUrl || !isShowSim ? 'hide' : ''} ${\n        theme.includes('dark') ? 'theme-dark' : 'theme-light'\n      }`}\n      css={css`\n        ${styles.previewerWrapper}\n        ${theme.includes('dark') ? styles.dark : styles.light}\n      `}\n    >\n      {!previewerLoaded && <div className=\"previewer-loading\" />}\n      <iframe\n        ref={previewerRef}\n        src={originPath}\n        onLoad={() => setPreviewerLoaded(true)}\n        allow=\"clipboard-read; clipboard-write\"\n      />\n    </div>\n  );\n};\n\nexport default Previewer;\n"
  },
  {
    "path": ".dumi/theme/common/ThemeSwitch/ThemeIcon.tsx",
    "content": "import Icon from '@ant-design/icons';\nimport React from 'react';\n\nconst ThemeIcon: React.FC<{ className?: string }> = (props) => {\n  const SVGIcon = React.useCallback(\n    () => (\n      <svg width={20} height={20} viewBox=\"0 0 24 24\" fill=\"currentColor\" {...props}>\n        <g fillRule=\"evenodd\">\n          <g fillRule=\"nonzero\">\n            <path d=\"M7.02 3.635l12.518 12.518a1.863 1.863 0 010 2.635l-1.317 1.318a1.863 1.863 0 01-2.635 0L3.068 7.588A2.795 2.795 0 117.02 3.635zm2.09 14.428a.932.932 0 110 1.864.932.932 0 010-1.864zm-.043-9.747L7.75 9.635l9.154 9.153 1.318-1.317-9.154-9.155zM3.52 12.473c.514 0 .931.417.931.931v.932h.932a.932.932 0 110 1.864h-.932v.931a.932.932 0 01-1.863 0l-.001-.931h-.93a.932.932 0 010-1.864h.93v-.932c0-.514.418-.931.933-.931zm15.374-3.727a1.398 1.398 0 110 2.795 1.398 1.398 0 010-2.795zM4.385 4.953a.932.932 0 000 1.317l2.046 2.047L7.75 7 5.703 4.953a.932.932 0 00-1.318 0zM14.701.36a.932.932 0 01.931.932v.931h.932a.932.932 0 010 1.864h-.933l.001.932a.932.932 0 11-1.863 0l-.001-.932h-.93a.932.932 0 110-1.864h.93v-.931a.932.932 0 01.933-.932z\" />\n          </g>\n        </g>\n      </svg>\n    ),\n    [props]\n  );\n  return <Icon component={SVGIcon} {...props} />;\n};\n\nexport default ThemeIcon;\n"
  },
  {
    "path": ".dumi/theme/common/ThemeSwitch/index.tsx",
    "content": "import { FloatButton } from 'antd';\nimport { CompactTheme, DarkTheme } from 'antd-token-previewer/lib/icons';\nimport { FormattedMessage } from 'dumi';\nimport React from 'react';\nimport ThemeIcon from './ThemeIcon';\n\nexport type ThemeName = 'light' | 'dark' | 'compact';\n\nexport type ThemeSwitchProps = {\n  value?: ThemeName[];\n  onChange: (value: ThemeName[]) => void;\n};\n\nconst ThemeSwitch: React.FC<ThemeSwitchProps> = (props: ThemeSwitchProps) => {\n  const { value = ['light'], onChange } = props;\n  return (\n    <FloatButton.Group trigger=\"click\" icon={<ThemeIcon />}>\n      <FloatButton\n        icon={<DarkTheme />}\n        type={value.includes('dark') ? 'primary' : 'default'}\n        onClick={() => {\n          const themeValue = value.includes('dark') ? 'light' : 'dark';\n          onChange([themeValue, ...value.filter((item) => ['dark', 'light'].indexOf(item) < 0)]); // compact 值必须放在靠后位置\n        }}\n        tooltip={<FormattedMessage id=\"app.theme.switch.dark\" />}\n      />\n      <FloatButton\n        icon={<CompactTheme />}\n        type={value.includes('compact') ? 'primary' : 'default'}\n        onClick={() => {\n          if (value.includes('compact')) {\n            onChange(value.filter((item) => item !== 'compact'));\n          } else {\n            onChange([...value, 'compact']);\n          }\n        }}\n        tooltip={<FormattedMessage id=\"app.theme.switch.compact\" />}\n      />\n    </FloatButton.Group>\n  );\n};\n\nexport default ThemeSwitch;\n"
  },
  {
    "path": ".dumi/theme/common/config/overview.ts",
    "content": "export const ComponentSampleImages = {\n  light: {\n    'default': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/_JEbR4jx--IAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'button': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/lJZlQ5KnrXsAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'icon': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/PFJ_QKe0XEcAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'tab-bar': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/qc9BS5vcF1QAAAAAAAAAAAAADoEQAQFr/fmt.webp',\n    },\n    'tabs': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/bKbGSIOTIu4AAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'feedback': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/DsCqSZf_uB4AAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'avatar': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/QgLFSq0wiSIAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'calendar': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/n7vNRL-p1r8AAAAAAAAAAAAADoEQAQFr/original',\n    },\n    'collapse': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/4TqTQpiO_HcAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'container': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/9kW0ToqdOAEAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'divider': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/4AF2Qp-5Az8AAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'empty': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/ehJDSaRlTGIAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'grid': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/nE4tRKcyIKIAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'guide-tour': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/daNHQZxefhUAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'index-bar': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/aLv3SpE2TFIAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'list': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/ybMzT7-RMOIAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'progress': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/arA9QYUD9WgAAAAAAAAAAAAADoEQAQFr/original',\n    },\n    'steps': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/GBaPQo2IT3QAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'swipe-action': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/5LGtRpWDqZkAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'tag': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/1IcoSohdmJMAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'checkbox': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/XuK_QZ9_c74AAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'checklist': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/Bu6fQJAeiooAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'date-picker': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/yFADSalOg1MAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'form': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/D1N7Rrln1X0AAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'image-upload': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/7sEMR5KThsUAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'input': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/xg_qTpEbs-0AAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'number-keyboard': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/juu8RYs5f-cAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'number-input': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/v0WTRLe0iB4AAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'postscript': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/NqO6Q6TjnzkAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'picker': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/sXfxRJXfhJIAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'radio': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/7qBNRam_UHcAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'rare-words-keyboard': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/juu8RYs5f-cAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'selector': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/qQjmR7LSkWYAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'slider': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/CeucT6NL7TYAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'stepper': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/lhpNQapn8oEAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'switch': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/8iSJR4-TAWUAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'loading': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/grmMQadI2PEAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'modal': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/64mjT4H0q84AAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'popover': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/PQnOQaT-jp8AAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'popover-list': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/wEStRrgdi4EAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'popup': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/mU4LSZ8_2D8AAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'rate': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/9L3ES4kAcS0AAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'result': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/ONMiQqVDUcEAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'skeleton': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/t_upQ6ZUOC0AAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'toast': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/DK-ySJwhULUAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'badge': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/90lFSJTWqbQAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'notice-bar': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/IWLqTpCF3HEAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'page-container': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/qoFGRYpKfEQAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'voucher': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/ouVBQbV0LxMAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'card': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/qmBSTrwO5PYAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'sticky': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/s0HBSbfB_tUAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'countdown': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/c18aTav7R30AAAAAAAAAAAAADoEQAQFr/original',\n    },\n    'table': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/CpkkTr3EAHsAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'safe-area': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/5-A-TrkpTpkAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'select-contact': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/Loa6SoE0YiQAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'terms': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/3vOAT6qo9TYAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n  },\n  dark: {\n    'default': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/HVGsRoz7uX0AAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'button': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/M8PCQ4gzt3YAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'icon': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/7CUgTas_WQ4AAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'tab-bar': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/Yh-5Q6yFC5oAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'tabs': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/Jf9VQIDVKpMAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'feedback': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/1eBQR4djuBoAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'avatar': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/1Z6oQZuAlcoAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'calendar': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/E-nHTLq9WwUAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'collapse': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/-G71Rbrx6hMAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'container': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/t5Z5R6owxZcAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'divider': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/J8VASKEEYe0AAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'empty': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/pqf7S4fvtbAAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'grid': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/InU-Qoi5md0AAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'guide-tour': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/0M3PRYImEBYAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'index-bar': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/oRVuQZCBi4QAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'list': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/Ek2SQ4SQDggAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'progress': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/3TCdRYocZg0AAAAAAAAAAAAADoEQAQFr/original',\n    },\n    'steps': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/wDIUQ7tLlmgAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'swipe-action': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/sjT2S6drb1YAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'tag': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/2xiLS7imUccAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'checkbox': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/WoQ-SKnvPxoAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'checklist': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/b88rSJapaicAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'date-picker': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/pmtUQK6IIYwAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'form': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/l5bzSIti2cQAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'image-upload': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/HLFZSrAnzo4AAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'input': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/HyVQTLyBv58AAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'number-keyboard': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/juu8RYs5f-cAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'number-input': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/v0WTRLe0iB4AAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'postscript': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/NqO6Q6TjnzkAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'picker': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/bo9xQYHeDQQAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'radio': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/n7KCRq77-akAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'rare-words-keyboard': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/juu8RYs5f-cAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'keyboard': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/E-nHTLq9WwUAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'selector': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/BirWR7qOHHYAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'slider': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/VJ63SJr06f4AAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'stepper': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/YCluTKy-ntAAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'switch': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/Ka3YTIyWtvUAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'loading': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/ckM4TZFDkzkAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'modal': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/Z1DiTbaqZbwAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'popover': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/fIN0SLGi1wIAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'popover-list': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/uJcdQoIVaCgAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'popup': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/qB_pTbp3rFoAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'rate': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/tj3xS5i6PmAAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'result': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/GRb-Rq_QN2IAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'skeleton': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/iQPaRaSv6vIAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'toast': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/8XTMTpEflwcAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'badge': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/GvkPS6VdUm0AAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'notice-bar': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/ApHOQqkF3UgAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'page-container': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/V3-KQYdvOS8AAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'voucher': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/ouVBQbV0LxMAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'card': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/fXO1TbJSX2QAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'sticky': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/s0HBSbfB_tUAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'countdown': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/0qx3TqMT2B4AAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'table': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/tbNfR7MwQMUAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'safe-area': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/5-A-TrkpTpkAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'select-contact': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/Loa6SoE0YiQAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n    'terms': {\n      imageUrl:\n        'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/gikRRYAcJqMAAAAAAAAAAAAADoEQAQFr/fmt.avif',\n    },\n  },\n};\n\n// 为组件添加 -en 英文文档路径下的图片\nObject.keys(ComponentSampleImages).forEach((mode) => {\n  const overviewConfig = ComponentSampleImages[mode];\n  Object.keys(overviewConfig).forEach((attr) => {\n    overviewConfig[attr + '-en'] = {\n      ...overviewConfig[attr],\n    };\n  });\n});\n"
  },
  {
    "path": ".dumi/theme/common/styles/Common.tsx",
    "content": "import { css, Global } from '@emotion/react';\nimport useSiteToken from '../../hooks/useSiteToken';\n\nexport default () => {\n  const {\n    token: { colorText, fontSize, fontFamily, lineHeight, colorBgContainer, anchorTop }\n  } = useSiteToken();\n\n  return (\n    <Global\n      styles={css`\n        html {\n          direction: initial;\n          height: 100%;\n\n          &.rtl {\n            direction: rtl;\n          }\n        }\n\n        body {\n          height: 100%;\n          overflow-x: hidden;\n          color: ${colorText};\n          font-size: ${fontSize}px;\n          font-family: ${fontFamily};\n          line-height: ${lineHeight};\n          background: ${colorBgContainer};\n          transition: background 1s cubic-bezier(0.075, 0.82, 0.165, 1);\n        }\n        #root {\n          min-height: 100%;\n        }\n        [id] {\n          scroll-margin-top: ${anchorTop}px;\n        }\n\n        [data-prefers-color='dark'] {\n          color-scheme: dark;\n        }\n\n        [data-prefers-color='light'] {\n          color-scheme: light;\n        }\n      `}\n    />\n  );\n};\n"
  },
  {
    "path": ".dumi/theme/common/styles/DumiDefaultStyleOverride.tsx",
    "content": "import { css, Global } from '@emotion/react';\nimport useSiteToken from '../../hooks/useSiteToken';\n\nconst PREFERS_COLOR_ATTR = 'data-prefers-color';\nconst prefix = 'dumi-default';\n\nexport default () => {\n  const { token } = useSiteToken();\n  return (\n    <Global\n      styles={css`\n        [${PREFERS_COLOR_ATTR}=dark] {\n          .markdown {\n            img {\n              opacity: 0.8;\n            }\n          }\n        }\n        .dumi-theme-antd-root {\n          .${prefix}-badge {\n            &:not([type]),\n            &[type='info'] {\n              color: ${token.colorPrimary};\n              background: ${token.colorPrimaryBg};\n            }\n            &[type='warning'] {\n              color: ${token.colorWarning};\n              background: ${token.colorWarningBg};\n            }\n            &[type='success'] {\n              color: ${token.colorSuccess};\n              background: ${token.colorSuccessBg};\n            }\n            &[type='error'] {\n              color: ${token.colorError};\n              background: ${token.colorErrorBg};\n            }\n          }\n          .${prefix}-container.markdown {\n            &[data-type='info'] {\n              color: ${token.colorPrimary};\n              background: ${token.colorPrimaryBg};\n            }\n            &[data-type='warning'] {\n              color: ${token.colorWarning};\n              background: ${token.colorWarningBg};\n            }\n            &[data-type='success'] {\n              color: ${token.colorSuccess};\n              background: ${token.colorSuccessBg};\n            }\n            &[data-type='error'] {\n              color: ${token.colorError};\n              background: ${token.colorErrorBg};\n            }\n          }\n          .${prefix}-content-tabs {\n              margin: 0 0 24px 0;\n              padding: 0;\n          }\n        }\n      `}\n    />\n  );\n};\n"
  },
  {
    "path": ".dumi/theme/common/styles/HeadingAnchor.tsx",
    "content": "import { css, Global } from '@emotion/react';\n\nexport default () => (\n  <Global\n    styles={css`\n      h1,\n      h2,\n      h3,\n      h4,\n      h5,\n      h6 {\n        > a[aria-hidden]:first-of-type {\n          float: left;\n          width: 20px;\n          padding-inline-end: 4px;\n          font-size: 0;\n          line-height: inherit;\n          text-align: right;\n          padding-inline-end: 4px;\n          margin-inline-start: -24px;\n\n          [data-direction='rtl'] & {\n            float: right;\n          }\n\n          &:hover {\n            border: 0;\n          }\n\n          > .icon-link::before {\n            font-size: 20px;\n            content: '#';\n          }\n        }\n\n        &:not(:hover) > a[aria-hidden]:first-of-type > .icon-link {\n          visibility: hidden;\n        }\n      }\n    `}\n  />\n);\n"
  },
  {
    "path": ".dumi/theme/common/styles/Highlight.tsx",
    "content": "import { css, Global } from '@emotion/react';\nimport useSiteToken from '../../hooks/useSiteToken';\n\nexport default () => {\n  const { token } = useSiteToken();\n\n  return (\n    <Global\n      styles={css`\n        pre code {\n          display: block;\n          padding: 16px 32px;\n          color: ${token.colorText};\n          font-size: ${token.fontSize}px;\n          font-family: 'Lucida Console', Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n          line-height: 2;\n          white-space: pre;\n          background: white;\n          border: 1px solid #e9e9e9;\n          border-radius: ${token.borderRadius}px;\n        }\n\n        code[class*='language-'],\n        pre[class*='language-'] {\n          color: ${token.siteTheme.includes('dark') ? 'rgba(255,255,255,0.85)' : 'black'};\n          font-family: 'Lucida Console', Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n          line-height: 1.5;\n          direction: ltr;\n          white-space: pre;\n          text-align: left;\n          word-wrap: normal;\n          word-break: normal;\n          word-spacing: normal;\n          tab-size: 4;\n          hyphens: none;\n          background: none;\n        }\n\n        code[class*='css'] {\n          direction: ltr;\n        }\n\n        pre[class*='language-'] ::selection,\n        code[class*='language-'] ::selection {\n          text-shadow: none;\n          background: #b3d4fc;\n        }\n\n        @media print {\n          code[class*='language-'],\n          pre[class*='language-'] {\n            text-shadow: none;\n          }\n        }\n\n        /* Code blocks */\n        pre[class*='language-'] {\n          margin: 16px 0;\n          padding: 12px 20px;\n          overflow: auto;\n        }\n\n        :not(pre) > code[class*='language-'],\n        pre[class*='language-'] {\n          background: #f5f5f5;\n        }\n\n        /* Inline code */\n        :not(pre) > code[class*='language-'] {\n          padding: 0.1em;\n          white-space: normal;\n          border-radius: 0.3em;\n        }\n\n        .token.comment,\n        .token.prolog,\n        .token.doctype,\n        .token.cdata {\n          color: slategray;\n        }\n\n        .token.punctuation {\n          color: #999;\n        }\n\n        .namespace {\n          opacity: 0.7;\n        }\n\n        .markdown {\n          .token.property,\n          .token.tag,\n          .token.boolean,\n          .token.number,\n          .token.constant,\n          .token.symbol,\n          .token.deleted {\n            color: #f81d22;\n          }\n\n          .token.selector,\n          .token.attr-name,\n          .token.string,\n          .token.char,\n          .token.builtin,\n          .token.inserted {\n            color: #9a6e3a;\n          }\n\n          .token.operator,\n          .token.entity,\n          .token.url,\n          .language-css .token.string,\n          .style .token.string {\n            color: #9a6e3a;\n          }\n\n          .token.atrule,\n          .token.attr-value,\n          .token.keyword {\n            color: #008dff;\n          }\n\n          .token.function {\n            color: #f81d22;\n          }\n\n          .token.regex,\n          .token.important,\n          .token.variable {\n            color: #e90;\n          }\n\n          .token.important,\n          .token.bold {\n            font-weight: bold;\n          }\n\n          .token.italic {\n            font-style: italic;\n          }\n\n          .token.entity {\n            cursor: help;\n          }\n\n          .token.comment {\n            font-style: normal;\n          }\n        }\n      `}\n    />\n  );\n};\n"
  },
  {
    "path": ".dumi/theme/common/styles/Markdown.tsx",
    "content": "import { TinyColor } from '@ctrl/tinycolor';\nimport { css, Global } from '@emotion/react';\nimport useSiteToken from '../../hooks/useSiteToken';\n\nexport default () => {\n  const { token } = useSiteToken();\n\n  const { antCls } = token;\n\n  const demoGridColor = token.colorPrimary;\n\n  return (\n    <Global\n      styles={css`\n        .markdown {\n          color: ${token.colorText};\n          font-size: 14px;\n          line-height: 2;\n        }\n\n        .highlight {\n          line-height: 1.5;\n        }\n\n        .markdown img {\n          max-width: calc(100% - 32px);\n          max-height: 100%;\n        }\n\n        .markdown p > img {\n          margin: 34px 0;\n          box-shadow: 0 8px 20px rgba(143, 168, 191, 0.35);\n        }\n\n        .markdown p > img.markdown-inline-image {\n          margin: 0;\n          box-shadow: none;\n        }\n\n        .markdown h1 {\n          margin-top: 8px;\n          margin-bottom: 20px;\n          color: ${token.colorTextHeading};\n          font-weight: 500;\n          font-size: 30px;\n          font-family: Avenir, ${token.fontFamily}, sans-serif;\n          line-height: 38px;\n\n          .subtitle {\n            margin-left: 12px;\n          }\n        }\n\n        .markdown h2 {\n          font-size: 24px;\n          line-height: 32px;\n        }\n\n        .markdown h2,\n        .markdown h3,\n        .markdown h4,\n        .markdown h5,\n        .markdown h6 {\n          clear: both;\n          margin: 1.6em 0 0.6em;\n          color: ${token.colorTextHeading};\n          font-weight: 500;\n          font-family: Avenir, ${token.fontFamily}, sans-serif;\n        }\n\n        .markdown h3 {\n          font-size: 18px;\n        }\n\n        .markdown h4 {\n          font-size: 16px;\n        }\n\n        .markdown h5 {\n          font-size: 14px;\n        }\n\n        .markdown h6 {\n          font-size: 12px;\n        }\n\n        .markdown hr {\n          clear: both;\n          height: 1px;\n          margin: 24px 0;\n          background: ${token.colorSplit};\n          border: 0;\n        }\n\n        .markdown p,\n        .markdown pre {\n          margin: 1em 0;\n\n          ${antCls}-row-rtl & {\n            direction: rtl;\n            text-align: right;\n          }\n        }\n\n        .markdown ul > li {\n          margin-left: 20px;\n          padding-left: 4px;\n\n          .rtl & {\n            margin-right: 20px;\n            margin-left: 0;\n            padding-right: 4px;\n            padding-left: 0;\n          }\n\n          &:empty {\n            display: none;\n          }\n        }\n\n        .markdown ol > li {\n          margin-left: 20px;\n          padding-left: 4px;\n          list-style-type: decimal;\n\n          ${antCls}-row-rtl & {\n            margin-right: 20px;\n            margin-left: 0;\n            padding-right: 4px;\n            padding-left: 0;\n          }\n        }\n\n        .markdown ul > li > p,\n        .markdown ol > li > p {\n          margin: 0.2em 0;\n        }\n\n        .markdown code {\n          margin: 0 1px;\n          padding: 0.2em 0.4em;\n          font-size: 0.9em;\n          background: ${token.siteMarkdownCodeBg};\n          border-radius: 3px;\n          color: #d56161;\n          font-family: ${token.codeFamily};\n        }\n\n        .ant-alert code {\n          color: #d56161;\n          font-family: ${token.codeFamily};\n        }\n        .markdown pre {\n          font-family: ${token.codeFamily};\n          background: ${token.siteMarkdownCodeBg};\n          border-radius: ${token.borderRadius}px;\n        }\n\n        .markdown pre code {\n          margin: 0;\n          padding: 0;\n          overflow: auto;\n          color: ${token.colorText};\n          font-size: ${Math.max(token.fontSize - 1, 12)}px;\n          direction: ltr;\n          text-align: left;\n          background: #f5f5f5;\n          border: none;\n        }\n\n        .markdown strong,\n        .markdown b {\n          font-weight: 500;\n        }\n\n        .markdown .dumi-default-source-code {\n          margin: 1em 0;\n          background-color: ${token.siteMarkdownCodeBg};\n          border-radius: ${token.borderRadius}px;\n          > pre.prism-code {\n            padding: 12px 20px;\n            font-size: 13px;\n            line-height: 2;\n          }\n        }\n\n        .pic-plus {\n          & > * {\n            display: inline-block !important;\n            vertical-align: middle;\n          }\n          span {\n            margin: 0 20px;\n            color: #aaa;\n            font-size: 30px;\n          }\n        }\n        .antd-site-snippet {\n          .ant-tabs-tab {\n            .snippet-label {\n              display: flex;\n              align-items: center;\n              justify-content: center;\n              svg {\n                margin-inline-end: 8px;\n              }\n            }\n          }\n          .dumi-default-source-code {\n            margin: 0 auto;\n            background-color: ${token.siteMarkdownCodeBg};\n            border-radius: ${token.borderRadius}px;\n            > pre.prism-code {\n              padding: 12px 20px;\n              font-size: 13px;\n              line-height: 2;\n            }\n          }\n        }\n\n        .markdown table td > a:not(:last-child) {\n          margin-right: 0 !important;\n\n          &::after {\n            position: relative !important;\n          }\n        }\n\n        .markdown blockquote {\n          margin: 1em 0;\n          padding-left: 0.8em;\n          color: ${token.colorTextSecondary};\n          font-size: 90%;\n          border-left: 4px solid ${token.colorSplit};\n\n          .rtl & {\n            padding-right: 0.8em;\n            padding-left: 0;\n            border-right: 4px solid ${token.colorSplit};\n            border-left: none;\n          }\n        }\n\n        .markdown blockquote p {\n          margin: 0;\n        }\n\n        .markdown .anchor {\n          margin-left: 8px;\n          opacity: 0;\n          transition: opacity 0.3s;\n\n          .rtl & {\n            margin-right: 8px;\n            margin-left: 0;\n          }\n        }\n\n        .markdown .waiting {\n          color: #ccc;\n          cursor: not-allowed;\n        }\n\n        .markdown a.edit-button {\n          display: inline-block;\n          margin-left: 8px;\n          text-decoration: none;\n\n          .rtl & {\n            margin-right: 8px;\n            margin-left: 0;\n            transform: rotateY(180deg);\n          }\n\n          ${antCls}icon {\n            display: block;\n            color: ${token.colorTextSecondary};\n            font-size: 16px;\n            transition: all 0.3s;\n\n            &:hover {\n              color: ${token.colorText};\n            }\n          }\n        }\n\n        .markdown h1:hover .anchor,\n        .markdown h2:hover .anchor,\n        .markdown h3:hover .anchor,\n        .markdown h4:hover .anchor,\n        .markdown h5:hover .anchor,\n        .markdown h6:hover .anchor {\n          display: inline-block;\n          opacity: 1;\n        }\n\n        .markdown > br,\n        .markdown > p > br {\n          clear: both;\n        }\n\n        .markdown .dumi-default-table {\n          table {\n            margin: 0;\n            overflow-x: auto;\n            overflow-y: hidden;\n            direction: ltr;\n            empty-cells: show;\n            border: 1px solid ${token.colorSplit};\n            border-collapse: collapse;\n            border-spacing: 0;\n\n            th,\n            td {\n              padding: 12px 24px;\n              text-align: left;\n              border: 1px solid ${token.colorSplit};\n\n              &:first-of-type {\n                border-left: 1px solid ${token.colorSplit};\n              }\n\n              &:last-child {\n                border-right: 1px solid ${token.colorSplit};\n              }\n\n              img {\n                max-width: unset;\n              }\n            }\n\n            th {\n              color: #5c6b77;\n              font-weight: 500;\n              white-space: nowrap;\n              background: rgba(0, 0, 0, 0.02);\n              border-width: 1px 1px 2px;\n            }\n\n            tbody tr {\n              transition: all 0.3s;\n\n              &:hover {\n                background: rgba(60, 90, 100, 0.04);\n              }\n            }\n          }\n\n          .dumi-default-table-content {\n            table {\n              width: 100%;\n              margin: 0;\n              overflow-x: auto;\n              overflow-y: hidden;\n              font-size: ${Math.max(token.fontSize - 1, 12)}px;\n              font-family: ${token.codeFamily};\n              line-height: ${token.lineHeight};\n              border: 1px solid ${token.colorSplit};\n              border-width: 0 1px;\n              th {\n                border-width: 1px 0 2px;\n              }\n              td {\n                border-width: 1px 0;\n              }\n            }\n          }\n        }\n\n        .grid-demo,\n        [id^='components-grid-demo-'] {\n          ${antCls}-row > div,\n            .code-box-demo ${antCls}-row > div {\n            min-height: 30px;\n            margin-top: 8px;\n            margin-bottom: 8px;\n            color: #fff;\n            text-align: center;\n            border-radius: 0;\n          }\n\n          .code-box-demo ${antCls}-row > div:not(.gutter-row) {\n            padding: 16px 0;\n            background: ${demoGridColor};\n\n            &:nth-of-type(2n + 1) {\n              background: ${new TinyColor(demoGridColor).setAlpha(0.75).toHex8String()};\n            }\n          }\n\n          ${antCls}-row .demo-col,\n            .code-box-demo ${antCls}-row .demo-col {\n            margin-top: 0;\n            margin-bottom: 0;\n            padding: 30px 0;\n            color: ${token.colorWhite};\n            font-size: 18px;\n            text-align: center;\n            border: none;\n          }\n\n          ${antCls}-row .demo-col-1 {\n            background: ${new TinyColor(demoGridColor).setAlpha(0.75).toHexString()};\n          }\n\n          ${antCls}-row .demo-col-2,\n            .code-box-demo ${antCls}-row .demo-col-2 {\n            background: ${new TinyColor(demoGridColor).setAlpha(0.75).toHexString()};\n          }\n\n          ${antCls}-row .demo-col-3,\n            .code-box-demo ${antCls}-row .demo-col-3 {\n            color: #999;\n            background: rgba(255, 255, 255, 0.2);\n          }\n\n          ${antCls}-row .demo-col-4,\n            .code-box-demo ${antCls}-row .demo-col-4 {\n            background: ${new TinyColor(demoGridColor).setAlpha(0.6).toHexString()};\n          }\n\n          ${antCls}-row .demo-col-5,\n            .code-box-demo ${antCls}-row .demo-col-5 {\n            color: #999;\n            background: rgba(255, 255, 255, 0.2);\n          }\n\n          .code-box-demo .height-100 {\n            height: 100px;\n            line-height: 100px;\n          }\n\n          .code-box-demo .height-50 {\n            height: 50px;\n            line-height: 50px;\n          }\n\n          .code-box-demo .height-120 {\n            height: 120px;\n            line-height: 120px;\n          }\n\n          .code-box-demo .height-80 {\n            height: 80px;\n            line-height: 80px;\n          }\n        }\n\n        [id='components-grid-demo-playground'],\n        [id='components-grid-demo-gutter'] {\n          > .code-box-demo ${antCls}-row > div {\n            margin-top: 0;\n            margin-bottom: 0;\n          }\n        }\n      `}\n    />\n  );\n};\n"
  },
  {
    "path": ".dumi/theme/common/styles/PreviewImage.tsx",
    "content": "import { css, Global } from '@emotion/react';\nimport useSiteToken from '../../hooks/useSiteToken';\n\nexport default () => {\n  const { token } = useSiteToken();\n\n  return (\n    <Global\n      styles={css`\n        .preview-image-boxes {\n          display: flex;\n\n          &-with-carousel {\n            width: 420px;\n\n            .preview-image-box img {\n              padding: 0;\n            }\n          }\n\n          .ant-row-rtl & {\n            float: left;\n            margin: 0 64px 70px 0;\n          }\n        }\n        .preview-image-boxes-float {\n          float: right;\n          clear: both;\n          width: 496px;\n          margin: 0 0 70px 64px;\n        }\n        .preview-image-boxes-pure {\n          .preview-image-box img {\n            padding: 0;\n          }\n        }\n        .preview-image-boxes + .preview-image-boxes {\n          margin-top: -35px;\n        }\n\n        .preview-image-box {\n          float: left;\n          width: 100%;\n        }\n\n        .preview-image-box + .preview-image-box {\n          margin-left: 24px;\n\n          .ant-row-rtl & {\n            margin-right: 24px;\n            margin-left: 0;\n          }\n        }\n\n        .preview-image-wrapper {\n          position: relative;\n          display: inline-block;\n          width: 100%;\n          padding: 16px;\n          text-align: center;\n          background: #f2f4f5;\n          box-sizing: border-box;\n        }\n\n        .preview-image-wrapper.video {\n          display: block;\n          padding: 0;\n          background: 0;\n        }\n\n        .preview-image-wrapper video {\n          display: block;\n          width: 100%;\n\n          + svg {\n            position: absolute;\n            top: 0;\n            left: 0;\n          }\n        }\n\n        .preview-image-wrapper.good::after {\n          position: absolute;\n          bottom: 0;\n          left: 0;\n          display: block;\n          width: 100%;\n          height: 3px;\n          background: ${token.colorPrimary};\n          content: '';\n        }\n\n        .preview-image-wrapper.bad::after {\n          position: absolute;\n          bottom: 0;\n          left: 0;\n          display: block;\n          width: 100%;\n          height: 3px;\n          background: ${token.colorError};\n          content: '';\n        }\n\n        .preview-image-title {\n          margin-top: 20px;\n          color: ${token.colorText};\n          font-size: 12px;\n        }\n\n        .preview-image-description {\n          margin-top: 2px;\n          color: ${token.colorTextSecondary};\n          font-size: 12px;\n          line-height: 1.5;\n        }\n\n        .preview-image-description hr {\n          margin: 2px 0;\n          background: none;\n          border: 0;\n        }\n\n        .preview-image-box img {\n          box-sizing: border-box;\n          max-width: 100%;\n          padding: 12px;\n          background: ${token.colorBgContainer};\n          border-radius: ${token.borderRadius}px;\n          cursor: pointer;\n          transition: all 0.3s;\n\n          &.no-padding {\n            padding: 0;\n            background: none;\n          }\n        }\n\n        .preview-image-boxes.preview-image-boxes-with-carousel img {\n          padding: 0;\n          box-shadow: 0 1px 0 0 #ddd, 0 3px 0 0 ${token.colorBgContainer}, 0 4px 0 0 #ddd,\n            0 6px 0 0 ${token.colorBgContainer}, 0 7px 0 0 #ddd;\n        }\n\n        .preview-image-box img:hover {\n          box-shadow: 1px 1px 6px rgba(0, 0, 0, 0.3);\n        }\n\n        .transition-video-player,\n        .motion-video-min {\n          float: right;\n          width: 600px;\n          padding: 0 0 70px 20px;\n\n          .preview-image-wrapper {\n            padding: 0;\n          }\n\n          .ant-row-rtl & {\n            float: left;\n          }\n        }\n\n        .motion-video-min {\n          width: 390px;\n        }\n\n        .motion-principle-wrapper {\n          width: 100%;\n          max-width: 900px;\n          margin: 48px 0 24px;\n        }\n\n        .principle-wrapper {\n          width: 100%;\n\n          .principle {\n            display: inline-block;\n            box-sizing: border-box;\n            width: 100%;\n            min-height: 180px;\n            margin-right: 12.5%;\n            margin-bottom: 24px;\n            padding: 24px;\n            font-size: 24px;\n            text-align: center;\n            border: 1px solid #e8e8e8;\n            border-radius: 4px;\n\n            &:last-child {\n              margin-right: 0;\n            }\n\n            h4 {\n              margin: 16px 0 8px;\n            }\n\n            p {\n              font-size: 12px;\n              line-height: 24px;\n            }\n          }\n        }\n      `}\n    />\n  );\n};\n"
  },
  {
    "path": ".dumi/theme/common/styles/Reset.tsx",
    "content": "import { css, Global } from '@emotion/react';\n\nexport default () => (\n  <Global\n    styles={css`\n      body,\n      div,\n      dl,\n      dt,\n      dd,\n      ul,\n      ol,\n      li,\n      h1,\n      h2,\n      h3,\n      h4,\n      h5,\n      h6,\n      pre,\n      code,\n      form,\n      fieldset,\n      legend,\n      input,\n      textarea,\n      p,\n      blockquote,\n      th,\n      td,\n      hr,\n      button,\n      article,\n      aside,\n      details,\n      figcaption,\n      figure,\n      footer,\n      header,\n      hgroup,\n      menu,\n      nav,\n      section {\n        margin: 0;\n        padding: 0;\n      }\n      Í ul,\n      ol {\n        list-style: none;\n      }\n\n      img {\n        vertical-align: middle;\n        border-style: none;\n      }\n    `}\n  />\n);\n"
  },
  {
    "path": ".dumi/theme/common/styles/Responsive.tsx",
    "content": "import { css, Global } from '@emotion/react';\nimport useSiteToken from '../../hooks/useSiteToken';\n\nexport default () => {\n  const { token } = useSiteToken();\n\n  return (\n    <Global\n      styles={css`\n        .nav-phone-icon {\n          position: absolute;\n          top: 25px;\n          right: 30px;\n          z-index: 1;\n          display: none;\n          width: 16px;\n          height: 22px;\n          cursor: pointer;\n        }\n\n        @media only screen and (max-width: ${token.screenLG}px) {\n          .code-boxes-col-2-1,\n          .code-boxes-col-1-1 {\n            float: none;\n            width: 100%;\n            max-width: unset;\n          }\n        }\n\n        @media only screen and (max-width: 767.99px) {\n          .preview-image-boxes {\n            float: none;\n            width: 100%;\n            margin: 0 !important;\n          }\n\n          .preview-image-box {\n            width: 100%;\n            margin: 10px 0;\n            padding: 0;\n          }\n\n          .image-wrapper {\n            display: none;\n          }\n\n          div.version {\n            display: block;\n            margin: 29px auto 16px;\n          }\n\n          .toc {\n            display: none;\n          }\n\n          .nav-phone-icon {\n            display: block;\n          }\n\n          .main {\n            height: calc(100% - 86px);\n          }\n\n          .aside-container {\n            float: none;\n            width: auto;\n            padding-bottom: 30px;\n            border-right: 0;\n          }\n\n          .ant-row-rtl {\n            margin-right: 0;\n            margin-left: 0;\n            padding-right: 16px;\n            padding-left: 16px;\n\n            > .markdown > * {\n              width: 100% !important;\n            }\n          }\n\n          .main-wrapper {\n            width: 100%;\n            margin: 0;\n            border-radius: 0;\n          }\n\n          .prev-next-nav {\n            width: ~'calc(100% - 32px)';\n            margin-left: 16px;\n\n            .ant-row-rtl & {\n              margin-right: 16px;\n              margin-left: 64px;\n            }\n          }\n\n          .drawer {\n            .ant-menu-inline .ant-menu-item::after,\n            .ant-menu-vertical .ant-menu-item::after {\n              right: auto;\n              left: 0;\n            }\n          }\n\n          /** home 区块 **/\n          .home-page-wrapper {\n            .page {\n              h2 {\n                margin: 80px auto 64px;\n              }\n            }\n\n            .parallax-bg {\n              display: none;\n            }\n          }\n\n          .banner {\n            display: block;\n            height: 632px;\n\n            &-bg-wrapper {\n              display: none;\n            }\n\n            .img-wrapper,\n            .text-wrapper {\n              display: inline-block;\n              width: 100%;\n              min-width: unset;\n              max-width: unset;\n              margin: auto;\n              text-align: center;\n            }\n\n            .img-wrapper {\n              position: initial;\n              margin-top: 20px;\n              text-align: center;\n\n              svg {\n                width: 100%;\n                max-width: 260px;\n                height: auto;\n                margin: 0 auto;\n              }\n            }\n\n            .text-wrapper {\n              min-height: 200px;\n              margin-top: 32px;\n              padding: 0;\n\n              h1 {\n                display: none;\n              }\n\n              p {\n                color: #314659;\n                font-size: 14px;\n                line-height: 28px;\n              }\n\n              .banner-btns {\n                display: block;\n                min-width: 100%;\n                white-space: nowrap;\n                text-align: center;\n\n                .banner-btn {\n                  padding: 0 20px;\n                  font-size: 14px;\n                }\n              }\n\n              .banner-promote {\n                min-width: 100%;\n                margin-top: 32px;\n\n                .ant-divider {\n                  display: none;\n                }\n\n                a {\n                  font-size: 14px;\n                  white-space: nowrap;\n\n                  img {\n                    width: 20px;\n                  }\n                }\n              }\n            }\n          }\n\n          .page1 {\n            min-height: 1300px;\n\n            .ant-row {\n              margin: 24px auto 64px;\n\n              > div {\n                margin-bottom: 48px;\n              }\n            }\n          }\n\n          .page2 {\n            min-height: 840px;\n            background: ${token.colorBgContainer};\n\n            &-content {\n              box-shadow: none;\n            }\n\n            &-components {\n              display: none;\n            }\n\n            &-product {\n              min-height: auto;\n              padding: 0 16px;\n\n              .product-block {\n                margin-bottom: 34px;\n                padding-bottom: 35px;\n                border-bottom: 1px solid ${token.colorSplit};\n\n                &:last-child {\n                  margin-bottom: 32px;\n                  border-bottom: none;\n\n                  .block-text-wrapper {\n                    height: auto;\n                  }\n                }\n\n                .block-image-wrapper {\n                  height: 88px;\n\n                  img {\n                    height: 100%;\n                  }\n                }\n\n                .block-text-wrapper {\n                  padding-bottom: 0;\n                  border-bottom: none;\n\n                  h4 {\n                    margin-bottom: 4px;\n                    font-size: 18px;\n                    line-height: 24px;\n                  }\n\n                  p {\n                    margin-bottom: 8px;\n                    font-size: 12px;\n                    line-height: 20px;\n                  }\n\n                  a {\n                    line-height: 20px;\n                  }\n\n                  .components-button-wrapper {\n                    margin-top: 16px;\n                    font-size: 12px;\n\n                    a {\n                      display: block;\n                    }\n                  }\n\n                  a.more-mobile-react,\n                  a.more-mobile-angular {\n                    margin-top: 0;\n                    color: ${token.colorLink};\n                  }\n\n                  a.more-mobile-react:hover,\n                  a.more-mobile-angular:hover {\n                    color: #40a9ff;\n                  }\n                }\n              }\n            }\n          }\n\n          .page3 {\n            min-height: 688px;\n            background: url('https://gw.alipayobjects.com/zos/rmsportal/qICoJIqqQRMeRGhPHBBS.svg')\n              no-repeat;\n            background-size: cover;\n\n            .ant-row {\n              margin: 0 8px;\n            }\n\n            .page3-block {\n              margin-bottom: 32px;\n              padding: 24px;\n              background: ${token.colorBgContainer};\n              border-radius: 4px;\n              box-shadow: 0 8px 16px rgba(174, 185, 193, 0.3);\n\n              &:nth-of-type(2) {\n                .page3-img-wrapper img {\n                  display: block;\n                  width: 70%;\n                  margin: auto;\n                }\n              }\n\n              p {\n                font-size: 12px;\n              }\n\n              .page3-img-wrapper {\n                width: 20%;\n\n                img {\n                  width: 100%;\n                }\n              }\n\n              .page3-text-wrapper {\n                width: 80%;\n                max-width: initial;\n                margin: 0;\n                padding-left: 16px;\n              }\n            }\n          }\n        }\n      `}\n    />\n  );\n};\n"
  },
  {
    "path": ".dumi/theme/common/styles/SearchBar.tsx",
    "content": "import { css, Global } from '@emotion/react';\nimport useSiteToken from '../../hooks/useSiteToken';\n\nconst THEME_PREFIX = 'dumi-default-';\n\nexport default () => {\n  const { token } = useSiteToken();\n\n  return (\n    <Global\n      styles={css`\n        html {\n          .${THEME_PREFIX}search-bar {\n            &-input {\n              color: ${token.colorText};\n              background: ${token.colorBgContainer};\n              &:focus {\n                background: ${token.colorBgContainer};\n              }\n              &::placeholder {\n                color: ${token.colorTextPlaceholder} !important;\n              }\n            }\n          }\n          .${THEME_PREFIX}search-popover {\n            background-color: ${token.colorBgElevated} !important;\n            &::before {\n              border-bottom-color: ${token.colorBgElevated} !important;\n            }\n          }\n          .${THEME_PREFIX}search-result {\n            dl {\n              dt {\n                background-color: ${token.controlItemBgActive} !important;\n              }\n              dd {\n                a {\n                  &:hover {\n                    background-color: ${token.controlItemBgHover};\n                    h4,\n                    p {\n                      color: ${token.colorText} !important;\n                    }\n                    svg {\n                      fill: ${token.colorText} !important;\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      `}\n    />\n  );\n};\n"
  },
  {
    "path": ".dumi/theme/common/styles/index.ts",
    "content": "export { default as Common } from './Common';\nexport { default as DumiDefaultStyleOverride } from './DumiDefaultStyleOverride';\nexport { default as HeadingAnchor } from './HeadingAnchor';\nexport { default as Highlight } from './Highlight';\nexport { default as Markdown } from './Markdown';\nexport { default as Reset } from './Reset';\nexport { default as Responsive } from './Responsive';\nexport { default as SearchBar } from './SearchBar';\nexport { default as PreviewImage } from './PreviewImage';\n"
  },
  {
    "path": ".dumi/theme/defineThemeConfig/index.ts",
    "content": "import type { IAllThemeConfig } from '../types';\n\n/**\n * @description provider declaration of config files\n * @param {ThemeConfig} config theme config\n * @returns {ThemeConfig}\n */\nexport function defineThemeConfig(config: Partial<IAllThemeConfig>): Partial<IAllThemeConfig> {\n  return config;\n}\n"
  },
  {
    "path": ".dumi/theme/global.d.ts",
    "content": "interface Window {\n  setMsgToSim?: (miniCode: string) => void; // 像模拟器通信\n}\n"
  },
  {
    "path": ".dumi/theme/hooks/useAdditionalThemeConfig.ts",
    "content": "// 获取 dumi-theme-antd 额外的配置\nimport { useSiteData } from 'dumi';\n\nimport type { IAllThemeConfig } from '../types';\n\ninterface IuseAdditionalThemeConfig {\n  (): IAllThemeConfig;\n}\n\nconst useAdditionalThemeConfig: IuseAdditionalThemeConfig = () => {\n  const { themeConfig } = useSiteData();\n  const additionalThemeConfig = themeConfig;\n\n  return additionalThemeConfig;\n};\n\nexport default useAdditionalThemeConfig;\n"
  },
  {
    "path": ".dumi/theme/hooks/useLocaleValue.ts",
    "content": "import { useLocale, useSiteData } from 'dumi';\nimport type { IAllThemeConfig } from '../types';\n\nexport default function useLocaleValue(key: string) {\n  const { themeConfig } = useSiteData();\n  const locale = useLocale();\n\n  const additionalThemeConfig: IAllThemeConfig = themeConfig;\n  const value = additionalThemeConfig[key];\n  return value?.[locale.id] ?? value;\n}\n"
  },
  {
    "path": ".dumi/theme/hooks/useMenu.tsx",
    "content": "import type { MenuProps } from 'antd';\nimport { Tag } from 'antd';\nimport {\n  Link,\n  useFullSidebarData,\n  useLocale,\n  useLocation,\n  useSidebarData,\n} from 'dumi';\nimport type { ReactNode } from 'react';\nimport { useMemo } from 'react';\nimport pkgJSON from '../../../package.json';\nimport type {\n  ISidebarGroupModePathItem,\n} from '../types';\nimport { handleFullSidebarData, removeTitleCode } from '../utils';\nimport useAdditionalThemeConfig from './useAdditionalThemeConfig';\n\nexport type UseMenuOptions = {\n  before?: ReactNode;\n  after?: ReactNode;\n};\n\nconst useMenu = (\n  options: UseMenuOptions = {},\n): [MenuProps['items'], string] => {\n  const { pathname, search } = useLocation();\n  const { sidebarGroupModePath } =\n    useAdditionalThemeConfig();\n  const { before, after } = options;\n\n  const fullSidebarData = useFullSidebarData();\n  const navSecondSidebarData = handleFullSidebarData(fullSidebarData);\n  const locale = useLocale();\n\n  // 提取一级导航下侧边栏数据\n  const currentNavKey = `/${pathname.split('/')?.[1]}`;\n  const sidebarData = navSecondSidebarData[currentNavKey];\n\n  const menuItems = useMemo<MenuProps['items']>(() => {\n    const suffixRegExp = new RegExp(`${(locale as any)?.suffix ?? ''}$`, 'g');\n    const sidebarItems = [...(sidebarData ?? [])];\n\n    const getItemTag = (\n      tag: string | { color: string; title: string },\n      show = true,\n    ) =>\n      tag &&\n      show && (\n        <Tag\n          color={typeof tag === 'string' ? 'processing' : tag.color}\n          bordered={false}\n          style={{\n            marginInlineStart: 'auto',\n            marginInlineEnd: 0,\n            marginTop: -2,\n          }}\n        >\n          {(typeof tag === 'string' ? tag : tag.title).replace(\n            'VERSION',\n            `v${pkgJSON.version}`,\n          )}\n        </Tag>\n      );\n\n    return (\n      sidebarItems?.reduce<\n        Exclude<MenuProps['items'] | { order?: number }[], undefined>\n      >((result, group) => {\n        if (group?.title) {\n          // sideBar menu group 模式, 默认以非 group 模式渲染\n          const isSideBarGroupMode =\n            sidebarGroupModePath === true\n              ? true\n              : (sidebarGroupModePath ?? []).filter(\n                  (rule: ISidebarGroupModePathItem) => {\n                    return pathname.startsWith(rule);\n                  },\n                ).length > 0;\n\n          if (isSideBarGroupMode) {\n            result.push({\n              type: 'group',\n              label: group?.title,\n              order: group?.order,\n              key: group?.title,\n              children: group.children?.map((item) => ({\n                label: (\n                  <Link\n                    to={`${item.link}${search}`}\n                    style={{ display: 'flex', alignItems: 'center' }}\n                  >\n                    {before}\n                    <span key=\"english\">{removeTitleCode(item?.title)}</span>\n                    <span className=\"chinese\" key=\"chinese\">\n                      {removeTitleCode(item.frontmatter?.subtitle)}\n                    </span>\n                    {getItemTag(item.frontmatter?.tag, !before && !after)}\n                    {after}\n                  </Link>\n                ),\n                key: item.link.replace(suffixRegExp, ''),\n              })),\n            });\n          } else {\n            const childrenResultTypeOrder = {};\n            const childrenGroup = group.children.reduce<\n              Record<\n                string,\n                ReturnType<typeof useSidebarData>[number]['children']\n              >\n            >((childrenResult, child) => {\n              const nextChildrenResult = childrenResult;\n              const childType = child?.frontmatter?.type;\n              // 兼容 type 为字符串 && object，object 支持排序\n              const type =\n                typeof childType === 'string'\n                  ? childType\n                  : childType?.title ?? 'default';\n\n              if (!nextChildrenResult[type]) {\n                nextChildrenResult[type] = [];\n              }\n              if (!childrenResultTypeOrder[type]) {\n                childrenResultTypeOrder[type] = {\n                  title: type,\n                  order: childType?.order ?? -1,\n                };\n              } else if (childType?.order) {\n                childrenResultTypeOrder[type].order = childType.order;\n              }\n\n              nextChildrenResult[type].push(child);\n              return nextChildrenResult;\n            }, {});\n\n            const childrenGroupOrdered = Object.keys(childrenGroup)\n              .sort(\n                (a, b) =>\n                  childrenResultTypeOrder[a].order -\n                  childrenResultTypeOrder[b].order,\n              )\n              .reduce<\n                Record<\n                  string,\n                  ReturnType<typeof useSidebarData>[number]['children']\n                >\n              >((obj, key) => {\n                const _obj = obj;\n                _obj[key] = childrenGroup[key];\n                return _obj;\n              }, {});\n\n            const childItems: any[] = [];\n            childItems.push(\n              ...(childrenGroupOrdered.default?.map((item) => ({\n                label: (\n                  <Link\n                    to={`${item.link}${search}`}\n                    style={{ display: 'flex', alignItems: 'center' }}\n                  >\n                    {before}\n                    {removeTitleCode(item?.title)}\n                    {getItemTag(item.frontmatter?.tag, !before && !after)}\n                    {after}\n                  </Link>\n                ),\n                key: item.link.replace(suffixRegExp, ''),\n              })) ?? []),\n            );\n            Object.entries(childrenGroupOrdered).forEach(([type, children]) => {\n              if (type !== 'default') {\n                childItems.push({\n                  type: 'group',\n                  label: type,\n                  key: type,\n                  children: children?.map((item) => ({\n                    label: (\n                      <Link\n                        to={`${item.link}${search}`}\n                        style={{ display: 'flex', alignItems: 'center' }}\n                      >\n                        {before}\n                        {removeTitleCode(item?.title)}\n                        {getItemTag(item.frontmatter?.tag, !before && !after)}\n                        {after}\n                      </Link>\n                    ),\n                    key: item.link.replace(suffixRegExp, ''),\n                  })),\n                });\n              }\n            });\n            result.push({\n              label: group?.title,\n              key: group?.title,\n              order: group?.order,\n              children: childItems,\n            });\n          }\n        } else {\n          const list = group.children || [];\n          // 如果有 date 字段，我们就对其进行排序\n          if (list.every((info) => info?.frontmatter?.date)) {\n            list.sort((a, b) =>\n              a?.frontmatter?.date > b?.frontmatter?.date ? -1 : 1,\n            );\n          }\n\n          result.push(\n            ...list.map((item) => ({\n              order: item?.order,\n              label: (\n                <Link\n                  to={`${item.link}${search}`}\n                  style={{ display: 'flex', alignItems: 'center' }}\n                >\n                  {before}\n                  {removeTitleCode(item?.title)}\n                  {getItemTag(item.frontmatter?.tag, !before && !after)}\n                  {after}\n                </Link>\n              ),\n              key: item.link.replace(suffixRegExp, ''),\n            })),\n          );\n        }\n\n        // group 模式与 single 模式混合排序\n        result.sort((a, b) => (a?.order < b?.order ? -1 : 1));\n        return result;\n      }, []) ?? []\n    );\n  }, [\n    sidebarData,\n    sidebarGroupModePath,\n    pathname,\n    search,\n    before,\n    after,\n    locale,\n  ]);\n\n  const selectedKey = pathname.replace(\n    new RegExp(`${(locale as any)?.suffix ?? ''}$`, 'g'),\n    '',\n  );\n\n  return [menuItems, selectedKey];\n};\n\nexport default useMenu;\n"
  },
  {
    "path": ".dumi/theme/hooks/useSiteToken.ts",
    "content": "import { TinyColor } from '@ctrl/tinycolor';\nimport { theme } from 'antd';\nimport type { GlobalToken } from 'antd';\nimport { ConfigContext } from 'antd/lib/config-provider';\nimport { useContext } from 'react';\nimport SiteContext from '../slots/SiteContext';\nimport type { SiteContextProps } from '../slots/SiteContext';\n\ninterface IUseSiteToken {\n  token: GlobalToken & {\n    headerHeight: number;\n    menuItemBorder: number;\n    mobileMaxWidth: number;\n    siteMarkdownCodeBg: string;\n    antCls: string;\n    iconCls: string;\n    marginFarXS: number;\n    marginFarSM: number;\n    marginFar: number;\n    codeFamily: string;\n    contentMarginTop: number;\n    anchorTop: number;\n    boxShadowCard: string;\n    siteTheme: SiteContextProps['theme'];\n  };\n  siteCls: string;\n}\nconst { useToken } = theme;\n\nconst headerHeight = 64;\n\nconst boxShadowCard = `\n0 1px 2px -2px ${new TinyColor('rgba(0, 0, 0, 0.16)').toRgbString()},\n0 3px 6px 0 ${new TinyColor('rgba(0, 0, 0, 0.12)').toRgbString()},\n0 5px 12px 4px ${new TinyColor('rgba(0, 0, 0, 0.09)').toRgbString()}\n`;\n\nconst useSiteToken = (): IUseSiteToken => {\n  const result = useToken();\n  const { getPrefixCls, iconPrefixCls } = useContext(ConfigContext);\n  const { theme: siteTheme } = useContext(SiteContext);\n  const rootPrefixCls = getPrefixCls();\n  const { token } = result;\n  const siteMarkdownCodeBg = token.colorFillTertiary;\n\n  return {\n    ...result,\n    token: {\n      ...token,\n      headerHeight,\n      menuItemBorder: 2,\n      mobileMaxWidth: 767.99,\n      siteMarkdownCodeBg,\n      antCls: `.${rootPrefixCls}`,\n      iconCls: `.${iconPrefixCls}`,\n      /** 56 */\n      marginFarXS: (token.marginXXL / 6) * 7,\n      /** 80 */\n      marginFarSM: (token.marginXXL / 3) * 5,\n      /** 96 */\n      marginFar: token.marginXXL * 2,\n      codeFamily: \"'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace\",\n      contentMarginTop: 40,\n      anchorTop: headerHeight + token.margin,\n      boxShadowCard,\n      siteTheme\n    },\n    /** dumi-theme-antd 站点 class 前缀 */\n    siteCls: 'dumi-antd'\n  };\n};\n\nexport default useSiteToken;\n"
  },
  {
    "path": ".dumi/theme/hooks/uselocale.ts",
    "content": "import { useLocale as useDumiLocale } from 'dumi';\n\nexport interface LocaleMap<Key extends string> {\n  cn: Record<Key, string>;\n  en: Record<Key, string>;\n}\n\nexport default function useLocale<Key extends string>(\n  localeMap?: LocaleMap<Key>\n): [Record<Key, string>, 'cn' | 'en'] {\n  const { id } = useDumiLocale();\n  const localeType = id === 'zh-CN' ? 'cn' : ('en' as const);\n  return [localeMap?.[localeType]!, localeType];\n}\n"
  },
  {
    "path": ".dumi/theme/index.ts",
    "content": "import Footer from './slots/Footer';\nimport Loading from './common/Loading';\nimport HomeBaseLayout from './builtins/HomeBaseLayout';\n\nexport { Loading, Footer, HomeBaseLayout };\n"
  },
  {
    "path": ".dumi/theme/layouts/DocLayout/index.tsx",
    "content": "import { css } from '@emotion/react';\nimport { Helmet, Outlet, useLocale, useLocation, useOutlet, useRouteMeta, useSiteData } from 'dumi';\nimport React, { useEffect, useContext, useMemo, type FC } from 'react';\nimport classNames from 'classnames';\nimport GlobalStyles from '../../common/GlobalStyles';\nimport useLocaleValue from '../../hooks/useLocaleValue';\nimport Footer from '../../slots/Footer';\nimport Header from '../../slots/Header';\nimport Homepage from '../HomePageLayout';\nimport SidebarLayout from '../SidebarLayout';\nimport SiteContext from '../../slots/SiteContext';\nimport '../../static/style';\n\nconst useStyles = () => {\n  return {\n    layoutWrap: css`\n      display: flex;\n      flex-direction: column;\n      min-height: 100vh;\n    `\n  };\n};\n\nconst DocLayout: FC = () => {\n  const outlet = useOutlet();\n  const locale = useLocale();\n  const location = useLocation();\n  const styles = useStyles();\n  const routeMeta = useRouteMeta();\n  const title = useLocaleValue('title');\n  const description = useLocaleValue('description');\n  const { pathname, hash } = location;\n  const { loading } = useSiteData();\n  const { direction } = useContext(SiteContext);\n\n  const content = useMemo(() => {\n    if (\n      ['', '/'].some((path) => path === pathname) ||\n      ['/index'].some((path) => pathname.startsWith(path))\n    ) {\n      return (\n        <React.Fragment>\n          {outlet || <Homepage />}\n          <Footer />\n        </React.Fragment>\n      );\n    }\n    return routeMeta.frontmatter?.sidebar === false ? (\n      <div>\n        <Outlet />\n      </div>\n    ) : (\n      <SidebarLayout>\n        <Outlet />\n      </SidebarLayout>\n    );\n  }, [outlet, pathname, routeMeta]);\n\n  // handle hash change or visit page hash from Link component, and jump after async chunk loaded\n  useEffect(() => {\n    const id = hash.replace('#', '');\n    if (id) {\n      document.getElementById(decodeURIComponent(id))?.scrollIntoView();\n    }\n  }, [loading, hash]);\n\n  return (\n    <div css={styles.layoutWrap}>\n      <Helmet encodeSpecialCharacters={false}>\n        <html\n          lang={locale.id}\n          data-direction={direction}\n          className={classNames(['dumi-theme-antd-root', { rtl: direction === 'rtl' }])}\n        />\n        <title>{`${title || 'dumi-theme-antd'}${description ? `-${description}` : ''}`}</title>\n        <link\n          sizes=\"144x144\"\n          href=\"https://gw.alipayobjects.com/zos/antfincdn/UmVnt3t4T0/antd.png\"\n        />\n        <meta name=\"description\" content={description} />\n        <meta property=\"og:title\" content={title} />\n        <meta property=\"og:type\" content=\"website\" />\n        <meta\n          property=\"og:image\"\n          content=\"https://gw.alipayobjects.com/zos/rmsportal/rlpTLlbMzTNYuZGGCVYM.png\"\n        />\n      </Helmet>\n      <GlobalStyles />\n      <Header />\n      {content}\n    </div>\n  );\n};\n\nexport default DocLayout;\n"
  },
  {
    "path": ".dumi/theme/layouts/GlobalLayout.tsx",
    "content": "import {\n  createCache,\n  extractStyle,\n  legacyNotSelectorLinter,\n  logicalPropertiesLinter,\n  parentSelectorLinter,\n  StyleProvider,\n} from '@ant-design/cssinjs';\nimport { ConfigProvider, theme as antdTheme } from 'antd';\nimport { Outlet, usePrefersColor, useServerInsertedHTML } from 'dumi';\nimport type { FC } from 'react';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport Sim from '../common/Sim';\nimport type { ThemeName } from '../common/ThemeSwitch';\nimport useAdditionalThemeConfig from '../hooks/useAdditionalThemeConfig';\nimport type { SiteContextProps } from '../slots/SiteContext';\nimport SiteContext from '../slots/SiteContext';\n\ntype SiteState = Partial<Omit<SiteContextProps, 'updateSiteContext'>>;\nconst RESPONSIVE_MOBILE = 768;\nconst SITE_STATE_LOCALSTORAGE_KEY = 'dumi-theme-antd-site-state';\n\nconst defaultSiteState: SiteState = {\n  theme: [],\n  isMobile: false,\n  direction: 'ltr',\n  platform: 'alipay',\n  herboxUrl: '',\n};\nconst getAlgorithm = (themes: ThemeName[] = []) =>\n  themes.map((theme) => {\n    if (theme === 'dark') {\n      return antdTheme.darkAlgorithm;\n    }\n    if (theme === 'compact') {\n      return antdTheme.compactAlgorithm;\n    }\n    return antdTheme.defaultAlgorithm;\n  });\n\nconst isThemeDark = () =>\n  window.matchMedia('(prefers-color-scheme: dark)').matches;\nconst getSiteState = (siteState) => {\n  const localSiteState = siteState;\n  const isDark = isThemeDark(); // 系统默认主题\n  const theme = localSiteState?.theme || [];\n  const isAutoTheme = theme.filter((item) => item === 'auto').length > 0;\n  if (isAutoTheme) {\n    const nextTheme = theme.filter((item) => item !== 'auto');\n    nextTheme.push(isDark ? 'dark' : 'light');\n    localSiteState.theme = nextTheme;\n  }\n  return Object.assign(defaultSiteState, localSiteState);\n};\n\nconst GlobalLayout: FC = () => {\n  const [, , setPrefersColor] = usePrefersColor();\n  const { theme: configTheme, ssr, prefersColor } = useAdditionalThemeConfig();\n  const [{ theme, isMobile, direction, platform, herboxUrl }, setSiteState] =\n    useState<SiteState>(defaultSiteState);\n\n  // 基于 localStorage 实现\n  const updateSiteConfig = useCallback((props: SiteState) => {\n    try {\n      const localSiteState = JSON.parse(\n        window.localStorage.getItem(SITE_STATE_LOCALSTORAGE_KEY) || '{}'\n      );\n      const nextLocalSiteState = Object.assign(localSiteState, props);\n      window.localStorage.setItem(\n        SITE_STATE_LOCALSTORAGE_KEY,\n        JSON.stringify(nextLocalSiteState)\n      );\n      setSiteState((prev) => ({\n        ...prev,\n        ...props,\n      }));\n    } catch (error) {\n      // eslint-disable-next-line no-console\n      console.error(error);\n    }\n  }, []);\n\n  const updateMobileMode = useCallback(() => {\n    updateSiteConfig({\n      isMobile: window.innerWidth < RESPONSIVE_MOBILE,\n    });\n  }, [updateSiteConfig]);\n\n  useEffect(() => {\n    try {\n      const localSiteState = JSON.parse(\n        window.localStorage.getItem(SITE_STATE_LOCALSTORAGE_KEY) || '{}'\n      );\n      // 首次设置主题样式\n      if (!localSiteState?.theme) {\n        localSiteState.theme = [prefersColor.default];\n      }\n      const siteConfig = getSiteState(localSiteState);\n      updateSiteConfig(siteConfig);\n    } catch (error) {\n      // eslint-disable-next-line no-console\n      console.error(error);\n    }\n  }, [prefersColor, updateSiteConfig]);\n\n  useEffect(() => {\n    updateMobileMode();\n    // set data-prefers-color\n    setPrefersColor((theme ?? []).indexOf('dark') > -1 ? 'dark' : 'light');\n    window.addEventListener('resize', updateMobileMode);\n    return () => {\n      window.removeEventListener('resize', updateMobileMode);\n    };\n  }, [theme, updateMobileMode, setPrefersColor]);\n\n  const siteContextValue = useMemo(\n    () => ({\n      direction,\n      isMobile: isMobile!,\n      theme: theme!,\n      platform: platform!,\n      herboxUrl: herboxUrl!,\n      updateSiteConfig,\n    }),\n    [isMobile, theme, direction, platform, herboxUrl, updateSiteConfig]\n  );\n\n  const [styleCache] = React.useState(() => createCache());\n\n  useServerInsertedHTML(() => {\n    const styleText = extractStyle(styleCache, {\n      plain: true,\n      types: 'style',\n    });\n    return (\n      <style\n        data-type=\"antd-cssinjs\"\n        dangerouslySetInnerHTML={{ __html: styleText }}\n      />\n    );\n  });\n\n  useServerInsertedHTML(() => {\n    const styleText = extractStyle(styleCache, {\n      plain: true,\n      types: ['cssVar', 'token'],\n    });\n    return (\n      <style\n        data-type=\"antd-css-var\"\n        data-rc-order=\"prepend\"\n        data-rc-priority=\"-9999\"\n        dangerouslySetInnerHTML={{ __html: styleText }}\n      />\n    );\n  });\n\n  const BaseGlobalLayoutJSX = (\n    <SiteContext.Provider value={siteContextValue}>\n      <ConfigProvider\n        theme={{\n          ...configTheme,\n          algorithm: getAlgorithm(theme),\n        }}\n      >\n        <Outlet />\n        {/* {prefersColor.switch && (\n          <ThemeSwitch\n            value={theme}\n            onChange={(nextTheme) => updateSiteConfig({ theme: nextTheme })}\n          />\n        )} */}\n\n        <Sim />\n      </ConfigProvider>\n    </SiteContext.Provider>\n  );\n\n  const SSRGlobalLayoutJSX = (\n    <StyleProvider\n      cache={styleCache}\n      linters={[\n        logicalPropertiesLinter,\n        legacyNotSelectorLinter,\n        parentSelectorLinter,\n      ]}\n    >\n      {BaseGlobalLayoutJSX}\n    </StyleProvider>\n  );\n  if (ssr) {\n    (global as any).styleCache = styleCache;\n    return SSRGlobalLayoutJSX;\n  }\n  return BaseGlobalLayoutJSX;\n};\n\nexport default GlobalLayout;\n"
  },
  {
    "path": ".dumi/theme/layouts/HomePageLayout/index.tsx",
    "content": "import React from 'react';\nimport HomeBaseLayout from '../../builtins/HomeBaseLayout';\n\nconst HomePageLayout: React.FC = () => {\n  return <HomeBaseLayout />;\n};\n\nexport default HomePageLayout;\n"
  },
  {
    "path": ".dumi/theme/layouts/SidebarLayout/index.tsx",
    "content": "import { css } from '@emotion/react';\nimport type { FC, PropsWithChildren } from 'react';\nimport CommonHelmet from '../../common/CommonHelmet';\nimport Content from '../../slots/Content';\nimport Sidebar from '../../slots/Sidebar';\n\nconst useStyle = () => {\n  return {\n    mainWrap: css`\n      display: flex;\n      flex: 1;\n      margin-top: 104px;\n    `,\n  };\n};\n\nconst SidebarLayout: FC<PropsWithChildren<unknown>> = ({ children }) => {\n  const style = useStyle();\n  return (\n    <main css={style.mainWrap}>\n      <CommonHelmet />\n      <Sidebar />\n      <Content>{children}</Content>\n    </main>\n  );\n};\n\nexport default SidebarLayout;\n"
  },
  {
    "path": ".dumi/theme/locales/en.json",
    "content": "{\n  \"app.not-found.back-home\": \"Back to home page\",\n  \"app.not-found.subTitle\": \"Sorry, the page you visited does not exist.\",\n  \"app.theme.switch.dark\": \"Dark theme\",\n  \"app.theme.switch.compact\": \"Compact theme\",\n  \"app.header.menu.more\": \"More\",\n  \"app.footer.last.updated\": \"Last updated: \",\n  \"app.footer.actions.edit\": \"Improve this documentation\",\n  \"header.search.placeholder\": \"Input to search\",\n  \"app.theme.sidebar.alipay\": \"Alipay\",\n  \"app.theme.sidebar.wechat\": \"Wechat\",\n  \"app.previewer.collapse.label\": \"Sample Code\",\n  \"app.platform.support.warning\": \"This component does not support ${platform} platform\"\n}\n"
  },
  {
    "path": ".dumi/theme/locales/zh-CN.json",
    "content": "{\n  \"app.not-found.back-home\": \"返回首页\",\n  \"app.not-found.subTitle\": \"你访问的页面貌似不存在？\",\n  \"app.theme.switch\": \"切换主题\",\n  \"app.theme.switch.dark\": \"暗黑主题\",\n  \"app.theme.switch.compact\": \"紧凑主题\",\n  \"app.header.menu.more\": \"更多\",\n  \"app.footer.last.updated\": \"最后更新时间：\",\n  \"app.footer.actions.edit\": \"帮助改进此文档\",\n  \"app.theme.sidebar.alipay\": \"支付宝\",\n  \"app.theme.sidebar.wechat\": \"微信\",\n  \"app.previewer.collapse.label\": \"示例代码\",\n  \"app.platform.support.warning\": \"该组件不支持${platform}平台\"\n}\n"
  },
  {
    "path": ".dumi/theme/plugin/index.ts",
    "content": "import type { IApi } from 'dumi';\n\nexport default (api: IApi) => {\n  api.describe({\n    // eslint-disable-next-line @typescript-eslint/no-var-requires\n    key: `dumi-theme:${require('../../../package.json').name}`\n  });\n  api.modifyDefaultConfig(\n    (memo) =>\n      Object.assign(memo, {\n        cjs: {\n          output: 'dist/defineThemeConfig',\n          input: 'src/defineThemeConfig'\n        }\n      })\n    // eslint-disable-next-line function-paren-newline\n  );\n};\n"
  },
  {
    "path": ".dumi/theme/plugin/techStack.ts",
    "content": "import type { IApi } from 'dumi';\nimport { winPath } from 'dumi/plugin-utils';\nimport type { IDumiTechStack } from 'dumi/tech-stack-utils';\nimport fs from 'fs';\nimport path from 'path';\nimport getSourceCode from '../../../scripts/getSourceCode';\n\nclass AntdTechStack implements IDumiTechStack {\n  name = 'antd';\n\n  constructor(opts: {}) {}\n\n  /**\n   * 仅将指向 demo/pages 目录的 code 标签当做 Antd demo\n   */\n  isSupported(...[node]: Parameters<IDumiTechStack['isSupported']>) {\n    return (\n      typeof node.properties?.src === 'string' &&\n      node.properties.src.includes('demo/pages')\n    );\n  }\n\n  /**\n   * 将 code 的渲染结果替换为空的占位组件，因为实际的渲染会交给 openbox\n   */\n  transformCode() {\n    return `import React from 'react';\n\nexport default () => React.createElement(React.Fragment, null, 'Antd demo 暂不支持独立预览');\n`;\n  }\n\n  /**\n   * 生成传递给 Previewer 组件的 props\n   */\n  generatePreviewerProps(\n    // @ts-ignore\n    ...[props, opts]: Parameters<IDumiTechStack['generatePreviewerProps']>\n  ) {\n    // console.log('generatePreviewerProps', props, opts);\n\n    const env = process.env.NODE_ENV;\n    // 实例文件的绝对路径\n    props.fileAbsPath = opts.fileAbsPath;\n    // 环境变量信息\n    props.env = env;\n    if (props.filename.includes('demo/pages')) {\n      // demo/pages/Button/index.ts\n      const pageElem = props.filename.split('/');\n      pageElem.shift();\n\n      const folder = pageElem.slice(0, -1).join('/') + '/';\n      const page = pageElem.join('/').replace(/\\.(ts|js)$/, '');\n      props.herboxUrl = `/preview.html?page=${page}&folder=${folder}&theme=light&compilerServer=${\n        process.env.SERVER || ''\n      }`;\n    }\n    return props;\n  }\n\n  /**\n   * 生成 Antd demo 的元数据\n   * @note  由于源码展示也一并交给 openbox 而不是 dumi，所以这份元数据主要作用是生成 assets.json\n   */\n  generateMetadata(\n    // @ts-ignore\n    ...[asset, opts]: Parameters<IDumiTechStack['generateMetadata']>\n  ) {\n    const deps: typeof asset.dependencies = {};\n\n    // 生成源码元数据\n    // Object.entries(\n    //   // @ts-ignore\n    //   getBlockDepsFiles(this.pkgName, path.dirname(opts.fileAbsPath))\n    // ).forEach(([file, args]) => {\n    //   deps[file] = {\n    //     type: 'FILE',\n    //     value: args.content,\n    //   };\n    // });\n\n    return {\n      ...asset,\n      dependencies: deps,\n    };\n  }\n}\n\n/**\n * 注册 Antd 技术栈到 Kit，用于将文档中的 code 渲染成 Antd 的 demo\n */\nexport default async (api: IApi) => {\n  api.describe({ key: 'antd-lib:tech-stack' });\n\n  // 注册技术栈\n  api.registerTechStack(() => new AntdTechStack({}));\n\n  // 替换默认的 Previewer 组件\n  // @ts-ignore\n  api.modifyTheme((memo) => {\n    memo.builtins.Previewer.source = winPath(\n      require.resolve('../builtins/Previewer/index.tsx')\n    );\n\n    return memo;\n  });\n\n  api.addBeforeMiddlewares(() => [\n    (req, res, next) => {\n      if (req.path === '/preview.html') {\n        fs.createReadStream(\n          path.join(__dirname, '../builtins/iframe.html')\n        ).pipe(res);\n        return;\n      }\n      if (req.path === '/code.html') {\n        fs.createReadStream(path.join(__dirname, '../builtins/code.html')).pipe(\n          res\n        );\n        return;\n      }\n      if (req.path.startsWith('/sourceCode/')) {\n        const page = req.path.replace('/sourceCode/', '');\n        getSourceCode({\n          page,\n          theme: req.query.theme,\n          platform: req.query.platform,\n        }).then((json) => res.json(json));\n        return;\n      }\n      if (req.url === '/mini/packageInfo.json') {\n        res.json({});\n        return;\n      }\n      next();\n    },\n  ]);\n};\n"
  },
  {
    "path": ".dumi/theme/plugin.ts",
    "content": "/* eslint-disable import/no-extraneous-dependencies */\n/* eslint-disable no-param-reassign */\nimport { cache } from '@emotion/css';\nimport createEmotionServer from '@emotion/server/create-instance';\nimport { createHash } from 'crypto';\nimport type { IApi } from 'dumi';\nimport fs from 'fs';\nimport path from 'path';\n\nfunction extractEmotionStyle(html: string) {\n  if (html === undefined) {\n    throw new Error('Did you forget to return html from renderToString?');\n  }\n\n  const { extractCritical } = createEmotionServer(cache);\n  const { ids, css } = extractCritical(html);\n\n  if (!css) return [];\n\n  return [\n    {\n      key: cache.key,\n      ids,\n      css,\n      tag: `<style data-emotion=\"${cache.key} ${ids.join(' ')}\">${css}</style>`,\n    },\n  ];\n}\n\nexport const getHash = (str: string, length = 8) =>\n  createHash('md5').update(str).digest('hex').slice(0, length);\n\nconst dumiThemeUmiPlugin = (api: IApi) => {\n  const writeCSSFile = (key: string, hashKey: string, cssString: string) => {\n    const fileName = `style-${key}.${getHash(hashKey)}.css`;\n\n    const filePath = path.join(api.paths.absOutputPath, fileName);\n\n    if (!fs.existsSync(filePath)) {\n      fs.writeFileSync(filePath, cssString, 'utf8');\n    }\n\n    return fileName;\n  };\n\n  const addLinkStyle = (html: string, cssFile: string, prepend = false) => {\n    const prefix = api.userConfig.publicPath || api.config.publicPath;\n\n    if (prepend) {\n      return html.replace(\n        '<head>',\n        `<head><link rel=\"stylesheet\" href=\"${prefix + cssFile}\">`\n      );\n    }\n\n    return html.replace(\n      '</head>',\n      `<link rel=\"stylesheet\" href=\"${prefix + cssFile}\"></head>`\n    );\n  };\n\n  // add ssr css file to html\n  api.modifyConfig((memo) => {\n    // 将 .dumrc 中 ssr 配置注入 themeConfig 中，便于页面获取\n    memo.themeConfig.ssr = memo.ssr;\n\n    return memo;\n  });\n\n  api.modifyExportHTMLFiles((files) => {\n    if (api.config?.ssr) {\n      const nextFiles = files\n        // exclude dynamic route path, to avoid deploy failed by `:id` directory\n        .filter((f) => !f.path.includes(':'))\n        .map((file) => {\n          let globalStyles = '';\n\n          // Debug for file content: uncomment this if need check raw out\n          // const tmpFileName = `_${file.path.replace(/\\//g, '-')}`;\n          // const tmpFilePath = path.join(api.paths.absOutputPath, tmpFileName);\n          // fs.writeFileSync(tmpFilePath, file.content, 'utf8');\n\n          // extract all emotion style tags from body\n          file.content = file.content.replace(\n            /<style (data-emotion|data-sandpack)[\\S\\s]+?<\\/style>/g,\n            (s) => {\n              globalStyles += s;\n\n              return '';\n            }\n          );\n\n          // insert emotion style tags to head\n          file.content = file.content.replace(\n            '</head>',\n            `${globalStyles}</head>`\n          );\n\n          // 1. 提取 emotion 样式\n          const styles = extractEmotionStyle(file.content);\n\n          // 2. 提取每个样式到独立 css 文件\n          styles.forEach((result) => {\n            const cssFile = writeCSSFile(\n              result.key,\n              result.ids.join(''),\n              result.css\n            );\n            file.content = addLinkStyle(file.content, cssFile);\n          });\n\n          // Insert antd style to head\n          const matchRegex = /<style data-type=\"antd-cssinjs\">(.*?)<\\/style>/;\n          const matchList = file.content.match(matchRegex) || [];\n\n          let antdStyle = '';\n\n          matchList.forEach((text) => {\n            file.content = file.content.replace(text, '');\n            antdStyle += text.replace(matchRegex, '$1');\n          });\n\n          const cssFile = writeCSSFile('antd', antdStyle, antdStyle);\n          file.content = addLinkStyle(file.content, cssFile, true);\n\n          // Insert antd cssVar to head\n          const cssVarMatchRegex =\n            /<style data-type=\"antd-css-var\"[\\S\\s]+?<\\/style>/;\n          const cssVarMatchList = file.content.match(cssVarMatchRegex) || [];\n\n          cssVarMatchList.forEach((text) => {\n            file.content = file.content.replace(text, '');\n            file.content = file.content.replace('<head>', `<head>${text}`);\n          });\n\n          return file;\n        });\n\n      return nextFiles;\n    }\n    return files;\n  });\n\n  api.registerPlugins([require.resolve('./plugin/techStack.ts')]);\n};\n\nexport default dumiThemeUmiPlugin;\n"
  },
  {
    "path": ".dumi/theme/slots/Content/DocAnchor.tsx",
    "content": "import { css } from '@emotion/react';\nimport { Anchor } from 'antd';\nimport type { AnchorLinkItemProps } from 'antd/es/anchor/Anchor';\nimport classNames from 'classnames';\nimport { useRouteMeta, useTabMeta } from 'dumi';\nimport React from 'react';\nimport useSiteToken from '../../hooks/useSiteToken';\n\nconst useStyle = () => {\n  const { token } = useSiteToken();\n\n  const { antCls } = token;\n\n  return {\n    toc: css`\n      ${antCls}-anchor {\n        ${antCls}-anchor-link-title {\n          font-size: ${token.fontSizeSM}px;\n        }\n      }\n    `,\n    tocWrapper: css`\n      position: fixed;\n      top: ${token.headerHeight + token.contentMarginTop - 8}px;\n      inset-inline-end: 0;\n      width: 144px;\n      padding: ${token.paddingXS}px;\n      border-radius: ${token.borderRadius}px;\n      box-sizing: border-box;\n      margin-inline-end: calc(16px - 100vw + 100%);\n      z-index: 10;\n      .toc-debug {\n        color: ${token.purple6};\n        &:hover {\n          color: ${token.purple5};\n        }\n      }\n      > div {\n        box-sizing: border-box;\n        width: 100%;\n        max-height: calc(\n          100vh - ${token.headerHeight + token.contentMarginTop + 24}px\n        ) !important;\n        margin: auto;\n        overflow: auto;\n        padding: ${token.paddingXXS}px;\n        backdrop-filter: blur(8px);\n      }\n\n      @media only screen and (max-width: ${token.screenLG}px) {\n        display: none;\n      }\n    `,\n    articleWrapper: css`\n      padding: 0 170px 32px 64px;\n\n      &.rtl {\n        padding: 0 64px 144px 170px;\n      }\n\n      @media only screen and (max-width: ${token.screenLG}px) {\n        &,\n        &.rtl {\n          padding: 0 ${token.paddingLG * 2}px;\n        }\n      }\n    `,\n  };\n};\n\ninterface DocAnchorProps {\n  showDebug?: boolean;\n  debugDemos?: string[];\n}\n\ninterface AnchorItem {\n  id: string;\n  title: string;\n  children?: AnchorItem[];\n}\n\nconst DocAnchor: React.FC<DocAnchorProps> = ({\n  showDebug,\n  debugDemos = [],\n}) => {\n  const styles = useStyle();\n  const { token } = useSiteToken();\n  const meta = useRouteMeta();\n  const tab = useTabMeta();\n\n  const renderAnchorItem = (item: AnchorItem): AnchorLinkItemProps => ({\n    href: `#${item.id}`,\n    title: item.title,\n    key: item.id,\n    children: item.children\n      ?.filter((child) => showDebug || !debugDemos.includes(child.id))\n      .map<AnchorLinkItemProps>((child) => ({\n        key: child.id,\n        href: `#${child.id}`,\n        title: (\n          <span\n            className={classNames({\n              'toc-debug': debugDemos.includes(child.id),\n            })}\n          >\n            {child?.title}\n          </span>\n        ),\n      })),\n  });\n\n  const anchorItems = React.useMemo<AnchorItem[]>(\n    () =>\n      (tab?.toc || meta.toc).reduce<AnchorItem[]>((result, item) => {\n        if (item.depth === 2) {\n          result.push({ ...item });\n        } else if (item.depth === 3) {\n          const parent = result[result.length - 1];\n          if (parent) {\n            parent.children = parent.children || [];\n            parent.children.push({ ...item });\n          }\n        }\n        return result;\n      }, []),\n    [tab?.toc, meta.toc]\n  );\n\n  if (!meta.frontmatter.toc) {\n    return null;\n  }\n\n  return (\n    <section css={styles.tocWrapper}>\n      <Anchor\n        css={styles.toc}\n        affix={false}\n        targetOffset={token.anchorTop}\n        showInkInFixed\n        items={anchorItems.map<AnchorLinkItemProps>(renderAnchorItem)}\n      />\n    </section>\n  );\n};\n\nexport default DocAnchor;\n"
  },
  {
    "path": ".dumi/theme/slots/Content/InViewSuspense.tsx",
    "content": "import { Skeleton } from 'antd';\nimport React, { Suspense } from 'react';\nimport type { IntersectionObserverProps } from 'react-intersection-observer';\nimport { InView } from 'react-intersection-observer';\n\ntype InViewSuspenseProps = Pick<IntersectionObserverProps, 'delay'> & {\n  fallback?: React.ReactNode;\n  children?: React.ReactNode;\n};\n\nconst InViewSuspense: React.FC<InViewSuspenseProps> = ({\n  children,\n  fallback = <Skeleton.Input active size=\"small\" />,\n  delay = 200,\n}) => (\n  <InView triggerOnce delay={delay}>\n    {({ inView, ref }) => (\n      <div ref={ref}>\n        <Suspense fallback={fallback}>{inView ? children : <span />}</Suspense>\n      </div>\n    )}\n  </InView>\n);\n\nexport default InViewSuspense;\n"
  },
  {
    "path": ".dumi/theme/slots/Content/index.tsx",
    "content": "import { CalendarOutlined } from '@ant-design/icons';\nimport { css } from '@emotion/react';\nimport { Col, message, Space, Typography } from 'antd';\nimport classNames from 'classnames';\nimport DayJS from 'dayjs';\nimport { useIntl, useMatchedRoute, useRouteMeta } from 'dumi';\nimport React, { useContext, useEffect, useMemo } from 'react';\nimport EditLink from '../../common/EditLink';\nimport LastUpdated from '../../common/LastUpdated';\nimport PrevAndNext from '../../common/PrevAndNext';\nimport useSiteToken from '../../hooks/useSiteToken';\nimport SiteContext from '../SiteContext';\nimport DocAnchor from './DocAnchor';\nimport InViewSuspense from './InViewSuspense';\n\nconst useStyle = ({ isOverview, isShowSim }) => {\n  const { token } = useSiteToken();\n  const { antCls } = token;\n\n  return {\n    contributorsList: css`\n      display: flex;\n      flex-wrap: wrap;\n      margin-top: 120px !important;\n\n      a,\n      ${antCls}-avatar + ${antCls}-avatar {\n        margin-bottom: 8px;\n        margin-inline-end: 8px;\n      }\n    `,\n    toc: css`\n      ${antCls}-anchor {\n        ${antCls}-anchor-link-title {\n          font-size: 12px;\n        }\n      }\n    `,\n    tocWrapper: css`\n      position: absolute;\n      top: 8px;\n      right: 0;\n      width: 160px;\n      margin: 12px 0;\n      padding: 8px 8px 8px 4px;\n      backdrop-filter: blur(8px);\n      border-radius: ${token.borderRadius}px;\n      box-sizing: border-box;\n\n      .toc-debug {\n        color: ${token['purple-6']};\n\n        &:hover {\n          color: ${token['purple-5']};\n        }\n      }\n\n      > div {\n        box-sizing: border-box;\n        width: 100%;\n        max-height: calc(100vh - 40px) !important;\n        margin: 0 auto;\n        overflow: auto;\n        padding-inline: 4px;\n      }\n\n      &.rtl {\n        right: auto;\n        left: 20px;\n      }\n\n      @media only screen and (max-width: ${token.screenLG}px) {\n        display: none;\n      }\n    `,\n    articleWrapper: css`\n      padding: ${isOverview\n        ? '0 64px 32px 64px'\n        : isShowSim\n        ? '0 412px 32px 64px'\n        : '0 164px 32px 64px'};\n      flex: 1;\n\n      &.rtl {\n        padding: 0 64px 144px 170px;\n      }\n\n      @media only screen and (max-width: ${token.screenLG}px) {\n        &,\n        &.rtl {\n          padding-right: 24px;\n          padding-left: 24px;\n        }\n      }\n    `,\n    bottomEditContent: css`\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      padding-bottom: 12px;\n      flex: 0;\n    `,\n    colContent: css`\n      display: flex;\n      flex-direction: column;\n    `,\n  };\n};\n\nconst Content: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n  const isOverview =\n    window.location.pathname === '/components/overview' ||\n    window.location.pathname === '/components/overview-en' ||\n    window.location.pathname === '/copilots/copilot-overview' ||\n    window.location.pathname === '/copilots/copilot-overview-en';\n\n  const matchedRoute = useMatchedRoute();\n\n  const isShowSim = useMemo(() => {\n    return matchedRoute?.meta?.frontmatter?.nav?.path === '/components' || matchedRoute?.meta?.frontmatter?.nav?.path === '/copilot';\n  }, [matchedRoute]);\n\n  const meta = useRouteMeta();\n  const styles = useStyle({ isOverview, isShowSim });\n  const { direction, platform, updateSiteConfig } = useContext(SiteContext);\n\n  const debugDemos = useMemo(\n    () =>\n      meta.toc?.filter((item) => item._debug_demo).map((item) => item.id) || [],\n    [meta]\n  );\n\n  const isShowTitle = useMemo(() => {\n    const title = meta.frontmatter?.title || meta.frontmatter.subtitle;\n    if (!title) return false;\n\n    // 避免 markdown 里有 h1 导致双标题\n    const firstToc = meta.toc[0];\n    if (firstToc && firstToc.depth === 1) return false;\n\n    return true;\n  }, [meta.frontmatter?.title, meta.frontmatter.subtitle, meta.toc]);\n\n  const isRTL = direction === 'rtl';\n\n  const intl = useIntl();\n\n  // 不支持平台提示\n  useEffect(() => {\n    if (\n      Array.isArray(meta.frontmatter.supportPlatform) &&\n      !meta.frontmatter.supportPlatform.includes(platform)\n    ) {\n      const warningText = intl.formatMessage({\n        id: 'app.platform.support.warning',\n      });\n      const platformText = intl.formatMessage({\n        id: `app.theme.sidebar.${platform}`,\n      });\n      message.open({\n        type: 'warning',\n        content: warningText.replaceAll('${platform}', platformText),\n      });\n\n      updateSiteConfig({\n        platform: meta.frontmatter.supportPlatform[0],\n      });\n    }\n  }, [meta.frontmatter.supportPlatform, platform, updateSiteConfig, intl]);\n\n  return (\n    <Col\n      xxl={20}\n      xl={19}\n      lg={18}\n      md={18}\n      sm={24}\n      xs={24}\n      css={styles.colContent}\n    >\n      {!!meta.frontmatter.toc && !isShowSim && !isOverview && (\n        <InViewSuspense fallback={null}>\n          <DocAnchor debugDemos={debugDemos} />\n        </InViewSuspense>\n      )}\n      <article\n        css={styles.articleWrapper}\n        className={classNames({ rtl: isRTL })}\n      >\n        {isShowTitle ? (\n          <Typography.Title\n            style={{\n              fontSize: 30,\n            }}\n          >\n            {meta.frontmatter?.title}\n            {meta.frontmatter.subtitle && (\n              <span\n                style={{\n                  marginLeft: 12,\n                }}\n              >\n                {meta.frontmatter.subtitle}\n              </span>\n            )}\n          </Typography.Title>\n        ) : null}\n\n        {/* 添加作者、时间等信息 */}\n        {meta.frontmatter.date || meta.frontmatter.author ? (\n          <Typography.Paragraph\n            style={{\n              opacity: 0.65,\n            }}\n          >\n            <Space>\n              {meta.frontmatter.date && (\n                <span>\n                  <CalendarOutlined />\n                  {DayJS(meta.frontmatter.date).format('YYYY-MM-DD')}\n                </span>\n              )}\n              {meta.frontmatter.author &&\n                (meta.frontmatter.author as string)\n                  ?.split(',')\n                  ?.map((author) => (\n                    <Typography.Link\n                      href={`https://github.com/${author}`}\n                      key={author}\n                      target=\"_blank\"\n                    >\n                      {`@${author}`}\n                    </Typography.Link>\n                  ))}\n            </Space>\n          </Typography.Paragraph>\n        ) : null}\n        {children}\n      </article>\n      {!isOverview ? (\n        <>\n          <div\n            css={css`\n              ${styles.articleWrapper}\n              ${styles.bottomEditContent}\n            `}\n          >\n            <LastUpdated time={meta.frontmatter?.lastUpdated} />\n            <EditLink />\n          </div>\n          <PrevAndNext rtl={isRTL} isShowSim={isShowSim} />\n        </>\n      ) : null}\n    </Col>\n  );\n};\n\nexport default Content;\n"
  },
  {
    "path": ".dumi/theme/slots/Footer/index.tsx",
    "content": "import { TinyColor } from '@ctrl/tinycolor';\nimport { css } from '@emotion/react';\nimport RcFooter from 'rc-footer';\nimport cloneDeep from 'lodash.clonedeep';\nimport getAlphaColor from 'antd/lib/theme/util/getAlphaColor';\nimport { useContext, useCallback } from 'react';\nimport { type FC } from 'react';\nimport type { FooterColumn } from 'rc-footer/lib/column';\nimport useSiteToken from '../../hooks/useSiteToken';\nimport useLocaleValue from '../../hooks/useLocaleValue';\nimport SiteContext from '../SiteContext';\nimport type { SiteContextProps } from '../SiteContext';\n\nconst useStyle = () => {\n  const { token } = useSiteToken();\n  const footerLinks = useLocaleValue('footerLinks');\n  const { isMobile } = useContext<SiteContextProps>(SiteContext);\n  const background = new TinyColor(getAlphaColor('#f0f3fa', '#fff'))\n    .onBackground(token.colorBgContainer)\n    .toHexString();\n\n  return {\n    holder: css`\n      background: ${background};\n    `,\n\n    footer: css`\n      background: ${background};\n      color: ${token.colorTextSecondary};\n      box-shadow: inset 0 106px 36px -116px rgba(0, 0, 0, 0.14);\n\n      * {\n        box-sizing: border-box;\n      }\n\n      h2,\n      a {\n        color: ${token.colorText};\n      }\n\n      .rc-footer-column {\n        margin-bottom: ${isMobile ? 60 : 0}px;\n        :last-child {\n          margin-bottom: ${isMobile ? 20 : 0}px;\n        }\n      }\n\n      .rc-footer-item-icon {\n        top: -1.5px;\n      }\n\n      .rc-footer-container {\n        display: ${Array.isArray(footerLinks) && footerLinks.length > 0 ? 'block' : 'none'};\n        max-width: 1208px;\n        margin-inline: auto;\n        padding-inline: ${token.marginXXL}px;\n      }\n\n      .rc-footer-bottom {\n        box-shadow: inset 0 106px 36px -116px rgba(0, 0, 0, 0.14);\n        .rc-footer-bottom-container {\n          font-size: ${token.fontSize}px;\n        }\n      }\n    `\n  };\n};\n\nconst Footer: FC = () => {\n  const style = useStyle();\n  const footer = useLocaleValue('footer');\n  const footerLinks = useLocaleValue('footerLinks');\n\n  const getFooterLinks = useCallback((links: FooterColumn[]) => {\n    if (Array.isArray(links)) {\n      links.forEach((item) => {\n        const iconUrl = item.icon;\n        if (item.icon) {\n          // eslint-disable-next-line no-param-reassign\n          delete item.icon;\n          // eslint-disable-next-line no-param-reassign\n          item.icon = <img src={String(iconUrl)} alt=\"\" style={{ maxWidth: '100%' }} />;\n        }\n        if (Array.isArray(item.items)) {\n          getFooterLinks(item.items);\n        }\n      });\n    }\n    return links;\n  }, []);\n\n  if (!footer) return null;\n  return (\n    <RcFooter\n      columns={getFooterLinks(cloneDeep(footerLinks))}\n      css={style.footer}\n      bottom={\n        <span\n          dangerouslySetInnerHTML={{\n            __html: footer\n          }}\n        />\n      }\n    />\n  );\n};\n\nexport default Footer;\n"
  },
  {
    "path": ".dumi/theme/slots/Header/HeaderExtral.tsx",
    "content": "import { GithubOutlined } from '@ant-design/icons';\nimport { css } from '@emotion/react';\nimport { Tooltip } from 'antd';\nimport { DarkTheme, Light } from 'antd-token-previewer/lib/icons';\nimport { useContext, type FC } from 'react';\nimport useAdditionalThemeConfig from '../../hooks/useAdditionalThemeConfig';\nimport useSiteToken from '../../hooks/useSiteToken';\nimport type { SiteContextProps } from '../../slots/SiteContext';\nimport SiteContext from '../../slots/SiteContext';\nimport useLocaleValue from \"../../../theme/hooks/useLocaleValue\";\n\nconst BASE_SIZE = '1.2em';\n\nconst useStyle = () => {\n  const { token } = useSiteToken();\n  const { controlHeight, motionDurationMid } = token;\n\n  return {\n    container: css`\n      padding-bottom: 4px;\n    `,\n    btn: css`\n      color: ${token.colorText};\n      border-color: ${token.colorBorder};\n      padding: 0 !important;\n      width: ${controlHeight}px;\n      height: ${controlHeight}px;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      border: none;\n      background: transparent;\n      border-radius: ${token.borderRadius}px;\n      transition: all ${motionDurationMid};\n      cursor: pointer;\n\n      .btn-inner {\n        transition: all ${motionDurationMid};\n      }\n\n      &:hover {\n        background: ${token.colorBgTextHover};\n      }\n\n      img {\n        width: ${BASE_SIZE};\n        height: ${BASE_SIZE};\n      }\n\n      .anticon {\n        font-size: ${BASE_SIZE};\n      }\n    `,\n    theme: css`\n      svg {\n        width: 16px;\n        height: 16px;\n      }\n    `,\n  };\n};\n\nconst HeaderExtra: FC = () => {\n  const { github, socialLinks, prefersColor } = useAdditionalThemeConfig();\n  const style = useStyle();\n  const { theme, updateSiteConfig } = useContext<SiteContextProps>(SiteContext);\n  const lang = useLocaleValue('headerLocales');\n  const isDark = theme.includes('dark');\n  return (\n    <div css={style.container}>\n      {prefersColor.switch && (\n        <Tooltip\n          title={lang.theme}\n        >\n          <button\n            css={[style.btn, style.theme]}\n            type=\"button\"\n            onClick={() => {\n              const themeValue = isDark ? 'light' : 'dark';\n              updateSiteConfig({ theme: [themeValue] });\n            }}\n          >\n            {\n              isDark ?\n                <DarkTheme /> :\n                <Light/>\n            }\n          </button>\n        </Tooltip>\n      )}\n\n      {github || socialLinks?.github ? (\n        <Tooltip title=\"Github\">\n          <a\n            key=\"github\"\n            href={github || socialLinks?.github}\n            target=\"_blank\"\n            rel=\"noreferrer\"\n          >\n            <button css={[style.btn]} type=\"button\">\n              <GithubOutlined />\n            </button>\n          </a>\n        </Tooltip>\n      ) : null}\n    </div>\n  );\n};\n\nexport default HeaderExtra;\n"
  },
  {
    "path": ".dumi/theme/slots/Header/Logo.tsx",
    "content": "/* eslint-disable react/jsx-closing-tag-location */\nimport { css } from '@emotion/react';\nimport { Link, useLocale, useLocation, useSiteData } from 'dumi';\nimport { Fragment, useMemo } from 'react';\nimport useSiteToken from '../../hooks/useSiteToken';\n\nconst useStyle = () => {\n  const { token } = useSiteToken();\n\n  const { antCls, headerHeight, colorTextHeading, fontFamily, mobileMaxWidth } = token;\n\n  return {\n    logo: css`\n      height: ${headerHeight}px;\n      padding-inline-start: 40px;\n      overflow: hidden;\n      color: ${colorTextHeading};\n      font-weight: bold;\n      font-size: 18px;\n      font-family: PuHuiTi, ${fontFamily}, sans-serif;\n      line-height: ${headerHeight}px;\n      letter-spacing: -0.18px;\n      white-space: nowrap;\n      text-decoration: none;\n      display: inline-flex;\n      align-items: center;\n\n      &:hover {\n        color: ${colorTextHeading};\n      }\n\n      ${antCls}-row-rtl & {\n        float: right;\n        padding-right: 40px;\n        padding-left: 0;\n      }\n\n      img {\n        height: 32px;\n        margin-inline-end: 12px;\n        vertical-align: middle;\n\n        ${antCls}-row-rtl & {\n          margin-right: 0;\n          margin-left: 16px;\n        }\n      }\n\n      @media only screen and (max-width: ${mobileMaxWidth}px) {\n        padding-right: 0;\n        padding-left: 0;\n      }\n    `\n  };\n};\n\nconst Logo = () => {\n  const { logo } = useStyle();\n  const { themeConfig } = useSiteData();\n  const { search } = useLocation();\n  const locale = useLocale();\n  const logImgUrl =\n    themeConfig.logo || 'https://gw.alipayobjects.com/zos/rmsportal/KDpgvguMpGfqaHPjicRK.svg';\n  const content = useMemo(\n    () => (\n      <Fragment>\n        {themeConfig.logo !== false && <img alt=\"logo\" src={logImgUrl} />}\n        <span style={{ lineHeight: '32px' }}>{themeConfig.name}</span>\n      </Fragment>\n    ),\n    [logImgUrl, themeConfig.name, themeConfig.logo]\n  );\n\n  const suffix = 'suffix' in locale ? locale.suffix : '';\n  const homePath = `/${suffix ? `index${suffix}` : ''}`;\n\n  return (\n    <h1>\n      {themeConfig.homeLink && themeConfig.homeLink.startsWith('http') ? (\n        <a href={themeConfig.homeLink} css={logo}>\n          {content}\n        </a>\n      ) : (\n        <Link to={themeConfig.homeLink || `${homePath}${search}`} css={logo}>\n          {content}\n        </Link>\n      )}\n    </h1>\n  );\n};\n\nexport default Logo;\n"
  },
  {
    "path": ".dumi/theme/slots/Header/More.tsx",
    "content": "import { DownOutlined } from '@ant-design/icons';\nimport type { MenuProps } from 'antd';\nimport { Button, Dropdown } from 'antd';\nimport { FormattedMessage } from 'dumi';\nimport React from 'react';\nimport useLocaleValue from '../../hooks/useLocaleValue';\nimport { IMoreLink } from '../../types';\n\nexport const getMoreLinksGroup = (moreLinks: IMoreLink[]): MenuProps['items'] => {\n  return (moreLinks ?? []).map((item, index) => ({\n    label: (\n      <a href={item.link} target=\"_blank\" rel=\"noopener noreferrer\">\n        {item.text}\n      </a>\n    ),\n    key: index\n  }));\n};\n\nconst More: React.FC = () => {\n  const moreLinks = useLocaleValue('moreLinks') || [];\n  return Array.isArray(moreLinks) && moreLinks.length > 0 ? (\n    <Dropdown menu={{ items: getMoreLinksGroup(moreLinks) }} placement=\"bottomRight\">\n      <Button size=\"small\">\n        <FormattedMessage id=\"app.header.menu.more\" />\n        <DownOutlined />\n      </Button>\n    </Dropdown>\n  ) : null;\n};\n\nexport default More;\n"
  },
  {
    "path": ".dumi/theme/slots/Header/Navigation.tsx",
    "content": "import { MenuFoldOutlined } from '@ant-design/icons';\nimport { css } from '@emotion/react';\nimport { Player } from '@galacean/effects';\nimport type { MenuProps } from 'antd';\nimport { Menu } from 'antd';\nimport {\n  FormattedMessage,\n  Link,\n  useLocale,\n  useLocation,\n  useNavData,\n  useSiteData,\n} from 'dumi';\nimport { INavItem } from 'dumi/dist/client/theme-api/types';\nimport { motion } from 'framer-motion';\nimport { useCallback, useContext, useEffect, useRef } from 'react';\nimport useAdditionalThemeConfig from '../../hooks/useAdditionalThemeConfig';\nimport useLocaleValue from '../../hooks/useLocaleValue';\nimport useSiteToken from '../../hooks/useSiteToken';\nimport type { SiteContextProps } from '../../slots/SiteContext';\nimport SiteContext from '../../slots/SiteContext';\nimport { getTargetLocalePath, isExternalLinks } from '../../utils';\nimport { type IResponsive } from './index';\nimport { getMoreLinksGroup } from './More';\n\nexport interface NavigationProps {\n  isMobile: boolean;\n  responsive: IResponsive;\n}\n\nconst useStyle = () => {\n  const { token } = useSiteToken();\n\n  const {\n    antCls,\n    iconCls,\n    fontFamily,\n    headerHeight,\n    menuItemBorder,\n    colorPrimary,\n  } = token;\n\n  return {\n    nav: css`\n      height: 100%;\n      font-size: 14px;\n      font-family: Avenir, ${fontFamily}, sans-serif;\n      border: 0;\n\n      &${antCls}-menu-horizontal {\n        border-bottom: none;\n\n        & > ${antCls}-menu-item, & > ${antCls}-menu-submenu {\n          min-width: (40px + 12px * 2);\n          height: ${headerHeight}px;\n          padding-right: 12px;\n          padding-left: 12px;\n          line-height: ${headerHeight}px;\n\n          &::after {\n            top: 0;\n            right: 12px;\n            bottom: auto;\n            left: 12px;\n            border-width: ${menuItemBorder}px;\n          }\n        }\n\n        & ${antCls}-menu-submenu-title ${iconCls} {\n          margin: 0;\n        }\n\n        & > ${antCls}-menu-item-selected {\n          a {\n            color: ${colorPrimary};\n          }\n        }\n      }\n\n      & > ${antCls}-menu-item, & > ${antCls}-menu-submenu {\n        text-align: center;\n      }\n    `,\n    navItem: css`\n      position: relative;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n    `,\n    newPlayer: css`\n      width: 100px;\n      height: 100px;\n      position: absolute;\n      top: 12px;\n      left: 50%;\n      transform: translateX(-50%);\n      z-index: 9;\n      pointer-events: none;\n    `,\n    rightIcon: css`\n      margin-left: 8px;\n      width: 16px;\n      height: 16px;\n    `,\n    popoverMenuNav: css`\n      ${antCls}-menu-item,\n      ${antCls}-menu-submenu {\n        text-align: left;\n      }\n\n      ${antCls}-menu-item-group-title {\n        padding-left: 24px;\n      }\n\n      ${antCls}-menu-item-group-list {\n        padding: 0 16px;\n      }\n\n      ${antCls}-menu-item,\n      a {\n        color: #333;\n      }\n    `,\n  };\n};\n\nexport default function Navigation({ isMobile, responsive }: NavigationProps) {\n  const { pathname, search } = useLocation();\n  const { locales } = useSiteData();\n  const { github, socialLinks, prefersColor } = useAdditionalThemeConfig();\n  const { theme, updateSiteConfig } = useContext<SiteContextProps>(SiteContext);\n\n  // 统一使用 themeConfig.nav，使用 useNavData，当存在自定义 pages 时，会导致 nav 混乱\n  const navList = useNavData();\n  const locale = useLocale();\n  const moreLinks = useLocaleValue('moreLinks');\n  const activeMenuItem = pathname.split('/').slice(0, 2).join('/');\n  const playerDom = useRef<HTMLDivElement>(null);\n  const timers = useRef<NodeJS.Timeout[]>([]);\n\n  useEffect(() => {\n    if (!playerDom.current) return;\n\n    const player = new Player({\n      container: playerDom.current,\n    });\n\n    const timer1 = setTimeout(() => {\n      player.loadScene(\n        'https://mdn.alipayobjects.com/mars/afts/file/A*wKDRRKoA9fcAAAAAAAAAAAAADlB4AQ'\n      );\n      player.play();\n      const timer2 = setTimeout(() => {\n        player.loadScene(\n          'https://mdn.alipayobjects.com/mars/afts/file/A*wKDRRKoA9fcAAAAAAAAAAAAADlB4AQ'\n        );\n        player.play();\n        timers.current.push(timer2);\n      }, 10000);\n    }, 3000);\n    timers.current.push(timer1);\n    return () => {\n      timers.current.forEach((t) => {\n        clearTimeout(t);\n      });\n      timers.current = [];\n    };\n  }, []);\n\n  const createMenuItems = (navs: INavItem[]) => {\n    const style = useStyle();\n    return navs.map((navItem: INavItem) => {\n      const linkKeyValue = (navItem.link ?? '')\n        .split('/')\n        .slice(0, 2)\n        .join('/');\n      return {\n        // eslint-disable-next-line no-nested-ternary\n        label: (\n          <div css={style.navItem}>\n            {navItem.children ? (\n              navItem.title\n            ) : isExternalLinks(navItem.link) ? (\n              <a\n                href={`${navItem.link}${search}`}\n                target=\"_blank\"\n                rel=\"noreferrer\"\n              >\n                {navItem.title}\n              </a>\n            ) : (\n              <Link to={`${navItem.link}${search}`}>{navItem.title}</Link>\n            )}\n            {navItem.isNew ? (\n              <div ref={playerDom} css={style.newPlayer}></div>\n            ) : null}\n            {navItem.rightIcon && (\n              <motion.div\n                style={{ display: 'inline-block' }}\n                animate={{\n                  rotate: [-5, 5, -5, 5, 0], // 轻微旋转\n                  x: [-2, 2, -2, 2, 0], // 轻微水平移动\n                  y: [-1, 1, -1, 1, 0], // 轻微垂直移动\n                  transition: {\n                    duration: 1.0, // 增加持续时间，使晃动更加平滑\n                    repeat: Infinity, // 无限循环\n                    ease: 'easeInOut', // 使用平滑的缓动函数\n                    repeatDelay: 3,\n                  },\n                }}\n              >\n                <img css={style.rightIcon} src={navItem.rightIcon} alt=\"\" />\n              </motion.div>\n            )}\n          </div>\n        ),\n        key: isExternalLinks(navItem.link) ? navItem.link : linkKeyValue,\n        children: navItem.children ? createMenuItems(navItem.children) : null,\n      };\n    });\n  };\n  const menuItems: MenuProps['items'] = createMenuItems(navList);\n\n  // 获取小屏幕下多语言导航栏节点\n  const getLangNode = useCallback(() => {\n    if (locales.length < 2) {\n      return null;\n    }\n    if (locales.length === 2) {\n      const nextLang = locales.filter((item) => item.id !== locale.id)[0];\n      const nextPath = getTargetLocalePath({\n        current: locale,\n        target: nextLang,\n      });\n      return {\n        label: (\n          <a rel=\"noopener noreferrer\" href={nextPath}>\n            {nextLang.name}\n          </a>\n        ),\n        key: nextLang.id,\n      };\n    }\n    return {\n      label: <span>{locale.name}</span>,\n      key: 'multi-lang',\n      children: locales\n        .filter((item) => item.id !== locale.id)\n        .map((item) => {\n          const nextPath = getTargetLocalePath({\n            current: locale,\n            target: item,\n          });\n          return {\n            label: (\n              <a rel=\"noopener noreferrer\" href={nextPath}>\n                {item.name}\n              </a>\n            ),\n            key: item.id,\n          };\n        }),\n    };\n  }, [locale, locales]);\n\n  let additional: MenuProps['items'];\n  const additionalItems: MenuProps['items'] = [\n    prefersColor.switch\n      ? {\n          label: (\n            <div\n              onClick={() => {\n                const themeValue = theme.includes('dark') ? 'light' : 'dark';\n                updateSiteConfig({ theme: [themeValue] });\n              }}\n            >\n              <FormattedMessage id=\"app.theme.switch\" />\n            </div>\n          ),\n          key: 'theme',\n        }\n      : null,\n    github || socialLinks?.github\n      ? {\n          label: (\n            <a\n              rel=\"noopener noreferrer\"\n              href={github || socialLinks?.github}\n              target=\"_blank\"\n            >\n              GitHub\n            </a>\n          ),\n          key: 'github',\n        }\n      : null,\n    getLangNode(),\n    ...(getMoreLinksGroup(moreLinks) || []),\n  ];\n\n  if (isMobile) {\n    additional = additionalItems;\n  } else if (responsive === 'crowded') {\n    additional = [\n      {\n        label: <MenuFoldOutlined />,\n        key: 'additional',\n        children: [...additionalItems],\n      },\n    ];\n  }\n  const items: MenuProps['items'] = [\n    ...(menuItems ?? []),\n    ...(additional ?? []),\n  ];\n  const menuMode = isMobile ? 'inline' : 'horizontal';\n  const style = useStyle();\n  return (\n    <Menu\n      items={items}\n      mode={menuMode}\n      css={style.nav}\n      selectedKeys={[activeMenuItem]}\n      disabledOverflow\n    />\n  );\n}\n"
  },
  {
    "path": ".dumi/theme/slots/Header/SwitchBtn.tsx",
    "content": "import { css } from '@emotion/react';\nimport { Tooltip } from 'antd';\nimport React from 'react';\nimport useSiteToken from '../../hooks/useSiteToken';\n\nexport interface LangBtnProps {\n  label1: React.ReactNode;\n  label2: React.ReactNode;\n  tooltip1?: React.ReactNode;\n  tooltip2?: React.ReactNode;\n  value: 1 | 2;\n  pure?: boolean;\n  onClick?: React.MouseEventHandler;\n}\n\nconst BASE_SIZE = '1.2em';\n\nconst useStyle = () => {\n  const { token } = useSiteToken();\n  const { controlHeight, motionDurationMid } = token;\n\n  return {\n    btn: css`\n      color: ${token.colorText};\n      border-color: ${token.colorBorder};\n      padding: 0 !important;\n      width: ${controlHeight}px;\n      height: ${controlHeight}px;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      border: none;\n      background: transparent;\n      border-radius: ${token.borderRadius}px;\n      transition: all ${motionDurationMid};\n      cursor: pointer;\n\n      .btn-inner {\n        transition: all ${motionDurationMid};\n      }\n\n      &:hover {\n        background: ${token.colorBgTextHover};\n      }\n\n      img {\n        width: ${BASE_SIZE};\n        height: ${BASE_SIZE};\n      }\n\n      .anticon {\n        font-size: ${BASE_SIZE};\n      }\n    `\n  };\n};\n\nexport default function SwitchBtn({\n  label1,\n  label2,\n  tooltip1,\n  tooltip2,\n  value,\n  pure,\n  onClick\n}: LangBtnProps) {\n  const { token } = useSiteToken();\n  const style = useStyle();\n\n  let label1Style: React.CSSProperties;\n  let label2Style: React.CSSProperties;\n\n  const iconStyle: React.CSSProperties = {\n    position: 'absolute',\n    fontSize: BASE_SIZE,\n    lineHeight: 1,\n    border: `1px solid ${token.colorText}`,\n    color: token.colorText\n  };\n\n  const fontStyle: React.CSSProperties = {\n    left: '-5%',\n    top: 0,\n    zIndex: 1,\n    background: token.colorText,\n    color: token.colorBgContainer,\n    transformOrigin: '0 0',\n    transform: 'scale(0.7)'\n  };\n  const backStyle: React.CSSProperties = {\n    right: '-5%',\n    bottom: 0,\n    zIndex: 0,\n    transformOrigin: '100% 100%',\n    transform: 'scale(0.5)'\n  };\n\n  if (value === 1) {\n    label1Style = fontStyle;\n    label2Style = backStyle;\n  } else {\n    label1Style = backStyle;\n    label2Style = fontStyle;\n  }\n\n  let node = (\n    <button onClick={onClick} css={[style.btn]} key=\"lang-button\" data-value={value} type=\"button\">\n      <div className=\"btn-inner\">\n        {pure && (value === 1 ? label1 : label2)}\n        {!pure && (\n          <div\n            style={{\n              position: 'relative',\n              width: BASE_SIZE,\n              height: BASE_SIZE\n            }}\n          >\n            <span\n              style={{\n                ...iconStyle,\n                ...label1Style\n              }}\n            >\n              {label1}\n            </span>\n            <span\n              style={{\n                ...iconStyle,\n                ...label2Style\n              }}\n            >\n              {label2}\n            </span>\n          </div>\n        )}\n      </div>\n    </button>\n  );\n\n  if (tooltip1 || tooltip2) {\n    node = <Tooltip title={value === 1 ? tooltip1 : tooltip2}>{node}</Tooltip>;\n  }\n\n  return node;\n}\n"
  },
  {
    "path": ".dumi/theme/slots/Header/index.tsx",
    "content": "/* eslint-disable import/no-unresolved */\nimport { MenuOutlined } from '@ant-design/icons';\nimport { ClassNames, css } from '@emotion/react';\nimport { Col, Popover, Row, Select } from 'antd';\nimport classNames from 'classnames';\nimport { useLocale, useLocation } from 'dumi';\nimport DumiSearchBar from 'dumi/theme-default/slots/SearchBar';\nimport LangSwitch from 'dumi/theme/slots/LangSwitch';\nimport React, {\n  useCallback,\n  useContext,\n  useEffect,\n  useState,\n  type FC,\n} from 'react';\nimport useAdditionalThemeConfig from '../../hooks/useAdditionalThemeConfig';\nimport useSiteToken from '../../hooks/useSiteToken';\nimport type { SiteContextProps } from '../SiteContext';\nimport SiteContext from '../SiteContext';\nimport HeaderExtra from './HeaderExtral';\nimport Logo from './Logo';\nimport More from './More';\nimport Navigation from './Navigation';\n\ninterface HeaderState {\n  windowWidth: number;\n  menuVisible: boolean;\n}\nexport type IResponsive = null | 'narrow' | 'crowded';\n\nconst RESPONSIVE_XS = 1120;\nconst RESPONSIVE_SM = 1200;\n\nconst colPropsHome = [\n  {\n    flex: 'none',\n  },\n  {\n    flex: 'auto',\n  },\n];\nconst _colProps = [\n  {\n    xxl: 4,\n    xl: 5,\n    lg: 6,\n    md: 6,\n    sm: 24,\n    xs: 24,\n  },\n  {\n    xxl: 20,\n    xl: 19,\n    lg: 18,\n    md: 18,\n    sm: 0,\n    xs: 0,\n  },\n];\n\nconst useStyle = () => {\n  const { token } = useSiteToken();\n  const searchIconColor = '#ced4d9';\n\n  return {\n    header: css`\n      position: fixed;\n      top: 0;\n      left: 0;\n      right: 0;\n      z-index: 99;\n      max-width: 100%;\n      background: ${token.colorBgContainer};\n      box-shadow: ${token.boxShadowTertiary};\n\n      @media only screen and (max-width: ${token.mobileMaxWidth}px) {\n        text-align: center;\n      }\n\n      .nav-search-wrapper {\n        display: flex;\n        flex: auto;\n      }\n\n      .dumi-default-search-bar {\n        border-inline-start: 1px solid rgba(0, 0, 0, 0.06);\n\n        > svg {\n          width: 14px;\n          fill: ${searchIconColor};\n        }\n\n        > input {\n          height: 22px;\n          border: 0;\n\n          &:focus {\n            box-shadow: none;\n          }\n\n          &::placeholder {\n            color: ${searchIconColor};\n          }\n        }\n\n        .dumi-default-search-shortcut {\n          color: ${searchIconColor};\n          background-color: rgba(150, 150, 150, 0.06);\n          border-color: rgba(100, 100, 100, 0.2);\n          border-radius: 4px;\n        }\n\n        .dumi-default-search-popover {\n          inset-inline-start: 11px;\n          inset-inline-end: unset;\n\n          &::before {\n            inset-inline-start: 100px;\n            inset-inline-end: unset;\n          }\n        }\n      }\n    `,\n    menuRow: css`\n      display: flex;\n      align-items: center;\n      margin: 0;\n\n      > * {\n        flex: none;\n        margin: 0 12px 0 0;\n\n        &:last-child {\n          margin-inline-end: 40px;\n        }\n      }\n\n      ${token.antCls}-row-rtl & {\n        > * {\n          &:last-child {\n            margin-right: 12px;\n            margin-left: 40px;\n          }\n        }\n      }\n    `,\n    popoverMenu: {\n      width: 300,\n\n      [`${token.antCls}-popover-inner-content`]: {\n        padding: 0,\n      },\n    },\n  };\n};\n\nconst Header: FC = () => {\n  const { isMobile } = useContext<SiteContextProps>(SiteContext);\n  const [headerState, setHeaderState] = useState<HeaderState>({\n    windowWidth: 1400,\n    menuVisible: false,\n  });\n  const location = useLocation();\n  const { docVersions } = useAdditionalThemeConfig();\n\n  const onWindowResize = useCallback(() => {\n    setHeaderState((prev) => ({\n      ...prev,\n      windowWidth: window.innerWidth,\n    }));\n  }, []);\n  const handleHideMenu = useCallback(() => {\n    setHeaderState((prev) => ({\n      ...prev,\n      menuVisible: false,\n    }));\n  }, []);\n  const onMenuVisibleChange = useCallback((visible: boolean) => {\n    setHeaderState((prev) => ({\n      ...prev,\n      menuVisible: visible,\n    }));\n  }, []);\n\n  const handleVersionChange = useCallback((url: string) => {\n    window.location.href = url;\n  }, []);\n\n  useEffect(() => {\n    handleHideMenu();\n  }, [location, handleHideMenu]);\n\n  useEffect(() => {\n    onWindowResize();\n    window.addEventListener('resize', onWindowResize);\n    return () => {\n      window.removeEventListener('resize', onWindowResize);\n    };\n  }, [onWindowResize]);\n\n  const { pathname } = location;\n  const locale = useLocale();\n  const suffix: string = (locale as any).suffex || '';\n  const isHome = ['', `index${suffix}`].includes(pathname);\n  const { windowWidth, menuVisible } = headerState;\n  const style = useStyle();\n  const headerClassName = classNames({\n    clearfix: true,\n    'home-header': isHome,\n  });\n  let responsive: IResponsive = null;\n\n  if (windowWidth < RESPONSIVE_XS) {\n    responsive = 'crowded';\n  } else if (windowWidth < RESPONSIVE_SM) {\n    responsive = 'narrow';\n  }\n\n  const navigationNode = (\n    <Navigation key=\"nav\" isMobile={isMobile} responsive={responsive} />\n  );\n  const versionOptions = Object.keys(docVersions ?? {}).map((version) => ({\n    value: docVersions?.[version],\n    label: version,\n  }));\n  let menu: (React.ReactElement | null)[] = [\n    navigationNode,\n    versionOptions.length > 0 ? (\n      <Select\n        key=\"version\"\n        size=\"small\"\n        defaultValue={versionOptions[0]?.value}\n        onChange={handleVersionChange}\n        popupMatchSelectWidth={false}\n        getPopupContainer={(trigger) => trigger.parentNode}\n        options={versionOptions}\n      />\n    ) : null,\n    <More key=\"more\" />,\n    <LangSwitch key={new Date().getTime()} />,\n    <HeaderExtra key=\"header-Extra\" />,\n  ];\n  if (windowWidth < RESPONSIVE_XS) {\n    menu = [navigationNode];\n  }\n\n  const colProps = isHome ? colPropsHome : _colProps;\n\n  return (\n    <header css={style.header} className={headerClassName}>\n      {isMobile && (\n        <ClassNames>\n          {({ css: cssFn }) => (\n            <Popover\n              overlayClassName={cssFn(style.popoverMenu)}\n              placement=\"bottomRight\"\n              content={menu}\n              trigger=\"click\"\n              open={menuVisible}\n              arrow\n              onOpenChange={onMenuVisibleChange}\n            >\n              <MenuOutlined className=\"nav-phone-icon\" />\n            </Popover>\n          )}\n        </ClassNames>\n      )}\n      <Row\n        style={{\n          height: 64,\n        }}\n      >\n        <Col {...colProps[0]}>\n          <Logo />\n        </Col>\n        <Col {...colProps[1]} css={style.menuRow}>\n          <div className=\"nav-search-wrapper\">\n            <DumiSearchBar />\n          </div>\n          {!isMobile && menu}\n        </Col>\n      </Row>\n    </header>\n  );\n};\n\nexport default Header;\n"
  },
  {
    "path": ".dumi/theme/slots/LangSwitch/index.tsx",
    "content": "// 多语言切换\nimport { Select } from 'antd';\nimport { history, useIntl, useLocale, useLocation, useSearchParams, useSiteData } from 'dumi';\nimport { useCallback, type FC } from 'react';\nimport useAdditionalThemeConfig from '../../hooks/useAdditionalThemeConfig';\nimport { getTargetLocalePath } from '../../utils';\nimport SwitchBtn from '../Header/SwitchBtn';\n\nconst { Option } = Select;\n\nconst LangSwitch: FC = () => {\n  const [searchParams] = useSearchParams();\n  const { localesEnhance } = useAdditionalThemeConfig();\n  const { locales } = useSiteData();\n  const { locale } = useIntl();\n  const current = useLocale();\n  const { pathname } = useLocation();\n\n  const handleLangChange = useCallback(\n    (lang: string) => {\n      let path = getTargetLocalePath({\n        pathname,\n        current,\n        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n        target: locales.find(({ id }) => id === lang)!\n      });\n\n      // 多多语言首页做特殊处理 eg. /index-en\n      if (path.startsWith('/-')) {\n        path = `/index${path.substring(1)}`;\n      } else if (path.endsWith('/index')) {\n        path = path.replace('/index', '/');\n      }\n      history.push({\n        pathname: path,\n        search: searchParams.toString()\n      });\n    },\n    [pathname, current, locales, searchParams]\n  );\n\n  const onLangChange = useCallback(() => {\n    handleLangChange(locales.filter((item) => item.id !== locale)[0].id);\n  }, [locale, handleLangChange, locales]);\n\n  let LangSwitchJSX;\n  // do not render in single language\n  if (locales.length > 2 || (!localesEnhance && locales.length > 2)) {\n    const langOptions = locales.map((lang) => (\n      <Option value={lang.id} key={lang.id}>\n        {lang.name}\n      </Option>\n    ));\n    LangSwitchJSX = (\n      <Select\n        key=\"lang\"\n        className=\"version\"\n        size=\"small\"\n        defaultValue={locale}\n        onChange={handleLangChange}\n        popupMatchSelectWidth={false}\n        getPopupContainer={(trigger) => trigger.parentNode}\n      >\n        {langOptions}\n      </Select>\n    );\n  } else if (locales.length === 2 && Array.isArray(localesEnhance) && localesEnhance.length > 1) {\n    // 按 locales 顺序展示\n    const switchValue = locales[0].id === locale ? 1 : 2;\n    LangSwitchJSX = (\n      <SwitchBtn\n        key=\"lang\"\n        onClick={onLangChange}\n        value={switchValue}\n        label1={localesEnhance[0].switchPrefix}\n        label2={localesEnhance[1].switchPrefix}\n        tooltip1={`${locales[0].name} / ${locales[1].name}`}\n        tooltip2={`${locales[1].name} / ${locales[0].name}`}\n      />\n    );\n  }\n  return LangSwitchJSX;\n};\n\nexport default LangSwitch;\n"
  },
  {
    "path": ".dumi/theme/slots/NotFound/index.tsx",
    "content": "import { HomeOutlined } from '@ant-design/icons';\nimport { Button, Result } from 'antd';\nimport { FormattedMessage, Link } from 'dumi';\nimport React from 'react';\n\nexport interface NotFoundProps {\n  router: {\n    push: (pathname: string) => void;\n    replace: (pathname: string) => void;\n  };\n}\n\nconst NotFoundPage: React.FC<NotFoundProps> = () => {\n  return (\n    <div id=\"page-404\">\n      <section>\n        <Result\n          status=\"404\"\n          title=\"404\"\n          subTitle={<FormattedMessage id=\"app.not-found.subTitle\" />}\n          extra={\n            <Link to=\"/\">\n              <Button type=\"primary\" icon={<HomeOutlined />}>\n                {' '}\n                <FormattedMessage id=\"app.not-found.back-home\" />\n              </Button>\n            </Link>\n          }\n        />\n      </section>\n    </div>\n  );\n};\n\nexport default NotFoundPage;\n"
  },
  {
    "path": ".dumi/theme/slots/Sidebar/index.tsx",
    "content": "import { UnorderedListOutlined } from '@ant-design/icons';\nimport { css } from '@emotion/react';\nimport { Col, ConfigProvider, Menu } from 'antd';\nimport { FormattedMessage, useMatchedRoute, useSidebarData } from 'dumi';\n\nimport MobileMenu from 'rc-drawer';\nimport 'rc-drawer/assets/index.css';\nimport React, {\n  FC,\n  useCallback,\n  useContext,\n  useEffect,\n  useMemo,\n  useState,\n} from 'react';\nimport useMenu from '../../hooks/useMenu';\nimport useSiteToken from '../../hooks/useSiteToken';\nimport SiteContext from '../SiteContext';\n\ninterface SidebarState {\n  mobileMenuVisible: boolean;\n}\n\nconst SWITCH_HEIGHT = 33;\n\nconst PLATFORM_ICON = {\n  alipay: {\n    default:\n      'https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*Dk3bQ5d5hmkAAAAAAAAAAAAADtF8AQ/original',\n    active:\n      'https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*9j5oQbJwkTwAAAAAAAAAAAAADtF8AQ/original',\n  },\n  wechat: {\n    default:\n      'https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*HD4MSp4J_0sAAAAAAAAAAAAADtF8AQ/original',\n    active:\n      'https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*7x3RQKnnTs4AAAAAAAAAAAAADtF8AQ/original',\n  },\n};\n\nconst useStyle = (isShowPlatfromSwitch) => {\n  const { token } = useSiteToken();\n\n  const { theme } = useContext(SiteContext);\n  const isDark = theme.includes('dark');\n\n  const { antCls, fontFamily, colorSplit } = token;\n\n  const swichHeight = useMemo(\n    () => (isShowPlatfromSwitch ? SWITCH_HEIGHT : 0),\n    [isShowPlatfromSwitch]\n  );\n\n  return {\n    asideContainer: css`\n      min-height: 100%;\n      padding-bottom: 48px;\n      font-family: Avenir, ${fontFamily}, sans-serif;\n      &.ant-menu-inline.ant-menu-inline {\n        border-inline-end: none;\n      }\n      &${antCls}-menu-inline {\n        user-select: none;\n        ${antCls}-menu-submenu-title h4,\n        > ${antCls}-menu-item,\n        ${antCls}-menu-item a {\n          overflow: hidden;\n          font-size: 14px;\n          text-overflow: ellipsis;\n        }\n\n        > ${antCls}-menu-item-group > ${antCls}-menu-item-group-title {\n          margin-top: 16px;\n          margin-bottom: 16px;\n          font-size: 13px;\n\n          &::after {\n            position: relative;\n            top: 12px;\n            display: block;\n            width: calc(100% - 20px);\n            height: 1px;\n            background: ${colorSplit};\n            content: '';\n          }\n        }\n\n        > ${antCls}-menu-item,\n          > ${antCls}-menu-submenu\n          > ${antCls}-menu-submenu-title,\n          > ${antCls}-menu-item-group\n          > ${antCls}-menu-item-group-title,\n          > ${antCls}-menu-item-group\n          > ${antCls}-menu-item-group-list\n          > ${antCls}-menu-item,\n          &${antCls}-menu-inline\n          > ${antCls}-menu-item-group\n          > ${antCls}-menu-item-group-list\n          > ${antCls}-menu-item {\n          padding-left: 40px !important;\n\n          ${antCls}-row-rtl & {\n            padding-right: 40px !important;\n            padding-left: 16px !important;\n          }\n        }\n\n        // Nest Category > Type > Article\n        &${antCls}-menu-inline {\n          ${antCls}-menu-item-group-title {\n            margin-left: 4px;\n            padding-left: 60px;\n\n            ${antCls}-row-rtl & {\n              padding-right: 60px;\n              padding-left: 16px;\n            }\n          }\n\n          ${antCls}-menu-item-group-list > ${antCls}-menu-item {\n            padding-left: 80px !important;\n\n            ${antCls}-row-rtl & {\n              padding-right: 80px !important;\n              padding-left: 16px !important;\n            }\n          }\n        }\n\n        ${antCls}-menu-item-group:first-of-type {\n          ${antCls}-menu-item-group-title {\n            margin-top: 0;\n          }\n        }\n      }\n\n      a[disabled] {\n        color: #ccc;\n      }\n\n      .chinese {\n        margin-left: 6px;\n        font-weight: normal;\n        font-size: 12px;\n        opacity: 0.67;\n      }\n    `,\n    mainMenu: css`\n      z-index: 1;\n      border-inline-end: 1px solid rgba(5, 5, 5, 0.06);\n      margin-top: ${isShowPlatfromSwitch ? -40 : 0}px;\n\n      .main-menu-inner {\n        position: sticky;\n        top: ${token.headerHeight + token.contentMarginTop + swichHeight}px;\n        width: 100%;\n        height: 100%;\n        max-height: calc(\n          100vh - ${token.headerHeight + token.contentMarginTop}px\n        );\n        overflow: hidden;\n        scrollbar-width: thin;\n        scrollbar-color: unset;\n      }\n\n      &:hover .main-menu-inner {\n        overflow-y: auto;\n      }\n    `,\n    mobileMenu: css`\n      position: fixed;\n      z-index: 2;\n      bottom: 100px;\n      right: 20px;\n      cursor: pointer;\n    `,\n    swichPlatform: css`\n      position: sticky;\n      top: ${64 + swichHeight / 2}px;\n      // top: 104px;\n      z-index: 1;\n      padding: 0 30px 20px 30px;\n      background: ${isDark ? '#141414' : '#fff'};\n      .swich {\n        height: ${swichHeight}px;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        background-color: ${isDark ? 'rgba(255, 255, 255, 0.04)' : '#e9e9e9'};\n        border-radius: 3px;\n        padding: 3px;\n        .item {\n          height: 27px;\n          border-radius: 1px;\n          display: flex;\n          align-items: center;\n          justify-content: center;\n          padding: 3px 0;\n          margin-right: 3px;\n          width: 100%;\n          transition: all 0.5s;\n          cursor: pointer;\n          user-select: none;\n          &:last-of-type {\n            margin-right: 0;\n          }\n          .icon {\n            width: 18px;\n            height: 18px;\n            margin-right: 8px;\n            flex-shrink: 0;\n          }\n          & > span {\n            font-size: 14px;\n            line-height: 20px;\n            color: #999999;\n            flex-shrink: 0;\n          }\n          &.active {\n            background: ${isDark ? '#141414' : '#fff'};\n            border-radius: 1px;\n            & > span {\n              font-weight: 500;\n              color: ${isDark ? '#fff' : '#1677ff'};\n            }\n          }\n          &.activeWx {\n            background: ${isDark ? '#141414' : '#fff'};\n            border-radius: 1px;\n            & > span {\n              font-weight: 500;\n              color: ${isDark ? '#fff' : 'rgba(0, 0, 0, 0.88)'};\n            }\n          }\n        }\n      }\n    `,\n  };\n};\n\nconst Sidebar: FC = () => {\n  const [sidebarState, setSidebarState] = useState<SidebarState>({\n    mobileMenuVisible: false,\n  });\n  const sidebarData = useSidebarData();\n\n  const matchedRoute = useMatchedRoute();\n\n  const isShowPlatfromSwitch = useMemo(() => {\n    const { pathname } = window.location;\n    return (\n      pathname.startsWith('/components/') ||\n      matchedRoute?.meta?.frontmatter?.nav?.path === '/components' ||\n      pathname.startsWith('/copilots/') ||\n      matchedRoute?.meta?.frontmatter?.nav?.path === '/copilot'\n    );\n  }, [matchedRoute]);\n\n  const styles = useStyle(isShowPlatfromSwitch);\n  const {\n    token: { colorBgContainer },\n  } = useSiteToken();\n  const { theme, isMobile, platform, updateSiteConfig } =\n    useContext(SiteContext);\n  const [menuItems, selectedKey] = useMenu();\n\n  const isDark = theme.includes('dark');\n\n  const handleShowMobileMenu = useCallback(() => {\n    setSidebarState((prev) => ({\n      ...prev,\n      mobileMenuVisible: true,\n    }));\n  }, []);\n\n  const handleCloseMobileMenu = useCallback(() => {\n    setSidebarState((prev) => ({\n      ...prev,\n      mobileMenuVisible: false,\n    }));\n  }, []);\n\n  useEffect(() => {\n    if (isMobile) {\n      handleCloseMobileMenu();\n    }\n  }, [isMobile, handleCloseMobileMenu]);\n\n  const { mobileMenuVisible } = sidebarState;\n\n  const menuChild = (\n    <ConfigProvider\n      theme={{\n        components: {\n          Menu: { itemBg: colorBgContainer, darkItemBg: colorBgContainer },\n        },\n      }}\n    >\n      <Menu\n        items={menuItems}\n        inlineIndent={30}\n        css={styles.asideContainer}\n        mode=\"inline\"\n        theme={isDark ? 'dark' : 'light'}\n        selectedKeys={[selectedKey]}\n        defaultOpenKeys={\n          sidebarData\n            ?.map(({ title }) => title)\n            .filter((item) => item) as string[]\n        }\n      />\n    </ConfigProvider>\n  );\n\n  const switchPlatform = useCallback(\n    (platform) => {\n      updateSiteConfig({\n        platform,\n      });\n    },\n    [platform, updateSiteConfig]\n  );\n\n  return isMobile ? (\n    <React.Fragment>\n      <MobileMenu\n        key=\"mobile-menu\"\n        contentWrapperStyle={{\n          width: '300px',\n        }}\n        open={mobileMenuVisible}\n        onClose={handleCloseMobileMenu}\n      >\n        {menuChild}\n      </MobileMenu>\n      {(menuItems ?? []).length > 1 ? (\n        <div css={styles.mobileMenu} onClick={handleShowMobileMenu}>\n          <UnorderedListOutlined />\n        </div>\n      ) : null}\n    </React.Fragment>\n  ) : (\n    <Col xxl={4} xl={5} lg={6} md={6} sm={24} xs={24} css={styles.mainMenu}>\n      {isShowPlatfromSwitch && (\n        <div css={styles.swichPlatform}>\n          <div className=\"swich\">\n            <div\n              className={`item ${platform === 'alipay' && 'active'}`}\n              onClick={() => switchPlatform('alipay')}\n            >\n              <img\n                className=\"icon\"\n                src={\n                  PLATFORM_ICON['alipay'][\n                    platform === 'alipay' ? 'active' : 'default'\n                  ]\n                }\n              />\n              <span>{<FormattedMessage id=\"app.theme.sidebar.alipay\" />}</span>\n            </div>\n            <div\n              className={`item ${platform === 'wechat' && 'activeWx'}`}\n              onClick={() => switchPlatform('wechat')}\n            >\n              <img\n                className=\"icon\"\n                src={\n                  PLATFORM_ICON['wechat'][\n                    platform === 'wechat' ? 'active' : 'default'\n                  ]\n                }\n              />\n              <span>{<FormattedMessage id=\"app.theme.sidebar.wechat\" />}</span>\n            </div>\n          </div>\n        </div>\n      )}\n      <section className=\"main-menu-inner\">{menuChild}</section>\n    </Col>\n  );\n};\n\nexport default Sidebar;\n"
  },
  {
    "path": ".dumi/theme/slots/SiteContext.ts",
    "content": "import type { DirectionType } from 'antd/lib/config-provider';\nimport { createContext } from 'react';\nimport type { ThemeName } from '../common/ThemeSwitch';\n\nexport type PlatformName = 'alipay' | 'wechat';\n\nexport interface SiteContextProps {\n  isMobile: boolean;\n  direction: DirectionType;\n  theme: ThemeName[];\n  platform: PlatformName;\n  herboxUrl: string; //  demo 预览模拟器iframe地址\n  updateSiteConfig: (props: Partial<SiteContextProps>) => void;\n}\n\nconst SiteContext = createContext<SiteContextProps>({\n  isMobile: false,\n  direction: 'ltr',\n  theme: [],\n  platform: 'alipay',\n  herboxUrl: '',\n  updateSiteConfig: () => {},\n});\n\nexport default SiteContext;\n"
  },
  {
    "path": ".dumi/theme/static/style.ts",
    "content": "import 'rc-footer/assets/index.less';\n"
  },
  {
    "path": ".dumi/theme/styles/variables.less",
    "content": "@prefix: dumi-theme-antd;\n\n@s-content-width: 1392px;\n@s-content-padding: 48px;\n@s-sidebar-width: 184px;\n@s-header-height: 76px;\n@s-header-height-m: 52px;\n\n// default theme colors\n@c-primary: #1677ff;\n@c-warning: #d59200;\n@c-success: #208a41;\n@c-error: #ce1f31;\n@c-text: #30363f;\n@c-text-secondary: #4f5866;\n@c-text-note: #8a9099;\n@c-border: #d0d5d8;\n@c-border-light: #e4e9ec;\n@c-site-bg: #f7f9fb;\n\n// dark theme colors\n// @dark-selector be injected by less-loader in feature/theme/index.ts\n@dark-solid-amount: 15%;\n@dark-light-amount: 22%;\n@dark-border-amount: 71%;\n@c-primary-dark: darken(@c-primary, @dark-solid-amount);\n@c-warning-dark: darken(@c-warning, @dark-solid-amount);\n@c-success-dark: darken(@c-success, @dark-solid-amount);\n@c-error-dark: darken(@c-error, @dark-solid-amount);\n@c-text-dark: lighten(@c-text-note, @dark-light-amount);\n@c-text-secondary-dark: lighten(@c-text-secondary, @dark-light-amount);\n@c-text-note-dark: lighten(@c-text, @dark-light-amount);\n@c-border-dark: darken(@c-border, @dark-border-amount);\n@c-border-less-dark: darken(@c-border-light, @dark-border-amount);\n@c-site-bg-dark: darken(@c-site-bg, 95%);\n\n@mobile: ~'only screen and (max-width: 767px)';\n@tablet: ~'only screen and (min-width: 768px) and (max-width: 1024px)';\n@desktop: ~'only screen and (min-width: 1025px)';\n"
  },
  {
    "path": ".dumi/theme/types.ts",
    "content": "import type { SerializedStyles } from '@emotion/react';\nimport type { IThemeConfig } from 'dumi/dist/client/theme-api/types';\nimport type { ThemeConfig } from 'antd';\nimport type { FooterColumn } from 'rc-footer/lib/column';\n\nexport type ISidebarGroupModePathItem = string;\n\ninterface ILocaleEnhance {\n  /** 同 themeConfig 中 locales 项中的 id */\n  id: string;\n  /** 当多语言只有两项时用于展示切换的前缀 */\n  switchPrefix: string;\n}\n\ninterface IAction {\n  /** 按钮文字描述 */\n  text: string;\n  /** 按钮链接 */\n  link: string;\n  /** 按钮类型 */\n  type?: 'primary' | 'default';\n}\n\nexport interface IMoreLink {\n  /** 链接文字描述 */\n  text: string;\n  /** 链接 */\n  link: string;\n}\n\ninterface IFeature {\n  /** 特性名称 */\n  title: string;\n  /** 特性具体描述 */\n  details: string;\n  /** css in js 样式 */\n  itemCss?: SerializedStyles;\n}\n\ninterface ILoading {\n  skeleton?: Array<string>;\n}\n// 分组类型，将 children 换位字符串数组\n\nexport type SidebarEnhanceItemType = {\n  title: string;\n  link: string;\n  target?: string;\n};\n\nexport type SidebarEnhanceChildrenType = string | SidebarEnhanceItemType;\nexport type SidebarEnhanceSubType = {\n  children: SidebarEnhanceChildrenType[];\n  title: string;\n};\n\n// 增强模式的 sidebar 相关类型\nexport type SidebarEnhanceGroupChildren = (SidebarEnhanceSubType | SidebarEnhanceChildrenType)[];\nexport type SidebarEnhanceGroupType = {\n  type: 'group';\n  title: string;\n  children: SidebarEnhanceGroupChildren;\n};\nexport type SidebarEnhanceType =\n  | SidebarEnhanceSubType\n  | SidebarEnhanceGroupType\n  | SidebarEnhanceChildrenType;\nexport type SidebarEnhanceItems = SidebarEnhanceType[];\n\ninterface IDocVersion {\n  [propName: string]: string;\n}\n\nexport interface IBannerConfig {\n  /** 是否展示头部 banner 背景 */\n  showBanner?: boolean;\n  /** banner 图片地址 */\n  bannerImgUrl?: string;\n  /** banner 移动端图片地址 */\n  bannerMobileImgUrl?: string;\n}\n\ninterface IAdditionalThemeConfig {\n  /** github 链接 */\n  github?: string;\n  /** 首页链接 */\n  homeLink?: string;\n  /** 多语言额外配置，主要用于展示语言切换文字（只针对于两项多语言时） */\n  localesEnhance?: ILocaleEnhance[];\n  /** 配置首页首屏区域的大标题。 */\n  title?: string | Record<string, string>;\n  /** 配置首页首屏区域的简介文字 */\n  description?: string | Record<string, string>;\n  /** 配置首页首屏区域的操作按钮 */\n  actions?: IAction[] | Record<string, IAction[]>;\n  /** 配置首页特性描述 */\n  features?: IFeature[] | Record<string, IFeature[]>;\n  /** sidebar group 模式路由 */\n  sidebarGroupModePath?: true | ISidebarGroupModePathItem[];\n  /** 文档版本 */\n  docVersions?: IDocVersion;\n  /** 更多链接 */\n  moreLinks?: IMoreLink[] | Record<string, IMoreLink[]>;\n  /** banner 配置 */\n  bannerConfig?: IBannerConfig;\n  /** 是否展示 rtl */\n  rtl?: boolean;\n  /** 增强模式的 sidebar */\n  sidebarEnhance?: Record<string, SidebarEnhanceItems>;\n  /** antd 主题定制，同 `ConfigProvider` 中 `theme` */\n  theme?: Omit<ThemeConfig, 'algorithm'>;\n  /** 是否展示页面加载状态 */\n  loading?: ILoading;\n  /** footer 上方展示友情链接 */\n  footerLinks?: FooterColumn[] | Record<string, FooterColumn[]>;\n  /** SSR, plugin 自动注入，无需设置 */\n  ssr?: boolean | Record<string, unknown>;\n}\n\nexport interface IAllThemeConfig extends IThemeConfig, IAdditionalThemeConfig {}\n\nexport { IAdditionalThemeConfig, ILocaleEnhance, IFeature, IAction };\n"
  },
  {
    "path": ".dumi/theme/utils.ts",
    "content": "import { history, useSiteData } from 'dumi';\nimport type { ISidebarGroup } from 'dumi/dist/client/theme-api/types';\n\ntype ILocaleItem = ReturnType<typeof useSiteData>['locales'][0];\n\nexport function getTargetLocalePath({\n  pathname = history.location.pathname,\n  current,\n  target\n}: {\n  pathname?: string;\n  current: ILocaleItem;\n  target: ILocaleItem;\n}) {\n  const clearPath =\n    'base' in current\n      ? pathname.replace(current.base.replace(/\\/$/, ''), '')\n      : pathname.replace(new RegExp(`${current.suffix}$`), '');\n\n  return 'base' in target\n    ? `${target.base}${clearPath}`.replace(/^\\/\\//, '/')\n    : `${clearPath}${target.suffix}`;\n}\n\n// 删除标题中的 HTML 标签\nexport const removeTitleCode = (title = '') => {\n  return title.replace(/<\\w+>.*<\\/\\w+>/g, '');\n};\n\nexport const isExternalLinks = (link?: string): boolean => {\n  return /^(\\w+:)\\/\\/|^(mailto|tel):/.test(link ?? '');\n};\n\nexport const handleFullSidebarData = (\n  fullSidebarData: Record<string, ISidebarGroup[]>\n): Record<string, ISidebarGroup[]> => {\n  const nextFullSidebarData: Record<string, ISidebarGroup[]> = {};\n  Object.entries(fullSidebarData).forEach(([key, value]) => {\n    const existedLevelOneNavList = Object.keys(nextFullSidebarData);\n    if (key.split('/').length === 3) {\n      // 二级目录\n      const levelOneNavKey = `/${key.split('/')[1]}`;\n      let _levelTwoNav = value[0]?.children?.find((item) => {\n        const _frontmatterInfo = item.frontmatter?.nav;\n        return typeof _frontmatterInfo === 'object' && typeof _frontmatterInfo?.second === 'object';\n      });\n      // 如果是 second 配置不为对象，直接获取其值即可\n      if (!_levelTwoNav) {\n        _levelTwoNav = value[0]?.children[0];\n      }\n      // 找找二级菜单名称以及顺序\n      const _levelTwoNavInfo = _levelTwoNav?.frontmatter?.nav;\n      const frontmatterNavSecond: { order: number; title?: string } = {\n        order: 0,\n        title: undefined\n      };\n      if (typeof _levelTwoNavInfo !== 'string') {\n        // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n        // @ts-ignore\n        frontmatterNavSecond.order = _levelTwoNavInfo?.second?.order ?? 0;\n        // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n        // @ts-ignore\n        frontmatterNavSecond.title = _levelTwoNavInfo?.second?.title ?? _levelTwoNavInfo?.second;\n      }\n\n      if (existedLevelOneNavList.includes(levelOneNavKey)) {\n        // 已存在，直接 push 为 children\n        nextFullSidebarData[levelOneNavKey].push({\n          title: frontmatterNavSecond.title,\n          order: frontmatterNavSecond.order,\n          children: value[0]?.children\n        });\n      } else {\n        nextFullSidebarData[levelOneNavKey] = value.map((item) => ({\n          ...item,\n          title: frontmatterNavSecond.title,\n          order: frontmatterNavSecond.order\n        }));\n      }\n    } else if (existedLevelOneNavList.includes(key)) {\n      nextFullSidebarData[key] = nextFullSidebarData[key].concat(value);\n    } else {\n      nextFullSidebarData[key] = value;\n    }\n  });\n  return nextFullSidebarData;\n};\n"
  },
  {
    "path": ".dumi/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"strictNullChecks\": true,\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"node\",\n    \"declaration\": true,\n    \"resolveJsonModule\": true,\n    \"esModuleInterop\": true,\n    \"experimentalDecorators\": true,\n    \"jsx\": \"react-jsx\",\n    \"jsxImportSource\": \"@emotion/react\",\n    \"noUnusedParameters\": true,\n    \"noUnusedLocals\": true,\n    \"noImplicitAny\": false,\n    \"target\": \"es6\",\n    \"lib\": [\n      \"dom\",\n      \"es2021\"\n    ],\n    \"skipLibCheck\": true,\n    \"stripInternal\": true,\n    \"baseUrl\": \"./\",\n    \"paths\": {\n      \"@@/*\": [\n        \".dumi/tmp/*\"\n      ],\n      \"dumi/theme/*\": [\n        \".dumi/theme/*\"\n      ],\n    }\n  },\n  \"exclude\": [\n    \"node_modules\"\n  ]\n}\n"
  },
  {
    "path": ".dumirc.ts",
    "content": "import { defineConfig } from 'dumi';\nimport { defineThemeConfig } from './.dumi/theme/defineThemeConfig';\n\nexport default defineConfig({\n  mfsu: false,\n  hash: true,\n  outputPath: 'docs-dist',\n  ssr: false,\n  sitemap: { hostname: 'https://mini.ant.design' },\n  favicons: [\n    'https://gw.alipayobjects.com/zos/bmw-prod/35bd3910-2382-4f5d-903f-ac4c31b76199.svg',\n  ],\n  extraBabelPresets: ['@emotion/babel-preset-css-prop'],\n  metas: [\n    {\n      name: 'viewport',\n      content:\n        'width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no, viewport-fit=cover',\n    },\n    {\n      name: 'google-site-verification',\n      content: 'kzh4AXx63f3ZC1w2W_k4DWX4L2p_4hRcP5SsRmmMk8k',\n    },\n  ],\n  headScripts: [\n    {\n      src: 'https://gw.alipayobjects.com/os/lib/current-device/0.10.2/umd/current-device.min.js',\n    },\n    {\n      src: 'https://v1.cnzz.com/z_stat.php?id=1280900245&web_id=1280900245',\n      async: true,\n    },\n  ],\n  links: [\n    {\n      rel: 'preconnect',\n      href: 'https://8V6T3YYVB3-dsn.algolia.net',\n    },\n  ],\n  themeConfig: defineThemeConfig({\n    name: 'Ant Design Mini',\n    prefersColor: {\n      default: 'auto',\n      switch: true,\n    },\n    rtl: false,\n    logo: 'https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*xfx9Q4kg62MAAAAAAAAAAAAADtF8AQ/original',\n    lastUpdated: true,\n    nav: {\n      'zh-CN': [\n        {\n          title: '指南',\n          link: '/guide/quick-start',\n        },\n        {\n          title: '组件',\n          link: '/components/overview',\n        },\n        {\n          title: 'Copilot',\n          link: '/copilots/bubble',\n          // @ts-ignore\n          isNew: true,\n          rightIcon:\n            'https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*iiKoT73_9ucAAAAAAAAAAAAAetF8AQ/original',\n        },\n        {\n          title: '资源',\n          link: '/resources',\n        },\n        {\n          title: '国内镜像',\n          link: 'https://ant-design-mini.antgroup.com',\n        },\n        {\n          title: '发布日志',\n          link: 'https://github.com/ant-design/ant-design-mini/releases',\n        },\n      ],\n      'en': [\n        {\n          title: 'Guide',\n          link: '/guide/quick-start-en',\n        },\n        {\n          title: 'Components',\n          link: '/components/overview-en',\n        },\n        {\n          title: 'Copilot',\n          link: '/copilots/bubble-en',\n          // @ts-ignore\n          isNew: true,\n          rightIcon:\n            'https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*iiKoT73_9ucAAAAAAAAAAAAAetF8AQ/original',\n        },\n        {\n          title: 'Resources',\n          link: '/resources-en',\n        },\n        {\n          title: 'Domestic Mirror',\n          link: 'https://ant-design-mini.antgroup.com',\n        },\n        {\n          title: 'Releases',\n          link: 'https://github.com/ant-design/ant-design-mini/releases',\n        },\n      ],\n    },\n    footer: `© ${new Date().getFullYear()} Made with ❤ by\n        <a className={styles.copyrightLink} href='https://xtech.antfin.com' target='_blank'>\n          XTech\n        </a>`,\n    github: 'https://github.com/ant-design/ant-design-mini',\n    localesEnhance: [\n      { id: 'zh-CN', switchPrefix: '中' },\n      { id: 'en', switchPrefix: 'EN' },\n    ],\n    title: 'Ant Design Mini',\n    description: {\n      'zh-CN': '探索移动端小程序的极致体验',\n      'en': 'Explore the ultimate experience of mobile applets',\n    },\n    actions: {\n      'zh-CN': [\n        {\n          type: 'primary',\n          text: '快速上手',\n          link: '/guide/quick-start',\n        },\n        {\n          text: '在线体验',\n          link: '/components/overview',\n        },\n      ],\n      'en': [\n        {\n          type: 'primary',\n          text: 'Get started quickly',\n          link: '/guide/quick-start-en',\n        },\n        {\n          text: 'Online Experience',\n          link: '/components/overview-en',\n        },\n      ],\n    },\n    features: {},\n    loading: {\n      skeleton: ['/guide', '/components', '/guide', '/components'],\n    },\n    docVersions: {\n      'v3': '',\n      'v2': 'https://2x-mini.ant.design',\n    },\n    footerLinks: {\n      'zh-CN': [\n        {\n          title: '相关资源',\n          items: [\n            {\n              title: 'Ant Design',\n              url: 'https://ant.design',\n              openExternal: true,\n            },\n            {\n              title: 'Ant Design Charts',\n              url: 'https://charts.ant.design',\n              openExternal: true,\n            },\n            {\n              title: 'Ant Design Pro',\n              url: 'https://pro.ant.design',\n              openExternal: true,\n            },\n            {\n              title: 'Ant Design Pro Components',\n              url: 'https://procomponents.ant.design',\n              openExternal: true,\n            },\n            {\n              title: 'Ant Design Mobile',\n              url: 'https://mobile.ant.design',\n              openExternal: true,\n            },\n            {\n              title: 'Ant Design Landing',\n              description: '首页模板集',\n              url: 'https://landing.ant.design',\n              openExternal: true,\n            },\n            {\n              title: 'Scaffolds',\n              description: '脚手架市场',\n              url: 'https://scaffold.ant.design',\n              openExternal: true,\n            },\n            {\n              title: 'Umi',\n              description: 'react 应用开发框架',\n              url: 'https://umijs.org',\n              openExternal: true,\n            },\n            {\n              title: 'Dumi',\n              description: '组件/文档研发工具',\n              url: 'https://d.umijs.org',\n              openExternal: true,\n            },\n            {\n              title: 'qiankun',\n              description: '微前端框架',\n              url: 'https://qiankun.umijs.org',\n              openExternal: true,\n            },\n            {\n              title: 'ahooks',\n              description: 'React Hooks 库',\n              url: 'https://github.com/alibaba/hooks',\n              openExternal: true,\n            },\n            {\n              title: 'Ant Motion',\n              description: '设计动效',\n              url: 'https://motion.ant.design',\n              openExternal: true,\n            },\n          ],\n        },\n        {\n          title: '社区',\n          items: [\n            {\n              title: 'Awesome Ant Design',\n              url: 'https://github.com/websemantics/awesome-ant-design',\n              openExternal: true,\n            },\n            {\n              title: 'Medium',\n              url: 'http://medium.com/ant-design/',\n              openExternal: true,\n            },\n            {\n              title: 'Twitter',\n              url: 'http://twitter.com/antdesignui',\n              openExternal: true,\n            },\n            {\n              title: '体验科技专栏',\n              url: 'http://zhuanlan.zhihu.com/xtech',\n              openExternal: true,\n            },\n          ],\n        },\n        {\n          title: '帮助',\n          items: [\n            {\n              icon: 'https://github-production-user-asset-6210df.s3.amazonaws.com/20694238/256181695-b05fa72a-4ab5-479d-bb74-3d723755de47.png',\n              title: 'GitHub',\n              url: 'https://github.com/ant-design/ant-design-mini',\n              openExternal: true,\n            },\n            {\n              icon: 'https://github-production-user-asset-6210df.s3.amazonaws.com/20694238/256181680-3b031d0f-1c51-48d2-a676-b2f82aa23e09.png',\n              title: '报告 Bug',\n              url: 'https://github.com/ant-design/ant-design-mini/issues',\n              openExternal: true,\n            },\n            {\n              icon: 'https://github-production-user-asset-6210df.s3.amazonaws.com/20694238/256181701-b51d6a6f-3190-4525-80d0-43ac194437c9.png',\n              title: '讨论列表',\n              url: 'https://github.com/ant-design/ant-design-mini/issues',\n              openExternal: true,\n            },\n          ],\n        },\n        {\n          title: '更多产品',\n          icon: 'https://gw.alipayobjects.com/zos/rmsportal/nBVXkrFdWHxbZlmMbsaH.svg',\n          items: [\n            {\n              icon: 'https://gw.alipayobjects.com/zos/rmsportal/XuVpGqBFxXplzvLjJBZB.svg',\n              title: '语雀',\n              url: 'https://yuque.com',\n              description: '构建你的数字花园',\n              openExternal: true,\n            },\n            {\n              icon: 'https://gw.alipayobjects.com/zos/antfincdn/nc7Fc0XBg5/8a6844f5-a6ed-4630-9177-4fa5d0b7dd47.png',\n              title: 'AntV',\n              url: 'https://antv.vision',\n              description: '数据可视化解决方案',\n              openExternal: true,\n            },\n            {\n              icon: 'https://www.eggjs.org/logo.svg',\n              title: 'Egg',\n              url: 'https://eggjs.org',\n              description: '企业级 Node.js 框架',\n              openExternal: true,\n            },\n            {\n              icon: 'https://gw.alipayobjects.com/zos/rmsportal/DMDOlAUhmktLyEODCMBR.ico',\n              title: 'Kitchen',\n              description: 'Sketch 工具集',\n              url: 'https://kitchen.alipay.com',\n              openExternal: true,\n            },\n            {\n              icon: 'https://gw.alipayobjects.com/zos/rmsportal/nBVXkrFdWHxbZlmMbsaH.svg',\n              title: '蚂蚁体验科技',\n              url: 'https://xtech.antfin.com/',\n              openExternal: true,\n            },\n          ],\n        },\n      ],\n      'en': [\n        {\n          title: 'Related resources',\n          items: [\n            {\n              title: 'Ant Design',\n              url: 'https://ant.design',\n              openExternal: true,\n            },\n            {\n              title: 'Ant Design Charts',\n              url: 'https://charts.ant.design',\n              openExternal: true,\n            },\n            {\n              title: 'Ant Design Pro',\n              url: 'https://pro.ant.design',\n              openExternal: true,\n            },\n            {\n              title: 'Ant Design Pro Components',\n              url: 'https://procomponents.ant.design',\n              openExternal: true,\n            },\n            {\n              title: 'Ant Design Mobile',\n              url: 'https://mobile.ant.design',\n              openExternal: true,\n            },\n            {\n              title: 'Ant Design Landing',\n              description: 'Home page template set',\n              url: 'https://landing.ant.design',\n              openExternal: true,\n            },\n            {\n              title: 'Scaffolds',\n              description: 'scaffolding market',\n              url: 'https://scaffold.ant.design',\n              openExternal: true,\n            },\n            {\n              title: 'Umi',\n              description: 'react development framework',\n              url: 'https://umijs.org',\n              openExternal: true,\n            },\n            {\n              title: 'Dumi',\n              description: 'component/doc development toolkit',\n              url: 'https://d.umijs.org',\n              openExternal: true,\n            },\n            {\n              title: 'qiankun',\n              description: 'Micro front-end framework',\n              url: 'https://qiankun.umijs.org',\n              openExternal: true,\n            },\n            {\n              title: 'ahooks',\n              description: 'React Hooks Library',\n              url: 'https://github.com/alibaba/hooks',\n              openExternal: true,\n            },\n            {\n              title: 'Ant Motion',\n              description: 'Design animation',\n              url: 'https://motion.ant.design',\n              openExternal: true,\n            },\n          ],\n        },\n        {\n          title: 'Community',\n          items: [\n            {\n              title: 'Awesome Ant Design',\n              url: 'https://github.com/websemantics/awesome-ant-design',\n              openExternal: true,\n            },\n            {\n              title: 'Medium',\n              url: 'http://medium.com/ant-design/',\n              openExternal: true,\n            },\n            {\n              title: 'Twitter',\n              url: 'http://twitter.com/antdesignui',\n              openExternal: true,\n            },\n            {\n              title: 'Experience Technology Column',\n              url: 'http://zhuanlan.zhihu.com/xtech',\n              openExternal: true,\n            },\n          ],\n        },\n        {\n          title: 'Help',\n          items: [\n            {\n              icon: 'https://github-production-user-asset-6210df.s3.amazonaws.com/20694238/256181695-b05fa72a-4ab5-479d-bb74-3d723755de47.png',\n              title: 'GitHub',\n              url: 'https://github.com/ant-design/ant-design-mini',\n              openExternal: true,\n            },\n            {\n              icon: 'https://github-production-user-asset-6210df.s3.amazonaws.com/20694238/256181680-3b031d0f-1c51-48d2-a676-b2f82aa23e09.png',\n              title: 'Report Bug',\n              url: 'https://github.com/ant-design/ant-design-mini/issues',\n              openExternal: true,\n            },\n            {\n              icon: 'https://github-production-user-asset-6210df.s3.amazonaws.com/20694238/256181701-b51d6a6f-3190-4525-80d0-43ac194437c9.png',\n              title: 'Discussion List',\n              url: 'https://github.com/ant-design/ant-design-mini/issues',\n              openExternal: true,\n            },\n          ],\n        },\n        {\n          title: 'More Production',\n          icon: 'https://gw.alipayobjects.com/zos/rmsportal/nBVXkrFdWHxbZlmMbsaH.svg',\n          items: [\n            {\n              icon: 'https://gw.alipayobjects.com/zos/rmsportal/XuVpGqBFxXplzvLjJBZB.svg',\n              title: 'Yuque',\n              url: 'https://yuque.com',\n              description: 'Build your digital garden',\n              openExternal: true,\n            },\n            {\n              icon: 'https://gw.alipayobjects.com/zos/antfincdn/nc7Fc0XBg5/8a6844f5-a6ed-4630-9177-4fa5d0b7dd47.png',\n              title: 'AntV',\n              url: 'https://antv.vision',\n              description: 'Data visualization solutions',\n              openExternal: true,\n            },\n            {\n              icon: 'https://www.eggjs.org/logo.svg',\n              title: 'Egg',\n              url: 'https://eggjs.org',\n              description: 'Enterprise-grade Node.js framework',\n              openExternal: true,\n            },\n            {\n              icon: 'https://gw.alipayobjects.com/zos/rmsportal/DMDOlAUhmktLyEODCMBR.ico',\n              title: 'Kitchen',\n              description: 'Sketch Toolkit',\n              url: 'https://kitchen.alipay.com',\n              openExternal: true,\n            },\n            {\n              icon: 'https://gw.alipayobjects.com/zos/rmsportal/nBVXkrFdWHxbZlmMbsaH.svg',\n              title: 'Ant Experience Technology',\n              url: 'https://xtech.antfin.com/',\n              openExternal: true,\n            },\n          ],\n        },\n      ],\n    },\n    // Header 配置\n    headerLocales: {\n      'zh-CN': {\n        key: 'zh-CN',\n        theme: '切换主题',\n      },\n      'en': {\n        key: 'en',\n        theme: 'Theme Switch',\n      },\n    },\n    // Banner 配置\n    bannerLocales: {\n      'zh-CN': {\n        key: 'zh-CN',\n        desc: '# 探索移动端小程序的极致体验',\n        integration: '快速接入',\n        try: '在线体验',\n      },\n      'en': {\n        key: 'en',\n        desc: '# Explore the Ultimate Experience of Mobile Mini Programs',\n        integration: 'Quick Start',\n        try: 'Try It Online',\n      },\n    },\n    // 相关框架\n    frameLocales: {\n      'zh-CN': {\n        key: 'zh-CN',\n        title: '设计语言与研发框架',\n        subTitle: '配套生态，让你快速搭建小程序应用',\n      },\n      'en': {\n        key: 'en',\n        title: 'Design Language and Development Framework',\n        subTitle: 'Comprehensive Ecosystem for Rapid Application Development',\n      },\n    },\n    // 组件模块\n    galleryLocales: {\n      'zh-CN': {\n        key: 'zh-CN',\n        title: '组件丰富，选用自如',\n        subTitle: '大量实用组件满足你的需求，灵活定制与拓展',\n      },\n      'en': {\n        key: 'en',\n        title: 'Rich Component Library, Easy to Choose and Use',\n        subTitle:\n          'A Wide Range of Practical Components to Meet Your Needs, with Flexible Customization and Expansion',\n      },\n    },\n    // 公告\n    noticeLocales: {\n      'zh-CN': {\n        key: 'zh-CN',\n      },\n      'en': {\n        key: 'en',\n      },\n    },\n    // 主题\n    themeLocales: {\n      'zh-CN': {\n        key: 'zh-CN',\n        title: '定制主题，国际语言',\n        subTitle: 'Ant Design Mini 开放更多主题样式，国际语言随意切换组件文案',\n        dark: '暗黑模式',\n        light: '明亮模式',\n        langDesc: '简体中文',\n      },\n      'en': {\n        key: 'en',\n        title: 'Customizable Themes, International Languages',\n        subTitle:\n          'Ant Design Mini Offers More Theme Styles and Seamless Switching of Component Text in Multiple Languages',\n        dark: 'Dark Mode',\n        light: 'Light Mode',\n        langDesc: 'English',\n      },\n    },\n    // 谁在使用\n    userLocales: {\n      'zh-CN': {\n        key: 'zh-CN',\n        title: 'Ant Design Mini 正在为 100+ 客户带来效能提升',\n      },\n      'en': {\n        key: 'en',\n        title:\n          'Ant Design Mini is Bringing Efficiency Gains to Over 100 Customers',\n      },\n    },\n  }),\n  locales: [\n    { id: 'zh-CN', name: '中文', suffix: '' },\n    { id: 'en', name: 'English', suffix: '-en' },\n  ],\n  resolve: {\n    atomDirs: [\n      {\n        type: 'component',\n        dir: 'src',\n      },\n      {\n        type: 'copilot',\n        dir: 'copilot',\n      },\n    ],\n  },\n});\n"
  },
  {
    "path": ".editorconfig",
    "content": "# http://editorconfig.org\nroot = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\n\n[*.md]\ntrim_trailing_whitespace = false\n\n[Makefile]\nindent_style = tab\n"
  },
  {
    "path": ".eslintignore",
    "content": "es/**\ndemo/es/**\nplugin/**\nsrc/.umi/**\nsrc/.umi-production/**\ndist/**\ndocs-dist/**\nnode_modules\ncompiled/\n"
  },
  {
    "path": ".eslintrc",
    "content": "{\n  \"env\": {\n    \"node\": true\n  },\n  \"globals\": {\n    \"wx\": true,\n    \"my\": true,\n    \"App\": true,\n    \"Component\": true,\n    \"Page\": true\n  },\n  \"parser\": \"@typescript-eslint/parser\",\n  \"plugins\": [\"@typescript-eslint\"],\n  \"extends\": [\n    \"eslint:recommended\",\n    \"plugin:@typescript-eslint/eslint-recommended\",\n    \"plugin:@typescript-eslint/recommended\"\n  ],\n  \"rules\": {\n    \"no-console\": \"warn\",\n    \"@typescript-eslint/no-var-requires\": \"warn\",\n    \"@typescript-eslint/no-empty-function\": \"warn\",\n    \"@typescript-eslint/no-empty-interface\": \"warn\",\n    \"@typescript-eslint/ban-ts-comment\": \"off\"\n  }\n}\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug Report\nabout: Bug Report\n---\n\n<!--\n在提交 bug 之前，请参考以下问题排查方式，或许对你会有所帮助：\n👉 查看你的 package.json 中是否使用最新版本的 antd-mini，且已正确安装；\n👉 根据小程序开发者工具 https://opendocs.alipay.com/mini/ide 的报错提示排查；\n👉 详细阅读过组件库文档；\n👉 是否遇到自定义组件常见问题 https://opendocs.alipay.com/mini/framework/auge4r 中所提到的问题；\n-->\n\n## 组件\n<!-- 产生 BUG 的组件 -->\n\n## 基础库版本\n\n<!-- 可以通过 my.SDKVersion 获取基础库版本 -->\n\n- [ ] 1.x\n- [ ] 2.x\n\n## 设备机型\n\n## 手机系统\n\n- [ ] iOS\n- [ ] Android\n- [ ] HarmonyOS\n\n## APP \n<!-- 默认为支付宝，如果非支付宝小程序，请填写运行该小程序的 APP -->\n\n## 组件库版本 \n<!-- 产生 BUG 的组件库版本 -->\n\n## 预期行为 \n<!-- 组件正常情况下的行为描述 -->\n\n## 复现步骤 \n<!-- 请提供复现方法，条件运行情况下请提供最小化 demo 示例 -->\n1. \n2. \n\n## 复现 demo\n<!-- 请上传最小复现 demo -->\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request_template.md",
    "content": "---\nname: 功能优化需求\nabout: 期望组件增强的功能需求\nlabels: enhancement\n\n---\n\n## 背景\n<!-- 请描述你所遇到的问题现状 --> \n\n\n## 期望\n<!-- 请描述你所希望添加的功能 --> \n\n\n## 思路\n<!-- 对于你所描述的问题，是否已有解决方案或者思路，如有可提供作为参考，或者提交你的 PR 、截图 --> "
  },
  {
    "path": ".github/contributing.md",
    "content": "---\ntoc: false\n---\n\n## 参与 antd-mini 建设\n\nantd-mini 的发展离不开社区的每一位用户，这里有一些信息可以帮助你参与共建。\n\n### 项目运作流程\n\n### issue\n\n如果你有组件库的相关使用问题或需求，可以前往 issue 区域搜索或者提问。我们提供了多种 issue 模板，请根据需要选择对应模板。同时，也非常欢迎你为其他同学解惑。\n\n#### feature request\n\n如果现有的组件不能满足你的开发需求，请提交 issue 来描述你的需求。当然，并不是每一个 FR 都会实现。因为 antd-mini 的定位是一个基础组件库，而非业务组件库。我们会讨论每一个 FR，确认是一个基础组件需求后，我们就会进入开发流程。\n\n#### bug\n\n提交 issue 时，请尽可能多地提供 bug 相关信息，以帮助我们更快地复现并解决。\n\n下面是一些注意事项：\n\n- 设备信息、客户端版本、组件库版本、组件等\n- 你期望的组件行为是什么，实际上组件的行为是什么\n- 详细描述复习步骤\n- 尽可能提供能够复现 demo 以方便我们快速定位问题\n\n### 贡献代码\n\n非常欢迎各位为 antd-mini 贡献代码，这里有一份[贡献指南](https://github.com/ant-design/ant-design-mini/blob/main/docs/guide/contribute.md)。在贡献代码之前，请提交 RFC issue 并详细描述你的改动，以便我们能够在 RFC 中充分讨论，节省双方的时间。\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where the package manifests are located.\n# Please see the documentation for all configuration options:\n# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file\n\nversion: 2\nupdates:\n  - package-ecosystem: \"\" # See documentation for possible values\n    directory: \"/\" # Location of package manifests\n    schedule:\n      interval: \"weekly\"\n"
  },
  {
    "path": ".github/pull_requeset_template.md",
    "content": "---\nname: Pull Request\nabout: Pull Request\n---\n\n## 概要\n\n<!-- 告诉 CR 者为什么要改？（如：Issue 地址、需求概述、需求链接） -->\n<!-- 如果改动过于复杂，需要贴出改动的思路 -->\n\n## 变更范围\n\n- [ ] demo/**\n- [ ] src/**\n\n## 变更类型\n\n- [ ] Bug\n- [ ] Docs\n- [ ] Feature\n- [ ] Performance\n- [ ] Refactor\n- [ ] 其他: 请补充\n\n## 自查清单\n\n- [ ]  更新/添加 相关文档\n- [ ]  更新/添加 demo 以展示新特性\n\n\n## 改动前 / 后 (可选)\n\n<!-- 如果可以通过「日志」或「snapshot」表达前后变化的，请补充 -->\n\n- 改动前：\n\n- 改动后：\n"
  },
  {
    "path": ".github/workflows/chatgpt_code_review.yaml",
    "content": "name: ChatGPT Code Review\n\npermissions:\n  contents: read\n  pull-requests: write\n\non:\n  pull_request:\n    types: [opened, reopened, synchronize]\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: anc95/ChatGPT-CodeReview@main\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n          LANGUAGE: Chinese\n"
  },
  {
    "path": ".github/workflows/preview.yml",
    "content": "name: 🔂 Surge PR Preview\n\non: [pull_request]\n\njobs:\n  preview:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2\n      - uses: afc163/surge-preview@v1\n        id: preview_step\n        with:\n          surge_token: ${{ secrets.SURGE_TOKEN }}\n          github_token: ${{ secrets.GITHUB_TOKEN }}\n          dist: docs-dist\n          build: |\n            npm install\n            npm run build\n      - name: Get the preview_url\n        run: echo \"url => ${{ steps.preview_step.outputs.preview_url }}\""
  },
  {
    "path": ".github/workflows/pull_request.yml",
    "content": "name: pull_request ci\n\non: [push, pull_request]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2\n      - name: Use Node.js 18.x\n        uses: actions/setup-node@v1\n        with:\n          node-version: 18.x\n      - name: build\n        run: |\n          npm i\n          npm run build\n          npm run check-compiled\n      - name: test\n        run: npm run cov\n      - name: Codecov\n        uses: codecov/codecov-action@v2.1.0\n        with:\n          directory: ./coverage/\n"
  },
  {
    "path": ".github/workflows/real_release.yml",
    "content": "# 在 PR 的评论中回复 `/release [dist-tag]` 可以进行本次发布，如 `/release beta`\n# 可不填参数直接评论 `/release`，默认发布到 latest\n\nname: Release By PR Comment\n\non:\n  issue_comment:\n\n# Example output: in a PR branch (head) named `feature-1 to a target branch (base) of `release-v1`, you'll see:\n# github.base_ref: release-v1\n# github.head_ref: feature-1\n# github.ref: refs/pull/2/merge\n\njobs:\n  if_release_comment:\n    if: \"${{ github.event.issue.pull_request && startsWith(github.event.issue.title, 'chore(release): v') && startsWith(github.event.comment.body, '/release') }}\"\n    runs-on: ubuntu-latest\n    steps:\n      - name: 'Check if user has write access'\n        uses: 'lannonbr/repo-permission-check-action@2.0.2'\n        with:\n          permission: 'write'\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n\n      - uses: xt0rted/pull-request-comment-branch@v1\n        id: comment-branch\n\n      - name: Checkout\n        uses: actions/checkout@v2\n        if: success()\n        with:\n          ref: ${{ steps.comment-branch.outputs.head_ref }}\n\n      - run: |\n          echo \"HEAD_SHA=${{steps.comment-branch.outputs.head_sha}}\" >> $GITHUB_ENV\n\n      - uses: actions/github-script@v6\n        id: get-dist-tag\n        with:\n          github-token: ${{secrets.GITHUB_TOKEN}}\n          script: |\n            const script = require('./scripts/github/cli.js')\n            return await script('dist-tag', {github, context, core})\n        env:\n          COMMENT_CONTENT: ${{ github.event.comment.body }}\n\n      - name: Setup Version & Environment Variables\n        run: |\n          DIST_VERSION=$(node -e \"console.log(require('./package.json').version)\")\n          echo \"DIST_VERSION=${DIST_VERSION}\" >> $GITHUB_ENV\n          echo \"TAG=${DIST_VERSION}\" >> $GITHUB_ENV\n          echo $PR_CONTENT >> ./RELEASE_LOG.md\n        env:\n          PR_CONTENT: ${{ github.event.issue.body }}\n\n      - uses: mukunku/tag-exists-action@v1.0.0\n        id: checkTag\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n\n      - uses: actions/github-script@v6\n        id: run-check-suite\n        with:\n          github-token: ${{secrets.GITHUB_TOKEN}}\n          script: |\n            const script = require('./scripts/github/notifyReleaseResult.js')\n            return await script('Release', {github, context, core}, 'start')\n\n      - name: Setup CHECK_RUN_ID Environment Variables\n        run: |\n          echo \"CHECK_RUN_ID=${{steps.run-check-suite.outputs.result}}\" >> $GITHUB_ENV\n\n      - name: Use Node.js 18\n        uses: actions/setup-node@v1\n        with:\n          node-version: 18\n          registry-url: https://registry.npmjs.org/\n\n      # 安装依赖并构建\n      - name: Install dependencies & Build\n        run: |\n          npm i\n\n      - name: Publish version\n        run: |\n          echo \"//registry.npmjs.org/:_authToken=${NPM_TOKEN}\" >> .npmrc\n          node ./scripts/publishInCI\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}\n          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}\n          DIST_TAG: ${{ steps.get-dist-tag.outputs.result }}\n\n      - name: Add missing Tag\n        if: steps.checkTag.outputs.exists == 'false'\n        run: |\n          git config --global user.name 'github-actions[bot]'\n          git config --global user.email 'github-actions[bot]@users.noreply.github.com'\n          git remote set-url origin https://x-access-token:${GITHUB_TOKEN}@github.com/$GITHUB_REPOSITORY\n\n          git tag ${{ env.DIST_VERSION }}\n          git push origin ${{ env.DIST_VERSION }}:${{ env.DIST_VERSION }}\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Create Release\n        id: create_release\n        uses: ncipollo/release-action@v1\n        with:\n          tag: ${{ env.DIST_VERSION }}\n          name: ${{ env.DIST_VERSION }}\n          body: ${{ github.event.issue.body }}\n          token: ${{ secrets.GITHUB_TOKEN }}\n          draft: true\n          prerelease: true\n\n      # 发布失败后，更新 checkRun 状态\n      - uses: actions/github-script@v6\n        if: failure()\n        with:\n          github-token: ${{secrets.GITHUB_TOKEN}}\n          script: |\n            const script = require('./scripts/github/notifyReleaseResult.js')\n            return await script('Release', {github, context, core}, 'failure')\n\n      - uses: actions/github-script@v6\n        if: success()\n        with:\n          github-token: ${{secrets.GITHUB_TOKEN}}\n          script: |\n            const script = require('./scripts/github/notifyReleaseResult.js')\n            return await script('Release', {github, context, core}, 'end')\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: Release\n\non:\n  workflow_dispatch:\n    inputs:\n      version:\n        description: 'The version you want to release, eg: 1.0.0. **no prefix v!**'\n        required: true\n      release_branch:\n        description: 'Released from which branch, eg: master'\n        required: false\n        default: 'master'\n\njobs:\n  release:\n    name: Release\n    runs-on: ubuntu-latest\n\n    strategy:\n      matrix:\n        node-version: [18.x]\n\n    steps:\n      # 判断用户是否有管理员权限\n      - name: 'Check if user has admin access'\n        uses: 'lannonbr/repo-permission-check-action@2.0.2'\n        with:\n          permission: 'admin'\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Checkout\n        uses: actions/checkout@v2\n        with:\n          fetch-depth: 0\n\n      - name: Use Node.js ${{ matrix.node-version }}\n        uses: actions/setup-node@v1\n        with:\n          node-version: ${{ matrix.node-version }}\n\n      - uses: mukunku/tag-exists-action@v1.0.0\n        id: checkTag\n        env:\n          TAG: v${{github.event.inputs.version}}\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Git Identity\n        if: steps.checkTag.outputs.exists == 'false'\n        run: |\n          git config --global user.name 'github-actions[bot]'\n          git config --global user.email 'github-actions[bot]@users.noreply.github.com'\n          git remote set-url origin https://x-access-token:${GITHUB_TOKEN}@github.com/$GITHUB_REPOSITORY\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n\n      # 安装依赖并构建\n      - name: Install dependencies\n        if: steps.checkTag.outputs.exists == 'false'\n        run: |\n          npm i\n          npm run build\n\n      - name: Generate Changelog, Version, Commit and Push\n        if: steps.checkTag.outputs.exists == 'false' &&  github.event.inputs.release_branch != ''\n        run: |\n          # Bump version in package.json\n          node ./scripts/publishInCI\n          # generate conventional changelog\n          npm run changelog\n          # Commit package.json and CHANGELOG.md files\n          git add .\n          git commit -am \"chore(release): v${DIST_VERSION}\"\n          # TAG\n          git tag ${DIST_VERSION}\n          git push origin ${DIST_VERSION}:${DIST_VERSION}\n          # Push to origin\n          git checkout -b v${DIST_VERSION}\n          git push origin v${DIST_VERSION}\n          npx extract-changelog-release > RELEASE_BODY.md\n        env:\n          SETUP_RELEASE: true\n          DIST_TAG: latest\n          DIST_VERSION: ${{ github.event.inputs.version }}\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n\n      # 在 master 分支运行时，自动基于 Release 分支创建 PR\n      - name: Create Pull Request\n        if: github.event.inputs.release_branch != ''\n        uses: actions/github-script@v6\n        with:\n          github-token: ${{secrets.GITHUB_TOKEN}}\n          script: |\n            const { readFile } = require(\"fs/promises\")\n            const data = await readFile('RELEASE_BODY.md')\n\n            await github.rest.pulls.create({\n              owner: context.repo.owner,\n              repo: context.repo.repo,\n              title: 'chore(release): v${{ github.event.inputs.version }}',\n              head: 'v${{ github.event.inputs.version }}',\n              base: 'master',\n              body: data.toString(),\n            })\n"
  },
  {
    "path": ".github/workflows/release_candidate.yml",
    "content": "name: Release Candidate\n\non:\n  workflow_dispatch:\n    inputs:\n      ref:\n        description: 'A valid branch or commit hash, eg: v2.14, master'\n        required: true\n        default: 'master'\n\n      distTag:\n        description: '要发布的 dist tag，仅可以为 alpha 或 beta'\n        required: true\n        default: 'beta'\n\njobs:\n  rc-version:\n    name: RC Version\n\n    runs-on: ubuntu-latest\n\n    strategy:\n      matrix:\n        node-version: [18.x]\n\n    steps:\n      # 判断用户是否有写权限\n      - name: 'Check if user has write access'\n        uses: 'lannonbr/repo-permission-check-action@2.0.2'\n        with:\n          permission: 'write'\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n\n      # Checkout 到指定分支\n      - uses: actions/checkout@v2\n        if: success()\n        with:\n          ref: ${{ github.event.inputs.ref }}\n\n      - name: Use Node.js ${{ matrix.node-version }}\n        uses: actions/setup-node@v1\n        with:\n          node-version: ${{ matrix.node-version }}\n          registry-url: 'https://registry.npmjs.org'\n\n      # 安装依赖并构建\n      - name: Install dependencies & Build\n        run: |\n          npm i\n\n      - name: Publish version\n        run: |\n          echo \"//registry.npmjs.org/:_authToken=${NPM_TOKEN}\" >> .npmrc\n          node ./scripts/publishRC\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}\n          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}\n          DIST_TAG: ${{ github.event.inputs.distTag }}\n\n      - name: Set Current Version\n        if: success()\n        run: |\n          DIST_VERSION=$(node -p 'require(\"./package.json\").version')\n          echo \"DIST_VERSION=${DIST_VERSION}\" >> $GITHUB_ENV\n\n      - name: Adding markdown\n        if: success()\n        run: |\n          DIST_VERSION=$(node -p 'require(\"./package.json\").version')\n          echo '### Released :rocket:' $DIST_VERSION >> $GITHUB_STEP_SUMMARY\n          echo '```' >> $GITHUB_STEP_SUMMARY\n          echo $DIST_VERSION >> $GITHUB_STEP_SUMMARY\n          echo '```' >> $GITHUB_STEP_SUMMARY\n          echo 'user input ref:' $INPUT_REF >> $GITHUB_STEP_SUMMARY\n          echo '```log' >> $GITHUB_STEP_SUMMARY\n          git log --oneline -1 >> $GITHUB_STEP_SUMMARY\n          echo '```' >> $GITHUB_STEP_SUMMARY\n        env:\n          INPUT_REF: ${{ github.event.inputs.ref }}\n\n      - name: Add Tag\n        if: success()\n        run: |\n          git config --global user.name 'github-actions[bot]'\n          git config --global user.email 'github-actions[bot]@users.noreply.github.com'\n          git remote set-url origin https://x-access-token:${GITHUB_TOKEN}@github.com/$GITHUB_REPOSITORY\n\n          git tag ${{ env.DIST_VERSION }}\n          git push origin ${{ env.DIST_VERSION }}:${{ env.DIST_VERSION }}\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/npm-debug.log*\n/yarn-error.log\n/yarn.lock\n/package-lock.json\n\n# production\n/native\n/es\n/less\n/docs-dist\n/dist\n/dist-theme-dark\n\n# misc\n.DS_Store\n/coverage\n\n# umi\n.umi\n.umi-production\n.umi-test\n.env.local\n\n# ide\n/.vscode\n/.idea\n\n# other\n/.mini-ide\n/.cache\n\n# wechat\nproject.private.config.json\ncompiled/wechat/miniprogram_npm\ncompiled/wechat/node_modules\ncompiled/wechat/package-lock.json\ncompiled/wechat/yarn.lock\ncompiledBackup/wechat/miniprogram_npm\ncompiledBackup/wechat/node_modules\ncompiledBackup/wechat/yarn.lock\nknowledge.json\nserver\n.dumi/tmp\n.dumi/tmp-production\n\n# compiled\n/compiled\nconfig/alipay/app.json\nconfig/wechat.json\nconfig/wechat/app.json\nconfig/alipaynative.json\nconfig/alipaynative/app.json\n\nCLAUDE.md\n.claude\n.npmrc\n"
  },
  {
    "path": ".prettierignore",
    "content": "**/*.svg\n**/*.ejs\n**/*.html\npackage.json\n"
  },
  {
    "path": ".prettierrc",
    "content": "{\n  \"overrides\": [\n    {\n      \"files\": \"*.axml\",\n      \"options\": {\n        \"parser\": \"html\",\n        \"printWidth\": 80,\n        \"tabWidth\": 2,\n        \"bracketSameLine\": true,\n        \"bracketSpacing\": true,\n        \"singleAttributePerLine\": true,\n        \"htmlWhitespaceSensitivity\": \"ignore\"\n      }\n    },\n    {\n      \"files\": [\"**/*.json5\"],\n      \"options\": {\n        \"trailingComma\": \"none\",\n        \"singleQuote\": false\n      }\n    }\n  ],\n  \"quoteProps\": \"preserve\",\n  \"singleQuote\": true\n}\n"
  },
  {
    "path": ".stylelintrc",
    "content": "{\n  \"extends\": \"stylelint-config-standard\",\n  \"rules\": {\n    at-rule-empty-line-before: null,\n    at-rule-name-space-after: null,\n    at-rule-no-unknown: null,\n    comment-empty-line-before: null,\n    declaration-bang-space-before: null,\n    declaration-empty-line-before: null,\n    function-comma-newline-after: null,\n    function-name-case: null,\n    function-parentheses-newline-inside: null,\n    function-max-empty-lines: null,\n    function-whitespace-after: null,\n    indentation: null,\n    number-leading-zero: null,\n    number-no-trailing-zeros: null,\n    rule-empty-line-before: null,\n    selector-combinator-space-after: null,\n    selector-list-comma-newline-after: null,\n    selector-pseudo-element-colon-notation: null,\n    unit-no-unknown: null,\n    value-list-max-empty-lines: null,\n    unit-case: null,\n    color-hex-case: null,\n    \"selector-type-no-unknown\": [\n      true,\n      {\n        \"ignoreTypes\": [\n          \"page\"\n        ]\n      }\n    ],\n  }\n}"
  },
  {
    "path": "CHANGELOG.md",
    "content": "### Changelog\n\nAll notable changes to this project will be documented in this file. Dates are displayed in UTC.\n\nGenerated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).\n\n#### [3.4.3](https://github.com/ant-design/ant-design-mini/compare/3.4.2...3.4.3)\n\n- fix: form-date-picker defaultPickerValue [`#1520`](https://github.com/ant-design/ant-design-mini/pull/1520)\n\n#### [3.4.2](https://github.com/ant-design/ant-design-mini/compare/3.4.2-beta.1...3.4.2)\n\n> 21 October 2025\n\n#### [3.4.2-beta.1](https://github.com/ant-design/ant-design-mini/compare/3.4.1...3.4.2-beta.1)\n\n> 12 December 2025\n\n- Fix swipe action [`#1516`](https://github.com/ant-design/ant-design-mini/pull/1516)\n- fix: form-date-picker defaultPickerValue [`8ae7ca3`](https://github.com/ant-design/ant-design-mini/commit/8ae7ca3c78b65f13a3954203ec04147dd87596ac)\n\n#### [3.4.1](https://github.com/ant-design/ant-design-mini/compare/3.4.0...3.4.1)\n\n> 30 September 2025\n\n- Fix swipe action [`#1511`](https://github.com/ant-design/ant-design-mini/pull/1511)\n- fix: popup animation [`96dc633`](https://github.com/ant-design/ant-design-mini/commit/96dc63388d7a4dfc6bc9439812171b8207607dab)\n\n#### [3.4.0](https://github.com/ant-design/ant-design-mini/compare/3.4.0-beta.1...3.4.0)\n\n> 22 September 2025\n\n#### [3.4.0-beta.1](https://github.com/ant-design/ant-design-mini/compare/3.3.2...3.4.0-beta.1)\n\n> 29 September 2025\n\n- Feat animation [`#1506`](https://github.com/ant-design/ant-design-mini/pull/1506)\n- fix: swipeaction click [`8b32bce`](https://github.com/ant-design/ant-design-mini/commit/8b32bce00c21c2bbe07311a1a00711970b1bf3a6)\n- fix: popup animation [`96dc633`](https://github.com/ant-design/ant-design-mini/commit/96dc63388d7a4dfc6bc9439812171b8207607dab)\n\n#### [3.3.2](https://github.com/ant-design/ant-design-mini/compare/3.3.1...3.3.2)\n\n> 10 September 2025\n\n- Feat data picker value [`#1504`](https://github.com/ant-design/ant-design-mini/pull/1504)\n- Feat data picker value [`#1503`](https://github.com/ant-design/ant-design-mini/pull/1503)\n- chore: remove pull_request_release_next workflow [`#1502`](https://github.com/ant-design/ant-design-mini/pull/1502)\n- chore: popup doc [`096d596`](https://github.com/ant-design/ant-design-mini/commit/096d59601bf14b07638b2fa5499471aea7d665c1)\n- chore: update repo-permission-check-action to v2.0.2 [`5d27236`](https://github.com/ant-design/ant-design-mini/commit/5d27236e8636b3f880da2c31c2358824b14bf3c9)\n- chore: publish config [`2ce1fd5`](https://github.com/ant-design/ant-design-mini/commit/2ce1fd5311b6b7531d00539a4e0320f8876c35bb)\n\n#### [3.3.1](https://github.com/ant-design/ant-design-mini/compare/3.3.0...3.3.1)\n\n> 31 July 2025\n\n- fix: tabbar style [`#1494`](https://github.com/ant-design/ant-design-mini/pull/1494)\n\n#### [3.3.0](https://github.com/ant-design/ant-design-mini/compare/3.2.2...3.3.0)\n\n> 30 July 2025\n\n- Feat native [`#1492`](https://github.com/ant-design/ant-design-mini/pull/1492)\n- fix: tag doc [`f046bf4`](https://github.com/ant-design/ant-design-mini/commit/f046bf4389abe8fd72796a02e27d7bcd23565344)\n- fix: migration doc 404 [`5c8dd26`](https://github.com/ant-design/ant-design-mini/commit/5c8dd262cc3162deefd14a83e093f005d9d68171)\n- fix: tag doc [`9c83c43`](https://github.com/ant-design/ant-design-mini/commit/9c83c43041182662e6eacd12bf09040e41c43642)\n\n#### [3.2.2](https://github.com/ant-design/ant-design-mini/compare/3.2.1...3.2.2)\n\n> 30 June 2025\n\n- feat: 给calendar滚动事件加上防抖 [`078cd9c`](https://github.com/ant-design/ant-design-mini/commit/078cd9c78f061d1e9f20c9781b0ff1b927604d72)\n\n#### [3.2.1](https://github.com/ant-design/ant-design-mini/compare/3.2.0...3.2.1)\n\n> 17 June 2025\n\n- Fix dialog [`#1478`](https://github.com/ant-design/ant-design-mini/pull/1478)\n- Fix dialog [`#1477`](https://github.com/ant-design/ant-design-mini/pull/1477)\n\n#### [3.2.0](https://github.com/ant-design/ant-design-mini/compare/3.1.15...3.2.0)\n\n> 12 June 2025\n\n- Feat alipay native [`#1473`](https://github.com/ant-design/ant-design-mini/pull/1473)\n\n#### [3.1.15](https://github.com/ant-design/ant-design-mini/compare/3.1.14...3.1.15)\n\n> 4 June 2025\n\n- fIx: 修复日历组件sticky标题位置错乱问题 [`#1471`](https://github.com/ant-design/ant-design-mini/pull/1471)\n\n#### [3.1.14](https://github.com/ant-design/ant-design-mini/compare/3.1.13...3.1.14)\n\n> 30 May 2025\n\n- fix: popup的visible假值变化问题 [`#1469`](https://github.com/ant-design/ant-design-mini/pull/1469)\n- fix: grid wechat detail miss [`9b5fb97`](https://github.com/ant-design/ant-design-mini/commit/9b5fb97603e2aa2318acccc614044f6b3b9cebc4)\n- fix: grid wechat detail miss [`fe78a65`](https://github.com/ant-design/ant-design-mini/commit/fe78a657ce0480f44c637fcddb76e9037618d1d2)\n\n#### [3.1.13](https://github.com/ant-design/ant-design-mini/compare/3.1.12...3.1.13)\n\n> 23 May 2025\n\n- Feat component2 [`#1463`](https://github.com/ant-design/ant-design-mini/pull/1463)\n- fix: datePicker弹窗关闭后重置暂存的选项 [`#1464`](https://github.com/ant-design/ant-design-mini/pull/1464)\n- Feat popup close slot [`#1462`](https://github.com/ant-design/ant-design-mini/pull/1462)\n- Feat data picker slot [`#1459`](https://github.com/ant-design/ant-design-mini/pull/1459)\n- fix: wx ontap double trigger [`#1458`](https://github.com/ant-design/ant-design-mini/pull/1458)\n- fix: textarea controlled problem [`#1457`](https://github.com/ant-design/ant-design-mini/pull/1457)\n\n#### [3.1.12](https://github.com/ant-design/ant-design-mini/compare/3.1.11...3.1.12)\n\n> 11 April 2025\n\n- Feat/space 0410 [`#1454`](https://github.com/ant-design/ant-design-mini/pull/1454)\n- Feat/space 0410 [`#1451`](https://github.com/ant-design/ant-design-mini/pull/1451)\n- feat: 添加 Space 组件, 新增布局分类并调整 Grid 和 Divider 组件到此分类中 [`#1450`](https://github.com/ant-design/ant-design-mini/pull/1450)\n- Feat collapse support miniplugin [`#1447`](https://github.com/ant-design/ant-design-mini/pull/1447)\n- fix: collapse support miniplugin [`#1446`](https://github.com/ant-design/ant-design-mini/pull/1446)\n- chore: docs update [`ac38587`](https://github.com/ant-design/ant-design-mini/commit/ac38587f609a14b478aa53976569dd74452dc463)\n\n#### [3.1.11](https://github.com/ant-design/ant-design-mini/compare/3.1.10...3.1.11)\n\n> 31 March 2025\n\n- fix: form empty array readonly logic [`#1443`](https://github.com/ant-design/ant-design-mini/pull/1443)\n- Style checkbox icon [`#1442`](https://github.com/ant-design/ant-design-mini/pull/1442)\n\n#### [3.1.10](https://github.com/ant-design/ant-design-mini/compare/3.1.9...3.1.10)\n\n> 27 March 2025\n\n- checkbox icon change [`#1439`](https://github.com/ant-design/ant-design-mini/pull/1439)\n- fix: calendar week titlearea disappear in popup [`#1437`](https://github.com/ant-design/ant-design-mini/pull/1437)\n- chore: locale docs fix [`db7db20`](https://github.com/ant-design/ant-design-mini/commit/db7db20a3d1e2ef772f3131dbeb40f451862fc45)\n\n#### [3.1.9](https://github.com/ant-design/ant-design-mini/compare/3.1.8...3.1.9)\n\n> 18 March 2025\n\n- Fix skeleton loading [`#1435`](https://github.com/ant-design/ant-design-mini/pull/1435)\n- Fix skeleton loading [`#1433`](https://github.com/ant-design/ant-design-mini/pull/1433)\n\n#### [3.1.8](https://github.com/ant-design/ant-design-mini/compare/3.1.7...3.1.8)\n\n> 14 March 2025\n\n- Fix form setfields value [`#1429`](https://github.com/ant-design/ant-design-mini/pull/1429)\n- fix: table width [`#1427`](https://github.com/ant-design/ant-design-mini/pull/1427)\n- Issus 1425 jianglu [`#1426`](https://github.com/ant-design/ant-design-mini/pull/1426)\n- chore: datePicker docs fix [`7a79ca0`](https://github.com/ant-design/ant-design-mini/commit/7a79ca021941319f4679ffe186d0bcb8fd5a388d)\n- chore: rimraf to compatible windows platform [`ca46e73`](https://github.com/ant-design/ant-design-mini/commit/ca46e73cca622626381373a1df25e4f3a557c83b)\n\n#### [3.1.7](https://github.com/ant-design/ant-design-mini/compare/3.1.6...3.1.7)\n\n> 4 March 2025\n\n- Feat form layout [`#1423`](https://github.com/ant-design/ant-design-mini/pull/1423)\n- Feat form layout [`#1422`](https://github.com/ant-design/ant-design-mini/pull/1422)\n- Adjust input max min default value [`#1421`](https://github.com/ant-design/ant-design-mini/pull/1421)\n- Refactor component constructor [`#1418`](https://github.com/ant-design/ant-design-mini/pull/1418)\n- fix: wx input cursor problem [`#1420`](https://github.com/ant-design/ant-design-mini/pull/1420)\n\n#### [3.1.6](https://github.com/ant-design/ant-design-mini/compare/3.1.6-beta.25...3.1.6)\n\n> 21 February 2025\n\n#### [3.1.6-beta.25](https://github.com/ant-design/ant-design-mini/compare/3.1.6-beta.24...3.1.6-beta.25)\n\n> 10 September 2025\n\n- fix: date-range-picker controlled [`780a7f6`](https://github.com/ant-design/ant-design-mini/commit/780a7f6e9741f4be6e471c86cc0bdd5ecf161049)\n- fix: date-range-picker controlled [`188b6ac`](https://github.com/ant-design/ant-design-mini/commit/188b6ac80b3bfd7a56eb444ecb80d902ce0fae7e)\n- feat: popup darkmode maskbg [`e5eb0be`](https://github.com/ant-design/ant-design-mini/commit/e5eb0bea04bdac743fd7d6c40788636f0c299677)\n\n#### [3.1.6-beta.24](https://github.com/ant-design/ant-design-mini/compare/3.1.6-beta.23...3.1.6-beta.24)\n\n> 9 September 2025\n\n- chore: publish config [`536dfd6`](https://github.com/ant-design/ant-design-mini/commit/536dfd6026c82cb7a54f59aa7a44c188ae0827e0)\n\n#### [3.1.6-beta.23](https://github.com/ant-design/ant-design-mini/compare/3.1.6-beta.22...3.1.6-beta.23)\n\n> 9 September 2025\n\n- chore: remove pull_request_release_next workflow [`#1502`](https://github.com/ant-design/ant-design-mini/pull/1502)\n- fix: tabbar style [`#1494`](https://github.com/ant-design/ant-design-mini/pull/1494)\n- Feat native [`#1492`](https://github.com/ant-design/ant-design-mini/pull/1492)\n- chore: publish config [`98cf68d`](https://github.com/ant-design/ant-design-mini/commit/98cf68d3cf42881f525e75a3b8e2af457bdcc17f)\n- feat: improve DatePicker RangePicker value initialization and validation [`7946d72`](https://github.com/ant-design/ant-design-mini/commit/7946d72778de5eadcff526abfc2c8c4e5f0f6f05)\n- chore: popup doc [`096d596`](https://github.com/ant-design/ant-design-mini/commit/096d59601bf14b07638b2fa5499471aea7d665c1)\n\n#### [3.1.6-beta.22](https://github.com/ant-design/ant-design-mini/compare/3.1.6-beta.21...3.1.6-beta.22)\n\n> 30 July 2025\n\n- Fix dialog [`#1478`](https://github.com/ant-design/ant-design-mini/pull/1478)\n- Fix dialog [`#1477`](https://github.com/ant-design/ant-design-mini/pull/1477)\n- Feat alipay native [`#1473`](https://github.com/ant-design/ant-design-mini/pull/1473)\n- fIx: 修复日历组件sticky标题位置错乱问题 [`#1471`](https://github.com/ant-design/ant-design-mini/pull/1471)\n- feat: es适配native [`ec25239`](https://github.com/ant-design/ant-design-mini/commit/ec25239cd90e8312a62640ad921ceaaed063c474)\n- feat: label 在Alipaynative环境不支持兼容 [`b7ab493`](https://github.com/ant-design/ant-design-mini/commit/b7ab4933b60ef11efaeb9297b628ec67f070d71a)\n- feat: 不支持alipaynative环境的提示 [`48d4d32`](https://github.com/ant-design/ant-design-mini/commit/48d4d3284808faf3e4a7e59cb59c2864d434cd6f)\n\n#### [3.1.6-beta.21](https://github.com/ant-design/ant-design-mini/compare/3.1.6-beta.20...3.1.6-beta.21)\n\n> 26 June 2025\n\n- fix: 临时去掉onScroll方法 [`1d32a1b`](https://github.com/ant-design/ant-design-mini/commit/1d32a1b964e814525d8186f42e262380b944d2cf)\n\n#### [3.1.6-beta.20](https://github.com/ant-design/ant-design-mini/compare/3.1.6-beta.19...3.1.6-beta.20)\n\n> 3 June 2025\n\n- fix: popup的visible假值变化问题 [`#1469`](https://github.com/ant-design/ant-design-mini/pull/1469)\n- fIx: 修复日历组件sticky标题位置错乱问题 [`f612bd5`](https://github.com/ant-design/ant-design-mini/commit/f612bd5d7cce46f58ea2615e250514d090a7ea3b)\n- fix: grid wechat detail miss [`9b5fb97`](https://github.com/ant-design/ant-design-mini/commit/9b5fb97603e2aa2318acccc614044f6b3b9cebc4)\n- fix: grid wechat detail miss [`fe78a65`](https://github.com/ant-design/ant-design-mini/commit/fe78a657ce0480f44c637fcddb76e9037618d1d2)\n\n#### [3.1.6-beta.19](https://github.com/ant-design/ant-design-mini/compare/3.1.6-beta.18...3.1.6-beta.19)\n\n> 29 May 2025\n\n- Feat component2 [`#1463`](https://github.com/ant-design/ant-design-mini/pull/1463)\n- fix: datePicker弹窗关闭后重置暂存的选项 [`#1464`](https://github.com/ant-design/ant-design-mini/pull/1464)\n- fix: popup的visible假值变化问题 [`45a6d57`](https://github.com/ant-design/ant-design-mini/commit/45a6d5714e76d3bd4356e879525095e432bf55f1)\n- fix: popup的visible假值变化问题 [`d4f72e2`](https://github.com/ant-design/ant-design-mini/commit/d4f72e2c2c7800cf5cd05583e9f358edf8b4e2c2)\n\n#### [3.1.6-beta.18](https://github.com/ant-design/ant-design-mini/compare/3.1.6-beta.17...3.1.6-beta.18)\n\n> 22 May 2025\n\n- Feat popup close slot [`#1462`](https://github.com/ant-design/ant-design-mini/pull/1462)\n- fix: datePicker弹窗关闭后重置暂存的选项 [`e3cdcb9`](https://github.com/ant-design/ant-design-mini/commit/e3cdcb93701c8a5ab3d407fe85980479260e6ab1)\n- feat: 版本号更新 [`b84a667`](https://github.com/ant-design/ant-design-mini/commit/b84a66758511c7f41b3c2518f261aece5d14b159)\n\n#### [3.1.6-beta.17](https://github.com/ant-design/ant-design-mini/compare/3.1.6-beta.16...3.1.6-beta.17)\n\n> 19 May 2025\n\n- feat: bundle兼容component2 [`8cb4f75`](https://github.com/ant-design/ant-design-mini/commit/8cb4f7519395cc5aed6488545604e31e4cf0bdcd)\n- feat: bundle兼容component2 [`3fcfdfd`](https://github.com/ant-design/ant-design-mini/commit/3fcfdfd241b533c5ee1b232d71cbd72a56df7c9c)\n- feat: bundle兼容component2 [`859363a`](https://github.com/ant-design/ant-design-mini/commit/859363a29d1ec3d0cba18035e78d8fb1f5853fdc)\n\n#### [3.1.6-beta.16](https://github.com/ant-design/ant-design-mini/compare/3.1.6-beta.15...3.1.6-beta.16)\n\n> 14 May 2025\n\n- Feat data picker slot [`#1459`](https://github.com/ant-design/ant-design-mini/pull/1459)\n- feat: 插槽定制Header [`2c7deb1`](https://github.com/ant-design/ant-design-mini/commit/2c7deb1167e6e38bbd2f765783a1e47545ff46d9)\n- feat: 插槽定制Header [`74921c2`](https://github.com/ant-design/ant-design-mini/commit/74921c268df011ccdc315acafca958f73e075fbc)\n- feat: 插槽定制Header [`c797dc0`](https://github.com/ant-design/ant-design-mini/commit/c797dc0d08364621d6fc58a1f187d51f146f1d03)\n\n#### [3.1.6-beta.15](https://github.com/ant-design/ant-design-mini/compare/3.1.6-beta.14...3.1.6-beta.15)\n\n> 22 April 2025\n\n- fix: wx ontap double trigger [`#1458`](https://github.com/ant-design/ant-design-mini/pull/1458)\n- feat: date-picker 属性变化后，需要更新渲染的值 [`fe94684`](https://github.com/ant-design/ant-design-mini/commit/fe946840c748623b0476989f1cfa45483e34427e)\n- feat: date-picker支持content-header插槽 [`db2e8f8`](https://github.com/ant-design/ant-design-mini/commit/db2e8f841d06fcdffa85c3e30861853b2f0483f5)\n- feat: date-picker 属性变化后，需要更新渲染的值 [`b6193c6`](https://github.com/ant-design/ant-design-mini/commit/b6193c6a8583607bb8ff92cafc677608eab8bdd0)\n\n#### [3.1.6-beta.14](https://github.com/ant-design/ant-design-mini/compare/3.1.6-beta.13...3.1.6-beta.14)\n\n> 22 April 2025\n\n- fix: textarea controlled problem [`#1457`](https://github.com/ant-design/ant-design-mini/pull/1457)\n- fix: wx ontap double trigger [`1b7b66e`](https://github.com/ant-design/ant-design-mini/commit/1b7b66ea08c036d7254568315e20ae654053006e)\n- fix: wx ontap double trigger [`2de72c0`](https://github.com/ant-design/ant-design-mini/commit/2de72c0aa78e84a742edbc8869b68d983e81b7e5)\n\n#### [3.1.6-beta.13](https://github.com/ant-design/ant-design-mini/compare/3.1.6-beta.12...3.1.6-beta.13)\n\n> 15 April 2025\n\n- fix: textarea controlled problem [`a0dfcc5`](https://github.com/ant-design/ant-design-mini/commit/a0dfcc541bcad9a1cd2d462fdd08bb23910b24aa)\n- chore: update verison [`5194f1c`](https://github.com/ant-design/ant-design-mini/commit/5194f1c8d35729416456c802cfe5d6fd7d815a73)\n\n#### [3.1.6-beta.12](https://github.com/ant-design/ant-design-mini/compare/3.1.6-beta.11...3.1.6-beta.12)\n\n> 11 April 2025\n\n- Feat/space 0410 [`#1454`](https://github.com/ant-design/ant-design-mini/pull/1454)\n- Feat/space 0410 [`#1451`](https://github.com/ant-design/ant-design-mini/pull/1451)\n- feat: 添加 Space 组件, 新增布局分类并调整 Grid 和 Divider 组件到此分类中 [`#1450`](https://github.com/ant-design/ant-design-mini/pull/1450)\n- Feat collapse support miniplugin [`#1447`](https://github.com/ant-design/ant-design-mini/pull/1447)\n- fix: collapse support miniplugin [`#1446`](https://github.com/ant-design/ant-design-mini/pull/1446)\n- chore: docs update [`ac38587`](https://github.com/ant-design/ant-design-mini/commit/ac38587f609a14b478aa53976569dd74452dc463)\n- fix: publish problem [`177f564`](https://github.com/ant-design/ant-design-mini/commit/177f564dd24b7680c5b6d787105b86ce7acbff35)\n- fix: publish problem [`ad39753`](https://github.com/ant-design/ant-design-mini/commit/ad39753eaf70edd8046a06f48875821b31604121)\n\n#### [3.1.6-beta.11](https://github.com/ant-design/ant-design-mini/compare/3.1.6-beta.10...3.1.6-beta.11)\n\n> 3 April 2025\n\n- fix: form empty array readonly logic [`#1443`](https://github.com/ant-design/ant-design-mini/pull/1443)\n- fix: collapse support miniplugin [`67fc996`](https://github.com/ant-design/ant-design-mini/commit/67fc996a708a9715594a9ab5d4d8f88e8d934db8)\n\n#### [3.1.6-beta.10](https://github.com/ant-design/ant-design-mini/compare/3.1.6-beta.9...3.1.6-beta.10)\n\n> 31 March 2025\n\n- Style checkbox icon [`#1442`](https://github.com/ant-design/ant-design-mini/pull/1442)\n- fix: form empty array readonly logic [`a064468`](https://github.com/ant-design/ant-design-mini/commit/a064468d22496be7c56c0aedf523d0a8d3bc1cc4)\n- fix: form empty array readonly logic [`39e3a0e`](https://github.com/ant-design/ant-design-mini/commit/39e3a0eb9fba938634c4ad9060f6512c188c8ab2)\n\n#### [3.1.6-beta.9](https://github.com/ant-design/ant-design-mini/compare/3.1.6-beta.8...3.1.6-beta.9)\n\n> 28 March 2025\n\n- checkbox icon change [`#1439`](https://github.com/ant-design/ant-design-mini/pull/1439)\n- fix: calendar week titlearea disappear in popup [`#1437`](https://github.com/ant-design/ant-design-mini/pull/1437)\n- fix: checkbox icon change [`ee4b98e`](https://github.com/ant-design/ant-design-mini/commit/ee4b98eafe9aadcd866fc09ecb8a723261041502)\n- fix: checkbox icon change [`7368b41`](https://github.com/ant-design/ant-design-mini/commit/7368b41993f19ec04bebcf262863726f52fdb926)\n\n#### [3.1.6-beta.8](https://github.com/ant-design/ant-design-mini/compare/3.1.6-beta.7...3.1.6-beta.8)\n\n> 24 March 2025\n\n- Fix skeleton loading [`#1435`](https://github.com/ant-design/ant-design-mini/pull/1435)\n- Fix skeleton loading [`#1433`](https://github.com/ant-design/ant-design-mini/pull/1433)\n- Fix form setfields value [`#1429`](https://github.com/ant-design/ant-design-mini/pull/1429)\n- fix: table width [`#1427`](https://github.com/ant-design/ant-design-mini/pull/1427)\n- fix: calendar week titlearea disappear in popup [`48f41f4`](https://github.com/ant-design/ant-design-mini/commit/48f41f42748000098c62eb932e805f05603375ee)\n- chore: locale docs fix [`db7db20`](https://github.com/ant-design/ant-design-mini/commit/db7db20a3d1e2ef772f3131dbeb40f451862fc45)\n\n#### [3.1.6-beta.7](https://github.com/ant-design/ant-design-mini/compare/3.1.6-beta.6...3.1.6-beta.7)\n\n> 14 March 2025\n\n- fix: form setfiledsvalues override [`d2e543d`](https://github.com/ant-design/ant-design-mini/commit/d2e543d03c9d8db1057477d74beb9c162714ab9a)\n- fix: form setfiledsvalues override [`8b69a7e`](https://github.com/ant-design/ant-design-mini/commit/8b69a7e7b3072ca154d4b0d1281770a89c898efd)\n\n#### [3.1.6-beta.6](https://github.com/ant-design/ant-design-mini/compare/3.1.6-beta.5...3.1.6-beta.6)\n\n> 14 March 2025\n\n- fix: form setfiledsvalues override [`cddb96c`](https://github.com/ant-design/ant-design-mini/commit/cddb96c165653d5badfe21ecb5cdf4e1423b24e8)\n- fix: form setfiledsvalues override [`35b7cc7`](https://github.com/ant-design/ant-design-mini/commit/35b7cc79d9c2b07dd79e3ea052ff213f2f4fae10)\n\n#### [3.1.6-beta.5](https://github.com/ant-design/ant-design-mini/compare/3.1.6-beta.4...3.1.6-beta.5)\n\n> 12 March 2025\n\n- Issus 1425 jianglu [`#1426`](https://github.com/ant-design/ant-design-mini/pull/1426)\n- Feat form layout [`#1423`](https://github.com/ant-design/ant-design-mini/pull/1423)\n- Feat form layout [`#1422`](https://github.com/ant-design/ant-design-mini/pull/1422)\n- chore: datePicker docs fix [`7a79ca0`](https://github.com/ant-design/ant-design-mini/commit/7a79ca021941319f4679ffe186d0bcb8fd5a388d)\n- chore: rimraf to compatible windows platform [`ca46e73`](https://github.com/ant-design/ant-design-mini/commit/ca46e73cca622626381373a1df25e4f3a557c83b)\n- fix: table width [`7f3cb5c`](https://github.com/ant-design/ant-design-mini/commit/7f3cb5c4f66c8a9891abef319a4313c6aa9ef1ca)\n\n#### [3.1.6-beta.4](https://github.com/ant-design/ant-design-mini/compare/3.1.6-beta.3...3.1.6-beta.4)\n\n> 4 March 2025\n\n- Adjust input max min default value [`#1421`](https://github.com/ant-design/ant-design-mini/pull/1421)\n- Refactor component constructor [`#1418`](https://github.com/ant-design/ant-design-mini/pull/1418)\n- feat: 表单项单行都可以点击 [`b21c2f7`](https://github.com/ant-design/ant-design-mini/commit/b21c2f702aa60e8397f54b407e996060b47011d2)\n- feat: 表单项单行都可以点击 [`d38c13a`](https://github.com/ant-design/ant-design-mini/commit/d38c13af0e5d0cfebe4addeefd2c1b8e8370d9f7)\n- feat: adjust input max min default value [`60719a7`](https://github.com/ant-design/ant-design-mini/commit/60719a7afd2af14ef131e5e0c57a7825e8d1c326)\n\n#### [3.1.6-beta.3](https://github.com/ant-design/ant-design-mini/compare/3.1.6-beta.2...3.1.6-beta.3)\n\n> 27 February 2025\n\n- feat: adjust input max min default value [`bbfd055`](https://github.com/ant-design/ant-design-mini/commit/bbfd055969bc8f46c8f3ffdf9c8f7d725c0264f3)\n- feat: adjust input max min default value [`3e5f1cd`](https://github.com/ant-design/ant-design-mini/commit/3e5f1cd0c8bbc3f685e6c1c9931505c6d83fa0f2)\n\n#### [3.1.6-beta.2](https://github.com/ant-design/ant-design-mini/compare/3.1.6-beta.1...3.1.6-beta.2)\n\n> 26 February 2025\n\n- fix: wx input cursor problem [`#1420`](https://github.com/ant-design/ant-design-mini/pull/1420)\n- feat: refactor Component construct [`13a5f57`](https://github.com/ant-design/ant-design-mini/commit/13a5f5766fe921a3795426cbf07eb4b0e5b9dcb7)\n- feat: refactor Component construct [`b64439c`](https://github.com/ant-design/ant-design-mini/commit/b64439cd61a881a599b8b1d48208a58b599144f9)\n- fix: imageUpload default maxCount [`3caff01`](https://github.com/ant-design/ant-design-mini/commit/3caff01b975c9a26c5f711eb98aeeb475f4accc2)\n\n#### [3.1.6-beta.1](https://github.com/ant-design/ant-design-mini/compare/3.1.5...3.1.6-beta.1)\n\n> 25 February 2025\n\n- fix: footer useComponents path error [`#1415`](https://github.com/ant-design/ant-design-mini/pull/1415)\n- fix: wx input cursor problem [`80dbab4`](https://github.com/ant-design/ant-design-mini/commit/80dbab4a96d561910bb43b1f9a2186b708a94831)\n- fix: wx input cursor problem [`bfab75d`](https://github.com/ant-design/ant-design-mini/commit/bfab75d47e08e506c28487a4cbc22aab9a0834c4)\n\n#### [3.1.5](https://github.com/ant-design/ant-design-mini/compare/3.1.4...3.1.5)\n\n> 20 February 2025\n\n- Feat x optimization [`#1412`](https://github.com/ant-design/ant-design-mini/pull/1412)\n- Feat max min input [`#1411`](https://github.com/ant-design/ant-design-mini/pull/1411)\n\n#### [3.1.4](https://github.com/ant-design/ant-design-mini/compare/3.1.4-beta.3...3.1.4)\n\n> 17 February 2025\n\n#### [3.1.4-beta.3](https://github.com/ant-design/ant-design-mini/compare/3.1.4-beta.1...3.1.4-beta.3)\n\n> 18 February 2025\n\n- feat: form-input support max min precision [`90fc3bd`](https://github.com/ant-design/ant-design-mini/commit/90fc3bdb433ab9c109b8a7a6884ff00e1850d222)\n- chore: update verison [`f9f345f`](https://github.com/ant-design/ant-design-mini/commit/f9f345facda26debca7a332699bb5e5722360492)\n- feat: form-input support max min precision [`c931e86`](https://github.com/ant-design/ant-design-mini/commit/c931e86fc3a4bc9d22b59b62a290d033285cfe99)\n\n#### [3.1.4-beta.1](https://github.com/ant-design/ant-design-mini/compare/3.1.3...3.1.4-beta.1)\n\n> 18 February 2025\n\n- Form add readonly property [`#1407`](https://github.com/ant-design/ant-design-mini/pull/1407)\n- feat: number type input limit range and precision [`72b4885`](https://github.com/ant-design/ant-design-mini/commit/72b48858ef417782f3f5a7bad87bcf1c5ca083f7)\n- chore: update verison [`232bbd1`](https://github.com/ant-design/ant-design-mini/commit/232bbd11928b3511d47db06b0253a1e8ec0977c4)\n\n#### [3.1.3](https://github.com/ant-design/ant-design-mini/compare/3.1.3-beta.3...3.1.3)\n\n> 10 February 2025\n\n#### [3.1.3-beta.3](https://github.com/ant-design/ant-design-mini/compare/3.1.3-beta.2...3.1.3-beta.3)\n\n> 13 February 2025\n\n- feat: form add readonly [`4e151a4`](https://github.com/ant-design/ant-design-mini/commit/4e151a4c87bcaa50c821976b263b4d67c6f2f0d8)\n- feat: form add readonly [`6901efe`](https://github.com/ant-design/ant-design-mini/commit/6901efe309e594fb03939df2d6cdd9066dd4ced5)\n- feat: form add readonly [`1f16edb`](https://github.com/ant-design/ant-design-mini/commit/1f16edbac6b31c951cde5aae82db918c3d7cfd49)\n\n#### [3.1.3-beta.2](https://github.com/ant-design/ant-design-mini/compare/3.1.3-beta.1...3.1.3-beta.2)\n\n> 13 February 2025\n\n- feat: form add readonly [`13047d0`](https://github.com/ant-design/ant-design-mini/commit/13047d01cccf3451df0e75e4017dfbd5daa455eb)\n- feat: form add readonly [`d6d2c24`](https://github.com/ant-design/ant-design-mini/commit/d6d2c24092bcc5dcfcf5a2cb9a13116daf634ab9)\n- feat: form add readonly [`0ee0127`](https://github.com/ant-design/ant-design-mini/commit/0ee0127eeb04a96c69d8cc6edaf507016beedef6)\n\n#### [3.1.3-beta.1](https://github.com/ant-design/ant-design-mini/compare/3.1.3-alpha.1...3.1.3-beta.1)\n\n> 11 February 2025\n\n- feat: form add readonly [`a3bca4b`](https://github.com/ant-design/ant-design-mini/commit/a3bca4be93dcaaaafa9c94f8e766caacde23b9fb)\n- docs: optimize doc [`989cc37`](https://github.com/ant-design/ant-design-mini/commit/989cc37bca36c8d9f110e5565e7af061558fcda9)\n- docs: optimize doc [`b38e33c`](https://github.com/ant-design/ant-design-mini/commit/b38e33cea131ca91271c6579b045607561218937)\n\n#### [3.1.3-alpha.1](https://github.com/ant-design/ant-design-mini/compare/3.1.2...3.1.3-alpha.1)\n\n> 14 February 2025\n\n- fix: copilot js path not find [`#1401`](https://github.com/ant-design/ant-design-mini/pull/1401)\n- feat: sender components add wrapper slot [`ec55f16`](https://github.com/ant-design/ant-design-mini/commit/ec55f16f804cd39a2288e666a10f957a809f433a)\n- feat: bubble components add wrapper slot [`8019edd`](https://github.com/ant-design/ant-design-mini/commit/8019edddd0c362f9bb16cd400f2fb0d970f3fd3a)\n- feat: prompts components add disabled props [`2a13cac`](https://github.com/ant-design/ant-design-mini/commit/2a13cac61c85cc48253b44c178e5697ee1b5afd3)\n\n#### [3.1.2](https://github.com/ant-design/ant-design-mini/compare/3.1.1...3.1.2)\n\n> 8 February 2025\n\n- fix: copilot usingComponents path not find [`929426c`](https://github.com/ant-design/ant-design-mini/commit/929426cd6dd46118b62688118165854da0fb260a)\n\n#### [3.1.1](https://github.com/ant-design/ant-design-mini/compare/3.1.0...3.1.1)\n\n> 7 February 2025\n\n- Feat 0207 issue [`#1398`](https://github.com/ant-design/ant-design-mini/pull/1398)\n- fix some bug in different platform [`#1397`](https://github.com/ant-design/ant-design-mini/pull/1397)\n- docs fix [`#1395`](https://github.com/ant-design/ant-design-mini/pull/1395)\n\n#### [3.1.0](https://github.com/ant-design/ant-design-mini/compare/3.0.9...3.1.0)\n\n> 24 January 2025\n\n- Adjust x-components demo style [`#1393`](https://github.com/ant-design/ant-design-mini/pull/1393)\n\n#### [3.0.9](https://github.com/ant-design/ant-design-mini/compare/3.0.8...3.0.9)\n\n> 24 January 2025\n\n- Feat/x-components [`#1391`](https://github.com/ant-design/ant-design-mini/pull/1391)\n- copilot系列组件 [`#1390`](https://github.com/ant-design/ant-design-mini/pull/1390)\n\n#### [3.0.8](https://github.com/ant-design/ant-design-mini/compare/3.0.7...3.0.8)\n\n> 21 January 2025\n\n- indexbar scroll  not silky [`#1386`](https://github.com/ant-design/ant-design-mini/pull/1386)\n\n#### [3.0.7](https://github.com/ant-design/ant-design-mini/compare/3.0.6...3.0.7)\n\n> 16 January 2025\n\n- fix: display range problem [`#1383`](https://github.com/ant-design/ant-design-mini/pull/1383)\n- Fix card divier [`#1378`](https://github.com/ant-design/ant-design-mini/pull/1378)\n- fix: card divider [`#1377`](https://github.com/ant-design/ant-design-mini/pull/1377)\n\n#### [3.0.6](https://github.com/ant-design/ant-design-mini/compare/3.0.6-beta.1...3.0.6)\n\n> 9 January 2025\n\n- fix: form onValueChange validate time series problem [`#1372`](https://github.com/ant-design/ant-design-mini/pull/1372)\n- Feat/table ellipse [`#1365`](https://github.com/ant-design/ant-design-mini/pull/1365)\n- Add wx:key [`#1370`](https://github.com/ant-design/ant-design-mini/pull/1370)\n- Wx problem fix [`#1364`](https://github.com/ant-design/ant-design-mini/pull/1364)\n\n#### [3.0.6-beta.1](https://github.com/ant-design/ant-design-mini/compare/3.0.5...3.0.6-beta.1)\n\n> 8 January 2025\n\n- feat: 表头也支持换行 [`8372463`](https://github.com/ant-design/ant-design-mini/commit/8372463e104f4b05b557ccfb5b4550a35a837ee6)\n- fix: 去掉注释 [`ec936a0`](https://github.com/ant-design/ant-design-mini/commit/ec936a03d87dcc978490a5d078679c385f8ec75e)\n- fix: merge master [`5edad2b`](https://github.com/ant-design/ant-design-mini/commit/5edad2bf8cbe585199b545ba577d7499f4f4e4d1)\n\n#### [3.0.5](https://github.com/ant-design/ant-design-mini/compare/3.0.4...3.0.5)\n\n> 7 January 2025\n\n- Feat/table ellipse [`#1359`](https://github.com/ant-design/ant-design-mini/pull/1359)\n- Update the link to the correct migration documentation [`#1325`](https://github.com/ant-design/ant-design-mini/pull/1325)\n- fix-some-demo-op [`#1341`](https://github.com/ant-design/ant-design-mini/pull/1341)\n- fix: popup title cant display in wechat platform [`#1358`](https://github.com/ant-design/ant-design-mini/pull/1358)\n- CascaderPicker引用路径错误修正 [`#1343`](https://github.com/ant-design/ant-design-mini/pull/1343)\n- Optimize docs [`#1354`](https://github.com/ant-design/ant-design-mini/pull/1354)\n- docs: update doc [`6832e64`](https://github.com/ant-design/ant-design-mini/commit/6832e64d97eff3d6bf951033e48ff2c18fe19bd7)\n\n#### [3.0.4](https://github.com/ant-design/ant-design-mini/compare/3.0.3...3.0.4)\n\n> 30 December 2024\n\n- Feat a part of  component support  wechat [`#1349`](https://github.com/ant-design/ant-design-mini/pull/1349)\n\n#### [3.0.3](https://github.com/ant-design/ant-design-mini/compare/3.0.2...3.0.3)\n\n> 17 December 2024\n\n- fix: tabs wechat error [`#1340`](https://github.com/ant-design/ant-design-mini/pull/1340)\n- docs: popover theme color [`#1338`](https://github.com/ant-design/ant-design-mini/pull/1338)\n\n#### [3.0.2](https://github.com/ant-design/ant-design-mini/compare/3.0.2-beta.2...3.0.2)\n\n> 16 December 2024\n\n- feat: release.yml增加npm run build指令 [`#1335`](https://github.com/ant-design/ant-design-mini/pull/1335)\n- fix: 闭合 Button 标签 [`#1329`](https://github.com/ant-design/ant-design-mini/pull/1329)\n- Feat/noticebar support multiple line [`#1333`](https://github.com/ant-design/ant-design-mini/pull/1333)\n- docs: 微信事件采用 bindxxx 格式 [`#1330`](https://github.com/ant-design/ant-design-mini/pull/1330)\n- fix: 生成wechat app.json时，遍历依赖找到不支持微信的demo页面并去掉 [`#1331`](https://github.com/ant-design/ant-design-mini/pull/1331)\n- refactor: 组件 Token 变量通过模块的方式引入,不多地维护 [`#1327`](https://github.com/ant-design/ant-design-mini/pull/1327)\n- Docs/readme 112804 [`#1321`](https://github.com/ant-design/ant-design-mini/pull/1321)\n- Feat term [`#1324`](https://github.com/ant-design/ant-design-mini/pull/1324)\n- fix: 将demo文件夹里的二级页面也加入到文件列表文件中 [`#1326`](https://github.com/ant-design/ant-design-mini/pull/1326)\n- 将几处demo页面列表及组件列表的配置文件改为动态生成 [`#1322`](https://github.com/ant-design/ant-design-mini/pull/1322)\n- Feat footer [`#1323`](https://github.com/ant-design/ant-design-mini/pull/1323)\n- docs: 优化 README.md [`#1320`](https://github.com/ant-design/ant-design-mini/pull/1320)\n- docs: 优化 README.md [`#1319`](https://github.com/ant-design/ant-design-mini/pull/1319)\n- Docs/readme 1128 [`#1318`](https://github.com/ant-design/ant-design-mini/pull/1318)\n- Docs/readme 1128 [`#1317`](https://github.com/ant-design/ant-design-mini/pull/1317)\n- chore: 1. 修改 antd-mobile logo 和官网地址; 2. 为 commit 校验添加参考地址 [`#1315`](https://github.com/ant-design/ant-design-mini/pull/1315)\n- website document optimization [`#1314`](https://github.com/ant-design/ant-design-mini/pull/1314)\n\n#### [3.0.2-beta.2](https://github.com/ant-design/ant-design-mini/compare/3.0.2-beta.1...3.0.2-beta.2)\n\n> 27 November 2024\n\n- fix: release时不再需要重复run build [`2ff2296`](https://github.com/ant-design/ant-design-mini/commit/2ff2296288a4ded04c946fc84df7510cfaaa3c39)\n\n#### [3.0.2-beta.1](https://github.com/ant-design/ant-design-mini/compare/3.0.1...3.0.2-beta.1)\n\n> 27 November 2024\n\n- Demo feat dev [`#1311`](https://github.com/ant-design/ant-design-mini/pull/1311)\n- feat: 改造compiled [`8b62eb8`](https://github.com/ant-design/ant-design-mini/commit/8b62eb84feadc566cff8cf34b32b14ae443f09c4)\n- fix: 修改beta版本号 [`1358c68`](https://github.com/ant-design/ant-design-mini/commit/1358c68fa965e4c97738e81b2d2f55d3062a3880)\n- fix: eslintignore [`a601414`](https://github.com/ant-design/ant-design-mini/commit/a601414e150c97e9cb90e5cfd60064cf9c236672)\n\n#### [3.0.1](https://github.com/ant-design/ant-design-mini/compare/3.0.0...3.0.1)\n\n> 25 November 2024\n\n- Docs new dev [`#1307`](https://github.com/ant-design/ant-design-mini/pull/1307)\n- fix: 修复部分组件 props 命名规范问题 [`#1306`](https://github.com/ant-design/ant-design-mini/pull/1306)\n\n### [3.0.0](https://github.com/ant-design/ant-design-mini/compare/2.36.10-alpha.1...3.0.0)\n\n> 21 November 2024\n\n- Docs site dev [`#1304`](https://github.com/ant-design/ant-design-mini/pull/1304)\n\n#### [2.36.10-alpha.1](https://github.com/ant-design/ant-design-mini/compare/2.36.9...2.36.10-alpha.1)\n\n> 25 December 2024\n\n- feat: 为 Tabs 添加 catchTouchStart/catchTouchMove 属性 [`#1350`](https://github.com/ant-design/ant-design-mini/pull/1350)\n\n#### [2.36.9](https://github.com/ant-design/ant-design-mini/compare/2.36.8...2.36.9)\n\n> 14 March 2025\n\n- fix: form setfiledsvalues override [`e931569`](https://github.com/ant-design/ant-design-mini/commit/e931569c327dc03be05cdc6fc344260e81084853)\n- fix: form setfiledsvalues override [`f70b670`](https://github.com/ant-design/ant-design-mini/commit/f70b670b88da09dba4362fb83d66997101c9b2a6)\n- fix: form setfiledsvalues override [`1a78374`](https://github.com/ant-design/ant-design-mini/commit/1a783749b0d7e771de4c5e819a14956f766862ac)\n\n#### [2.36.8](https://github.com/ant-design/ant-design-mini/compare/2.36.7...2.36.8)\n\n> 12 November 2024\n\n- fix: button flex style [`2a62d53`](https://github.com/ant-design/ant-design-mini/commit/2a62d53e09f1f7525c1367712de0f2df237afc17)\n\n#### [2.36.7](https://github.com/ant-design/ant-design-mini/compare/2.36.6...2.36.7)\n\n> 29 September 2024\n\n- fix: 修复keyboardnumber组件键盘快速点击偶尔失效的问题 [`#1290`](https://github.com/ant-design/ant-design-mini/pull/1290)\n- update doc [`#1281`](https://github.com/ant-design/ant-design-mini/pull/1281)\n- Fix wx picker slot [`#1280`](https://github.com/ant-design/ant-design-mini/pull/1280)\n- feat: wechat support slot [`#1277`](https://github.com/ant-design/ant-design-mini/pull/1277)\n- fix: onSwipeStart is not undefined [`#1275`](https://github.com/ant-design/ant-design-mini/pull/1275)\n\n#### [2.36.6](https://github.com/ant-design/ant-design-mini/compare/2.36.5...2.36.6)\n\n> 10 September 2024\n\n- fix: disabled button tap  can  callback [`#1272`](https://github.com/ant-design/ant-design-mini/pull/1272)\n- fix: collapse node wrap fix [`#1271`](https://github.com/ant-design/ant-design-mini/pull/1271)\n- Feat zindex [`#1268`](https://github.com/ant-design/ant-design-mini/pull/1268)\n\n#### [2.36.5](https://github.com/ant-design/ant-design-mini/compare/2.36.4...2.36.5)\n\n> 20 August 2024\n\n- Fix issue 1265 [`#1266`](https://github.com/ant-design/ant-design-mini/pull/1266)\n\n#### [2.36.4](https://github.com/ant-design/ant-design-mini/compare/2.36.3...2.36.4)\n\n> 15 August 2024\n\n- fix: picker closing the mask flicker [`#1263`](https://github.com/ant-design/ant-design-mini/pull/1263)\n\n#### [2.36.3](https://github.com/ant-design/ant-design-mini/compare/2.36.2...2.36.3)\n\n> 8 August 2024\n\n- @alipay/axml-transverter 依赖替换 [`#1261`](https://github.com/ant-design/ant-design-mini/pull/1261)\n- feat: indexbar异步加载数据时，异常处理 [`#1260`](https://github.com/ant-design/ant-design-mini/pull/1260)\n- Feat: IndexBar demo optimize [`#1259`](https://github.com/ant-design/ant-design-mini/pull/1259)\n\n#### [2.36.2](https://github.com/ant-design/ant-design-mini/compare/2.36.1...2.36.2)\n\n> 5 August 2024\n\n- Feat calendar range [`#1256`](https://github.com/ant-design/ant-design-mini/pull/1256)\n\n#### [2.36.1](https://github.com/ant-design/ant-design-mini/compare/2.36.0...2.36.1)\n\n> 31 July 2024\n\n- fix: 修复modal默认插槽展示问题 [`#1252`](https://github.com/ant-design/ant-design-mini/pull/1252)\n\n#### [2.36.0](https://github.com/ant-design/ant-design-mini/compare/2.35.7...2.36.0)\n\n> 30 July 2024\n\n- Refactor dev build [`#1248`](https://github.com/ant-design/ant-design-mini/pull/1248)\n\n#### [2.35.7](https://github.com/ant-design/ant-design-mini/compare/2.35.6...2.35.7)\n\n> 30 July 2024\n\n- feat: popup的mask支持插槽定制 [`#1249`](https://github.com/ant-design/ant-design-mini/pull/1249)\n\n#### [2.35.6](https://github.com/ant-design/ant-design-mini/compare/2.35.5...2.35.6)\n\n> 29 July 2024\n\n- feat: lodash依赖去除，兼容适配微信 [`#1246`](https://github.com/ant-design/ant-design-mini/pull/1246)\n\n#### [2.35.5](https://github.com/ant-design/ant-design-mini/compare/2.35.4...2.35.5)\n\n> 25 July 2024\n\n- fix: 微信版本form按需引入lodash报错 [`6558755`](https://github.com/ant-design/ant-design-mini/commit/6558755ba04cf9485f4ba1a315f81eaff86a7635)\n\n#### [2.35.4](https://github.com/ant-design/ant-design-mini/compare/2.35.3...2.35.4)\n\n> 11 July 2024\n\n- fix: 解决支付宝小程序Picker中导致 targetId not match [`#1241`](https://github.com/ant-design/ant-design-mini/pull/1241)\n\n#### [2.35.3](https://github.com/ant-design/ant-design-mini/compare/2.35.2...2.35.3)\n\n> 10 July 2024\n\n- form-item 的 name 支持嵌套字段 [`#1235`](https://github.com/ant-design/ant-design-mini/pull/1235)\n\n#### [2.35.2](https://github.com/ant-design/ant-design-mini/compare/2.35.1...2.35.2)\n\n> 2 July 2024\n\n- Feat calendar format [`#1230`](https://github.com/ant-design/ant-design-mini/pull/1230)\n\n#### [2.35.1](https://github.com/ant-design/ant-design-mini/compare/2.35.0...2.35.1)\n\n> 1 July 2024\n\n- Fix form item error [`#1228`](https://github.com/ant-design/ant-design-mini/pull/1228)\n- feat: collapse add item classname [`#1226`](https://github.com/ant-design/ant-design-mini/pull/1226)\n\n#### [2.35.0](https://github.com/ant-design/ant-design-mini/compare/2.34.1...2.35.0)\n\n> 27 June 2024\n\n- feat: input also support adjustPosition in alipay [`#1223`](https://github.com/ant-design/ant-design-mini/pull/1223)\n- feat: 增加 Page 组件 [`#1220`](https://github.com/ant-design/ant-design-mini/pull/1220)\n- Feat typography [`#1216`](https://github.com/ant-design/ant-design-mini/pull/1216)\n\n#### [2.34.1](https://github.com/ant-design/ant-design-mini/compare/2.34.0...2.34.1)\n\n> 26 June 2024\n\n- fix: 微信端noticebar循环失效 [`#1218`](https://github.com/ant-design/ant-design-mini/pull/1218)\n- fix: 修复textarea清楚按钮遮挡问题 [`#1214`](https://github.com/ant-design/ant-design-mini/pull/1214)\n\n#### [2.34.0](https://github.com/ant-design/ant-design-mini/compare/2.34.0-beta.1...2.34.0)\n\n> 18 June 2024\n\n- feat: Revert \"feat: lazy component (#1197)\" [`#1210`](https://github.com/ant-design/ant-design-mini/pull/1210)\n\n#### [2.34.0-beta.1](https://github.com/ant-design/ant-design-mini/compare/2.33.0...2.34.0-beta.1)\n\n> 18 June 2024\n\n- Detele functional mini [`#1204`](https://github.com/ant-design/ant-design-mini/pull/1204)\n- feat: calendar组件去掉hook实现 [`#1201`](https://github.com/ant-design/ant-design-mini/pull/1201)\n- feat: notice-bar微信版本支持icon插槽 [`#1196`](https://github.com/ant-design/ant-design-mini/pull/1196)\n- Feat no hook picker [`#1199`](https://github.com/ant-design/ant-design-mini/pull/1199)\n- feat: lazy component [`#1197`](https://github.com/ant-design/ant-design-mini/pull/1197)\n- Feat no hook picker [`#1192`](https://github.com/ant-design/ant-design-mini/pull/1192)\n- Feat no hook 2 [`#1189`](https://github.com/ant-design/ant-design-mini/pull/1189)\n- feat: Revert \"feat: lazy component (#1197)\" [`b2a5c11`](https://github.com/ant-design/ant-design-mini/commit/b2a5c11ef40599dd25eca15a5b7a36cd4d7a009d)\n- feat: 发布beta测试版本 [`4e9dedf`](https://github.com/ant-design/ant-design-mini/commit/4e9dedfb5d123756dbe79f8fc822ff0821f60d69)\n\n#### [2.33.0](https://github.com/ant-design/ant-design-mini/compare/2.32.0...2.33.0)\n\n> 14 June 2024\n\n#### [2.32.0](https://github.com/ant-design/ant-design-mini/compare/2.31.2...2.32.0)\n\n> 13 June 2024\n\n- Detele functional mini [`#1204`](https://github.com/ant-design/ant-design-mini/pull/1204)\n- feat: calendar组件去掉hook实现 [`#1201`](https://github.com/ant-design/ant-design-mini/pull/1201)\n- feat: notice-bar微信版本支持icon插槽 [`#1196`](https://github.com/ant-design/ant-design-mini/pull/1196)\n- Feat no hook picker [`#1199`](https://github.com/ant-design/ant-design-mini/pull/1199)\n- feat: lazy component [`#1197`](https://github.com/ant-design/ant-design-mini/pull/1197)\n- Feat no hook picker [`#1192`](https://github.com/ant-design/ant-design-mini/pull/1192)\n- Feat no hook 2 [`#1189`](https://github.com/ant-design/ant-design-mini/pull/1189)\n\n#### [2.31.2](https://github.com/ant-design/ant-design-mini/compare/2.31.1...2.31.2)\n\n> 16 May 2024\n\n#### [2.31.1](https://github.com/ant-design/ant-design-mini/compare/2.31.0...2.31.1)\n\n> 16 May 2024\n\n- feat: Slider 去掉hook相关实现，并适配微信 [`#1186`](https://github.com/ant-design/ant-design-mini/pull/1186)\n\n#### [2.31.0](https://github.com/ant-design/ant-design-mini/compare/2.30.2...2.31.0)\n\n> 13 May 2024\n\n-  Radio & Rate & Selector & Switch & TabBar & Checkbox & Checklist & Collapse & ImageUpload 组件去掉hook相关的实现 [`#1183`](https://github.com/ant-design/ant-design-mini/pull/1183)\n\n#### [2.30.2](https://github.com/ant-design/ant-design-mini/compare/2.30.1...2.30.2)\n\n> 11 May 2024\n\n- Fix popup controlled [`#1180`](https://github.com/ant-design/ant-design-mini/pull/1180)\n- fix: popover外部控制状态时的bug [`#1179`](https://github.com/ant-design/ant-design-mini/pull/1179)\n\n#### [2.30.1](https://github.com/ant-design/ant-design-mini/compare/2.30.0...2.30.1)\n\n> 9 May 2024\n\n- feat: selector支持插槽 [`#1177`](https://github.com/ant-design/ant-design-mini/pull/1177)\n- Feat popup no hook [`#1173`](https://github.com/ant-design/ant-design-mini/pull/1173)\n- Feat number keyboard no hook [`#1171`](https://github.com/ant-design/ant-design-mini/pull/1171)\n- Feat notice bar no hook [`#1169`](https://github.com/ant-design/ant-design-mini/pull/1169)\n- Feat no hooks input [`#1164`](https://github.com/ant-design/ant-design-mini/pull/1164)\n- feat: DateRangePicker和CascaderPicker增加visible和defaultVisible后完善单元测试 [`#1167`](https://github.com/ant-design/ant-design-mini/pull/1167)\n- feat: DateRangePicker和CascaderPicker支持visible和defaultVisible [`#1158`](https://github.com/ant-design/ant-design-mini/pull/1158)\n- feat: DatePicker增加visible和defaultVisible后完善单元测试 [`#1163`](https://github.com/ant-design/ant-design-mini/pull/1163)\n\n#### [2.30.0](https://github.com/ant-design/ant-design-mini/compare/2.29.4...2.30.0)\n\n> 19 April 2024\n\n- fix: 输入框允许清楚的情况下，自动失焦问题 [`#1161`](https://github.com/ant-design/ant-design-mini/pull/1161)\n- Feat progress animation [`#1160`](https://github.com/ant-design/ant-design-mini/pull/1160)\n- feat: progress hook offline [`#1159`](https://github.com/ant-design/ant-design-mini/pull/1159)\n- GuideTour hook offline [`#1157`](https://github.com/ant-design/ant-design-mini/pull/1157)\n\n#### [2.29.4](https://github.com/ant-design/ant-design-mini/compare/2.29.3...2.29.4)\n\n> 17 April 2024\n\n- chore: vitest降1.4.0版本 [`#1154`](https://github.com/ant-design/ant-design-mini/pull/1154)\n- fix: [#1149]修复RangePicker和CascaderPicker组件onVisibleChange事件参数未适配微信的问题 [`#1153`](https://github.com/ant-design/ant-design-mini/pull/1153)\n- DatePicker支持visible和defaultVisible [`#1152`](https://github.com/ant-design/ant-design-mini/pull/1152)\n\n#### [2.29.3](https://github.com/ant-design/ant-design-mini/compare/2.29.2...2.29.3)\n\n> 11 April 2024\n\n- fix: 修复DatePicker组件onVisibleChange事件参数未适配微信的问题 [`#1150`](https://github.com/ant-design/ant-design-mini/pull/1150)\n\n#### [2.29.2](https://github.com/ant-design/ant-design-mini/compare/2.29.1...2.29.2)\n\n> 10 April 2024\n\n- Fix/calendar scroll [`#1147`](https://github.com/ant-design/ant-design-mini/pull/1147)\n- fix: 修复modal微信端无动效问题 [`#1144`](https://github.com/ant-design/ant-design-mini/pull/1144)\n- feat: 支持滚动到当前选择的日期 [`#1145`](https://github.com/ant-design/ant-design-mini/pull/1145)\n\n#### [2.29.1](https://github.com/ant-design/ant-design-mini/compare/2.29.0...2.29.1)\n\n> 7 April 2024\n\n- fix: 修复modal微信端无动效问题 [`#1139`](https://github.com/ant-design/ant-design-mini/pull/1139)\n\n#### [2.29.0](https://github.com/ant-design/ant-design-mini/compare/2.28.3...2.29.0)\n\n> 3 April 2024\n\n- fix: 修复图片上传中的中文文案问题 [`#1136`](https://github.com/ant-design/ant-design-mini/pull/1136)\n- fix: 修复GuideTour内置中文文案问题 [`#1133`](https://github.com/ant-design/ant-design-mini/pull/1133)\n- fix: 修复picker的内置空状态中文文案和空状态判断问题 [`#1135`](https://github.com/ant-design/ant-design-mini/pull/1135)\n\n#### [2.28.3](https://github.com/ant-design/ant-design-mini/compare/2.28.2...2.28.3)\n\n> 29 March 2024\n\n- feat: 优化calendar组件选中交互，日期滚动到可视区域内 [`#1128`](https://github.com/ant-design/ant-design-mini/pull/1128)\n\n#### [2.28.2](https://github.com/ant-design/ant-design-mini/compare/2.28.1...2.28.2)\n\n> 27 March 2024\n\n- fix: 修改 SwipeAction 在微信小程序下的 slot [`#1123`](https://github.com/ant-design/ant-design-mini/pull/1123)\n- feat: listitem组件写法优化 [`#1124`](https://github.com/ant-design/ant-design-mini/pull/1124)\n- feat(swiperAction):swiperAction组件新增滑动按钮插槽 [`#1120`](https://github.com/ant-design/ant-design-mini/pull/1120)\n- fix: 修复 loading demo 引用出错的问题 [`#1116`](https://github.com/ant-design/ant-design-mini/pull/1116)\n\n#### [2.28.1](https://github.com/ant-design/ant-design-mini/compare/2.28.0...2.28.1)\n\n> 22 February 2024\n\n- feat: 兼容 updateFade 时 item 为 null 的情况 [`#1112`](https://github.com/ant-design/ant-design-mini/pull/1112)\n\n#### [2.28.0](https://github.com/ant-design/ant-design-mini/compare/2.27.1...2.28.0)\n\n> 22 February 2024\n\n- fix: 修改 tabs 调用 updateScroll 的时机 [`#1110`](https://github.com/ant-design/ant-design-mini/pull/1110)\n- fix:  修复 FormDynamic 删除 item 后报错的问题 [`#1109`](https://github.com/ant-design/ant-design-mini/pull/1109)\n- fix: 修复 FormImageUpload 上传多张图片失败的问题 [`#1107`](https://github.com/ant-design/ant-design-mini/pull/1107)\n- fix: 修复 form demo 上传图片失败的问题 [`#1106`](https://github.com/ant-design/ant-design-mini/pull/1106)\n- fix: 更新 demo 里组件的前缀 [`#1102`](https://github.com/ant-design/ant-design-mini/pull/1102)\n- fix: demo 示例调整微信版本 ES+ 转换结果 [`#1103`](https://github.com/ant-design/ant-design-mini/pull/1103)\n- fix: 统一 demo 里组件的前缀 [`#1101`](https://github.com/ant-design/ant-design-mini/pull/1101)\n- fix: 修复 form 表单的错误 [`#1100`](https://github.com/ant-design/ant-design-mini/pull/1100)\n- [Part2] 兼容 component1/component2 适配度 [`#1098`](https://github.com/ant-design/ant-design-mini/pull/1098)\n- fix: Avatar/不再消失 [`#1097`](https://github.com/ant-design/ant-design-mini/pull/1097)\n- [Part1] 兼容 component1/component2 适配度  [`#1096`](https://github.com/ant-design/ant-design-mini/pull/1096)\n- Create dependabot.yml [`89582a7`](https://github.com/ant-design/ant-design-mini/commit/89582a7d842b23f77578ba78a65aad1cc1b624c3)\n- fix: Boolean [`f793c45`](https://github.com/ant-design/ant-design-mini/commit/f793c45b6dd196e6dd2d4630a101cdc7fd79562b)\n\n#### [2.27.1](https://github.com/ant-design/ant-design-mini/compare/2.27.0...2.27.1)\n\n> 5 February 2024\n\n- fix: 修复 form-picker 等组件在微信平台下获取数值失败的问题 [`#1093`](https://github.com/ant-design/ant-design-mini/pull/1093)\n- fix: 将 demo 的 page.json 改成 json5 [`#1091`](https://github.com/ant-design/ant-design-mini/pull/1091)\n- 大量优化文档表达 [`#1048`](https://github.com/ant-design/ant-design-mini/pull/1048)\n- fix: 同步文档 [`bf7dd13`](https://github.com/ant-design/ant-design-mini/commit/bf7dd13e9d99f1980a31fc95041e2cf4ac532147)\n\n#### [2.27.0](https://github.com/ant-design/ant-design-mini/compare/2.26.0...2.27.0)\n\n> 2 February 2024\n\n- fix: 修复 tabs 的样式问题 [`#1089`](https://github.com/ant-design/ant-design-mini/pull/1089)\n\n#### [2.26.0](https://github.com/ant-design/ant-design-mini/compare/2.25.0...2.26.0)\n\n> 1 February 2024\n\n- fix: 提高 notice bar 测试稳定性 [`#1086`](https://github.com/ant-design/ant-design-mini/pull/1086)\n- fix: 修复 indexbar 无法循环的问题 [`#1085`](https://github.com/ant-design/ant-design-mini/pull/1085)\n- fix: 修复 list-item 缺失 slot 的问题 [`#1084`](https://github.com/ant-design/ant-design-mini/pull/1084)\n- feat: index-index 页面适配微信 [`#1081`](https://github.com/ant-design/ant-design-mini/pull/1081)\n- 一些 demo 适配微信小程序 [`#1080`](https://github.com/ant-design/ant-design-mini/pull/1080)\n- feat: SwipeAction 适配微信小程序与基础库 1.0 [`#1078`](https://github.com/ant-design/ant-design-mini/pull/1078)\n- feat: 更新 SwipeAction 的测试 [`#1079`](https://github.com/ant-design/ant-design-mini/pull/1079)\n- feat: tabs 适配微信 [`#1076`](https://github.com/ant-design/ant-design-mini/pull/1076)\n- feat: 重构 tabs [`#1075`](https://github.com/ant-design/ant-design-mini/pull/1075)\n- ci: added tabs component unit test [`#1073`](https://github.com/ant-design/ant-design-mini/pull/1073)\n- Feat swipe action demos [`#1074`](https://github.com/ant-design/ant-design-mini/pull/1074)\n- feat: 重构 RareWordsKeyboard [`#1067`](https://github.com/ant-design/ant-design-mini/pull/1067)\n- fix: 修改 icon 显示多个的问题 [`#1072`](https://github.com/ant-design/ant-design-mini/pull/1072)\n- feat: 更新 SwipeAction 的 axml [`#1071`](https://github.com/ant-design/ant-design-mini/pull/1071)\n- 重构 NumberKeyboard [`#1065`](https://github.com/ant-design/ant-design-mini/pull/1065)\n- 重构 Collapse [`#1068`](https://github.com/ant-design/ant-design-mini/pull/1068)\n- feat: 更新 RareWordsKeyboard 的测试 [`#1066`](https://github.com/ant-design/ant-design-mini/pull/1066)\n- feat: 重构 noticebar [`#1062`](https://github.com/ant-design/ant-design-mini/pull/1062)\n- feat: 重构 progress 组件 [`#1060`](https://github.com/ant-design/ant-design-mini/pull/1060)\n- 重构 ActionSheet [`#1061`](https://github.com/ant-design/ant-design-mini/pull/1061)\n- feat: 新增三个组件的单元测试 [`#1058`](https://github.com/ant-design/ant-design-mini/pull/1058)\n- feat: 适配 steps [`#1055`](https://github.com/ant-design/ant-design-mini/pull/1055)\n- 适配 Empty 组件 [`#1054`](https://github.com/ant-design/ant-design-mini/pull/1054)\n- 适配 tabbar 组件 [`#1056`](https://github.com/ant-design/ant-design-mini/pull/1056)\n- 更新 Steps 的 axml [`#1053`](https://github.com/ant-design/ant-design-mini/pull/1053)\n- feat: 更新 Badge Grid Pagination 组件 [`#1047`](https://github.com/ant-design/ant-design-mini/pull/1047)\n- feat:  格式化 collapse 的 axml [`#1049`](https://github.com/ant-design/ant-design-mini/pull/1049)\n- 格式化 Numberkeyboard 的 axml [`#1052`](https://github.com/ant-design/ant-design-mini/pull/1052)\n- 更新 tabbar 的 axml [`#1051`](https://github.com/ant-design/ant-design-mini/pull/1051)\n- 更新 progress 的 axml [`#1050`](https://github.com/ant-design/ant-design-mini/pull/1050)\n- Toast 适配微信 [`#1043`](https://github.com/ant-design/ant-design-mini/pull/1043)\n\n#### [2.25.0](https://github.com/ant-design/ant-design-mini/compare/2.24.0...2.25.0)\n\n> 22 January 2024\n\n- fix: change types [`#1045`](https://github.com/ant-design/ant-design-mini/pull/1045)\n- feat: tooltip 支持 slot [`#1034`](https://github.com/ant-design/ant-design-mini/pull/1034)\n- docs: fix compiled miss [`#1044`](https://github.com/ant-design/ant-design-mini/pull/1044)\n- 更新 Badge、Grid、Pagination、Toast 的 axml [`#1041`](https://github.com/ant-design/ant-design-mini/pull/1041)\n- fix:  更新 Stepper 在 readonly 模式下的样式 [`#1040`](https://github.com/ant-design/ant-design-mini/pull/1040)\n- feat: stepper 组件增加只读属性 (#1036) [`#1039`](https://github.com/ant-design/ant-design-mini/pull/1039)\n- fix: 修改微信 demo 页的 title [`#1038`](https://github.com/ant-design/ant-design-mini/pull/1038)\n- CheckList 适配微信 [`#1037`](https://github.com/ant-design/ant-design-mini/pull/1037)\n- Modal 适配微信 [`#1035`](https://github.com/ant-design/ant-design-mini/pull/1035)\n- 更新 modal 的 axml [`#1019`](https://github.com/ant-design/ant-design-mini/pull/1019)\n- 更新 NoticeBar 的 axml 以及补充测试 [`#1020`](https://github.com/ant-design/ant-design-mini/pull/1020)\n- Guide Tour 适配微信 [`#1018`](https://github.com/ant-design/ant-design-mini/pull/1018)\n- 重构 GuideTour [`#1017`](https://github.com/ant-design/ant-design-mini/pull/1017)\n- feat: skeleton 适配微信 [`#1033`](https://github.com/ant-design/ant-design-mini/pull/1033)\n- Divider、avatar 组件适配微信 [`#1016`](https://github.com/ant-design/ant-design-mini/pull/1016)\n- 更新 skeleton 的 axml [`#1021`](https://github.com/ant-design/ant-design-mini/pull/1021)\n- docs: standard API desc [`df292cb`](https://github.com/ant-design/ant-design-mini/commit/df292cb27bc51ebf7b7afe2bc2713505fcdf1c3d)\n\n#### [2.24.0](https://github.com/ant-design/ant-design-mini/compare/2.23.0...2.24.0)\n\n> 16 January 2024\n\n- feat: popup 组件新增 onAfterShow 与 onAfterClose 事件 [`#1025`](https://github.com/ant-design/ant-design-mini/pull/1025)\n- fix: 添加编译后的代码 [`cd79e6c`](https://github.com/ant-design/ant-design-mini/commit/cd79e6ce65adcf06ccca431df44b5dafcbd31cf1)\n\n#### [2.23.0](https://github.com/ant-design/ant-design-mini/compare/2.22.0...2.23.0)\n\n> 16 January 2024\n\n- fix: 修复 axml 错误 [`#1029`](https://github.com/ant-design/ant-design-mini/pull/1029)\n- Feat form wechat demo [`#1028`](https://github.com/ant-design/ant-design-mini/pull/1028)\n- 修复一些之前的类型问题 [`#1027`](https://github.com/ant-design/ant-design-mini/pull/1027)\n- fix: 修复一些 ts 类型、更新 form 的 demo [`#1026`](https://github.com/ant-design/ant-design-mini/pull/1026)\n- fix: 更新 form image upload [`#1024`](https://github.com/ant-design/ant-design-mini/pull/1024)\n- feat: 更新部分 form 组件的 props [`#1022`](https://github.com/ant-design/ant-design-mini/pull/1022)\n- From 组件适配微信 [`#1010`](https://github.com/ant-design/ant-design-mini/pull/1010)\n- 更新 Form 处理事件的方式 [`#1015`](https://github.com/ant-design/ant-design-mini/pull/1015)\n- feat: update time 2022 to 2024 [`#1013`](https://github.com/ant-design/ant-design-mini/pull/1013)\n- 修改支付宝小程序的 demo 的编译参数, 修改为 es6 [`#1011`](https://github.com/ant-design/ant-design-mini/pull/1011)\n- chore: 支持 json5 [`#1009`](https://github.com/ant-design/ant-design-mini/pull/1009)\n\n#### [2.22.0](https://github.com/ant-design/ant-design-mini/compare/2.21.0...2.22.0)\n\n> 27 December 2023\n\n- fix:  修复 form 校验时获取的 value 不正确的问题 [`#1006`](https://github.com/ant-design/ant-design-mini/pull/1006)\n- fix: 修复 value 类型为 string 时, 打开出错的问题 [`#1007`](https://github.com/ant-design/ant-design-mini/pull/1007)\n- feat: 更新群二维码 [`#1005`](https://github.com/ant-design/ant-design-mini/pull/1005)\n- 重构 form  [`#1003`](https://github.com/ant-design/ant-design-mini/pull/1003)\n\n#### [2.21.0](https://github.com/ant-design/ant-design-mini/compare/2.20.0...2.21.0)\n\n> 25 December 2023\n\n- fix: 修复 date picker 日期显示错误的问题 [`#1001`](https://github.com/ant-design/ant-design-mini/pull/1001)\n- test: 为 form 补全测试 [`#999`](https://github.com/ant-design/ant-design-mini/pull/999)\n- feat: demo 使用 tsx 重写 [`#997`](https://github.com/ant-design/ant-design-mini/pull/997)\n- Form 相关组件使用 tsx 重构 [`#996`](https://github.com/ant-design/ant-design-mini/pull/996)\n- feat: 重写 form-item 的 axml [`#995`](https://github.com/ant-design/ant-design-mini/pull/995)\n\n#### [2.20.0](https://github.com/ant-design/ant-design-mini/compare/2.19.0...2.20.0)\n\n> 19 December 2023\n\n- fix: 修复 onSelectMax 无效的问题 [`#993`](https://github.com/ant-design/ant-design-mini/pull/993)\n- feat:  Rate Custom 迁移到微信 [`#992`](https://github.com/ant-design/ant-design-mini/pull/992)\n- feat: selector 适配微信 [`#987`](https://github.com/ant-design/ant-design-mini/pull/987)\n- feat: rate 适配微信 [`#988`](https://github.com/ant-design/ant-design-mini/pull/988)\n- feat: radio 适配微信 [`#989`](https://github.com/ant-design/ant-design-mini/pull/989)\n- fix: 修复 range picker 的 format 警告 [`#991`](https://github.com/ant-design/ant-design-mini/pull/991)\n- radio rate selector 组件使用 functional 重写 [`#986`](https://github.com/ant-design/ant-design-mini/pull/986)\n- feat: tabs 重写为 tsx  [`#985`](https://github.com/ant-design/ant-design-mini/pull/985)\n- feat: selector 重写为 tsx [`#983`](https://github.com/ant-design/ant-design-mini/pull/983)\n- feat: rate 使用 tsx 重写 [`#982`](https://github.com/ant-design/ant-design-mini/pull/982)\n- feat: 使用 tsx 重写 radio [`#981`](https://github.com/ant-design/ant-design-mini/pull/981)\n\n#### [2.19.0](https://github.com/ant-design/ant-design-mini/compare/2.18.0...2.19.0)\n\n> 14 December 2023\n\n- feat: ImageUploadControl 适配微信 [`#978`](https://github.com/ant-design/ant-design-mini/pull/978)\n- Date picker 适配微信 [`#977`](https://github.com/ant-design/ant-design-mini/pull/977)\n- Picker 适配微信小程序 [`#976`](https://github.com/ant-design/ant-design-mini/pull/976)\n- feat: 重构 image upload 组件 [`#975`](https://github.com/ant-design/ant-design-mini/pull/975)\n- feat: 重写 range picker 的 axml [`#974`](https://github.com/ant-design/ant-design-mini/pull/974)\n- feat: 重写 range picker [`#972`](https://github.com/ant-design/ant-design-mini/pull/972)\n- feat:  Picker 与 CascaderPicker 组件使用 tsx 重写 [`#971`](https://github.com/ant-design/ant-design-mini/pull/971)\n- fix:  修复 maskClosable 不生效的问题 [`#970`](https://github.com/ant-design/ant-design-mini/pull/970)\n- feat: 更新 image upload 组件的 axml [`#942`](https://github.com/ant-design/ant-design-mini/pull/942)\n- feat: 使用 functional 重构 range picker 组件 [`#969`](https://github.com/ant-design/ant-design-mini/pull/969)\n- test: 更新 DatePicker、Radio、Rate、Selector 的测试 [`#968`](https://github.com/ant-design/ant-design-mini/pull/968)\n- test: 新增 RangePicker 的测试 [`#967`](https://github.com/ant-design/ant-design-mini/pull/967)\n- feat: 更新 date picker 的测试 [`#966`](https://github.com/ant-design/ant-design-mini/pull/966)\n\n#### [2.18.0](https://github.com/ant-design/ant-design-mini/compare/2.17.0...2.18.0)\n\n> 7 December 2023\n\n- fix: 修复 build 失败的问题 [`#964`](https://github.com/ant-design/ant-design-mini/pull/964)\n- fix: 更新 cascader-picker 在非受控模式下的渲染流程 [`#963`](https://github.com/ant-design/ant-design-mini/pull/963)\n- fix: 在 steps 使用 a-image 替换 image [`#962`](https://github.com/ant-design/ant-design-mini/pull/962)\n- feat: 更新 image upload 的测试 [`#961`](https://github.com/ant-design/ant-design-mini/pull/961)\n- feat: 重构 CascaderPicker [`#960`](https://github.com/ant-design/ant-design-mini/pull/960)\n- feat: 更新 picker 的测试 [`#958`](https://github.com/ant-design/ant-design-mini/pull/958)\n- feat: 更新 Picker 组件 [`#953`](https://github.com/ant-design/ant-design-mini/pull/953)\n\n#### [2.17.0](https://github.com/ant-design/ant-design-mini/compare/2.16.0...2.17.0)\n\n> 4 December 2023\n\n- fix: 修复 slider 在 appx 1.0 报错的问题 [`#956`](https://github.com/ant-design/ant-design-mini/pull/956)\n- Test: 为 picker 组件补全测试 [`#954`](https://github.com/ant-design/ant-design-mini/pull/954)\n\n#### [2.16.0](https://github.com/ant-design/ant-design-mini/compare/2.15.0...2.16.0)\n\n> 28 November 2023\n\n- fix: 修复 form-input 缺失 alwaysSystem 的问题 [`#950`](https://github.com/ant-design/ant-design-mini/pull/950)\n- form 支持动态更新 value [`#946`](https://github.com/ant-design/ant-design-mini/pull/946)\n- fix: 修复 selector 逻辑错误的问题 [`#948`](https://github.com/ant-design/ant-design-mini/pull/948)\n- Checkbox 适配微信 [`#941`](https://github.com/ant-design/ant-design-mini/pull/941)\n- 重构 Checkbox [`#940`](https://github.com/ant-design/ant-design-mini/pull/940)\n- feat: 更新 checkbox 的测试 [`#939`](https://github.com/ant-design/ant-design-mini/pull/939)\n- Checkbox 组件使用 tsx 重写 [`#938`](https://github.com/ant-design/ant-design-mini/pull/938)\n- feat: Popup 适配微信 [`#937`](https://github.com/ant-design/ant-design-mini/pull/937)\n- Popup 使用 functional 重构 [`#936`](https://github.com/ant-design/ant-design-mini/pull/936)\n- Slider 适配微信 [`#935`](https://github.com/ant-design/ant-design-mini/pull/935)\n- feat: slider 使用 functional 重写 [`9ae0ca3`](https://github.com/ant-design/ant-design-mini/commit/9ae0ca321178f45cadd63991d72a6d78a0402902)\n- feat: slider 组件使用 tsx 重写 [`cbd8a85`](https://github.com/ant-design/ant-design-mini/commit/cbd8a8506aba0fb8173ba6065680fee708f30e92)\n- feat: 更新 demo [`fa307bf`](https://github.com/ant-design/ant-design-mini/commit/fa307bfeef831f8d4d585a10231d4a6c088a4c01)\n\n#### [2.15.0](https://github.com/ant-design/ant-design-mini/compare/2.14.0...2.15.0)\n\n> 15 November 2023\n\n- Input 使用 functional 重构，补全测试 [`#915`](https://github.com/ant-design/ant-design-mini/pull/915)\n- docs: 更新文档 [`#914`](https://github.com/ant-design/ant-design-mini/pull/914)\n- fix: 更新 input 的测试 与 page 的 axml [`#910`](https://github.com/ant-design/ant-design-mini/pull/910)\n- test: Input & Textarea & InputBlur [`#909`](https://github.com/ant-design/ant-design-mini/pull/909)\n- test:   为 Stepper 添加一些测试 [`#908`](https://github.com/ant-design/ant-design-mini/pull/908)\n- Stepper 使用 tsx 重构 [`#906`](https://github.com/ant-design/ant-design-mini/pull/906)\n- Popover 组件适配微信 [`#905`](https://github.com/ant-design/ant-design-mini/pull/905)\n- Popover [`#903`](https://github.com/ant-design/ant-design-mini/pull/903)\n- feat: Textarea & InputBlur 使用 tsx 重构, 补全 props 类型 [`#902`](https://github.com/ant-design/ant-design-mini/pull/902)\n- Input & Stepper [`#901`](https://github.com/ant-design/ant-design-mini/pull/901)\n- ActionSheet 与 Popup 使用 tsxml 重写 [`#899`](https://github.com/ant-design/ant-design-mini/pull/899)\n- ButtonCustom 迁移到 tsx [`#897`](https://github.com/ant-design/ant-design-mini/pull/897)\n- Empty,Avatar 组件迁移到 tsx [`#896`](https://github.com/ant-design/ant-design-mini/pull/896)\n- feat:  在官网增加平台切换功能 [`#891`](https://github.com/ant-design/ant-design-mini/pull/891)\n- fix:   a:if 的元素外层不再嵌套 block [`#889`](https://github.com/ant-design/ant-design-mini/pull/889)\n- 重构 RareWordsKeyboard 的 axml [`#887`](https://github.com/ant-design/ant-design-mini/pull/887)\n- wip [`5c63cc5`](https://github.com/ant-design/ant-design-mini/commit/5c63cc509ddc1a41274a1135afdb04abb5876c43)\n- feat: 新增一些测试 [`068962f`](https://github.com/ant-design/ant-design-mini/commit/068962f52930ed402d86c7a42f613700e5268ae3)\n- feat: stepper 支持微信 [`783492a`](https://github.com/ant-design/ant-design-mini/commit/783492aee80f50d7598c444ab170a37aed2368d1)\n\n#### [2.14.0](https://github.com/ant-design/ant-design-mini/compare/2.13.0...2.14.0)\n\n> 24 October 2023\n\n- fix: 修复日历组件 demo [`#885`](https://github.com/ant-design/ant-design-mini/pull/885)\n- Component result tsxml [`#883`](https://github.com/ant-design/ant-design-mini/pull/883)\n- fix: 修改 form-textarea 的参数 [`#884`](https://github.com/ant-design/ant-design-mini/pull/884)\n- feat: 更新 result 组件的 axml [`#881`](https://github.com/ant-design/ant-design-mini/pull/881)\n- feat: 更新 list 组件 [`#880`](https://github.com/ant-design/ant-design-mini/pull/880)\n- feat: list 使用 tsxml 重写 [`#879`](https://github.com/ant-design/ant-design-mini/pull/879)\n- feat: 更新 list 的 tsxml [`#878`](https://github.com/ant-design/ant-design-mini/pull/878)\n- fix:  修复微信端日历组件显示不正确的问题 [`#876`](https://github.com/ant-design/ant-design-mini/pull/876)\n- feat: 支持 axml 编译支持 for-key [`#875`](https://github.com/ant-design/ant-design-mini/pull/875)\n- feat:  calendar [`#871`](https://github.com/ant-design/ant-design-mini/pull/871)\n- fix: 优化 text 元素的编译 [`#872`](https://github.com/ant-design/ant-design-mini/pull/872)\n- fix: 删除 dayjs 插件 [`#870`](https://github.com/ant-design/ant-design-mini/pull/870)\n\n#### [2.13.0](https://github.com/ant-design/ant-design-mini/compare/2.12.2...2.13.0)\n\n> 17 October 2023\n\n- fix: 修复 switch 的 value 不正确的问题 [`#868`](https://github.com/ant-design/ant-design-mini/pull/868)\n- chore: 新增在 uni-app 使用的指引 [`#867`](https://github.com/ant-design/ant-design-mini/pull/867)\n- fix: 修复 slide 的一些问题 [`#866`](https://github.com/ant-design/ant-design-mini/pull/866)\n- feat: 更新 transform 脚本 [`#865`](https://github.com/ant-design/ant-design-mini/pull/865)\n- chore: 移动测试位置 [`#863`](https://github.com/ant-design/ant-design-mini/pull/863)\n- fix: 删除一些无用的文件 [`#862`](https://github.com/ant-design/ant-design-mini/pull/862)\n- refactor: 调整目录结构 [`#861`](https://github.com/ant-design/ant-design-mini/pull/861)\n- Tag [`#857`](https://github.com/ant-design/ant-design-mini/pull/857)\n- Switch [`#858`](https://github.com/ant-design/ant-design-mini/pull/858)\n\n#### [2.12.2](https://github.com/ant-design/ant-design-mini/compare/2.12.1...2.12.2)\n\n> 11 October 2023\n\n- fix: raise the layer of picker mask to a compositing layer [`#859`](https://github.com/ant-design/ant-design-mini/pull/859)\n- fix: button loading [`#856`](https://github.com/ant-design/ant-design-mini/pull/856)\n- Button [`#855`](https://github.com/ant-design/ant-design-mini/pull/855)\n\n#### [2.12.1](https://github.com/ant-design/ant-design-mini/compare/2.12.0...2.12.1)\n\n> 7 October 2023\n\n- 更新 icon 组件 [`#851`](https://github.com/ant-design/ant-design-mini/pull/851)\n- fix: 修复日历组件 default value 不生效的问题 [`#853`](https://github.com/ant-design/ant-design-mini/pull/853)\n- chore: 格式化 less [`#852`](https://github.com/ant-design/ant-design-mini/pull/852)\n\n#### [2.12.0](https://github.com/ant-design/ant-design-mini/compare/2.12.0-alpha-0...2.12.0)\n\n> 26 September 2023\n\n- fix: 修复测试 [`#848`](https://github.com/ant-design/ant-design-mini/pull/848)\n- fix: 增补字库以及修复生僻字输入键盘一些问题 (#844) [`#845`](https://github.com/ant-design/ant-design-mini/pull/845)\n\n#### [2.12.0-alpha-0](https://github.com/ant-design/ant-design-mini/compare/2.11.0...2.12.0-alpha-0)\n\n> 26 September 2023\n\n- 新增 tsxml [`#838`](https://github.com/ant-design/ant-design-mini/pull/838)\n- chore: 格式化 axml [`#843`](https://github.com/ant-design/ant-design-mini/pull/843)\n- fix: 修复 FormImageUpload on remove 不生效的问题 [`#842`](https://github.com/ant-design/ant-design-mini/pull/842)\n- fix:  优化 axml 的写法 [`#837`](https://github.com/ant-design/ant-design-mini/pull/837)\n- feat: 优化升级指引 [`#834`](https://github.com/ant-design/ant-design-mini/pull/834)\n- fix: 修改项目的 description [`#835`](https://github.com/ant-design/ant-design-mini/pull/835)\n- feat: 更新官网导航地址 [`#833`](https://github.com/ant-design/ant-design-mini/pull/833)\n- feat: 更新首页样式，并且新增 uploader 的 demo [`#832`](https://github.com/ant-design/ant-design-mini/pull/832)\n- feat: 增加函数式组件的说明 [`#828`](https://github.com/ant-design/ant-design-mini/pull/828)\n- fix: 修改 demo 的 appid [`#830`](https://github.com/ant-design/ant-design-mini/pull/830)\n\n### [2.11.0](https://github.com/ant-design/ant-design-mini/compare/1.10.9...2.11.0)\n\n> 12 September 2023\n\n- feat: 升级到 2.0 [`#826`](https://github.com/ant-design/ant-design-mini/pull/826)\n- fix: should not use element selector [`#808`](https://github.com/ant-design/ant-design-mini/pull/808)\n- feat: 使用 vm 进行测试 [`#817`](https://github.com/ant-design/ant-design-mini/pull/817)\n\n#### [1.10.9](https://github.com/ant-design/ant-design-mini/compare/1.10.9-alpha.2...1.10.9)\n\n> 9 January 2025\n\n- chore: update version [`f7ceaa5`](https://github.com/ant-design/ant-design-mini/commit/f7ceaa51f428162444609463323e9775c3c64a27)\n\n#### [1.10.9-alpha.2](https://github.com/ant-design/ant-design-mini/compare/1.10.9-alpha.1...1.10.9-alpha.2)\n\n> 8 January 2025\n\n- fix: form onValueChange validate time series problem [`0d8ea96`](https://github.com/ant-design/ant-design-mini/commit/0d8ea966341de9e9707ecf8b168483b31019ca2f)\n- fix: picker view render [`be21b03`](https://github.com/ant-design/ant-design-mini/commit/be21b036622f05b747fe1c7dcac88fa2a5fe7f06)\n- chore: update version [`4bd2c5a`](https://github.com/ant-design/ant-design-mini/commit/4bd2c5a4e6b1d0d4a26714ef49d6055c199cf8b2)\n\n#### [1.10.9-alpha.1](https://github.com/ant-design/ant-design-mini/compare/1.10.8...1.10.9-alpha.1)\n\n> 8 January 2025\n\n- fix: form onValueChange validate time series problem [`d33653b`](https://github.com/ant-design/ant-design-mini/commit/d33653bdebf6b5da6e21da2713b117c3fdffc8dc)\n- fix: form onValueChange validate time series problem [`eb5faed`](https://github.com/ant-design/ant-design-mini/commit/eb5faedd487c605679bd5591b5f477f32b0a7364)\n- fix: form onValueChange validate time series problem [`8613b1e`](https://github.com/ant-design/ant-design-mini/commit/8613b1ee116ec23f4ce3bd919dc10f10cd0f23b0)\n\n#### [1.10.8](https://github.com/ant-design/ant-design-mini/compare/1.10.7...1.10.8)\n\n> 30 December 2024\n\n- fix: picker view render [`be21b03`](https://github.com/ant-design/ant-design-mini/commit/be21b036622f05b747fe1c7dcac88fa2a5fe7f06)\n- fix: picker view render [`58ec4c9`](https://github.com/ant-design/ant-design-mini/commit/58ec4c91025fef6e5d2d58d914d838cfb7164bac)\n\n#### [1.10.7](https://github.com/ant-design/ant-design-mini/compare/1.10.6...1.10.7)\n\n> 10 July 2024\n\n- fix: 修复插件中编译css标签选择器 [`c67b19e`](https://github.com/ant-design/ant-design-mini/commit/c67b19e5eff77f41a91377861041a18d4c9a04b1)\n- feat: 更新版本号 [`62e9515`](https://github.com/ant-design/ant-design-mini/commit/62e951511c36a63171ebd02f452874923d991269)\n\n#### [1.10.6](https://github.com/ant-design/ant-design-mini/compare/1.10.5...1.10.6)\n\n> 23 August 2023\n\n- fix: fix form-textarea onFocus not working [`#814`](https://github.com/ant-design/ant-design-mini/pull/814)\n- fix: 修复 form 表单 createForm Api 误写问题 [`#806`](https://github.com/ant-design/ant-design-mini/pull/806)\n- fix: 修复文档中 iOS 的大小写问题 [`#805`](https://github.com/ant-design/ant-design-mini/pull/805)\n\n#### [1.10.5](https://github.com/ant-design/ant-design-mini/compare/1.10.4...1.10.5)\n\n> 1 August 2023\n\n- feat: 修改indexbar bug [`#802`](https://github.com/ant-design/ant-design-mini/pull/802)\n- fix: tabs [`#801`](https://github.com/ant-design/ant-design-mini/pull/801)\n\n#### [1.10.4](https://github.com/ant-design/ant-design-mini/compare/1.10.3...1.10.4)\n\n> 21 July 2023\n\n- fix: stepper [`#799`](https://github.com/ant-design/ant-design-mini/pull/799)\n\n#### [1.10.3](https://github.com/ant-design/ant-design-mini/compare/1.10.2...1.10.3)\n\n> 18 July 2023\n\n- fix: DatePicker [`#796`](https://github.com/ant-design/ant-design-mini/pull/796)\n- fix: stepper [`#795`](https://github.com/ant-design/ant-design-mini/pull/795)\n- fix(Picker): fix content slot [`#794`](https://github.com/ant-design/ant-design-mini/pull/794)\n\n#### [1.10.2](https://github.com/ant-design/ant-design-mini/compare/1.10.1...1.10.2)\n\n> 18 July 2023\n\n- fix: stepper [`#792`](https://github.com/ant-design/ant-design-mini/pull/792)\n- fix: missing FormTextareaDefaultProps [`#791`](https://github.com/ant-design/ant-design-mini/pull/791)\n\n#### [1.10.1](https://github.com/ant-design/ant-design-mini/compare/1.10.0...1.10.1)\n\n> 14 July 2023\n\n- chore: 统一id前缀 [`#786`](https://github.com/ant-design/ant-design-mini/pull/786)\n- fix: tabs [`#784`](https://github.com/ant-design/ant-design-mini/pull/784)\n\n#### [1.10.0](https://github.com/ant-design/ant-design-mini/compare/1.9.4...1.10.0)\n\n> 12 July 2023\n\n- feat: tabs [`#780`](https://github.com/ant-design/ant-design-mini/pull/780)\n\n#### [1.9.4](https://github.com/ant-design/ant-design-mini/compare/1.9.3...1.9.4)\n\n> 6 July 2023\n\n- fix: Progress [`#776`](https://github.com/ant-design/ant-design-mini/pull/776)\n\n#### [1.9.3](https://github.com/ant-design/ant-design-mini/compare/1.9.2...1.9.3)\n\n> 3 July 2023\n\n- fix(Picker): fix content slot [`#773`](https://github.com/ant-design/ant-design-mini/pull/773)\n\n#### [1.9.2](https://github.com/ant-design/ant-design-mini/compare/1.9.1...1.9.2)\n\n> 16 June 2023\n\n- fix: slider [`#769`](https://github.com/ant-design/ant-design-mini/pull/769)\n- fix: form [`#768`](https://github.com/ant-design/ant-design-mini/pull/768)\n\n#### [1.9.1](https://github.com/ant-design/ant-design-mini/compare/1.9.0...1.9.1)\n\n> 14 June 2023\n\n- feat(RangePicker): 修改切换交互 [`#762`](https://github.com/ant-design/ant-design-mini/pull/762)\n- fix: Picker [`#761`](https://github.com/ant-design/ant-design-mini/pull/761)\n\n#### [1.9.0](https://github.com/ant-design/ant-design-mini/compare/1.8.3...1.9.0)\n\n> 6 June 2023\n\n- fix: 调整滑动组件的默认起始偏移量 [`#754`](https://github.com/ant-design/ant-design-mini/pull/754)\n- feat: 更新字库数据 [`#752`](https://github.com/ant-design/ant-design-mini/pull/752)\n\n#### [1.8.3](https://github.com/ant-design/ant-design-mini/compare/1.8.2...1.8.3)\n\n> 30 May 2023\n\n- chore: build [`#750`](https://github.com/ant-design/ant-design-mini/pull/750)\n- fix: button [`#749`](https://github.com/ant-design/ant-design-mini/pull/749)\n- fix: stepper [`#748`](https://github.com/ant-design/ant-design-mini/pull/748)\n\n#### [1.8.2](https://github.com/ant-design/ant-design-mini/compare/1.8.1...1.8.2)\n\n> 26 May 2023\n\n- fix: stepper [`#746`](https://github.com/ant-design/ant-design-mini/pull/746)\n\n#### [1.8.1](https://github.com/ant-design/ant-design-mini/compare/1.8.0...1.8.1)\n\n> 25 May 2023\n\n- fix: form [`#737`](https://github.com/ant-design/ant-design-mini/pull/737)\n- feat(collapse): 清除console.log [`#736`](https://github.com/ant-design/ant-design-mini/pull/736)\n\n#### [1.8.0](https://github.com/ant-design/ant-design-mini/compare/1.7.2...1.8.0)\n\n> 18 May 2023\n\n- fix: slider [`#732`](https://github.com/ant-design/ant-design-mini/pull/732)\n- feat(Slider): 阻止左右滑动时上下滑动 [`#731`](https://github.com/ant-design/ant-design-mini/pull/731)\n- fix: button [`#730`](https://github.com/ant-design/ant-design-mini/pull/730)\n- feat(picker): picker组件代码示例修改header-&gt;title [`#726`](https://github.com/ant-design/ant-design-mini/pull/726)\n\n#### [1.7.2](https://github.com/ant-design/ant-design-mini/compare/1.7.1...1.7.2)\n\n> 15 May 2023\n\n- fix: slider [`#722`](https://github.com/ant-design/ant-design-mini/pull/722)\n\n#### [1.7.1](https://github.com/ant-design/ant-design-mini/compare/1.7.0...1.7.1)\n\n> 11 May 2023\n\n- fix(Picker): picker-view value [`#720`](https://github.com/ant-design/ant-design-mini/pull/720)\n- chore(docs): 修改rules跳转链接 [`#719`](https://github.com/ant-design/ant-design-mini/pull/719)\n\n#### [1.7.0](https://github.com/ant-design/ant-design-mini/compare/1.6.3...1.7.0)\n\n> 9 May 2023\n\n- feat: tabs [`#715`](https://github.com/ant-design/ant-design-mini/pull/715)\n- fix: less [`#714`](https://github.com/ant-design/ant-design-mini/pull/714)\n- docs: 错别字修改 [`#713`](https://github.com/ant-design/ant-design-mini/pull/713)\n- docs(RangePicker): 更新文档 [`#712`](https://github.com/ant-design/ant-design-mini/pull/712)\n- fix(Steps): delete empty axml onTap [`#711`](https://github.com/ant-design/ant-design-mini/pull/711)\n\n#### [1.6.3](https://github.com/ant-design/ant-design-mini/compare/1.6.2...1.6.3)\n\n> 26 April 2023\n\n- fix(selector): 修复选中判断 [`#707`](https://github.com/ant-design/ant-design-mini/pull/707)\n- fix: form [`#705`](https://github.com/ant-design/ant-design-mini/pull/705)\n- feat(Popup): add animationType [`#704`](https://github.com/ant-design/ant-design-mini/pull/704)\n\n#### [1.6.2](https://github.com/ant-design/ant-design-mini/compare/1.6.1...1.6.2)\n\n> 23 April 2023\n\n- fix: stepper [`#698`](https://github.com/ant-design/ant-design-mini/pull/698)\n\n#### [1.6.1](https://github.com/ant-design/ant-design-mini/compare/1.6.0...1.6.1)\n\n> 17 April 2023\n\n- fix: form [`#685`](https://github.com/ant-design/ant-design-mini/pull/685)\n\n#### [1.6.0](https://github.com/ant-design/ant-design-mini/compare/1.5.2...1.6.0)\n\n> 12 April 2023\n\n- feat: form [`#674`](https://github.com/ant-design/ant-design-mini/pull/674)\n- fix(FormInput): 表单对齐 [`#680`](https://github.com/ant-design/ant-design-mini/pull/680)\n\n#### [1.5.2](https://github.com/ant-design/ant-design-mini/compare/1.5.1...1.5.2)\n\n> 10 April 2023\n\n- fix(Stepper): fix controlled [`#673`](https://github.com/ant-design/ant-design-mini/pull/673)\n- chore: remove useless code [`#671`](https://github.com/ant-design/ant-design-mini/pull/671)\n\n#### [1.5.1](https://github.com/ant-design/ant-design-mini/compare/1.5.0...1.5.1)\n\n> 3 April 2023\n\n- fix: form [`#667`](https://github.com/ant-design/ant-design-mini/pull/667)\n- ci: add Picker、CascaderPicker test [`#665`](https://github.com/ant-design/ant-design-mini/pull/665)\n- docs(Popup): 文档添加滚动FAQ [`#666`](https://github.com/ant-design/ant-design-mini/pull/666)\n- docs(Grid): 更新Grid demo [`#663`](https://github.com/ant-design/ant-design-mini/pull/663)\n\n#### [1.5.0](https://github.com/ant-design/ant-design-mini/compare/1.4.1...1.5.0)\n\n> 24 March 2023\n\n- feat: form [`#661`](https://github.com/ant-design/ant-design-mini/pull/661)\n- feat(DatePicker): add onFormatLabel [`#660`](https://github.com/ant-design/ant-design-mini/pull/660)\n- fix: 修复路径问题 [`#659`](https://github.com/ant-design/ant-design-mini/pull/659)\n- chore: build [`#658`](https://github.com/ant-design/ant-design-mini/pull/658)\n\n#### [1.4.1](https://github.com/ant-design/ant-design-mini/compare/1.4.0...1.4.1)\n\n> 23 March 2023\n\n- feat: 修复生僻字键盘demo字符无法展示的问题 [`#656`](https://github.com/ant-design/ant-design-mini/pull/656)\n- fix(FormInput): onFocus [`#652`](https://github.com/ant-design/ant-design-mini/pull/652)\n- fix(Divider): type missing [`#651`](https://github.com/ant-design/ant-design-mini/pull/651)\n- feat: 案例添加onChange监听 [`#650`](https://github.com/ant-design/ant-design-mini/pull/650)\n\n#### [1.4.0](https://github.com/ant-design/ant-design-mini/compare/1.3.2...1.4.0)\n\n> 17 March 2023\n\n- feat(Grid): add icon、title、description slot [`#638`](https://github.com/ant-design/ant-design-mini/pull/638)\n- Feat/form [`#632`](https://github.com/ant-design/ant-design-mini/pull/632)\n- feat: input controlled [`#633`](https://github.com/ant-design/ant-design-mini/pull/633)\n- chore: build [`#631`](https://github.com/ant-design/ant-design-mini/pull/631)\n- feat: 新增生僻字键盘 [`#603`](https://github.com/ant-design/ant-design-mini/pull/603)\n- feat(Form): add getFieldsValue api for Form [`#620`](https://github.com/ant-design/ant-design-mini/pull/620)\n\n#### [1.3.2](https://github.com/ant-design/ant-design-mini/compare/1.3.1...1.3.2)\n\n> 8 March 2023\n\n- fix: fix FormRadioGroup、FormCheckboxGroup、FormSelector disabled [`#622`](https://github.com/ant-design/ant-design-mini/pull/622)\n- fix: 修复横向滚动条问题 [`#617`](https://github.com/ant-design/ant-design-mini/pull/617)\n\n#### [1.3.1](https://github.com/ant-design/ant-design-mini/compare/1.3.0...1.3.1)\n\n> 3 March 2023\n\n- chore: build [`#614`](https://github.com/ant-design/ant-design-mini/pull/614)\n- feat(Popup): 优化动画性能 [`#613`](https://github.com/ant-design/ant-design-mini/pull/613)\n- chore: build [`#612`](https://github.com/ant-design/ant-design-mini/pull/612)\n\n#### [1.3.0](https://github.com/ant-design/ant-design-mini/compare/1.3.0-beta.1...1.3.0)\n\n> 1 March 2023\n\n- Chore/build [`#586`](https://github.com/ant-design/ant-design-mini/pull/586)\n\n#### [1.3.0-beta.1](https://github.com/ant-design/ant-design-mini/compare/1.3.0-beta.0...1.3.0-beta.1)\n\n> 1 March 2023\n\n- fix: preview [`6508763`](https://github.com/ant-design/ant-design-mini/commit/6508763a41a41b683adb270e2bf907baa0b418c4)\n- chore: build [`f8b066d`](https://github.com/ant-design/ant-design-mini/commit/f8b066d2fe5303ac963c75282a2bfe2db4807847)\n\n#### [1.3.0-beta.0](https://github.com/ant-design/ant-design-mini/compare/1.2.1...1.3.0-beta.0)\n\n> 28 February 2023\n\n- Feat/form [`#606`](https://github.com/ant-design/ant-design-mini/pull/606)\n- feat: 添加更多的less变量 [`#596`](https://github.com/ant-design/ant-design-mini/pull/596)\n- feat: 解决form-json 样式 [`#595`](https://github.com/ant-design/ant-design-mini/pull/595)\n- fix: props [`6d840ee`](https://github.com/ant-design/ant-design-mini/commit/6d840ee114a666299f574e4602bc9b1813062cac)\n- chore: build [`80a0e0b`](https://github.com/ant-design/ant-design-mini/commit/80a0e0b9f4a633a10cad9920bb7650542ea4d399)\n- fix: form [`47b6c4d`](https://github.com/ant-design/ant-design-mini/commit/47b6c4da9aac218352875b53310fc44821fe7602)\n\n#### [1.2.1](https://github.com/ant-design/ant-design-mini/compare/1.2.0...1.2.1)\n\n> 23 February 2023\n\n- fix: steps [`#594`](https://github.com/ant-design/ant-design-mini/pull/594)\n- docs: indexbar [`#602`](https://github.com/ant-design/ant-design-mini/pull/602)\n- chore: build [`#601`](https://github.com/ant-design/ant-design-mini/pull/601)\n- fix: indexbar query select [`#599`](https://github.com/ant-design/ant-design-mini/pull/599)\n\n#### [1.2.0](https://github.com/ant-design/ant-design-mini/compare/1.1.2...1.2.0)\n\n> 20 February 2023\n\n- fix: switch [`#591`](https://github.com/ant-design/ant-design-mini/pull/591)\n- fix: form [`#588`](https://github.com/ant-design/ant-design-mini/pull/588)\n- fix: steps [`#584`](https://github.com/ant-design/ant-design-mini/pull/584)\n- docs: form [`#582`](https://github.com/ant-design/ant-design-mini/pull/582)\n- docs: form [`#579`](https://github.com/ant-design/ant-design-mini/pull/579)\n- ci: test [`#581`](https://github.com/ant-design/ant-design-mini/pull/581)\n- docs(tabs): 修改文档错别字 [`#577`](https://github.com/ant-design/ant-design-mini/pull/577)\n- ci: test [`#574`](https://github.com/ant-design/ant-design-mini/pull/574)\n- feat: 新版本 [`#573`](https://github.com/ant-design/ant-design-mini/pull/573)\n- docs: 修改文档 [`#572`](https://github.com/ant-design/ant-design-mini/pull/572)\n\n#### [1.1.2](https://github.com/ant-design/ant-design-mini/compare/1.1.1...1.1.2)\n\n> 9 February 2023\n\n- fix(Container): 修复钉钉下headerRight 不显示 [`#570`](https://github.com/ant-design/ant-design-mini/pull/570)\n\n#### [1.1.1](https://github.com/ant-design/ant-design-mini/compare/1.1.0...1.1.1)\n\n> 9 February 2023\n\n- fix(Container): fix overflow style [`#568`](https://github.com/ant-design/ant-design-mini/pull/568)\n- docs: fix url [`#567`](https://github.com/ant-design/ant-design-mini/pull/567)\n- docs: add CheckboxCustomGroup demo [`#566`](https://github.com/ant-design/ant-design-mini/pull/566)\n- docs: add collapse checkbox [`#565`](https://github.com/ant-design/ant-design-mini/pull/565)\n\n#### [1.1.0](https://github.com/ant-design/ant-design-mini/compare/1.0.1...1.1.0)\n\n> 9 February 2023\n\n- feat(Container): 无title、headerRight时隐藏header [`#560`](https://github.com/ant-design/ant-design-mini/pull/560)\n- chore(formItem): 删除formItem无用代码 [`#562`](https://github.com/ant-design/ant-design-mini/pull/562)\n- docs(collapse): 文档透出CollapseItem的disabled字段 [`#561`](https://github.com/ant-design/ant-design-mini/pull/561)\n\n#### [1.0.1](https://github.com/ant-design/ant-design-mini/compare/1.0.0...1.0.1)\n\n> 7 February 2023\n\n- fix(swiperAction): 删除alipay-style依赖,修复swiperAction样式引入问题 [`#556`](https://github.com/ant-design/ant-design-mini/pull/556)\n- fix(form): 删除form在0.x下导致千牛端报错的无用代码 [`#555`](https://github.com/ant-design/ant-design-mini/pull/555)\n- chore: build [`#554`](https://github.com/ant-design/ant-design-mini/pull/554)\n- chore: build [`#553`](https://github.com/ant-design/ant-design-mini/pull/553)\n- feat: 修改Modal demo [`#552`](https://github.com/ant-design/ant-design-mini/pull/552)\n- feat: 更新openbox版本&升级demo功能 [`#542`](https://github.com/ant-design/ant-design-mini/pull/542)\n- chore: 删除无用代码 [`#551`](https://github.com/ant-design/ant-design-mini/pull/551)\n\n### [1.0.0](https://github.com/ant-design/ant-design-mini/compare/1.0.0-beta.8...1.0.0)\n\n> 3 February 2023\n\n- docs: 修改文档 [`#549`](https://github.com/ant-design/ant-design-mini/pull/549)\n- docs: 修改使用文档 [`#548`](https://github.com/ant-design/ant-design-mini/pull/548)\n- ci: test [`#526`](https://github.com/ant-design/ant-design-mini/pull/526)\n- docs: 修改文档 [`#546`](https://github.com/ant-design/ant-design-mini/pull/546)\n\n#### [1.0.0-beta.8](https://github.com/ant-design/ant-design-mini/compare/1.0.0-beta.7...1.0.0-beta.8)\n\n> 2 February 2023\n\n- chore: build [`#543`](https://github.com/ant-design/ant-design-mini/pull/543)\n- Feat/swipe width [`#538`](https://github.com/ant-design/ant-design-mini/pull/538)\n-  indicatorClass 统一命名为 indicatorClassName&修改Picker、DatePicker文档 [`#541`](https://github.com/ant-design/ant-design-mini/pull/541)\n- docs(noticeBar): 文档透出extra插槽 [`#540`](https://github.com/ant-design/ant-design-mini/pull/540)\n- feat(picker): picker indicatorClass 统一命名为 indicatorClassName [`#539`](https://github.com/ant-design/ant-design-mini/pull/539)\n- docs(input): 文档透出type属性 [`#537`](https://github.com/ant-design/ant-design-mini/pull/537)\n- chore(imageUpload): 调整 ImageUpload 文档 [`#535`](https://github.com/ant-design/ant-design-mini/pull/535)\n- feat: 修改swipe组件的示例表达 [`#534`](https://github.com/ant-design/ant-design-mini/pull/534)\n- chore: build [`#532`](https://github.com/ant-design/ant-design-mini/pull/532)\n\n#### [1.0.0-beta.7](https://github.com/ant-design/ant-design-mini/compare/1.0.0-beta.6...1.0.0-beta.7)\n\n> 17 January 2023\n\n- fix: docs [`#530`](https://github.com/ant-design/ant-design-mini/pull/530)\n- fix: radio [`#529`](https://github.com/ant-design/ant-design-mini/pull/529)\n- fix: checkbox [`#528`](https://github.com/ant-design/ant-design-mini/pull/528)\n- fix(docs): fix icon docs - clear invalid [`#525`](https://github.com/ant-design/ant-design-mini/pull/525)\n- fix: docs [`#524`](https://github.com/ant-design/ant-design-mini/pull/524)\n- feat: 修改Tabbar文档 [`#523`](https://github.com/ant-design/ant-design-mini/pull/523)\n- fix: popover [`#522`](https://github.com/ant-design/ant-design-mini/pull/522)\n\n#### [1.0.0-beta.6](https://github.com/ant-design/ant-design-mini/compare/1.0.0-beta.5...1.0.0-beta.6)\n\n> 15 January 2023\n\n- fix: popover [`#519`](https://github.com/ant-design/ant-design-mini/pull/519)\n- fix: input [`#520`](https://github.com/ant-design/ant-design-mini/pull/520)\n\n#### [1.0.0-beta.5](https://github.com/ant-design/ant-design-mini/compare/1.0.0-beta.4...1.0.0-beta.5)\n\n> 13 January 2023\n\n- fix: fix CascaderPicker dynamic options [`#517`](https://github.com/ant-design/ant-design-mini/pull/517)\n- fix: form [`#516`](https://github.com/ant-design/ant-design-mini/pull/516)\n- feat: 添加数字键盘的md属性说明 [`#514`](https://github.com/ant-design/ant-design-mini/pull/514)\n\n#### [1.0.0-beta.4](https://github.com/ant-design/ant-design-mini/compare/1.0.0-beta.3...1.0.0-beta.4)\n\n> 10 January 2023\n\n- fix: tabs [`#512`](https://github.com/ant-design/ant-design-mini/pull/512)\n- fix: build [`#511`](https://github.com/ant-design/ant-design-mini/pull/511)\n- fix: button [`#510`](https://github.com/ant-design/ant-design-mini/pull/510)\n- Feat/number keyboard [`#504`](https://github.com/ant-design/ant-design-mini/pull/504)\n- feat: add SelectorFilter demo [`#509`](https://github.com/ant-design/ant-design-mini/pull/509)\n- feat: 修改Checkbox、Radio icon样式优先级 [`#505`](https://github.com/ant-design/ant-design-mini/pull/505)\n- feat: 去除indexbar中示例2的滚动条 [`#503`](https://github.com/ant-design/ant-design-mini/pull/503)\n\n#### [1.0.0-beta.3](https://github.com/ant-design/ant-design-mini/compare/1.0.0-beta.2...1.0.0-beta.3)\n\n> 6 January 2023\n\n- feat: 修改Selector文档 [`#501`](https://github.com/ant-design/ant-design-mini/pull/501)\n- fix: fix Picker style [`#499`](https://github.com/ant-design/ant-design-mini/pull/499)\n\n#### [1.0.0-beta.2](https://github.com/ant-design/ant-design-mini/compare/1.0.0-beta.1...1.0.0-beta.2)\n\n> 6 January 2023\n\n- fix: fix FormCheckboxGroup、FormRadioGroup label slot [`#497`](https://github.com/ant-design/ant-design-mini/pull/497)\n\n#### [1.0.0-beta.1](https://github.com/ant-design/ant-design-mini/compare/1.0.0-beta.0...1.0.0-beta.1)\n\n> 5 January 2023\n\n- feat: add destroyOnClose [`#495`](https://github.com/ant-design/ant-design-mini/pull/495)\n- feat: update docs [`#491`](https://github.com/ant-design/ant-design-mini/pull/491)\n\n#### [1.0.0-beta.0](https://github.com/ant-design/ant-design-mini/compare/1.0.0-alpha.13...1.0.0-beta.0)\n\n> 4 January 2023\n\n- fix: catchTap [`#489`](https://github.com/ant-design/ant-design-mini/pull/489)\n\n#### [1.0.0-alpha.13](https://github.com/ant-design/ant-design-mini/compare/1.0.0-alpha.12...1.0.0-alpha.13)\n\n> 4 January 2023\n\n- fix: docs [`#487`](https://github.com/ant-design/ant-design-mini/pull/487)\n- feat: loading组件兼容dsl转微信小程序 [`#462`](https://github.com/ant-design/ant-design-mini/pull/462)\n- fix: form [`#486`](https://github.com/ant-design/ant-design-mini/pull/486)\n- fix: fix Tabs scrollLeft [`#482`](https://github.com/ant-design/ant-design-mini/pull/482)\n- Feat/swipe action md [`#473`](https://github.com/ant-design/ant-design-mini/pull/473)\n- 1.0 wyj [`#467`](https://github.com/ant-design/ant-design-mini/pull/467)\n\n#### [1.0.0-alpha.12](https://github.com/ant-design/ant-design-mini/compare/1.0.0-alpha.11...1.0.0-alpha.12)\n\n> 26 December 2022\n\n- feat: 官网导航添加国内镜像&版本切换 [`#479`](https://github.com/ant-design/ant-design-mini/pull/479)\n- Feat/indexbar width [`#474`](https://github.com/ant-design/ant-design-mini/pull/474)\n- fix: fix Picker、DatePicker not sync error [`#477`](https://github.com/ant-design/ant-design-mini/pull/477)\n\n#### [1.0.0-alpha.11](https://github.com/ant-design/ant-design-mini/compare/1.0.0-alpha.10...1.0.0-alpha.11)\n\n> 23 December 2022\n\n- feat: 增加swipe action 在2.0中使用说明 [`#471`](https://github.com/ant-design/ant-design-mini/pull/471)\n- feat: 增加indexBar的可触摸宽度 [`#470`](https://github.com/ant-design/ant-design-mini/pull/470)\n- fix: value [`#469`](https://github.com/ant-design/ant-design-mini/pull/469)\n- feat: add form custom [`#466`](https://github.com/ant-design/ant-design-mini/pull/466)\n\n#### [1.0.0-alpha.10](https://github.com/ant-design/ant-design-mini/compare/1.0.0-alpha.9...1.0.0-alpha.10)\n\n> 22 December 2022\n\n- fix: form [`#464`](https://github.com/ant-design/ant-design-mini/pull/464)\n\n#### [1.0.0-alpha.9](https://github.com/ant-design/ant-design-mini/compare/1.0.0-alpha.8...1.0.0-alpha.9)\n\n> 22 December 2022\n\n- Fix/popup [`#461`](https://github.com/ant-design/ant-design-mini/pull/461)\n\n#### [1.0.0-alpha.8](https://github.com/ant-design/ant-design-mini/compare/1.0.0-alpha.6...1.0.0-alpha.8)\n\n> 22 December 2022\n\n- fix: input [`#459`](https://github.com/ant-design/ant-design-mini/pull/459)\n- Fix/input [`#458`](https://github.com/ant-design/ant-design-mini/pull/458)\n- chore: build [`#457`](https://github.com/ant-design/ant-design-mini/pull/457)\n- 1.0 wyj [`#454`](https://github.com/ant-design/ant-design-mini/pull/454)\n- 1.0 wyj [`#452`](https://github.com/ant-design/ant-design-mini/pull/452)\n\n#### [1.0.0-alpha.6](https://github.com/ant-design/ant-design-mini/compare/1.0.0-alpha.5...1.0.0-alpha.6)\n\n> 17 December 2022\n\n- Fix/style [`#450`](https://github.com/ant-design/ant-design-mini/pull/450)\n- fix: empty [`#449`](https://github.com/ant-design/ant-design-mini/pull/449)\n\n#### [1.0.0-alpha.5](https://github.com/ant-design/ant-design-mini/compare/1.0.0-alpha.4...1.0.0-alpha.5)\n\n> 17 December 2022\n\n- Feat/indexbar filename [`#447`](https://github.com/ant-design/ant-design-mini/pull/447)\n- Feat/swipe actipn case [`#446`](https://github.com/ant-design/ant-design-mini/pull/446)\n- Feat/index bar [`#445`](https://github.com/ant-design/ant-design-mini/pull/445)\n\n#### [1.0.0-alpha.4](https://github.com/ant-design/ant-design-mini/compare/1.0.0-alpha.3...1.0.0-alpha.4)\n\n> 16 December 2022\n\n- Fix/style [`#443`](https://github.com/ant-design/ant-design-mini/pull/443)\n- chore: build [`#442`](https://github.com/ant-design/ant-design-mini/pull/442)\n\n#### [1.0.0-alpha.3](https://github.com/ant-design/ant-design-mini/compare/1.0.0-alpha.2...1.0.0-alpha.3)\n\n> 15 December 2022\n\n- Fix/style [`#437`](https://github.com/ant-design/ant-design-mini/pull/437)\n- 1.0 wyj [`#439`](https://github.com/ant-design/ant-design-mini/pull/439)\n- fix: rate [`#436`](https://github.com/ant-design/ant-design-mini/pull/436)\n- 1.0 wyj [`#435`](https://github.com/ant-design/ant-design-mini/pull/435)\n- fix: ImageUpload [`#433`](https://github.com/ant-design/ant-design-mini/pull/433)\n- Feat/indexbar [`#432`](https://github.com/ant-design/ant-design-mini/pull/432)\n\n#### [1.0.0-alpha.2](https://github.com/ant-design/ant-design-mini/compare/1.0.0-alpha.1...1.0.0-alpha.2)\n\n> 13 December 2022\n\n- fix: fix GuideTour button [`#430`](https://github.com/ant-design/ant-design-mini/pull/430)\n- fix: prefix [`#429`](https://github.com/ant-design/ant-design-mini/pull/429)\n- fix: tabs [`#428`](https://github.com/ant-design/ant-design-mini/pull/428)\n- Fix/input [`#427`](https://github.com/ant-design/ant-design-mini/pull/427)\n- 1.0 wyj new [`#426`](https://github.com/ant-design/ant-design-mini/pull/426)\n\n#### [1.0.0-alpha.1](https://github.com/ant-design/ant-design-mini/compare/1.0.0-alpha.0...1.0.0-alpha.1)\n\n> 9 December 2022\n\n- fix: build [`#423`](https://github.com/ant-design/ant-design-mini/pull/423)\n- Fix/style [`#421`](https://github.com/ant-design/ant-design-mini/pull/421)\n- 1.0 wyj new2 [`#422`](https://github.com/ant-design/ant-design-mini/pull/422)\n\n#### [1.0.0-alpha.0](https://github.com/ant-design/ant-design-mini/compare/0.0.27...1.0.0-alpha.0)\n\n> 8 December 2022\n\n- feat: swipe-action兼容appx1.0版本 [`#418`](https://github.com/ant-design/ant-design-mini/pull/418)\n- Fix/form [`#416`](https://github.com/ant-design/ant-design-mini/pull/416)\n- 1.0 wyj new1 [`#415`](https://github.com/ant-design/ant-design-mini/pull/415)\n- feat: adjust Popup props [`#414`](https://github.com/ant-design/ant-design-mini/pull/414)\n- 1.0 wyj new1 [`#412`](https://github.com/ant-design/ant-design-mini/pull/412)\n- fix: button [`#413`](https://github.com/ant-design/ant-design-mini/pull/413)\n- fix: mixin value [`#411`](https://github.com/ant-design/ant-design-mini/pull/411)\n- fix: checkbox radiobox [`#410`](https://github.com/ant-design/ant-design-mini/pull/410)\n- fix: skeleton [`#409`](https://github.com/ant-design/ant-design-mini/pull/409)\n- fix: container [`#408`](https://github.com/ant-design/ant-design-mini/pull/408)\n- fix: loading [`#407`](https://github.com/ant-design/ant-design-mini/pull/407)\n- fix: avatar [`#406`](https://github.com/ant-design/ant-design-mini/pull/406)\n- fix: button [`#405`](https://github.com/ant-design/ant-design-mini/pull/405)\n- fix: input [`#402`](https://github.com/ant-design/ant-design-mini/pull/402)\n- fix: collapse [`#404`](https://github.com/ant-design/ant-design-mini/pull/404)\n- fix: input [`#401`](https://github.com/ant-design/ant-design-mini/pull/401)\n- fix: tabs [`#400`](https://github.com/ant-design/ant-design-mini/pull/400)\n- feat: Popover 1.0 & ImageIcon [`#399`](https://github.com/ant-design/ant-design-mini/pull/399)\n- feat: form-slider [`#398`](https://github.com/ant-design/ant-design-mini/pull/398)\n- fix: slider [`#397`](https://github.com/ant-design/ant-design-mini/pull/397)\n- 1.0 new [`#395`](https://github.com/ant-design/ant-design-mini/pull/395)\n- feat: review swipe action [`#394`](https://github.com/ant-design/ant-design-mini/pull/394)\n- Fix/badge [`#393`](https://github.com/ant-design/ant-design-mini/pull/393)\n- feat: 移除废弃组件 [`#390`](https://github.com/ant-design/ant-design-mini/pull/390)\n- fix: fix value [`#389`](https://github.com/ant-design/ant-design-mini/pull/389)\n- fix: input onChange [`#387`](https://github.com/ant-design/ant-design-mini/pull/387)\n- Fix/button [`#386`](https://github.com/ant-design/ant-design-mini/pull/386)\n- fix: button [`#384`](https://github.com/ant-design/ant-design-mini/pull/384)\n- feat: Grid 1.0 [`#385`](https://github.com/ant-design/ant-design-mini/pull/385)\n- feat: Modal props [`#381`](https://github.com/ant-design/ant-design-mini/pull/381)\n- feat: GuideTour、Tabbar、Picker、DatePicker、Selector、Checkbox controlled [`#379`](https://github.com/ant-design/ant-design-mini/pull/379)\n- feat: checklist controlled [`#378`](https://github.com/ant-design/ant-design-mini/pull/378)\n- Fix/form [`#377`](https://github.com/ant-design/ant-design-mini/pull/377)\n- Refactor/blade view [`#375`](https://github.com/ant-design/ant-design-mini/pull/375)\n- feat: refactor divider [`#374`](https://github.com/ant-design/ant-design-mini/pull/374)\n- fix: form [`#369`](https://github.com/ant-design/ant-design-mini/pull/369)\n- fix: loading [`#368`](https://github.com/ant-design/ant-design-mini/pull/368)\n- 1.0 wyj [`#367`](https://github.com/ant-design/ant-design-mini/pull/367)\n- fix: loading [`#365`](https://github.com/ant-design/ant-design-mini/pull/365)\n- 1.0 wyj [`#363`](https://github.com/ant-design/ant-design-mini/pull/363)\n- chore: build [`#364`](https://github.com/ant-design/ant-design-mini/pull/364)\n- feat: add surge [`#362`](https://github.com/ant-design/ant-design-mini/pull/362)\n- chore: build [`#361`](https://github.com/ant-design/ant-design-mini/pull/361)\n- feat(empty): refactor empty [`#359`](https://github.com/ant-design/ant-design-mini/pull/359)\n- 1.0 wyj [`#360`](https://github.com/ant-design/ant-design-mini/pull/360)\n- feat: Picker、DatePicker、RangePicker、CascaderPicker defaultValue&Form [`#357`](https://github.com/ant-design/ant-design-mini/pull/357)\n- fix: tabs [`#358`](https://github.com/ant-design/ant-design-mini/pull/358)\n- chore: build [`#356`](https://github.com/ant-design/ant-design-mini/pull/356)\n- Fix/input [`#355`](https://github.com/ant-design/ant-design-mini/pull/355)\n- Refactor/loading [`#353`](https://github.com/ant-design/ant-design-mini/pull/353)\n- feat(loading): refactor loading [`#351`](https://github.com/ant-design/ant-design-mini/pull/351)\n- feat: update demo style [`#352`](https://github.com/ant-design/ant-design-mini/pull/352)\n- feat(toast): refactor toast [`#350`](https://github.com/ant-design/ant-design-mini/pull/350)\n- fix: form [`#338`](https://github.com/ant-design/ant-design-mini/pull/338)\n- Fix/default current [`#341`](https://github.com/ant-design/ant-design-mini/pull/341)\n- feat(skeleton): resolve conflict [`#348`](https://github.com/ant-design/ant-design-mini/pull/348)\n- feat(skeleton): refactor skeleton [`#342`](https://github.com/ant-design/ant-design-mini/pull/342)\n- feat: update progress、tag、demo [`#347`](https://github.com/ant-design/ant-design-mini/pull/347)\n- feat(result): refactor result [`#340`](https://github.com/ant-design/ant-design-mini/pull/340)\n- Fix/steps [`#329`](https://github.com/ant-design/ant-design-mini/pull/329)\n- feat(selector): refactor selector [`#336`](https://github.com/ant-design/ant-design-mini/pull/336)\n- feat: 修改路由配置json [`#330`](https://github.com/ant-design/ant-design-mini/pull/330)\n- Fix/collapse [`#324`](https://github.com/ant-design/ant-design-mini/pull/324)\n- Feat/swipe action px [`#326`](https://github.com/ant-design/ant-design-mini/pull/326)\n- Fix/tabs [`#316`](https://github.com/ant-design/ant-design-mini/pull/316)\n- feat: refactor stepper [`#323`](https://github.com/ant-design/ant-design-mini/pull/323)\n- Feat/swipw action dark [`#319`](https://github.com/ant-design/ant-design-mini/pull/319)\n- fix: rename css variable [`#322`](https://github.com/ant-design/ant-design-mini/pull/322)\n- feat: Checkbox、Radio、CheckboxGroup dark style [`#320`](https://github.com/ant-design/ant-design-mini/pull/320)\n- feat(slider): refactor slider components, include style props [`#321`](https://github.com/ant-design/ant-design-mini/pull/321)\n- feat: Tabbar、VTabs、Tabs、Checklist、Input、ImageUpload dark style [`#314`](https://github.com/ant-design/ant-design-mini/pull/314)\n- fix: Container style [`#312`](https://github.com/ant-design/ant-design-mini/pull/312)\n- feat: refactor videoUpload [`#311`](https://github.com/ant-design/ant-design-mini/pull/311)\n- [WIP] Fix/props [`#309`](https://github.com/ant-design/ant-design-mini/pull/309)\n- Next calendar [`#300`](https://github.com/ant-design/ant-design-mini/pull/300)\n- feat: Grid style [`#301`](https://github.com/ant-design/ant-design-mini/pull/301)\n- feat: NoticeBar style [`#296`](https://github.com/ant-design/ant-design-mini/pull/296)\n- feat: adjust 1.0props [`#293`](https://github.com/ant-design/ant-design-mini/pull/293)\n- Feat/swipe action new [`#287`](https://github.com/ant-design/ant-design-mini/pull/287)\n- feat: style [`#279`](https://github.com/ant-design/ant-design-mini/pull/279)\n- 1.0 sxs [`#286`](https://github.com/ant-design/ant-design-mini/pull/286)\n\n#### [0.0.27](https://github.com/ant-design/ant-design-mini/compare/0.0.26...0.0.27)\n\n> 17 June 2024\n\n- fix: 适配 Native 渲染模式下 0.x 版本示例 [`d571023`](https://github.com/ant-design/ant-design-mini/commit/d571023ed5711579971ee4afbc6564fb58db3bb3)\n- chore(native) [`05e92fd`](https://github.com/ant-design/ant-design-mini/commit/05e92fd86a235a69d5ed6518beb306e81f9e08ce)\n- feat: 修改需要发版的版本号 [`33bfcbc`](https://github.com/ant-design/ant-design-mini/commit/33bfcbc65bb4e74eecc605f7f424a56b07dbe622)\n\n#### [0.0.26](https://github.com/ant-design/ant-design-mini/compare/0.0.25...0.0.26)\n\n> 15 December 2022\n\n- fix: 解决tab item可能为空问题 [`#438`](https://github.com/ant-design/ant-design-mini/pull/438)\n\n#### [0.0.25](https://github.com/ant-design/ant-design-mini/compare/0.0.24...0.0.25)\n\n> 17 November 2022\n\n- fix: deps [`#345`](https://github.com/ant-design/ant-design-mini/pull/345)\n\n#### [0.0.24](https://github.com/ant-design/ant-design-mini/compare/0.0.23...0.0.24)\n\n> 17 November 2022\n\n- fix: deps [`#343`](https://github.com/ant-design/ant-design-mini/pull/343)\n\n#### [0.0.23](https://github.com/ant-design/ant-design-mini/compare/0.0.22...0.0.23)\n\n> 15 November 2022\n\n- Feat/dynamic picker column [`#335`](https://github.com/ant-design/ant-design-mini/pull/335)\n- fix: 修复 TabBar 在自定义图片模式下取值的问题 [`#328`](https://github.com/ant-design/ant-design-mini/pull/328)\n- Rate组件参数调整 [`#318`](https://github.com/ant-design/ant-design-mini/pull/318)\n- fix: 修复mask滚动穿透 [`#284`](https://github.com/ant-design/ant-design-mini/pull/284)\n- fix(collapse): fix lose controlled [`#283`](https://github.com/ant-design/ant-design-mini/pull/283)\n- feat(grid): support onFirstAppear method [`#291`](https://github.com/ant-design/ant-design-mini/pull/291)\n- fix(inputItem): remove repeat import [`#271`](https://github.com/ant-design/ant-design-mini/pull/271)\n- Fix/home page [`#282`](https://github.com/ant-design/ant-design-mini/pull/282)\n- feat: support badge [`#262`](https://github.com/ant-design/ant-design-mini/pull/262)\n- Feat/home page [`#243`](https://github.com/ant-design/ant-design-mini/pull/243)\n- chore(docs): 调整stepper type说明文档 [`#275`](https://github.com/ant-design/ant-design-mini/pull/275)\n- chore(docs): 修复错误文档 [`#264`](https://github.com/ant-design/ant-design-mini/pull/264)\n- style: 定位重复 [`#263`](https://github.com/ant-design/ant-design-mini/pull/263)\n\n#### [0.0.22](https://github.com/ant-design/ant-design-mini/compare/0.0.22-beta.1...0.0.22)\n\n> 7 September 2022\n\n#### [0.0.22-beta.1](https://github.com/ant-design/ant-design-mini/compare/0.0.22-beta.0...0.0.22-beta.1)\n\n> 31 October 2022\n\n- Rate组件参数调整 [`#318`](https://github.com/ant-design/ant-design-mini/pull/318)\n- fix: 修复mask滚动穿透 [`#284`](https://github.com/ant-design/ant-design-mini/pull/284)\n- fix(collapse): fix lose controlled [`#283`](https://github.com/ant-design/ant-design-mini/pull/283)\n- feat(grid): support onFirstAppear method [`#291`](https://github.com/ant-design/ant-design-mini/pull/291)\n- fix(inputItem): remove repeat import [`#271`](https://github.com/ant-design/ant-design-mini/pull/271)\n- Fix/home page [`#282`](https://github.com/ant-design/ant-design-mini/pull/282)\n- feat: support badge [`#262`](https://github.com/ant-design/ant-design-mini/pull/262)\n- Feat/home page [`#243`](https://github.com/ant-design/ant-design-mini/pull/243)\n- chore(docs): 调整stepper type说明文档 [`#275`](https://github.com/ant-design/ant-design-mini/pull/275)\n- chore(docs): 修复错误文档 [`#264`](https://github.com/ant-design/ant-design-mini/pull/264)\n- style: 定位重复 [`#263`](https://github.com/ant-design/ant-design-mini/pull/263)\n\n#### [0.0.22-beta.0](https://github.com/ant-design/ant-design-mini/compare/0.0.21...0.0.22-beta.0)\n\n> 6 September 2022\n\n- feat(Rate): new Component [`#155`](https://github.com/ant-design/ant-design-mini/pull/155)\n- feat: Picker、DatePicker add maskClosable [`#249`](https://github.com/ant-design/ant-design-mini/pull/249)\n- Feat/tabs elevator [`#231`](https://github.com/ant-design/ant-design-mini/pull/231)\n- Feat/guide tour un controlled [`#245`](https://github.com/ant-design/ant-design-mini/pull/245)\n- fix(imageUpload): fix onBeforeUpload [`#258`](https://github.com/ant-design/ant-design-mini/pull/258)\n- fix(imageUpload): fix onBeforeUpload [`#257`](https://github.com/ant-design/ant-design-mini/pull/257)\n- fix(imageUpload): fix onBeforeUpload [`#256`](https://github.com/ant-design/ant-design-mini/pull/256)\n- feat: Compatible dingding appx1.x that chooseImage return different value [`#253`](https://github.com/ant-design/ant-design-mini/pull/253)\n- feat: compatibility value is string in uploader [`#252`](https://github.com/ant-design/ant-design-mini/pull/252)\n- feat(Popup): add  autoHeight props [`#247`](https://github.com/ant-design/ant-design-mini/pull/247)\n- feat(ProgressCircle): new Component [`#154`](https://github.com/ant-design/ant-design-mini/pull/154)\n- feat(GuideTour): new component  [`#220`](https://github.com/ant-design/ant-design-mini/pull/220)\n\n#### [0.0.21](https://github.com/ant-design/ant-design-mini/compare/0.0.21-beta.2...0.0.21)\n\n> 22 August 2022\n\n#### [0.0.21-beta.2](https://github.com/ant-design/ant-design-mini/compare/0.0.21-beta.1...0.0.21-beta.2)\n\n> 1 September 2022\n\n- fix(imageUpload): fix onBeforeUpload [`b771147`](https://github.com/ant-design/ant-design-mini/commit/b771147da99f824ad529e3bc23bbc10bf087db48)\n\n#### [0.0.21-beta.1](https://github.com/ant-design/ant-design-mini/compare/0.0.21-beta.0...0.0.21-beta.1)\n\n> 30 August 2022\n\n- feat(Popup): add  autoHeight props [`#247`](https://github.com/ant-design/ant-design-mini/pull/247)\n- feat(ProgressCircle): new Component [`#154`](https://github.com/ant-design/ant-design-mini/pull/154)\n- feat(GuideTour): new component  [`#220`](https://github.com/ant-design/ant-design-mini/pull/220)\n- feat(Tabs): delete useless style [`#229`](https://github.com/ant-design/ant-design-mini/pull/229)\n- feat(datePicker): adjust minutes and seconds range [`#239`](https://github.com/ant-design/ant-design-mini/pull/239)\n- feat: Compatible dingding appx1.x that chooseImage return different value [`72333f2`](https://github.com/ant-design/ant-design-mini/commit/72333f2be3f76333481e53688a2d7afd01f7aec4)\n\n#### [0.0.21-beta.0](https://github.com/ant-design/ant-design-mini/compare/0.0.20...0.0.21-beta.0)\n\n> 21 August 2022\n\n- Feat/slider new [`#237`](https://github.com/ant-design/ant-design-mini/pull/237)\n- Feat/slider new [`#233`](https://github.com/ant-design/ant-design-mini/pull/233)\n- docs(tabs): new stickyTop props in md [`#230`](https://github.com/ant-design/ant-design-mini/pull/230)\n- Feat/slider new [`#144`](https://github.com/ant-design/ant-design-mini/pull/144)\n- fix(NoticeBar): fix marquee on pageHide [`#225`](https://github.com/ant-design/ant-design-mini/pull/225)\n- feat(Tabs): add event param to `onChange` [`#228`](https://github.com/ant-design/ant-design-mini/pull/228)\n- feat(config): open dumi sitemap and ssr to implement docsearch [`#224`](https://github.com/ant-design/ant-design-mini/pull/224)\n- feat(Popup): add close animation [`#223`](https://github.com/ant-design/ant-design-mini/pull/223)\n- feat(Tabs): support badge [`#203`](https://github.com/ant-design/ant-design-mini/pull/203)\n- Feat/mask disable scroll [`#207`](https://github.com/ant-design/ant-design-mini/pull/207)\n- feat(imageUpload): support different value type [`#218`](https://github.com/ant-design/ant-design-mini/pull/218)\n- feat(videoUpload): support different value type [`#219`](https://github.com/ant-design/ant-design-mini/pull/219)\n- fix(inputItem): fix input care color [`#217`](https://github.com/ant-design/ant-design-mini/pull/217)\n\n#### [0.0.20](https://github.com/ant-design/ant-design-mini/compare/0.0.20-beta.1...0.0.20)\n\n> 2 August 2022\n\n- docs: adjust Picker readme [`#215`](https://github.com/ant-design/ant-design-mini/pull/215)\n- feat(BladeView): remove useless refer and format style [`#211`](https://github.com/ant-design/ant-design-mini/pull/211)\n- fix(bladeView): fix sticky style and value name [`#214`](https://github.com/ant-design/ant-design-mini/pull/214)\n- Feat/picker [`#208`](https://github.com/ant-design/ant-design-mini/pull/208)\n- feat(Switch): modify handleIcon box-shadow [`#213`](https://github.com/ant-design/ant-design-mini/pull/213)\n- Feat/blade view [`#133`](https://github.com/ant-design/ant-design-mini/pull/133)\n- Feat/tabbar [`#209`](https://github.com/ant-design/ant-design-mini/pull/209)\n- feat(Tabbar): new component [`#151`](https://github.com/ant-design/ant-design-mini/pull/151)\n- feat(ProgressBar): new Component [`#140`](https://github.com/ant-design/ant-design-mini/pull/140)\n- Feat/demo [`#205`](https://github.com/ant-design/ant-design-mini/pull/205)\n- Feat/event data [`#202`](https://github.com/ant-design/ant-design-mini/pull/202)\n- Add event to input component‘event [`#196`](https://github.com/ant-design/ant-design-mini/pull/196)\n\n#### [0.0.20-beta.1](https://github.com/ant-design/ant-design-mini/compare/0.0.20-beta.0...0.0.20-beta.1)\n\n> 26 July 2022\n\n#### [0.0.20-beta.0](https://github.com/ant-design/ant-design-mini/compare/0.0.20-alpha.1...0.0.20-beta.0)\n\n> 26 July 2022\n\n- feat(Picker): refine demo [`ebc40ba`](https://github.com/ant-design/ant-design-mini/commit/ebc40ba6b803ca86323cdd02e295e865c3b78957)\n- feat(RangePicker): adaptive to Picker [`02d05b8`](https://github.com/ant-design/ant-design-mini/commit/02d05b847b51897fd080c231a82fd95001413bbf)\n- feat(Picker): add multi-select pikcer [`ef533fb`](https://github.com/ant-design/ant-design-mini/commit/ef533fb78009997628c14942d3241c79f619c96c)\n\n#### [0.0.20-alpha.1](https://github.com/ant-design/ant-design-mini/compare/0.0.20-alpha.0...0.0.20-alpha.1)\n\n> 2 August 2022\n\n- docs: adjust Picker readme [`#215`](https://github.com/ant-design/ant-design-mini/pull/215)\n- feat(BladeView): remove useless refer and format style [`#211`](https://github.com/ant-design/ant-design-mini/pull/211)\n- fix(bladeView): fix sticky style and value name [`#214`](https://github.com/ant-design/ant-design-mini/pull/214)\n\n#### [0.0.20-alpha.0](https://github.com/ant-design/ant-design-mini/compare/0.0.19...0.0.20-alpha.0)\n\n> 2 August 2022\n\n- Feat/picker [`#208`](https://github.com/ant-design/ant-design-mini/pull/208)\n- feat(Switch): modify handleIcon box-shadow [`#213`](https://github.com/ant-design/ant-design-mini/pull/213)\n- Feat/blade view [`#133`](https://github.com/ant-design/ant-design-mini/pull/133)\n- Feat/tabbar [`#209`](https://github.com/ant-design/ant-design-mini/pull/209)\n- feat(Tabbar): new component [`#151`](https://github.com/ant-design/ant-design-mini/pull/151)\n- feat(ProgressBar): new Component [`#140`](https://github.com/ant-design/ant-design-mini/pull/140)\n- Feat/demo [`#205`](https://github.com/ant-design/ant-design-mini/pull/205)\n- Feat/event data [`#202`](https://github.com/ant-design/ant-design-mini/pull/202)\n- Add event to input component‘event [`#196`](https://github.com/ant-design/ant-design-mini/pull/196)\n- Chore/docs [`#204`](https://github.com/ant-design/ant-design-mini/pull/204)\n- ci: update release workflow [`#200`](https://github.com/ant-design/ant-design-mini/pull/200)\n- chore(docs): merge master [`8be877b`](https://github.com/ant-design/ant-design-mini/commit/8be877b817a82bcdb81749f0f885f84e58614f64)\n- chore(docs): modify divider, footer, skeleton markdowwn [`532f642`](https://github.com/ant-design/ant-design-mini/commit/532f6423fb78a4602097eb7244cc3a86e3215c58)\n\n#### [0.0.19](https://github.com/ant-design/ant-design-mini/compare/0.0.19-beta.6...0.0.19)\n\n> 19 July 2022\n\n#### [0.0.19-beta.6](https://github.com/ant-design/ant-design-mini/compare/0.0.19-beta.5...0.0.19-beta.6)\n\n> 19 July 2022\n\n- feat(Switch): switch onChange support event [`#198`](https://github.com/ant-design/ant-design-mini/pull/198)\n- Feat/checkbox slot [`#197`](https://github.com/ant-design/ant-design-mini/pull/197)\n\n#### [0.0.19-beta.5](https://github.com/ant-design/ant-design-mini/compare/0.0.19-beta.4...0.0.19-beta.5)\n\n> 19 July 2022\n\n- feat(Checkbox): fix CheckboxGroup style [`#195`](https://github.com/ant-design/ant-design-mini/pull/195)\n\n#### [0.0.19-beta.4](https://github.com/ant-design/ant-design-mini/compare/0.0.19-beta.3...0.0.19-beta.4)\n\n> 18 July 2022\n\n- Feat/empty adjust [`#194`](https://github.com/ant-design/ant-design-mini/pull/194)\n- Feat/checkbox slot [`#193`](https://github.com/ant-design/ant-design-mini/pull/193)\n- feat(Checkbox): support slot [`#192`](https://github.com/ant-design/ant-design-mini/pull/192)\n- fix(Badge): fix position prop [`#191`](https://github.com/ant-design/ant-design-mini/pull/191)\n- feat(vTabs): add demo for switching content by tab click [`#189`](https://github.com/ant-design/ant-design-mini/pull/189)\n- feat(footer): new component [`#159`](https://github.com/ant-design/ant-design-mini/pull/159)\n- feat(divider): new component [`#161`](https://github.com/ant-design/ant-design-mini/pull/161)\n- feat(Grid): new Component [`#181`](https://github.com/ant-design/ant-design-mini/pull/181)\n- feat(Skeleton): new Component [`#182`](https://github.com/ant-design/ant-design-mini/pull/182)\n- Feat/checkbox [`#184`](https://github.com/ant-design/ant-design-mini/pull/184)\n- ci: update release workflow [`#185`](https://github.com/ant-design/ant-design-mini/pull/185)\n- feat(Selector): add maxSelectedCount、minSelectedCount  prop [`#162`](https://github.com/ant-design/ant-design-mini/pull/162)\n\n#### [0.0.19-beta.3](https://github.com/ant-design/ant-design-mini/compare/0.0.19-beta.1...0.0.19-beta.3)\n\n> 11 July 2022\n\n- feat: adjust doc style [`#183`](https://github.com/ant-design/ant-design-mini/pull/183)\n- Feat/docs: openbox [`#180`](https://github.com/ant-design/ant-design-mini/pull/180)\n- ci: fix release candidate workflow [`762ad05`](https://github.com/ant-design/ant-design-mini/commit/762ad05d1548ed7fbc8c4971ef9c0930808cad6c)\n- ci: update release [`90c7323`](https://github.com/ant-design/ant-design-mini/commit/90c73237af69618985f4f0816cb4e097c8531b7e)\n- feat(ListItem): delete unnecessary logic [`42e9a50`](https://github.com/ant-design/ant-design-mini/commit/42e9a50aad93916f1baf137809e1169fa770d95d)\n\n#### [0.0.19-beta.1](https://github.com/ant-design/ant-design-mini/compare/0.0.18...0.0.19-beta.1)\n\n> 30 June 2022\n\n- ci: fix publish step [`#167`](https://github.com/ant-design/ant-design-mini/pull/167)\n- ci: update release [`0db32b2`](https://github.com/ant-design/ant-design-mini/commit/0db32b20c2e9d1200b0f6f45f6cd8cc2da4bff89)\n- ci: update release [`c7ff1b0`](https://github.com/ant-design/ant-design-mini/commit/c7ff1b0709a13a0f984f5aacbd162cbd4b077538)\n- ci: update release [`f514df1`](https://github.com/ant-design/ant-design-mini/commit/f514df1f42fe48873efb5537f864f1672a5529dc)\n\n#### [0.0.18](https://github.com/ant-design/ant-design-mini/compare/0.0.17...0.0.18)\n\n> 29 June 2022\n\n- feat(imageVideoUpload): add imageUpload and videoUpload [`#143`](https://github.com/ant-design/ant-design-mini/pull/143)\n- Feat/date picker [`#135`](https://github.com/ant-design/ant-design-mini/pull/135)\n- Fix/filter selector label [`#168`](https://github.com/ant-design/ant-design-mini/pull/168)\n- chore: update doc [`#166`](https://github.com/ant-design/ant-design-mini/pull/166)\n- ci: add release workflow [`#165`](https://github.com/ant-design/ant-design-mini/pull/165)\n- feat/ActionSheet [`#137`](https://github.com/ant-design/ant-design-mini/pull/137)\n- fix(Filter): 修复 selector onChange 数据格式 [`#164`](https://github.com/ant-design/ant-design-mini/pull/164)\n- docs(FloatPanel): add onScroll event [`#157`](https://github.com/ant-design/ant-design-mini/pull/157)\n- chore(doc): refine readme [`#152`](https://github.com/ant-design/ant-design-mini/pull/152)\n- feat(doc): update appCdnBaseUrl [`45f5648`](https://github.com/ant-design/ant-design-mini/commit/45f5648535bb0c43ecc8f0faefbb4645f17dcd50)\n\n#### [0.0.17](https://github.com/ant-design/ant-design-mini/compare/0.0.16...0.0.17)\n\n> 20 June 2022\n\n- fix(floatPanel): wrapper css add width:100% [`#150`](https://github.com/ant-design/ant-design-mini/pull/150)\n- feat: Icon、ListItem、Button support stopPropagation [`#149`](https://github.com/ant-design/ant-design-mini/pull/149)\n- chore(CheckboxGroup): fix checkboxgroup and radiogroup style [`#146`](https://github.com/ant-design/ant-design-mini/pull/146)\n- fix(Tabs): fix title style in IOS9 [`#148`](https://github.com/ant-design/ant-design-mini/pull/148)\n- fix(FloatPanel): scroll-view bug && demo ui [`#147`](https://github.com/ant-design/ant-design-mini/pull/147)\n- 修复不设置标题时，标题行占位的问题 [`#145`](https://github.com/ant-design/ant-design-mini/pull/145)\n- feat(doc): update appCdnBaseUrl [`38d8358`](https://github.com/ant-design/ant-design-mini/commit/38d835857f4b42d62b6b96aa9f5c0585027b44f6)\n- chore(Container): boolean component true [`c15516d`](https://github.com/ant-design/ant-design-mini/commit/c15516d024bf2bbf6517b0a5a6d2abdf4e2f0720)\n\n#### [0.0.16](https://github.com/ant-design/ant-design-mini/compare/0.0.15...0.0.16)\n\n> 15 June 2022\n\n- chore(FloatPanel): upgrade demo [`5e3e8c9`](https://github.com/ant-design/ant-design-mini/commit/5e3e8c923b3b5df73baa3350de9874b419b27466)\n- chore(FloatPanel): add demo style [`99cd295`](https://github.com/ant-design/ant-design-mini/commit/99cd2958ef28389f50dd4d96c0ca5d02bfc5ad0f)\n\n#### [0.0.15](https://github.com/ant-design/ant-design-mini/compare/0.0.14...0.0.15)\n\n> 15 June 2022\n\n- Feat/float panel [`#142`](https://github.com/ant-design/ant-design-mini/pull/142)\n- Feat/toast [`#141`](https://github.com/ant-design/ant-design-mini/pull/141)\n- Chore/checklist [`#123`](https://github.com/ant-design/ant-design-mini/pull/123)\n- feat(FloatPanel): new Component [`#102`](https://github.com/ant-design/ant-design-mini/pull/102)\n- Feat/container [`#138`](https://github.com/ant-design/ant-design-mini/pull/138)\n- Chore/doc [`#136`](https://github.com/ant-design/ant-design-mini/pull/136)\n- chore(Form): delete footer slot in FormInMethod [`cfb9fa3`](https://github.com/ant-design/ant-design-mini/commit/cfb9fa378feabd1151b178a5ca11829915128d53)\n- chore(doc): update appCdnBaseUrl [`7cab5a5`](https://github.com/ant-design/ant-design-mini/commit/7cab5a5baf4fa222c8bb8f9d049ee327bc41fa98)\n\n#### [0.0.14](https://github.com/ant-design/ant-design-mini/compare/0.0.13...0.0.14)\n\n> 2 June 2022\n\n- chore(Modal): adjust style & add zIndex disableSrcoll animation props… [`#128`](https://github.com/ant-design/ant-design-mini/pull/128)\n- chore(Selector): fix value dosen't work [`#127`](https://github.com/ant-design/ant-design-mini/pull/127)\n- chore(doc): refine picker checkbox checkboxgroup readme [`#122`](https://github.com/ant-design/ant-design-mini/pull/122)\n- fix: quick-start.md [`#119`](https://github.com/ant-design/ant-design-mini/pull/119)\n- feat(doc): update appCdnBaseUrl [`4eb78e9`](https://github.com/ant-design/ant-design-mini/commit/4eb78e9fbbee343523ab533b8dbf889b40126eee)\n\n#### [0.0.13](https://github.com/ant-design/ant-design-mini/compare/0.0.11...0.0.13)\n\n> 30 May 2022\n\n- Chore/picker [`#118`](https://github.com/ant-design/ant-design-mini/pull/118)\n- feat(swiper): support the swiper adjustHeight attribute [`#117`](https://github.com/ant-design/ant-design-mini/pull/117)\n- chore(pub): update package.json name when published [`2850698`](https://github.com/ant-design/ant-design-mini/commit/2850698051805072af2371a792d36dc04694330f)\n- chore(demo): update appCdnBaseUrl [`0829bbf`](https://github.com/ant-design/ant-design-mini/commit/0829bbf72329a1f39065cfdce5e9b2f76e49bd61)\n\n#### [0.0.11](https://github.com/ant-design/ant-design-mini/compare/0.0.10...0.0.11)\n\n> 29 May 2022\n\n- Chore/picker [`#116`](https://github.com/ant-design/ant-design-mini/pull/116)\n- fix: fix FormGroup radius props [`#97`](https://github.com/ant-design/ant-design-mini/pull/97)\n- Chore/tab [`#111`](https://github.com/ant-design/ant-design-mini/pull/111)\n- Chore/switch [`#110`](https://github.com/ant-design/ant-design-mini/pull/110)\n- Chore/picker [`#108`](https://github.com/ant-design/ant-design-mini/pull/108)\n- chore(dumi): fix conflict babal.config.js [`#109`](https://github.com/ant-design/ant-design-mini/pull/109)\n- fix(checkbox-group): onchange does not trigger [`#103`](https://github.com/ant-design/ant-design-mini/pull/103)\n\n#### [0.0.10](https://github.com/ant-design/ant-design-mini/compare/0.0.9...0.0.10)\n\n> 17 May 2022\n\n- feat(Tips): 单行文本时关闭按钮垂直居中 [`#98`](https://github.com/ant-design/ant-design-mini/pull/98)\n- feat(doc): use google analytics [`#100`](https://github.com/ant-design/ant-design-mini/pull/100)\n- chore(Picker): this.dataList sync  with props.data [`#94`](https://github.com/ant-design/ant-design-mini/pull/94)\n- fix(CheckboxGroup): remove default value prop [`#96`](https://github.com/ant-design/ant-design-mini/pull/96)\n- fix(vTabs): fix click bottom tap jump to the tap before [`#95`](https://github.com/ant-design/ant-design-mini/pull/95)\n- fix(Icon): fix color style used in plugin [`#93`](https://github.com/ant-design/ant-design-mini/pull/93)\n- feat(doc): update appCdnBaseUrl [`ba7b163`](https://github.com/ant-design/ant-design-mini/commit/ba7b163b8481307b4bc4c7737fc624b51aaa4a8b)\n\n#### [0.0.9](https://github.com/ant-design/ant-design-mini/compare/0.0.8...0.0.9)\n\n> 11 May 2022\n\n- chore(CheckList): remove checkList and empty [`#85`](https://github.com/ant-design/ant-design-mini/pull/85)\n- feat(search-bar): 支持不同type input搜索 [`#73`](https://github.com/ant-design/ant-design-mini/pull/73)\n- feat(Tabs): add attributes for swiper [`#78`](https://github.com/ant-design/ant-design-mini/pull/78)\n- chore(stepper): remove useless code [`#84`](https://github.com/ant-design/ant-design-mini/pull/84)\n- Fix/loading [`#83`](https://github.com/ant-design/ant-design-mini/pull/83)\n- feat(dumi): real-time code preview supported [`#77`](https://github.com/ant-design/ant-design-mini/pull/77)\n- docs(modal): fix typo and markdown table [`#75`](https://github.com/ant-design/ant-design-mini/pull/75)\n- feat(Checklist): new checklist component [`#67`](https://github.com/ant-design/ant-design-mini/pull/67)\n- feat(empty): add empty compoennt [`#61`](https://github.com/ant-design/ant-design-mini/pull/61)\n- feat: update demo cdn [`#70`](https://github.com/ant-design/ant-design-mini/pull/70)\n\n#### [0.0.8](https://github.com/ant-design/ant-design-mini/compare/0.0.8-beta.1...0.0.8)\n\n> 24 April 2022\n\n#### [0.0.8-beta.1](https://github.com/ant-design/ant-design-mini/compare/0.0.7...0.0.8-beta.1)\n\n> 27 April 2022\n\n- feat(Checklist): new checklist component [`#67`](https://github.com/ant-design/ant-design-mini/pull/67)\n- feat(empty): add empty compoennt [`#61`](https://github.com/ant-design/ant-design-mini/pull/61)\n- feat: update demo cdn [`#70`](https://github.com/ant-design/ant-design-mini/pull/70)\n- feat: adjust Steps、Filter、Collapse uid to page unique [`#68`](https://github.com/ant-design/ant-design-mini/pull/68)\n- feat(search-bar): 支持不同type input搜索 [`9124f7f`](https://github.com/ant-design/ant-design-mini/commit/9124f7fd02dbb9a18245ce20095f6f82a106d4f5)\n\n#### [0.0.7](https://github.com/ant-design/ant-design-mini/compare/0.0.7-beta.2...0.0.7)\n\n> 21 April 2022\n\n- feat(calendar): enhance onChange event [`#63`](https://github.com/ant-design/ant-design-mini/pull/63)\n- feat(swipe-action): support \"dataSet\" [`#64`](https://github.com/ant-design/ant-design-mini/pull/64)\n\n#### [0.0.7-beta.2](https://github.com/ant-design/ant-design-mini/compare/0.0.7-alpha.12...0.0.7-beta.2)\n\n> 20 April 2022\n\n#### [0.0.7-alpha.12](https://github.com/ant-design/ant-design-mini/compare/0.0.7-alpha.10...0.0.7-alpha.12)\n\n> 28 July 2022\n\n- feat(Form): add triggerValidateOnChange [`2bfc8b3`](https://github.com/ant-design/ant-design-mini/commit/2bfc8b38f94e44622b5743a93001369174f96020)\n- feat(docs): docs [`4987bea`](https://github.com/ant-design/ant-design-mini/commit/4987bea73fd6827d8003f32515b445f1b28c1e2b)\n\n#### [0.0.7-alpha.10](https://github.com/ant-design/ant-design-mini/compare/0.0.7-alpha.9...0.0.7-alpha.10)\n\n> 20 July 2022\n\n- feat(selector): change conflict name [`e5efc90`](https://github.com/ant-design/ant-design-mini/commit/e5efc9027cfc9a4e937e68d360b7593b90bd26ee)\n\n#### [0.0.7-alpha.9](https://github.com/ant-design/ant-design-mini/compare/0.0.7-alpha.8...0.0.7-alpha.9)\n\n> 18 July 2022\n\n- feat(Picker): onChange [`23b5d71`](https://github.com/ant-design/ant-design-mini/commit/23b5d7166b5916b0fb22bafa21b70d5a4c465e5e)\n\n#### [0.0.7-alpha.8](https://github.com/ant-design/ant-design-mini/compare/0.0.7-alpha.7...0.0.7-alpha.8)\n\n> 13 July 2022\n\n- chore(Picker): dynamic change [`91aa349`](https://github.com/ant-design/ant-design-mini/commit/91aa349fd723ac1ea8d4794096eeda4f2aa7c180)\n\n#### [0.0.7-alpha.7](https://github.com/ant-design/ant-design-mini/compare/0.0.7-alpha.6...0.0.7-alpha.7)\n\n> 11 July 2022\n\n- feat(Form): add event [`80610df`](https://github.com/ant-design/ant-design-mini/commit/80610dfc4a1996ac86e455ff50c309720068c6a8)\n\n#### [0.0.7-alpha.6](https://github.com/ant-design/ant-design-mini/compare/0.0.7-alpha.5...0.0.7-alpha.6)\n\n> 8 July 2022\n\n- feat(Selector): change [`7eb133d`](https://github.com/ant-design/ant-design-mini/commit/7eb133d2e0a1f4a0da95e27a9e950189eeb7b3ec)\n\n#### [0.0.7-alpha.5](https://github.com/ant-design/ant-design-mini/compare/0.0.7-alpha.4...0.0.7-alpha.5)\n\n> 12 May 2022\n\n- feat(doc):change markdown format [`08c882a`](https://github.com/ant-design/ant-design-mini/commit/08c882a6d758d411bc79c226b71e8ba4d5bcd9e6)\n- feat(RadioGroup): add position & custom icon prop [`5e7674c`](https://github.com/ant-design/ant-design-mini/commit/5e7674c0239ebb4837b63a752471d9e9eefba12e)\n- refactor(CheckboxItem): remove dependency on Checkbox [`b644c93`](https://github.com/ant-design/ant-design-mini/commit/b644c9360a2d9d4c9753e20451992325195c20aa)\n\n#### [0.0.7-alpha.4](https://github.com/ant-design/ant-design-mini/compare/0.0.7-alpha.3...0.0.7-alpha.4)\n\n> 29 June 2022\n\n- feat(imageVideoUpload): add imageUpload and videoUpload [`#143`](https://github.com/ant-design/ant-design-mini/pull/143)\n- Feat/date picker [`#135`](https://github.com/ant-design/ant-design-mini/pull/135)\n- Fix/filter selector label [`#168`](https://github.com/ant-design/ant-design-mini/pull/168)\n- chore: update doc [`#166`](https://github.com/ant-design/ant-design-mini/pull/166)\n- ci: add release workflow [`#165`](https://github.com/ant-design/ant-design-mini/pull/165)\n- feat/ActionSheet [`#137`](https://github.com/ant-design/ant-design-mini/pull/137)\n- fix(Filter): 修复 selector onChange 数据格式 [`#164`](https://github.com/ant-design/ant-design-mini/pull/164)\n- docs(FloatPanel): add onScroll event [`#157`](https://github.com/ant-design/ant-design-mini/pull/157)\n- chore(doc): refine readme [`#152`](https://github.com/ant-design/ant-design-mini/pull/152)\n- feat(doc): update appCdnBaseUrl [`45f5648`](https://github.com/ant-design/ant-design-mini/commit/45f5648535bb0c43ecc8f0faefbb4645f17dcd50)\n\n#### [0.0.7-alpha.3](https://github.com/ant-design/ant-design-mini/compare/0.0.7-alpha.2...0.0.7-alpha.3)\n\n> 20 June 2022\n\n- fix(floatPanel): wrapper css add width:100% [`#150`](https://github.com/ant-design/ant-design-mini/pull/150)\n- feat: Icon、ListItem、Button support stopPropagation [`#149`](https://github.com/ant-design/ant-design-mini/pull/149)\n\n#### [0.0.7-alpha.2](https://github.com/ant-design/ant-design-mini/compare/0.0.6...0.0.7-alpha.2)\n\n> 20 June 2022\n\n- chore(CheckboxGroup): fix checkboxgroup and radiogroup style [`#146`](https://github.com/ant-design/ant-design-mini/pull/146)\n- fix(Tabs): fix title style in IOS9 [`#148`](https://github.com/ant-design/ant-design-mini/pull/148)\n- fix(FloatPanel): scroll-view bug && demo ui [`#147`](https://github.com/ant-design/ant-design-mini/pull/147)\n- 修复不设置标题时，标题行占位的问题 [`#145`](https://github.com/ant-design/ant-design-mini/pull/145)\n- Feat/float panel [`#142`](https://github.com/ant-design/ant-design-mini/pull/142)\n- Feat/toast [`#141`](https://github.com/ant-design/ant-design-mini/pull/141)\n- Chore/checklist [`#123`](https://github.com/ant-design/ant-design-mini/pull/123)\n- feat(FloatPanel): new Component [`#102`](https://github.com/ant-design/ant-design-mini/pull/102)\n- Feat/container [`#138`](https://github.com/ant-design/ant-design-mini/pull/138)\n- Chore/doc [`#136`](https://github.com/ant-design/ant-design-mini/pull/136)\n- chore(Modal): adjust style & add zIndex disableSrcoll animation props… [`#128`](https://github.com/ant-design/ant-design-mini/pull/128)\n- chore(Selector): fix value dosen't work [`#127`](https://github.com/ant-design/ant-design-mini/pull/127)\n- chore(doc): refine picker checkbox checkboxgroup readme [`#122`](https://github.com/ant-design/ant-design-mini/pull/122)\n- fix: quick-start.md [`#119`](https://github.com/ant-design/ant-design-mini/pull/119)\n- Chore/picker [`#118`](https://github.com/ant-design/ant-design-mini/pull/118)\n- feat(swiper): support the swiper adjustHeight attribute [`#117`](https://github.com/ant-design/ant-design-mini/pull/117)\n- Chore/picker [`#116`](https://github.com/ant-design/ant-design-mini/pull/116)\n- fix: fix FormGroup radius props [`#97`](https://github.com/ant-design/ant-design-mini/pull/97)\n- Chore/tab [`#111`](https://github.com/ant-design/ant-design-mini/pull/111)\n- Chore/switch [`#110`](https://github.com/ant-design/ant-design-mini/pull/110)\n- Chore/picker [`#108`](https://github.com/ant-design/ant-design-mini/pull/108)\n- chore(dumi): fix conflict babal.config.js [`#109`](https://github.com/ant-design/ant-design-mini/pull/109)\n- fix(checkbox-group): onchange does not trigger [`#103`](https://github.com/ant-design/ant-design-mini/pull/103)\n- feat(Tips): 单行文本时关闭按钮垂直居中 [`#98`](https://github.com/ant-design/ant-design-mini/pull/98)\n- feat(doc): use google analytics [`#100`](https://github.com/ant-design/ant-design-mini/pull/100)\n- chore(Picker): this.dataList sync  with props.data [`#94`](https://github.com/ant-design/ant-design-mini/pull/94)\n- fix(CheckboxGroup): remove default value prop [`#96`](https://github.com/ant-design/ant-design-mini/pull/96)\n- fix(vTabs): fix click bottom tap jump to the tap before [`#95`](https://github.com/ant-design/ant-design-mini/pull/95)\n- fix(Icon): fix color style used in plugin [`#93`](https://github.com/ant-design/ant-design-mini/pull/93)\n- chore(CheckList): remove checkList and empty [`#85`](https://github.com/ant-design/ant-design-mini/pull/85)\n- feat(search-bar): 支持不同type input搜索 [`#73`](https://github.com/ant-design/ant-design-mini/pull/73)\n- feat(Tabs): add attributes for swiper [`#78`](https://github.com/ant-design/ant-design-mini/pull/78)\n- chore(stepper): remove useless code [`#84`](https://github.com/ant-design/ant-design-mini/pull/84)\n- Fix/loading [`#83`](https://github.com/ant-design/ant-design-mini/pull/83)\n- feat(dumi): real-time code preview supported [`#77`](https://github.com/ant-design/ant-design-mini/pull/77)\n- docs(modal): fix typo and markdown table [`#75`](https://github.com/ant-design/ant-design-mini/pull/75)\n- feat(Checklist): new checklist component [`#67`](https://github.com/ant-design/ant-design-mini/pull/67)\n- feat(empty): add empty compoennt [`#61`](https://github.com/ant-design/ant-design-mini/pull/61)\n- feat: update demo cdn [`#70`](https://github.com/ant-design/ant-design-mini/pull/70)\n- feat: adjust Steps、Filter、Collapse uid to page unique [`#68`](https://github.com/ant-design/ant-design-mini/pull/68)\n- feat(calendar): enhance onChange event [`#63`](https://github.com/ant-design/ant-design-mini/pull/63)\n- feat(swipe-action): support \"dataSet\" [`#64`](https://github.com/ant-design/ant-design-mini/pull/64)\n- fix(Form): fix Form in plugin mode [`#62`](https://github.com/ant-design/ant-design-mini/pull/62)\n- chore(FloatPanel): upgrade demo [`5e3e8c9`](https://github.com/ant-design/ant-design-mini/commit/5e3e8c923b3b5df73baa3350de9874b419b27466)\n- chore(FloatPanel): add demo style [`99cd295`](https://github.com/ant-design/ant-design-mini/commit/99cd2958ef28389f50dd4d96c0ca5d02bfc5ad0f)\n- chore(Form): delete footer slot in FormInMethod [`cfb9fa3`](https://github.com/ant-design/ant-design-mini/commit/cfb9fa378feabd1151b178a5ca11829915128d53)\n\n#### [0.0.6](https://github.com/ant-design/ant-design-mini/compare/0.0.5...0.0.6)\n\n> 15 April 2022\n\n- feat(icon): click support to copy icon Type [`#54`](https://github.com/ant-design/ant-design-mini/pull/54)\n- fix(RadioGroup): fix checked bug [`#43`](https://github.com/ant-design/ant-design-mini/pull/43)\n- Feat/tips [`#47`](https://github.com/ant-design/ant-design-mini/pull/47)\n- feat/LoadingDoc [`#49`](https://github.com/ant-design/ant-design-mini/pull/49)\n- Enhance/tabs [`#53`](https://github.com/ant-design/ant-design-mini/pull/53)\n\n#### [0.0.5](https://github.com/ant-design/ant-design-mini/compare/0.0.4...0.0.5)\n\n> 14 April 2022\n\n- fix(tabs): fix sdkverison check error [`#52`](https://github.com/ant-design/ant-design-mini/pull/52)\n- Feat/cdn [`#51`](https://github.com/ant-design/ant-design-mini/pull/51)\n- Chore/docs [`#48`](https://github.com/ant-design/ant-design-mini/pull/48)\n- fix(publish): update package.json after publish [`#46`](https://github.com/ant-design/ant-design-mini/pull/46)\n- feat(tips): add visible and onClose props [`#39`](https://github.com/ant-design/ant-design-mini/pull/39)\n- fix: fix CheckboxGroup header prop [`#42`](https://github.com/ant-design/ant-design-mini/pull/42)\n- fix(compile): replace babel with tsc [`#45`](https://github.com/ant-design/ant-design-mini/pull/45)\n- fix(tabs): fix sdkverison check error [`#44`](https://github.com/ant-design/ant-design-mini/pull/44)\n\n#### [0.0.4](https://github.com/ant-design/ant-design-mini/compare/0.0.3...0.0.4)\n\n> 2 April 2022\n\n- fix(compile): trnasform es6 ot es5 [`#41`](https://github.com/ant-design/ant-design-mini/pull/41)\n\n#### [0.0.3](https://github.com/ant-design/ant-design-mini/compare/0.0.2...0.0.3)\n\n> 1 April 2022\n\n- Feat/tabs [`#26`](https://github.com/ant-design/ant-design-mini/pull/26)\n- Feat/cdn [`#37`](https://github.com/ant-design/ant-design-mini/pull/37)\n- chore(demo): rename demo less=&gt;acss [`#35`](https://github.com/ant-design/ant-design-mini/pull/35)\n- feat(plugin): update cdn [`#36`](https://github.com/ant-design/ant-design-mini/pull/36)\n- Feat/demo [`#34`](https://github.com/ant-design/ant-design-mini/pull/34)\n- feat(scripts): open dumi dev server once [`#33`](https://github.com/ant-design/ant-design-mini/pull/33)\n- Fix/popover [`#22`](https://github.com/ant-design/ant-design-mini/pull/22)\n- Chore/add container demo [`#20`](https://github.com/ant-design/ant-design-mini/pull/20)\n- feat(scripts): enhance docs deploy [`#32`](https://github.com/ant-design/ant-design-mini/pull/32)\n- feat(docs): adjust demo source file sort [`#31`](https://github.com/ant-design/ant-design-mini/pull/31)\n- feat(scripts): publish scripts [`#23`](https://github.com/ant-design/ant-design-mini/pull/23)\n- docs(plugin): enhance demo preview with only one simulator in docs [`#29`](https://github.com/ant-design/ant-design-mini/pull/29)\n- feat(swipe-action): add instance method to controll itemPosition [`#28`](https://github.com/ant-design/ant-design-mini/pull/28)\n- fix(__tests__): fix test error with ts types [`#25`](https://github.com/ant-design/ant-design-mini/pull/25)\n- chore(*): update contribute guide [`#24`](https://github.com/ant-design/ant-design-mini/pull/24)\n- Feat/rpx [`#21`](https://github.com/ant-design/ant-design-mini/pull/21)\n- chore(selector): fix xml condition determination issues to match 'vx' [`#19`](https://github.com/ant-design/ant-design-mini/pull/19)\n- fix(scripts): fix variable naming [`#17`](https://github.com/ant-design/ant-design-mini/pull/17)\n- feat(docs): generate docs auto [`#16`](https://github.com/ant-design/ant-design-mini/pull/16)\n- chore: gen CNAME file in docs-dist [`#14`](https://github.com/ant-design/ant-design-mini/pull/14)\n- fix(types): remove invalid use for my [`#13`](https://github.com/ant-design/ant-design-mini/pull/13)\n- Feat/docs [`#11`](https://github.com/ant-design/ant-design-mini/pull/11)\n- docs: update contribute link [`#12`](https://github.com/ant-design/ant-design-mini/pull/12)\n- docs: enable full mode for homepage [`#9`](https://github.com/ant-design/ant-design-mini/pull/9)\n- docs: workaround for simulator flicker problem [`#10`](https://github.com/ant-design/ant-design-mini/pull/10)\n- docs(*): update antd-mini version in docs [`939b03d`](https://github.com/ant-design/ant-design-mini/commit/939b03d101c8451811c43036ab4473f372247fcc)\n- fix(compile): fix less comile error [`d8eb11b`](https://github.com/ant-design/ant-design-mini/commit/d8eb11bb83f170be662ea3ab9cb48e76849f8fbb)\n- docs: remove uesless sidemenu config for homepage [`e54bccb`](https://github.com/ant-design/ant-design-mini/commit/e54bccbf20a7adcbb1a8d0acdf04e7ebffcdf949)\n\n#### [0.0.2](https://github.com/ant-design/ant-design-mini/compare/0.0.2-beta.1...0.0.2)\n\n> 21 February 2022\n\n- chore(*): update version [`33f7d6c`](https://github.com/ant-design/ant-design-mini/commit/33f7d6c52c8dcf1025bd27f294db4746475ee92e)\n\n#### [0.0.2-beta.1](https://github.com/ant-design/ant-design-mini/compare/0.0.2-alpha.1...0.0.2-beta.1)\n\n> 21 February 2022\n\n#### [0.0.2-alpha.1](https://github.com/ant-design/ant-design-mini/compare/v0.0.1...0.0.2-alpha.1)\n\n> 28 March 2022\n\n- feat(scripts): publish scripts [`6766e9b`](https://github.com/ant-design/ant-design-mini/commit/6766e9b0d8abddde5b3e94a06b383cf06c3a3424)\n- feat(scripts): append git sync [`2768aa8`](https://github.com/ant-design/ant-design-mini/commit/2768aa8b321157b2ac63179b6a1a436ff2b4efb6)\n\n#### v0.0.1\n\n> 12 August 2025\n\n- fix: tabbar style [`#1494`](https://github.com/ant-design/ant-design-mini/pull/1494)\n- Feat native [`#1492`](https://github.com/ant-design/ant-design-mini/pull/1492)\n- Fix dialog [`#1478`](https://github.com/ant-design/ant-design-mini/pull/1478)\n- Fix dialog [`#1477`](https://github.com/ant-design/ant-design-mini/pull/1477)\n- Feat alipay native [`#1473`](https://github.com/ant-design/ant-design-mini/pull/1473)\n- fIx: 修复日历组件sticky标题位置错乱问题 [`#1471`](https://github.com/ant-design/ant-design-mini/pull/1471)\n- fix: popup的visible假值变化问题 [`#1469`](https://github.com/ant-design/ant-design-mini/pull/1469)\n- Feat component2 [`#1463`](https://github.com/ant-design/ant-design-mini/pull/1463)\n- fix: datePicker弹窗关闭后重置暂存的选项 [`#1464`](https://github.com/ant-design/ant-design-mini/pull/1464)\n- Feat popup close slot [`#1462`](https://github.com/ant-design/ant-design-mini/pull/1462)\n- Feat data picker slot [`#1459`](https://github.com/ant-design/ant-design-mini/pull/1459)\n- fix: wx ontap double trigger [`#1458`](https://github.com/ant-design/ant-design-mini/pull/1458)\n- fix: textarea controlled problem [`#1457`](https://github.com/ant-design/ant-design-mini/pull/1457)\n- Feat/space 0410 [`#1454`](https://github.com/ant-design/ant-design-mini/pull/1454)\n- Feat/space 0410 [`#1451`](https://github.com/ant-design/ant-design-mini/pull/1451)\n- feat: 添加 Space 组件, 新增布局分类并调整 Grid 和 Divider 组件到此分类中 [`#1450`](https://github.com/ant-design/ant-design-mini/pull/1450)\n- Feat collapse support miniplugin [`#1447`](https://github.com/ant-design/ant-design-mini/pull/1447)\n- fix: collapse support miniplugin [`#1446`](https://github.com/ant-design/ant-design-mini/pull/1446)\n- fix: form empty array readonly logic [`#1443`](https://github.com/ant-design/ant-design-mini/pull/1443)\n- Style checkbox icon [`#1442`](https://github.com/ant-design/ant-design-mini/pull/1442)\n- checkbox icon change [`#1439`](https://github.com/ant-design/ant-design-mini/pull/1439)\n- fix: calendar week titlearea disappear in popup [`#1437`](https://github.com/ant-design/ant-design-mini/pull/1437)\n- Fix skeleton loading [`#1435`](https://github.com/ant-design/ant-design-mini/pull/1435)\n- Fix skeleton loading [`#1433`](https://github.com/ant-design/ant-design-mini/pull/1433)\n- Fix form setfields value [`#1429`](https://github.com/ant-design/ant-design-mini/pull/1429)\n- fix: table width [`#1427`](https://github.com/ant-design/ant-design-mini/pull/1427)\n- Issus 1425 jianglu [`#1426`](https://github.com/ant-design/ant-design-mini/pull/1426)\n- Feat form layout [`#1423`](https://github.com/ant-design/ant-design-mini/pull/1423)\n- Feat form layout [`#1422`](https://github.com/ant-design/ant-design-mini/pull/1422)\n- Adjust input max min default value [`#1421`](https://github.com/ant-design/ant-design-mini/pull/1421)\n- Refactor component constructor [`#1418`](https://github.com/ant-design/ant-design-mini/pull/1418)\n- fix: wx input cursor problem [`#1420`](https://github.com/ant-design/ant-design-mini/pull/1420)\n- fix: footer useComponents path error [`#1415`](https://github.com/ant-design/ant-design-mini/pull/1415)\n- Feat x optimization [`#1412`](https://github.com/ant-design/ant-design-mini/pull/1412)\n- Feat max min input [`#1411`](https://github.com/ant-design/ant-design-mini/pull/1411)\n- Form add readonly property [`#1407`](https://github.com/ant-design/ant-design-mini/pull/1407)\n- fix: copilot js path not find [`#1401`](https://github.com/ant-design/ant-design-mini/pull/1401)\n- Feat 0207 issue [`#1398`](https://github.com/ant-design/ant-design-mini/pull/1398)\n- fix some bug in different platform [`#1397`](https://github.com/ant-design/ant-design-mini/pull/1397)\n- docs fix [`#1395`](https://github.com/ant-design/ant-design-mini/pull/1395)\n- Adjust x-components demo style [`#1393`](https://github.com/ant-design/ant-design-mini/pull/1393)\n- Feat/x-components [`#1391`](https://github.com/ant-design/ant-design-mini/pull/1391)\n- copilot系列组件 [`#1390`](https://github.com/ant-design/ant-design-mini/pull/1390)\n- indexbar scroll  not silky [`#1386`](https://github.com/ant-design/ant-design-mini/pull/1386)\n- fix: display range problem [`#1383`](https://github.com/ant-design/ant-design-mini/pull/1383)\n- Fix card divier [`#1378`](https://github.com/ant-design/ant-design-mini/pull/1378)\n- fix: card divider [`#1377`](https://github.com/ant-design/ant-design-mini/pull/1377)\n- fix: form onValueChange validate time series problem [`#1372`](https://github.com/ant-design/ant-design-mini/pull/1372)\n- Feat/table ellipse [`#1365`](https://github.com/ant-design/ant-design-mini/pull/1365)\n- Add wx:key [`#1370`](https://github.com/ant-design/ant-design-mini/pull/1370)\n- Wx problem fix [`#1364`](https://github.com/ant-design/ant-design-mini/pull/1364)\n- Feat/table ellipse [`#1359`](https://github.com/ant-design/ant-design-mini/pull/1359)\n- Update the link to the correct migration documentation [`#1325`](https://github.com/ant-design/ant-design-mini/pull/1325)\n- fix-some-demo-op [`#1341`](https://github.com/ant-design/ant-design-mini/pull/1341)\n- fix: popup title cant display in wechat platform [`#1358`](https://github.com/ant-design/ant-design-mini/pull/1358)\n- CascaderPicker引用路径错误修正 [`#1343`](https://github.com/ant-design/ant-design-mini/pull/1343)\n- Optimize docs [`#1354`](https://github.com/ant-design/ant-design-mini/pull/1354)\n- Feat a part of  component support  wechat [`#1349`](https://github.com/ant-design/ant-design-mini/pull/1349)\n- fix: tabs wechat error [`#1340`](https://github.com/ant-design/ant-design-mini/pull/1340)\n- docs: popover theme color [`#1338`](https://github.com/ant-design/ant-design-mini/pull/1338)\n- feat: release.yml增加npm run build指令 [`#1335`](https://github.com/ant-design/ant-design-mini/pull/1335)\n- fix: 闭合 Button 标签 [`#1329`](https://github.com/ant-design/ant-design-mini/pull/1329)\n- Feat/noticebar support multiple line [`#1333`](https://github.com/ant-design/ant-design-mini/pull/1333)\n- docs: 微信事件采用 bindxxx 格式 [`#1330`](https://github.com/ant-design/ant-design-mini/pull/1330)\n- fix: 生成wechat app.json时，遍历依赖找到不支持微信的demo页面并去掉 [`#1331`](https://github.com/ant-design/ant-design-mini/pull/1331)\n- refactor: 组件 Token 变量通过模块的方式引入,不多地维护 [`#1327`](https://github.com/ant-design/ant-design-mini/pull/1327)\n- Docs/readme 112804 [`#1321`](https://github.com/ant-design/ant-design-mini/pull/1321)\n- Feat term [`#1324`](https://github.com/ant-design/ant-design-mini/pull/1324)\n- fix: 将demo文件夹里的二级页面也加入到文件列表文件中 [`#1326`](https://github.com/ant-design/ant-design-mini/pull/1326)\n- 将几处demo页面列表及组件列表的配置文件改为动态生成 [`#1322`](https://github.com/ant-design/ant-design-mini/pull/1322)\n- Feat footer [`#1323`](https://github.com/ant-design/ant-design-mini/pull/1323)\n- docs: 优化 README.md [`#1320`](https://github.com/ant-design/ant-design-mini/pull/1320)\n- docs: 优化 README.md [`#1319`](https://github.com/ant-design/ant-design-mini/pull/1319)\n- Docs/readme 1128 [`#1318`](https://github.com/ant-design/ant-design-mini/pull/1318)\n- Docs/readme 1128 [`#1317`](https://github.com/ant-design/ant-design-mini/pull/1317)\n- chore: 1. 修改 antd-mobile logo 和官网地址; 2. 为 commit 校验添加参考地址 [`#1315`](https://github.com/ant-design/ant-design-mini/pull/1315)\n- website document optimization [`#1314`](https://github.com/ant-design/ant-design-mini/pull/1314)\n- Demo feat dev [`#1311`](https://github.com/ant-design/ant-design-mini/pull/1311)\n- Docs new dev [`#1307`](https://github.com/ant-design/ant-design-mini/pull/1307)\n- fix: 修复部分组件 props 命名规范问题 [`#1306`](https://github.com/ant-design/ant-design-mini/pull/1306)\n- Docs site dev [`#1304`](https://github.com/ant-design/ant-design-mini/pull/1304)\n- fix: 修复keyboardnumber组件键盘快速点击偶尔失效的问题 [`#1290`](https://github.com/ant-design/ant-design-mini/pull/1290)\n- update doc [`#1281`](https://github.com/ant-design/ant-design-mini/pull/1281)\n- Fix wx picker slot [`#1280`](https://github.com/ant-design/ant-design-mini/pull/1280)\n- feat: wechat support slot [`#1277`](https://github.com/ant-design/ant-design-mini/pull/1277)\n- fix: onSwipeStart is not undefined [`#1275`](https://github.com/ant-design/ant-design-mini/pull/1275)\n- fix: disabled button tap  can  callback [`#1272`](https://github.com/ant-design/ant-design-mini/pull/1272)\n- fix: collapse node wrap fix [`#1271`](https://github.com/ant-design/ant-design-mini/pull/1271)\n- Feat zindex [`#1268`](https://github.com/ant-design/ant-design-mini/pull/1268)\n- Fix issue 1265 [`#1266`](https://github.com/ant-design/ant-design-mini/pull/1266)\n- fix: picker closing the mask flicker [`#1263`](https://github.com/ant-design/ant-design-mini/pull/1263)\n- @alipay/axml-transverter 依赖替换 [`#1261`](https://github.com/ant-design/ant-design-mini/pull/1261)\n- feat: indexbar异步加载数据时，异常处理 [`#1260`](https://github.com/ant-design/ant-design-mini/pull/1260)\n- Feat: IndexBar demo optimize [`#1259`](https://github.com/ant-design/ant-design-mini/pull/1259)\n- Feat calendar range [`#1256`](https://github.com/ant-design/ant-design-mini/pull/1256)\n- fix: 修复modal默认插槽展示问题 [`#1252`](https://github.com/ant-design/ant-design-mini/pull/1252)\n- Refactor dev build [`#1248`](https://github.com/ant-design/ant-design-mini/pull/1248)\n- feat: popup的mask支持插槽定制 [`#1249`](https://github.com/ant-design/ant-design-mini/pull/1249)\n- feat: lodash依赖去除，兼容适配微信 [`#1246`](https://github.com/ant-design/ant-design-mini/pull/1246)\n- fix: 解决支付宝小程序Picker中导致 targetId not match [`#1241`](https://github.com/ant-design/ant-design-mini/pull/1241)\n- form-item 的 name 支持嵌套字段 [`#1235`](https://github.com/ant-design/ant-design-mini/pull/1235)\n- Feat calendar format [`#1230`](https://github.com/ant-design/ant-design-mini/pull/1230)\n- Fix form item error [`#1228`](https://github.com/ant-design/ant-design-mini/pull/1228)\n- feat: collapse add item classname [`#1226`](https://github.com/ant-design/ant-design-mini/pull/1226)\n- feat: input also support adjustPosition in alipay [`#1223`](https://github.com/ant-design/ant-design-mini/pull/1223)\n- feat: 增加 Page 组件 [`#1220`](https://github.com/ant-design/ant-design-mini/pull/1220)\n- Feat typography [`#1216`](https://github.com/ant-design/ant-design-mini/pull/1216)\n- fix: 微信端noticebar循环失效 [`#1218`](https://github.com/ant-design/ant-design-mini/pull/1218)\n- fix: 修复textarea清楚按钮遮挡问题 [`#1214`](https://github.com/ant-design/ant-design-mini/pull/1214)\n- feat: Revert \"feat: lazy component (#1197)\" [`#1210`](https://github.com/ant-design/ant-design-mini/pull/1210)\n- Detele functional mini [`#1204`](https://github.com/ant-design/ant-design-mini/pull/1204)\n- feat: calendar组件去掉hook实现 [`#1201`](https://github.com/ant-design/ant-design-mini/pull/1201)\n- feat: notice-bar微信版本支持icon插槽 [`#1196`](https://github.com/ant-design/ant-design-mini/pull/1196)\n- Feat no hook picker [`#1199`](https://github.com/ant-design/ant-design-mini/pull/1199)\n- feat: lazy component [`#1197`](https://github.com/ant-design/ant-design-mini/pull/1197)\n- Feat no hook picker [`#1192`](https://github.com/ant-design/ant-design-mini/pull/1192)\n- Feat no hook 2 [`#1189`](https://github.com/ant-design/ant-design-mini/pull/1189)\n- feat: Slider 去掉hook相关实现，并适配微信 [`#1186`](https://github.com/ant-design/ant-design-mini/pull/1186)\n-  Radio & Rate & Selector & Switch & TabBar & Checkbox & Checklist & Collapse & ImageUpload 组件去掉hook相关的实现 [`#1183`](https://github.com/ant-design/ant-design-mini/pull/1183)\n- Fix popup controlled [`#1180`](https://github.com/ant-design/ant-design-mini/pull/1180)\n- fix: popover外部控制状态时的bug [`#1179`](https://github.com/ant-design/ant-design-mini/pull/1179)\n- feat: selector支持插槽 [`#1177`](https://github.com/ant-design/ant-design-mini/pull/1177)\n- Feat popup no hook [`#1173`](https://github.com/ant-design/ant-design-mini/pull/1173)\n- Feat number keyboard no hook [`#1171`](https://github.com/ant-design/ant-design-mini/pull/1171)\n- Feat notice bar no hook [`#1169`](https://github.com/ant-design/ant-design-mini/pull/1169)\n- Feat no hooks input [`#1164`](https://github.com/ant-design/ant-design-mini/pull/1164)\n- feat: DateRangePicker和CascaderPicker增加visible和defaultVisible后完善单元测试 [`#1167`](https://github.com/ant-design/ant-design-mini/pull/1167)\n- feat: DateRangePicker和CascaderPicker支持visible和defaultVisible [`#1158`](https://github.com/ant-design/ant-design-mini/pull/1158)\n- feat: DatePicker增加visible和defaultVisible后完善单元测试 [`#1163`](https://github.com/ant-design/ant-design-mini/pull/1163)\n- fix: 输入框允许清楚的情况下，自动失焦问题 [`#1161`](https://github.com/ant-design/ant-design-mini/pull/1161)\n- Feat progress animation [`#1160`](https://github.com/ant-design/ant-design-mini/pull/1160)\n- feat: progress hook offline [`#1159`](https://github.com/ant-design/ant-design-mini/pull/1159)\n- GuideTour hook offline [`#1157`](https://github.com/ant-design/ant-design-mini/pull/1157)\n- chore: vitest降1.4.0版本 [`#1154`](https://github.com/ant-design/ant-design-mini/pull/1154)\n- fix: [#1149]修复RangePicker和CascaderPicker组件onVisibleChange事件参数未适配微信的问题 [`#1153`](https://github.com/ant-design/ant-design-mini/pull/1153)\n- DatePicker支持visible和defaultVisible [`#1152`](https://github.com/ant-design/ant-design-mini/pull/1152)\n- fix: 修复DatePicker组件onVisibleChange事件参数未适配微信的问题 [`#1150`](https://github.com/ant-design/ant-design-mini/pull/1150)\n- Fix/calendar scroll [`#1147`](https://github.com/ant-design/ant-design-mini/pull/1147)\n- fix: 修复modal微信端无动效问题 [`#1144`](https://github.com/ant-design/ant-design-mini/pull/1144)\n- feat: 支持滚动到当前选择的日期 [`#1145`](https://github.com/ant-design/ant-design-mini/pull/1145)\n- fix: 修复modal微信端无动效问题 [`#1139`](https://github.com/ant-design/ant-design-mini/pull/1139)\n- fix: 修复图片上传中的中文文案问题 [`#1136`](https://github.com/ant-design/ant-design-mini/pull/1136)\n- fix: 修复GuideTour内置中文文案问题 [`#1133`](https://github.com/ant-design/ant-design-mini/pull/1133)\n- fix: 修复picker的内置空状态中文文案和空状态判断问题 [`#1135`](https://github.com/ant-design/ant-design-mini/pull/1135)\n- feat: 优化calendar组件选中交互，日期滚动到可视区域内 [`#1128`](https://github.com/ant-design/ant-design-mini/pull/1128)\n- fix: 修改 SwipeAction 在微信小程序下的 slot [`#1123`](https://github.com/ant-design/ant-design-mini/pull/1123)\n- feat: listitem组件写法优化 [`#1124`](https://github.com/ant-design/ant-design-mini/pull/1124)\n- feat(swiperAction):swiperAction组件新增滑动按钮插槽 [`#1120`](https://github.com/ant-design/ant-design-mini/pull/1120)\n- fix: 修复 loading demo 引用出错的问题 [`#1116`](https://github.com/ant-design/ant-design-mini/pull/1116)\n- feat: 兼容 updateFade 时 item 为 null 的情况 [`#1112`](https://github.com/ant-design/ant-design-mini/pull/1112)\n- fix: 修改 tabs 调用 updateScroll 的时机 [`#1110`](https://github.com/ant-design/ant-design-mini/pull/1110)\n- fix:  修复 FormDynamic 删除 item 后报错的问题 [`#1109`](https://github.com/ant-design/ant-design-mini/pull/1109)\n- fix: 修复 FormImageUpload 上传多张图片失败的问题 [`#1107`](https://github.com/ant-design/ant-design-mini/pull/1107)\n- fix: 修复 form demo 上传图片失败的问题 [`#1106`](https://github.com/ant-design/ant-design-mini/pull/1106)\n- fix: 更新 demo 里组件的前缀 [`#1102`](https://github.com/ant-design/ant-design-mini/pull/1102)\n- fix: demo 示例调整微信版本 ES+ 转换结果 [`#1103`](https://github.com/ant-design/ant-design-mini/pull/1103)\n- fix: 统一 demo 里组件的前缀 [`#1101`](https://github.com/ant-design/ant-design-mini/pull/1101)\n- fix: 修复 form 表单的错误 [`#1100`](https://github.com/ant-design/ant-design-mini/pull/1100)\n- [Part2] 兼容 component1/component2 适配度 [`#1098`](https://github.com/ant-design/ant-design-mini/pull/1098)\n- fix: Avatar/不再消失 [`#1097`](https://github.com/ant-design/ant-design-mini/pull/1097)\n- [Part1] 兼容 component1/component2 适配度  [`#1096`](https://github.com/ant-design/ant-design-mini/pull/1096)\n- fix: 修复 form-picker 等组件在微信平台下获取数值失败的问题 [`#1093`](https://github.com/ant-design/ant-design-mini/pull/1093)\n- fix: 将 demo 的 page.json 改成 json5 [`#1091`](https://github.com/ant-design/ant-design-mini/pull/1091)\n- 大量优化文档表达 [`#1048`](https://github.com/ant-design/ant-design-mini/pull/1048)\n- fix: 修复 tabs 的样式问题 [`#1089`](https://github.com/ant-design/ant-design-mini/pull/1089)\n- fix: 提高 notice bar 测试稳定性 [`#1086`](https://github.com/ant-design/ant-design-mini/pull/1086)\n- fix: 修复 indexbar 无法循环的问题 [`#1085`](https://github.com/ant-design/ant-design-mini/pull/1085)\n- fix: 修复 list-item 缺失 slot 的问题 [`#1084`](https://github.com/ant-design/ant-design-mini/pull/1084)\n- feat: index-index 页面适配微信 [`#1081`](https://github.com/ant-design/ant-design-mini/pull/1081)\n- 一些 demo 适配微信小程序 [`#1080`](https://github.com/ant-design/ant-design-mini/pull/1080)\n- feat: SwipeAction 适配微信小程序与基础库 1.0 [`#1078`](https://github.com/ant-design/ant-design-mini/pull/1078)\n- feat: 更新 SwipeAction 的测试 [`#1079`](https://github.com/ant-design/ant-design-mini/pull/1079)\n- feat: tabs 适配微信 [`#1076`](https://github.com/ant-design/ant-design-mini/pull/1076)\n- feat: 重构 tabs [`#1075`](https://github.com/ant-design/ant-design-mini/pull/1075)\n- ci: added tabs component unit test [`#1073`](https://github.com/ant-design/ant-design-mini/pull/1073)\n- Feat swipe action demos [`#1074`](https://github.com/ant-design/ant-design-mini/pull/1074)\n- feat: 重构 RareWordsKeyboard [`#1067`](https://github.com/ant-design/ant-design-mini/pull/1067)\n- fix: 修改 icon 显示多个的问题 [`#1072`](https://github.com/ant-design/ant-design-mini/pull/1072)\n- feat: 更新 SwipeAction 的 axml [`#1071`](https://github.com/ant-design/ant-design-mini/pull/1071)\n- 重构 NumberKeyboard [`#1065`](https://github.com/ant-design/ant-design-mini/pull/1065)\n- 重构 Collapse [`#1068`](https://github.com/ant-design/ant-design-mini/pull/1068)\n- feat: 更新 RareWordsKeyboard 的测试 [`#1066`](https://github.com/ant-design/ant-design-mini/pull/1066)\n- feat: 重构 noticebar [`#1062`](https://github.com/ant-design/ant-design-mini/pull/1062)\n- feat: 重构 progress 组件 [`#1060`](https://github.com/ant-design/ant-design-mini/pull/1060)\n- 重构 ActionSheet [`#1061`](https://github.com/ant-design/ant-design-mini/pull/1061)\n- feat: 新增三个组件的单元测试 [`#1058`](https://github.com/ant-design/ant-design-mini/pull/1058)\n- feat: 适配 steps [`#1055`](https://github.com/ant-design/ant-design-mini/pull/1055)\n- 适配 Empty 组件 [`#1054`](https://github.com/ant-design/ant-design-mini/pull/1054)\n- 适配 tabbar 组件 [`#1056`](https://github.com/ant-design/ant-design-mini/pull/1056)\n- 更新 Steps 的 axml [`#1053`](https://github.com/ant-design/ant-design-mini/pull/1053)\n- feat: 更新 Badge Grid Pagination 组件 [`#1047`](https://github.com/ant-design/ant-design-mini/pull/1047)\n- feat:  格式化 collapse 的 axml [`#1049`](https://github.com/ant-design/ant-design-mini/pull/1049)\n- 格式化 Numberkeyboard 的 axml [`#1052`](https://github.com/ant-design/ant-design-mini/pull/1052)\n- 更新 tabbar 的 axml [`#1051`](https://github.com/ant-design/ant-design-mini/pull/1051)\n- 更新 progress 的 axml [`#1050`](https://github.com/ant-design/ant-design-mini/pull/1050)\n- Toast 适配微信 [`#1043`](https://github.com/ant-design/ant-design-mini/pull/1043)\n- fix: change types [`#1045`](https://github.com/ant-design/ant-design-mini/pull/1045)\n- feat: tooltip 支持 slot [`#1034`](https://github.com/ant-design/ant-design-mini/pull/1034)\n- docs: fix compiled miss [`#1044`](https://github.com/ant-design/ant-design-mini/pull/1044)\n- 更新 Badge、Grid、Pagination、Toast 的 axml [`#1041`](https://github.com/ant-design/ant-design-mini/pull/1041)\n- fix:  更新 Stepper 在 readonly 模式下的样式 [`#1040`](https://github.com/ant-design/ant-design-mini/pull/1040)\n- feat: stepper 组件增加只读属性 (#1036) [`#1039`](https://github.com/ant-design/ant-design-mini/pull/1039)\n- fix: 修改微信 demo 页的 title [`#1038`](https://github.com/ant-design/ant-design-mini/pull/1038)\n- CheckList 适配微信 [`#1037`](https://github.com/ant-design/ant-design-mini/pull/1037)\n- Modal 适配微信 [`#1035`](https://github.com/ant-design/ant-design-mini/pull/1035)\n- 更新 modal 的 axml [`#1019`](https://github.com/ant-design/ant-design-mini/pull/1019)\n- 更新 NoticeBar 的 axml 以及补充测试 [`#1020`](https://github.com/ant-design/ant-design-mini/pull/1020)\n- Guide Tour 适配微信 [`#1018`](https://github.com/ant-design/ant-design-mini/pull/1018)\n- 重构 GuideTour [`#1017`](https://github.com/ant-design/ant-design-mini/pull/1017)\n- feat: skeleton 适配微信 [`#1033`](https://github.com/ant-design/ant-design-mini/pull/1033)\n- Divider、avatar 组件适配微信 [`#1016`](https://github.com/ant-design/ant-design-mini/pull/1016)\n- 更新 skeleton 的 axml [`#1021`](https://github.com/ant-design/ant-design-mini/pull/1021)\n- feat: popup 组件新增 onAfterShow 与 onAfterClose 事件 [`#1025`](https://github.com/ant-design/ant-design-mini/pull/1025)\n- fix: 修复 axml 错误 [`#1029`](https://github.com/ant-design/ant-design-mini/pull/1029)\n- Feat form wechat demo [`#1028`](https://github.com/ant-design/ant-design-mini/pull/1028)\n- 修复一些之前的类型问题 [`#1027`](https://github.com/ant-design/ant-design-mini/pull/1027)\n- fix: 修复一些 ts 类型、更新 form 的 demo [`#1026`](https://github.com/ant-design/ant-design-mini/pull/1026)\n- fix: 更新 form image upload [`#1024`](https://github.com/ant-design/ant-design-mini/pull/1024)\n- feat: 更新部分 form 组件的 props [`#1022`](https://github.com/ant-design/ant-design-mini/pull/1022)\n- From 组件适配微信 [`#1010`](https://github.com/ant-design/ant-design-mini/pull/1010)\n- 更新 Form 处理事件的方式 [`#1015`](https://github.com/ant-design/ant-design-mini/pull/1015)\n- feat: update time 2022 to 2024 [`#1013`](https://github.com/ant-design/ant-design-mini/pull/1013)\n- 修改支付宝小程序的 demo 的编译参数, 修改为 es6 [`#1011`](https://github.com/ant-design/ant-design-mini/pull/1011)\n- chore: 支持 json5 [`#1009`](https://github.com/ant-design/ant-design-mini/pull/1009)\n- fix:  修复 form 校验时获取的 value 不正确的问题 [`#1006`](https://github.com/ant-design/ant-design-mini/pull/1006)\n- fix: 修复 value 类型为 string 时, 打开出错的问题 [`#1007`](https://github.com/ant-design/ant-design-mini/pull/1007)\n- feat: 更新群二维码 [`#1005`](https://github.com/ant-design/ant-design-mini/pull/1005)\n- 重构 form  [`#1003`](https://github.com/ant-design/ant-design-mini/pull/1003)\n- fix: 修复 date picker 日期显示错误的问题 [`#1001`](https://github.com/ant-design/ant-design-mini/pull/1001)\n- test: 为 form 补全测试 [`#999`](https://github.com/ant-design/ant-design-mini/pull/999)\n- feat: demo 使用 tsx 重写 [`#997`](https://github.com/ant-design/ant-design-mini/pull/997)\n- Form 相关组件使用 tsx 重构 [`#996`](https://github.com/ant-design/ant-design-mini/pull/996)\n- feat: 重写 form-item 的 axml [`#995`](https://github.com/ant-design/ant-design-mini/pull/995)\n- fix: 修复 onSelectMax 无效的问题 [`#993`](https://github.com/ant-design/ant-design-mini/pull/993)\n- feat:  Rate Custom 迁移到微信 [`#992`](https://github.com/ant-design/ant-design-mini/pull/992)\n- feat: selector 适配微信 [`#987`](https://github.com/ant-design/ant-design-mini/pull/987)\n- feat: rate 适配微信 [`#988`](https://github.com/ant-design/ant-design-mini/pull/988)\n- feat: radio 适配微信 [`#989`](https://github.com/ant-design/ant-design-mini/pull/989)\n- fix: 修复 range picker 的 format 警告 [`#991`](https://github.com/ant-design/ant-design-mini/pull/991)\n- radio rate selector 组件使用 functional 重写 [`#986`](https://github.com/ant-design/ant-design-mini/pull/986)\n- feat: tabs 重写为 tsx  [`#985`](https://github.com/ant-design/ant-design-mini/pull/985)\n- feat: selector 重写为 tsx [`#983`](https://github.com/ant-design/ant-design-mini/pull/983)\n- feat: rate 使用 tsx 重写 [`#982`](https://github.com/ant-design/ant-design-mini/pull/982)\n- feat: 使用 tsx 重写 radio [`#981`](https://github.com/ant-design/ant-design-mini/pull/981)\n- feat: ImageUploadControl 适配微信 [`#978`](https://github.com/ant-design/ant-design-mini/pull/978)\n- Date picker 适配微信 [`#977`](https://github.com/ant-design/ant-design-mini/pull/977)\n- Picker 适配微信小程序 [`#976`](https://github.com/ant-design/ant-design-mini/pull/976)\n- feat: 重构 image upload 组件 [`#975`](https://github.com/ant-design/ant-design-mini/pull/975)\n- feat: 重写 range picker 的 axml [`#974`](https://github.com/ant-design/ant-design-mini/pull/974)\n- feat: 重写 range picker [`#972`](https://github.com/ant-design/ant-design-mini/pull/972)\n- feat:  Picker 与 CascaderPicker 组件使用 tsx 重写 [`#971`](https://github.com/ant-design/ant-design-mini/pull/971)\n- fix:  修复 maskClosable 不生效的问题 [`#970`](https://github.com/ant-design/ant-design-mini/pull/970)\n- feat: 更新 image upload 组件的 axml [`#942`](https://github.com/ant-design/ant-design-mini/pull/942)\n- feat: 使用 functional 重构 range picker 组件 [`#969`](https://github.com/ant-design/ant-design-mini/pull/969)\n- test: 更新 DatePicker、Radio、Rate、Selector 的测试 [`#968`](https://github.com/ant-design/ant-design-mini/pull/968)\n- test: 新增 RangePicker 的测试 [`#967`](https://github.com/ant-design/ant-design-mini/pull/967)\n- feat: 更新 date picker 的测试 [`#966`](https://github.com/ant-design/ant-design-mini/pull/966)\n- fix: 修复 build 失败的问题 [`#964`](https://github.com/ant-design/ant-design-mini/pull/964)\n- fix: 更新 cascader-picker 在非受控模式下的渲染流程 [`#963`](https://github.com/ant-design/ant-design-mini/pull/963)\n- fix: 在 steps 使用 a-image 替换 image [`#962`](https://github.com/ant-design/ant-design-mini/pull/962)\n- feat: 更新 image upload 的测试 [`#961`](https://github.com/ant-design/ant-design-mini/pull/961)\n- feat: 重构 CascaderPicker [`#960`](https://github.com/ant-design/ant-design-mini/pull/960)\n- feat: 更新 picker 的测试 [`#958`](https://github.com/ant-design/ant-design-mini/pull/958)\n- feat: 更新 Picker 组件 [`#953`](https://github.com/ant-design/ant-design-mini/pull/953)\n- fix: 修复 slider 在 appx 1.0 报错的问题 [`#956`](https://github.com/ant-design/ant-design-mini/pull/956)\n- Test: 为 picker 组件补全测试 [`#954`](https://github.com/ant-design/ant-design-mini/pull/954)\n- fix: 修复 form-input 缺失 alwaysSystem 的问题 [`#950`](https://github.com/ant-design/ant-design-mini/pull/950)\n- form 支持动态更新 value [`#946`](https://github.com/ant-design/ant-design-mini/pull/946)\n- fix: 修复 selector 逻辑错误的问题 [`#948`](https://github.com/ant-design/ant-design-mini/pull/948)\n- Checkbox 适配微信 [`#941`](https://github.com/ant-design/ant-design-mini/pull/941)\n- 重构 Checkbox [`#940`](https://github.com/ant-design/ant-design-mini/pull/940)\n- feat: 更新 checkbox 的测试 [`#939`](https://github.com/ant-design/ant-design-mini/pull/939)\n- Checkbox 组件使用 tsx 重写 [`#938`](https://github.com/ant-design/ant-design-mini/pull/938)\n- feat: Popup 适配微信 [`#937`](https://github.com/ant-design/ant-design-mini/pull/937)\n- Popup 使用 functional 重构 [`#936`](https://github.com/ant-design/ant-design-mini/pull/936)\n- Slider 适配微信 [`#935`](https://github.com/ant-design/ant-design-mini/pull/935)\n- Input 使用 functional 重构，补全测试 [`#915`](https://github.com/ant-design/ant-design-mini/pull/915)\n- docs: 更新文档 [`#914`](https://github.com/ant-design/ant-design-mini/pull/914)\n- fix: 更新 input 的测试 与 page 的 axml [`#910`](https://github.com/ant-design/ant-design-mini/pull/910)\n- test: Input & Textarea & InputBlur [`#909`](https://github.com/ant-design/ant-design-mini/pull/909)\n- test:   为 Stepper 添加一些测试 [`#908`](https://github.com/ant-design/ant-design-mini/pull/908)\n- Stepper 使用 tsx 重构 [`#906`](https://github.com/ant-design/ant-design-mini/pull/906)\n- Popover 组件适配微信 [`#905`](https://github.com/ant-design/ant-design-mini/pull/905)\n- Popover [`#903`](https://github.com/ant-design/ant-design-mini/pull/903)\n- feat: Textarea & InputBlur 使用 tsx 重构, 补全 props 类型 [`#902`](https://github.com/ant-design/ant-design-mini/pull/902)\n- Input & Stepper [`#901`](https://github.com/ant-design/ant-design-mini/pull/901)\n- ActionSheet 与 Popup 使用 tsxml 重写 [`#899`](https://github.com/ant-design/ant-design-mini/pull/899)\n- ButtonCustom 迁移到 tsx [`#897`](https://github.com/ant-design/ant-design-mini/pull/897)\n- Empty,Avatar 组件迁移到 tsx [`#896`](https://github.com/ant-design/ant-design-mini/pull/896)\n- feat:  在官网增加平台切换功能 [`#891`](https://github.com/ant-design/ant-design-mini/pull/891)\n- fix:   a:if 的元素外层不再嵌套 block [`#889`](https://github.com/ant-design/ant-design-mini/pull/889)\n- 重构 RareWordsKeyboard 的 axml [`#887`](https://github.com/ant-design/ant-design-mini/pull/887)\n- fix: 修复日历组件 demo [`#885`](https://github.com/ant-design/ant-design-mini/pull/885)\n- Component result tsxml [`#883`](https://github.com/ant-design/ant-design-mini/pull/883)\n- fix: 修改 form-textarea 的参数 [`#884`](https://github.com/ant-design/ant-design-mini/pull/884)\n- feat: 更新 result 组件的 axml [`#881`](https://github.com/ant-design/ant-design-mini/pull/881)\n- feat: 更新 list 组件 [`#880`](https://github.com/ant-design/ant-design-mini/pull/880)\n- feat: list 使用 tsxml 重写 [`#879`](https://github.com/ant-design/ant-design-mini/pull/879)\n- feat: 更新 list 的 tsxml [`#878`](https://github.com/ant-design/ant-design-mini/pull/878)\n- fix:  修复微信端日历组件显示不正确的问题 [`#876`](https://github.com/ant-design/ant-design-mini/pull/876)\n- feat: 支持 axml 编译支持 for-key [`#875`](https://github.com/ant-design/ant-design-mini/pull/875)\n- feat:  calendar [`#871`](https://github.com/ant-design/ant-design-mini/pull/871)\n- fix: 优化 text 元素的编译 [`#872`](https://github.com/ant-design/ant-design-mini/pull/872)\n- fix: 删除 dayjs 插件 [`#870`](https://github.com/ant-design/ant-design-mini/pull/870)\n- fix: 修复 switch 的 value 不正确的问题 [`#868`](https://github.com/ant-design/ant-design-mini/pull/868)\n- chore: 新增在 uni-app 使用的指引 [`#867`](https://github.com/ant-design/ant-design-mini/pull/867)\n- fix: 修复 slide 的一些问题 [`#866`](https://github.com/ant-design/ant-design-mini/pull/866)\n- feat: 更新 transform 脚本 [`#865`](https://github.com/ant-design/ant-design-mini/pull/865)\n- chore: 移动测试位置 [`#863`](https://github.com/ant-design/ant-design-mini/pull/863)\n- fix: 删除一些无用的文件 [`#862`](https://github.com/ant-design/ant-design-mini/pull/862)\n- refactor: 调整目录结构 [`#861`](https://github.com/ant-design/ant-design-mini/pull/861)\n- Tag [`#857`](https://github.com/ant-design/ant-design-mini/pull/857)\n- Switch [`#858`](https://github.com/ant-design/ant-design-mini/pull/858)\n- fix: raise the layer of picker mask to a compositing layer [`#859`](https://github.com/ant-design/ant-design-mini/pull/859)\n- fix: button loading [`#856`](https://github.com/ant-design/ant-design-mini/pull/856)\n- Button [`#855`](https://github.com/ant-design/ant-design-mini/pull/855)\n- 更新 icon 组件 [`#851`](https://github.com/ant-design/ant-design-mini/pull/851)\n- fix: 修复日历组件 default value 不生效的问题 [`#853`](https://github.com/ant-design/ant-design-mini/pull/853)\n- chore: 格式化 less [`#852`](https://github.com/ant-design/ant-design-mini/pull/852)\n- fix: 修复测试 [`#848`](https://github.com/ant-design/ant-design-mini/pull/848)\n- fix: 增补字库以及修复生僻字输入键盘一些问题 (#844) [`#845`](https://github.com/ant-design/ant-design-mini/pull/845)\n- 新增 tsxml [`#838`](https://github.com/ant-design/ant-design-mini/pull/838)\n- chore: 格式化 axml [`#843`](https://github.com/ant-design/ant-design-mini/pull/843)\n- fix: 修复 FormImageUpload on remove 不生效的问题 [`#842`](https://github.com/ant-design/ant-design-mini/pull/842)\n- fix:  优化 axml 的写法 [`#837`](https://github.com/ant-design/ant-design-mini/pull/837)\n- feat: 优化升级指引 [`#834`](https://github.com/ant-design/ant-design-mini/pull/834)\n- fix: 修改项目的 description [`#835`](https://github.com/ant-design/ant-design-mini/pull/835)\n- feat: 更新官网导航地址 [`#833`](https://github.com/ant-design/ant-design-mini/pull/833)\n- feat: 更新首页样式，并且新增 uploader 的 demo [`#832`](https://github.com/ant-design/ant-design-mini/pull/832)\n- feat: 增加函数式组件的说明 [`#828`](https://github.com/ant-design/ant-design-mini/pull/828)\n- fix: 修改 demo 的 appid [`#830`](https://github.com/ant-design/ant-design-mini/pull/830)\n- feat: 升级到 2.0 [`#826`](https://github.com/ant-design/ant-design-mini/pull/826)\n- fix: should not use element selector [`#808`](https://github.com/ant-design/ant-design-mini/pull/808)\n- feat: 使用 vm 进行测试 [`#817`](https://github.com/ant-design/ant-design-mini/pull/817)\n- fix: fix form-textarea onFocus not working [`#814`](https://github.com/ant-design/ant-design-mini/pull/814)\n- fix: 修复 form 表单 createForm Api 误写问题 [`#806`](https://github.com/ant-design/ant-design-mini/pull/806)\n- fix: 修复文档中 iOS 的大小写问题 [`#805`](https://github.com/ant-design/ant-design-mini/pull/805)\n- feat: 修改indexbar bug [`#802`](https://github.com/ant-design/ant-design-mini/pull/802)\n- fix: tabs [`#801`](https://github.com/ant-design/ant-design-mini/pull/801)\n- fix: stepper [`#799`](https://github.com/ant-design/ant-design-mini/pull/799)\n- fix: DatePicker [`#796`](https://github.com/ant-design/ant-design-mini/pull/796)\n- fix: stepper [`#795`](https://github.com/ant-design/ant-design-mini/pull/795)\n- fix(Picker): fix content slot [`#794`](https://github.com/ant-design/ant-design-mini/pull/794)\n- fix: stepper [`#792`](https://github.com/ant-design/ant-design-mini/pull/792)\n- fix: missing FormTextareaDefaultProps [`#791`](https://github.com/ant-design/ant-design-mini/pull/791)\n- chore: 统一id前缀 [`#786`](https://github.com/ant-design/ant-design-mini/pull/786)\n- fix: tabs [`#784`](https://github.com/ant-design/ant-design-mini/pull/784)\n- feat: tabs [`#780`](https://github.com/ant-design/ant-design-mini/pull/780)\n- fix: Progress [`#776`](https://github.com/ant-design/ant-design-mini/pull/776)\n- fix(Picker): fix content slot [`#773`](https://github.com/ant-design/ant-design-mini/pull/773)\n- fix: slider [`#769`](https://github.com/ant-design/ant-design-mini/pull/769)\n- fix: form [`#768`](https://github.com/ant-design/ant-design-mini/pull/768)\n- feat(RangePicker): 修改切换交互 [`#762`](https://github.com/ant-design/ant-design-mini/pull/762)\n- fix: Picker [`#761`](https://github.com/ant-design/ant-design-mini/pull/761)\n- fix: 调整滑动组件的默认起始偏移量 [`#754`](https://github.com/ant-design/ant-design-mini/pull/754)\n- feat: 更新字库数据 [`#752`](https://github.com/ant-design/ant-design-mini/pull/752)\n- chore: build [`#750`](https://github.com/ant-design/ant-design-mini/pull/750)\n- fix: button [`#749`](https://github.com/ant-design/ant-design-mini/pull/749)\n- fix: stepper [`#748`](https://github.com/ant-design/ant-design-mini/pull/748)\n- fix: stepper [`#746`](https://github.com/ant-design/ant-design-mini/pull/746)\n- fix: form [`#737`](https://github.com/ant-design/ant-design-mini/pull/737)\n- feat(collapse): 清除console.log [`#736`](https://github.com/ant-design/ant-design-mini/pull/736)\n- fix: slider [`#732`](https://github.com/ant-design/ant-design-mini/pull/732)\n- feat(Slider): 阻止左右滑动时上下滑动 [`#731`](https://github.com/ant-design/ant-design-mini/pull/731)\n- fix: button [`#730`](https://github.com/ant-design/ant-design-mini/pull/730)\n- feat(picker): picker组件代码示例修改header-&gt;title [`#726`](https://github.com/ant-design/ant-design-mini/pull/726)\n- fix: slider [`#722`](https://github.com/ant-design/ant-design-mini/pull/722)\n- fix(Picker): picker-view value [`#720`](https://github.com/ant-design/ant-design-mini/pull/720)\n- chore(docs): 修改rules跳转链接 [`#719`](https://github.com/ant-design/ant-design-mini/pull/719)\n- feat: tabs [`#715`](https://github.com/ant-design/ant-design-mini/pull/715)\n- fix: less [`#714`](https://github.com/ant-design/ant-design-mini/pull/714)\n- docs: 错别字修改 [`#713`](https://github.com/ant-design/ant-design-mini/pull/713)\n- docs(RangePicker): 更新文档 [`#712`](https://github.com/ant-design/ant-design-mini/pull/712)\n- fix(Steps): delete empty axml onTap [`#711`](https://github.com/ant-design/ant-design-mini/pull/711)\n- fix(selector): 修复选中判断 [`#707`](https://github.com/ant-design/ant-design-mini/pull/707)\n- fix: form [`#705`](https://github.com/ant-design/ant-design-mini/pull/705)\n- feat(Popup): add animationType [`#704`](https://github.com/ant-design/ant-design-mini/pull/704)\n- fix: stepper [`#698`](https://github.com/ant-design/ant-design-mini/pull/698)\n- fix: form [`#685`](https://github.com/ant-design/ant-design-mini/pull/685)\n- feat: form [`#674`](https://github.com/ant-design/ant-design-mini/pull/674)\n- fix(FormInput): 表单对齐 [`#680`](https://github.com/ant-design/ant-design-mini/pull/680)\n- fix(Stepper): fix controlled [`#673`](https://github.com/ant-design/ant-design-mini/pull/673)\n- chore: remove useless code [`#671`](https://github.com/ant-design/ant-design-mini/pull/671)\n- fix: form [`#667`](https://github.com/ant-design/ant-design-mini/pull/667)\n- ci: add Picker、CascaderPicker test [`#665`](https://github.com/ant-design/ant-design-mini/pull/665)\n- docs(Popup): 文档添加滚动FAQ [`#666`](https://github.com/ant-design/ant-design-mini/pull/666)\n- docs(Grid): 更新Grid demo [`#663`](https://github.com/ant-design/ant-design-mini/pull/663)\n- feat: form [`#661`](https://github.com/ant-design/ant-design-mini/pull/661)\n- feat(DatePicker): add onFormatLabel [`#660`](https://github.com/ant-design/ant-design-mini/pull/660)\n- fix: 修复路径问题 [`#659`](https://github.com/ant-design/ant-design-mini/pull/659)\n- chore: build [`#658`](https://github.com/ant-design/ant-design-mini/pull/658)\n- feat: 修复生僻字键盘demo字符无法展示的问题 [`#656`](https://github.com/ant-design/ant-design-mini/pull/656)\n- fix(FormInput): onFocus [`#652`](https://github.com/ant-design/ant-design-mini/pull/652)\n- fix(Divider): type missing [`#651`](https://github.com/ant-design/ant-design-mini/pull/651)\n- feat: 案例添加onChange监听 [`#650`](https://github.com/ant-design/ant-design-mini/pull/650)\n- feat(Grid): add icon、title、description slot [`#638`](https://github.com/ant-design/ant-design-mini/pull/638)\n- Feat/form [`#632`](https://github.com/ant-design/ant-design-mini/pull/632)\n- feat: input controlled [`#633`](https://github.com/ant-design/ant-design-mini/pull/633)\n- chore: build [`#631`](https://github.com/ant-design/ant-design-mini/pull/631)\n- feat: 新增生僻字键盘 [`#603`](https://github.com/ant-design/ant-design-mini/pull/603)\n- feat(Form): add getFieldsValue api for Form [`#620`](https://github.com/ant-design/ant-design-mini/pull/620)\n- fix: fix FormRadioGroup、FormCheckboxGroup、FormSelector disabled [`#622`](https://github.com/ant-design/ant-design-mini/pull/622)\n- fix: 修复横向滚动条问题 [`#617`](https://github.com/ant-design/ant-design-mini/pull/617)\n- chore: build [`#614`](https://github.com/ant-design/ant-design-mini/pull/614)\n- feat(Popup): 优化动画性能 [`#613`](https://github.com/ant-design/ant-design-mini/pull/613)\n- chore: build [`#612`](https://github.com/ant-design/ant-design-mini/pull/612)\n- Chore/build [`#586`](https://github.com/ant-design/ant-design-mini/pull/586)\n- Feat/form [`#606`](https://github.com/ant-design/ant-design-mini/pull/606)\n- feat: 添加更多的less变量 [`#596`](https://github.com/ant-design/ant-design-mini/pull/596)\n- feat: 解决form-json 样式 [`#595`](https://github.com/ant-design/ant-design-mini/pull/595)\n- fix: steps [`#594`](https://github.com/ant-design/ant-design-mini/pull/594)\n- docs: indexbar [`#602`](https://github.com/ant-design/ant-design-mini/pull/602)\n- chore: build [`#601`](https://github.com/ant-design/ant-design-mini/pull/601)\n- fix: indexbar query select [`#599`](https://github.com/ant-design/ant-design-mini/pull/599)\n- fix: switch [`#591`](https://github.com/ant-design/ant-design-mini/pull/591)\n- fix: form [`#588`](https://github.com/ant-design/ant-design-mini/pull/588)\n- fix: steps [`#584`](https://github.com/ant-design/ant-design-mini/pull/584)\n- docs: form [`#582`](https://github.com/ant-design/ant-design-mini/pull/582)\n- docs: form [`#579`](https://github.com/ant-design/ant-design-mini/pull/579)\n- ci: test [`#581`](https://github.com/ant-design/ant-design-mini/pull/581)\n- docs(tabs): 修改文档错别字 [`#577`](https://github.com/ant-design/ant-design-mini/pull/577)\n- ci: test [`#574`](https://github.com/ant-design/ant-design-mini/pull/574)\n- feat: 新版本 [`#573`](https://github.com/ant-design/ant-design-mini/pull/573)\n- docs: 修改文档 [`#572`](https://github.com/ant-design/ant-design-mini/pull/572)\n- fix(Container): 修复钉钉下headerRight 不显示 [`#570`](https://github.com/ant-design/ant-design-mini/pull/570)\n- fix(Container): fix overflow style [`#568`](https://github.com/ant-design/ant-design-mini/pull/568)\n- docs: fix url [`#567`](https://github.com/ant-design/ant-design-mini/pull/567)\n- docs: add CheckboxCustomGroup demo [`#566`](https://github.com/ant-design/ant-design-mini/pull/566)\n- docs: add collapse checkbox [`#565`](https://github.com/ant-design/ant-design-mini/pull/565)\n- feat(Container): 无title、headerRight时隐藏header [`#560`](https://github.com/ant-design/ant-design-mini/pull/560)\n- chore(formItem): 删除formItem无用代码 [`#562`](https://github.com/ant-design/ant-design-mini/pull/562)\n- docs(collapse): 文档透出CollapseItem的disabled字段 [`#561`](https://github.com/ant-design/ant-design-mini/pull/561)\n- fix(swiperAction): 删除alipay-style依赖,修复swiperAction样式引入问题 [`#556`](https://github.com/ant-design/ant-design-mini/pull/556)\n- fix(form): 删除form在0.x下导致千牛端报错的无用代码 [`#555`](https://github.com/ant-design/ant-design-mini/pull/555)\n- chore: build [`#554`](https://github.com/ant-design/ant-design-mini/pull/554)\n- chore: build [`#553`](https://github.com/ant-design/ant-design-mini/pull/553)\n- feat: 修改Modal demo [`#552`](https://github.com/ant-design/ant-design-mini/pull/552)\n- feat: 更新openbox版本&升级demo功能 [`#542`](https://github.com/ant-design/ant-design-mini/pull/542)\n- chore: 删除无用代码 [`#551`](https://github.com/ant-design/ant-design-mini/pull/551)\n- docs: 修改文档 [`#549`](https://github.com/ant-design/ant-design-mini/pull/549)\n- docs: 修改使用文档 [`#548`](https://github.com/ant-design/ant-design-mini/pull/548)\n- ci: test [`#526`](https://github.com/ant-design/ant-design-mini/pull/526)\n- docs: 修改文档 [`#546`](https://github.com/ant-design/ant-design-mini/pull/546)\n- chore: build [`#543`](https://github.com/ant-design/ant-design-mini/pull/543)\n- Feat/swipe width [`#538`](https://github.com/ant-design/ant-design-mini/pull/538)\n-  indicatorClass 统一命名为 indicatorClassName&修改Picker、DatePicker文档 [`#541`](https://github.com/ant-design/ant-design-mini/pull/541)\n- docs(noticeBar): 文档透出extra插槽 [`#540`](https://github.com/ant-design/ant-design-mini/pull/540)\n- feat(picker): picker indicatorClass 统一命名为 indicatorClassName [`#539`](https://github.com/ant-design/ant-design-mini/pull/539)\n- docs(input): 文档透出type属性 [`#537`](https://github.com/ant-design/ant-design-mini/pull/537)\n- chore(imageUpload): 调整 ImageUpload 文档 [`#535`](https://github.com/ant-design/ant-design-mini/pull/535)\n- feat: 修改swipe组件的示例表达 [`#534`](https://github.com/ant-design/ant-design-mini/pull/534)\n- chore: build [`#532`](https://github.com/ant-design/ant-design-mini/pull/532)\n- fix: docs [`#530`](https://github.com/ant-design/ant-design-mini/pull/530)\n- fix: radio [`#529`](https://github.com/ant-design/ant-design-mini/pull/529)\n- fix: checkbox [`#528`](https://github.com/ant-design/ant-design-mini/pull/528)\n- fix(docs): fix icon docs - clear invalid [`#525`](https://github.com/ant-design/ant-design-mini/pull/525)\n- fix: docs [`#524`](https://github.com/ant-design/ant-design-mini/pull/524)\n- feat: 修改Tabbar文档 [`#523`](https://github.com/ant-design/ant-design-mini/pull/523)\n- fix: popover [`#522`](https://github.com/ant-design/ant-design-mini/pull/522)\n- fix: popover [`#519`](https://github.com/ant-design/ant-design-mini/pull/519)\n- fix: input [`#520`](https://github.com/ant-design/ant-design-mini/pull/520)\n- fix: fix CascaderPicker dynamic options [`#517`](https://github.com/ant-design/ant-design-mini/pull/517)\n- fix: form [`#516`](https://github.com/ant-design/ant-design-mini/pull/516)\n- feat: 添加数字键盘的md属性说明 [`#514`](https://github.com/ant-design/ant-design-mini/pull/514)\n- fix: tabs [`#512`](https://github.com/ant-design/ant-design-mini/pull/512)\n- fix: build [`#511`](https://github.com/ant-design/ant-design-mini/pull/511)\n- fix: button [`#510`](https://github.com/ant-design/ant-design-mini/pull/510)\n- Feat/number keyboard [`#504`](https://github.com/ant-design/ant-design-mini/pull/504)\n- feat: add SelectorFilter demo [`#509`](https://github.com/ant-design/ant-design-mini/pull/509)\n- feat: 修改Checkbox、Radio icon样式优先级 [`#505`](https://github.com/ant-design/ant-design-mini/pull/505)\n- feat: 去除indexbar中示例2的滚动条 [`#503`](https://github.com/ant-design/ant-design-mini/pull/503)\n- feat: 修改Selector文档 [`#501`](https://github.com/ant-design/ant-design-mini/pull/501)\n- fix: fix Picker style [`#499`](https://github.com/ant-design/ant-design-mini/pull/499)\n- fix: fix FormCheckboxGroup、FormRadioGroup label slot [`#497`](https://github.com/ant-design/ant-design-mini/pull/497)\n- feat: add destroyOnClose [`#495`](https://github.com/ant-design/ant-design-mini/pull/495)\n- feat: update docs [`#491`](https://github.com/ant-design/ant-design-mini/pull/491)\n- fix: catchTap [`#489`](https://github.com/ant-design/ant-design-mini/pull/489)\n- fix: docs [`#487`](https://github.com/ant-design/ant-design-mini/pull/487)\n- feat: loading组件兼容dsl转微信小程序 [`#462`](https://github.com/ant-design/ant-design-mini/pull/462)\n- fix: form [`#486`](https://github.com/ant-design/ant-design-mini/pull/486)\n- fix: fix Tabs scrollLeft [`#482`](https://github.com/ant-design/ant-design-mini/pull/482)\n- Feat/swipe action md [`#473`](https://github.com/ant-design/ant-design-mini/pull/473)\n- 1.0 wyj [`#467`](https://github.com/ant-design/ant-design-mini/pull/467)\n- feat: 官网导航添加国内镜像&版本切换 [`#479`](https://github.com/ant-design/ant-design-mini/pull/479)\n- Feat/indexbar width [`#474`](https://github.com/ant-design/ant-design-mini/pull/474)\n- fix: fix Picker、DatePicker not sync error [`#477`](https://github.com/ant-design/ant-design-mini/pull/477)\n- feat: 增加swipe action 在2.0中使用说明 [`#471`](https://github.com/ant-design/ant-design-mini/pull/471)\n- feat: 增加indexBar的可触摸宽度 [`#470`](https://github.com/ant-design/ant-design-mini/pull/470)\n- fix: value [`#469`](https://github.com/ant-design/ant-design-mini/pull/469)\n- feat: add form custom [`#466`](https://github.com/ant-design/ant-design-mini/pull/466)\n- fix: form [`#464`](https://github.com/ant-design/ant-design-mini/pull/464)\n- Fix/popup [`#461`](https://github.com/ant-design/ant-design-mini/pull/461)\n- fix: input [`#459`](https://github.com/ant-design/ant-design-mini/pull/459)\n- Fix/input [`#458`](https://github.com/ant-design/ant-design-mini/pull/458)\n- chore: build [`#457`](https://github.com/ant-design/ant-design-mini/pull/457)\n- 1.0 wyj [`#454`](https://github.com/ant-design/ant-design-mini/pull/454)\n- 1.0 wyj [`#452`](https://github.com/ant-design/ant-design-mini/pull/452)\n- Fix/style [`#450`](https://github.com/ant-design/ant-design-mini/pull/450)\n- fix: empty [`#449`](https://github.com/ant-design/ant-design-mini/pull/449)\n- Feat/indexbar filename [`#447`](https://github.com/ant-design/ant-design-mini/pull/447)\n- Feat/swipe actipn case [`#446`](https://github.com/ant-design/ant-design-mini/pull/446)\n- Feat/index bar [`#445`](https://github.com/ant-design/ant-design-mini/pull/445)\n- Fix/style [`#443`](https://github.com/ant-design/ant-design-mini/pull/443)\n- chore: build [`#442`](https://github.com/ant-design/ant-design-mini/pull/442)\n- Fix/style [`#437`](https://github.com/ant-design/ant-design-mini/pull/437)\n- 1.0 wyj [`#439`](https://github.com/ant-design/ant-design-mini/pull/439)\n- fix: rate [`#436`](https://github.com/ant-design/ant-design-mini/pull/436)\n- 1.0 wyj [`#435`](https://github.com/ant-design/ant-design-mini/pull/435)\n- fix: ImageUpload [`#433`](https://github.com/ant-design/ant-design-mini/pull/433)\n- Feat/indexbar [`#432`](https://github.com/ant-design/ant-design-mini/pull/432)\n- fix: fix GuideTour button [`#430`](https://github.com/ant-design/ant-design-mini/pull/430)\n- fix: prefix [`#429`](https://github.com/ant-design/ant-design-mini/pull/429)\n- fix: tabs [`#428`](https://github.com/ant-design/ant-design-mini/pull/428)\n- Fix/input [`#427`](https://github.com/ant-design/ant-design-mini/pull/427)\n- 1.0 wyj new [`#426`](https://github.com/ant-design/ant-design-mini/pull/426)\n- fix: build [`#423`](https://github.com/ant-design/ant-design-mini/pull/423)\n- Fix/style [`#421`](https://github.com/ant-design/ant-design-mini/pull/421)\n- 1.0 wyj new2 [`#422`](https://github.com/ant-design/ant-design-mini/pull/422)\n- feat: swipe-action兼容appx1.0版本 [`#418`](https://github.com/ant-design/ant-design-mini/pull/418)\n- Fix/form [`#416`](https://github.com/ant-design/ant-design-mini/pull/416)\n- 1.0 wyj new1 [`#415`](https://github.com/ant-design/ant-design-mini/pull/415)\n- feat: adjust Popup props [`#414`](https://github.com/ant-design/ant-design-mini/pull/414)\n- 1.0 wyj new1 [`#412`](https://github.com/ant-design/ant-design-mini/pull/412)\n- fix: button [`#413`](https://github.com/ant-design/ant-design-mini/pull/413)\n- fix: mixin value [`#411`](https://github.com/ant-design/ant-design-mini/pull/411)\n- fix: checkbox radiobox [`#410`](https://github.com/ant-design/ant-design-mini/pull/410)\n- fix: skeleton [`#409`](https://github.com/ant-design/ant-design-mini/pull/409)\n- fix: container [`#408`](https://github.com/ant-design/ant-design-mini/pull/408)\n- fix: loading [`#407`](https://github.com/ant-design/ant-design-mini/pull/407)\n- fix: avatar [`#406`](https://github.com/ant-design/ant-design-mini/pull/406)\n- fix: button [`#405`](https://github.com/ant-design/ant-design-mini/pull/405)\n- fix: input [`#402`](https://github.com/ant-design/ant-design-mini/pull/402)\n- fix: collapse [`#404`](https://github.com/ant-design/ant-design-mini/pull/404)\n- fix: input [`#401`](https://github.com/ant-design/ant-design-mini/pull/401)\n- fix: tabs [`#400`](https://github.com/ant-design/ant-design-mini/pull/400)\n- feat: Popover 1.0 & ImageIcon [`#399`](https://github.com/ant-design/ant-design-mini/pull/399)\n- feat: form-slider [`#398`](https://github.com/ant-design/ant-design-mini/pull/398)\n- fix: slider [`#397`](https://github.com/ant-design/ant-design-mini/pull/397)\n- 1.0 new [`#395`](https://github.com/ant-design/ant-design-mini/pull/395)\n- feat: review swipe action [`#394`](https://github.com/ant-design/ant-design-mini/pull/394)\n- Fix/badge [`#393`](https://github.com/ant-design/ant-design-mini/pull/393)\n- feat: 移除废弃组件 [`#390`](https://github.com/ant-design/ant-design-mini/pull/390)\n- fix: fix value [`#389`](https://github.com/ant-design/ant-design-mini/pull/389)\n- fix: input onChange [`#387`](https://github.com/ant-design/ant-design-mini/pull/387)\n- Fix/button [`#386`](https://github.com/ant-design/ant-design-mini/pull/386)\n- fix: button [`#384`](https://github.com/ant-design/ant-design-mini/pull/384)\n- feat: Grid 1.0 [`#385`](https://github.com/ant-design/ant-design-mini/pull/385)\n- feat: Modal props [`#381`](https://github.com/ant-design/ant-design-mini/pull/381)\n- feat: GuideTour、Tabbar、Picker、DatePicker、Selector、Checkbox controlled [`#379`](https://github.com/ant-design/ant-design-mini/pull/379)\n- feat: checklist controlled [`#378`](https://github.com/ant-design/ant-design-mini/pull/378)\n- Fix/form [`#377`](https://github.com/ant-design/ant-design-mini/pull/377)\n- Refactor/blade view [`#375`](https://github.com/ant-design/ant-design-mini/pull/375)\n- feat: refactor divider [`#374`](https://github.com/ant-design/ant-design-mini/pull/374)\n- fix: form [`#369`](https://github.com/ant-design/ant-design-mini/pull/369)\n- fix: loading [`#368`](https://github.com/ant-design/ant-design-mini/pull/368)\n- 1.0 wyj [`#367`](https://github.com/ant-design/ant-design-mini/pull/367)\n- fix: loading [`#365`](https://github.com/ant-design/ant-design-mini/pull/365)\n- 1.0 wyj [`#363`](https://github.com/ant-design/ant-design-mini/pull/363)\n- chore: build [`#364`](https://github.com/ant-design/ant-design-mini/pull/364)\n- feat: add surge [`#362`](https://github.com/ant-design/ant-design-mini/pull/362)\n- chore: build [`#361`](https://github.com/ant-design/ant-design-mini/pull/361)\n- feat(empty): refactor empty [`#359`](https://github.com/ant-design/ant-design-mini/pull/359)\n- 1.0 wyj [`#360`](https://github.com/ant-design/ant-design-mini/pull/360)\n- feat: Picker、DatePicker、RangePicker、CascaderPicker defaultValue&Form [`#357`](https://github.com/ant-design/ant-design-mini/pull/357)\n- fix: tabs [`#358`](https://github.com/ant-design/ant-design-mini/pull/358)\n- chore: build [`#356`](https://github.com/ant-design/ant-design-mini/pull/356)\n- Fix/input [`#355`](https://github.com/ant-design/ant-design-mini/pull/355)\n- Refactor/loading [`#353`](https://github.com/ant-design/ant-design-mini/pull/353)\n- feat(loading): refactor loading [`#351`](https://github.com/ant-design/ant-design-mini/pull/351)\n- feat: update demo style [`#352`](https://github.com/ant-design/ant-design-mini/pull/352)\n- feat(toast): refactor toast [`#350`](https://github.com/ant-design/ant-design-mini/pull/350)\n- fix: form [`#338`](https://github.com/ant-design/ant-design-mini/pull/338)\n- Fix/default current [`#341`](https://github.com/ant-design/ant-design-mini/pull/341)\n- feat(skeleton): resolve conflict [`#348`](https://github.com/ant-design/ant-design-mini/pull/348)\n- feat(skeleton): refactor skeleton [`#342`](https://github.com/ant-design/ant-design-mini/pull/342)\n- feat: update progress、tag、demo [`#347`](https://github.com/ant-design/ant-design-mini/pull/347)\n- feat(result): refactor result [`#340`](https://github.com/ant-design/ant-design-mini/pull/340)\n- Fix/steps [`#329`](https://github.com/ant-design/ant-design-mini/pull/329)\n- feat(selector): refactor selector [`#336`](https://github.com/ant-design/ant-design-mini/pull/336)\n- feat: 修改路由配置json [`#330`](https://github.com/ant-design/ant-design-mini/pull/330)\n- Fix/collapse [`#324`](https://github.com/ant-design/ant-design-mini/pull/324)\n- Feat/swipe action px [`#326`](https://github.com/ant-design/ant-design-mini/pull/326)\n- Fix/tabs [`#316`](https://github.com/ant-design/ant-design-mini/pull/316)\n- feat: refactor stepper [`#323`](https://github.com/ant-design/ant-design-mini/pull/323)\n- Feat/swipw action dark [`#319`](https://github.com/ant-design/ant-design-mini/pull/319)\n- fix: rename css variable [`#322`](https://github.com/ant-design/ant-design-mini/pull/322)\n- feat: Checkbox、Radio、CheckboxGroup dark style [`#320`](https://github.com/ant-design/ant-design-mini/pull/320)\n- feat(slider): refactor slider components, include style props [`#321`](https://github.com/ant-design/ant-design-mini/pull/321)\n- feat: Tabbar、VTabs、Tabs、Checklist、Input、ImageUpload dark style [`#314`](https://github.com/ant-design/ant-design-mini/pull/314)\n- fix: Container style [`#312`](https://github.com/ant-design/ant-design-mini/pull/312)\n- feat: refactor videoUpload [`#311`](https://github.com/ant-design/ant-design-mini/pull/311)\n- [WIP] Fix/props [`#309`](https://github.com/ant-design/ant-design-mini/pull/309)\n- Next calendar [`#300`](https://github.com/ant-design/ant-design-mini/pull/300)\n- feat: Grid style [`#301`](https://github.com/ant-design/ant-design-mini/pull/301)\n- feat: NoticeBar style [`#296`](https://github.com/ant-design/ant-design-mini/pull/296)\n- feat: adjust 1.0props [`#293`](https://github.com/ant-design/ant-design-mini/pull/293)\n- Feat/swipe action new [`#287`](https://github.com/ant-design/ant-design-mini/pull/287)\n- feat: style [`#279`](https://github.com/ant-design/ant-design-mini/pull/279)\n- 1.0 sxs [`#286`](https://github.com/ant-design/ant-design-mini/pull/286)\n- fix(inputItem): remove repeat import [`#271`](https://github.com/ant-design/ant-design-mini/pull/271)\n- Fix/home page [`#282`](https://github.com/ant-design/ant-design-mini/pull/282)\n- feat: support badge [`#262`](https://github.com/ant-design/ant-design-mini/pull/262)\n- Feat/home page [`#243`](https://github.com/ant-design/ant-design-mini/pull/243)\n- chore(docs): 调整stepper type说明文档 [`#275`](https://github.com/ant-design/ant-design-mini/pull/275)\n- chore(docs): 修复错误文档 [`#264`](https://github.com/ant-design/ant-design-mini/pull/264)\n- style: 定位重复 [`#263`](https://github.com/ant-design/ant-design-mini/pull/263)\n- feat(Rate): new Component [`#155`](https://github.com/ant-design/ant-design-mini/pull/155)\n- feat: Picker、DatePicker add maskClosable [`#249`](https://github.com/ant-design/ant-design-mini/pull/249)\n- Feat/tabs elevator [`#231`](https://github.com/ant-design/ant-design-mini/pull/231)\n- Feat/guide tour un controlled [`#245`](https://github.com/ant-design/ant-design-mini/pull/245)\n- fix(imageUpload): fix onBeforeUpload [`#258`](https://github.com/ant-design/ant-design-mini/pull/258)\n- fix(imageUpload): fix onBeforeUpload [`#257`](https://github.com/ant-design/ant-design-mini/pull/257)\n- fix(imageUpload): fix onBeforeUpload [`#256`](https://github.com/ant-design/ant-design-mini/pull/256)\n- feat: Compatible dingding appx1.x that chooseImage return different value [`#253`](https://github.com/ant-design/ant-design-mini/pull/253)\n- feat: compatibility value is string in uploader [`#252`](https://github.com/ant-design/ant-design-mini/pull/252)\n- feat(Popup): add  autoHeight props [`#247`](https://github.com/ant-design/ant-design-mini/pull/247)\n- feat(ProgressCircle): new Component [`#154`](https://github.com/ant-design/ant-design-mini/pull/154)\n- feat(GuideTour): new component  [`#220`](https://github.com/ant-design/ant-design-mini/pull/220)\n- feat(Tabs): delete useless style [`#229`](https://github.com/ant-design/ant-design-mini/pull/229)\n- feat(datePicker): adjust minutes and seconds range [`#239`](https://github.com/ant-design/ant-design-mini/pull/239)\n- Feat/slider new [`#237`](https://github.com/ant-design/ant-design-mini/pull/237)\n- Feat/slider new [`#233`](https://github.com/ant-design/ant-design-mini/pull/233)\n- docs(tabs): new stickyTop props in md [`#230`](https://github.com/ant-design/ant-design-mini/pull/230)\n- Feat/slider new [`#144`](https://github.com/ant-design/ant-design-mini/pull/144)\n- fix(NoticeBar): fix marquee on pageHide [`#225`](https://github.com/ant-design/ant-design-mini/pull/225)\n- feat(Tabs): add event param to `onChange` [`#228`](https://github.com/ant-design/ant-design-mini/pull/228)\n- feat(config): open dumi sitemap and ssr to implement docsearch [`#224`](https://github.com/ant-design/ant-design-mini/pull/224)\n- feat(Popup): add close animation [`#223`](https://github.com/ant-design/ant-design-mini/pull/223)\n- feat(Tabs): support badge [`#203`](https://github.com/ant-design/ant-design-mini/pull/203)\n- Feat/mask disable scroll [`#207`](https://github.com/ant-design/ant-design-mini/pull/207)\n- feat(imageUpload): support different value type [`#218`](https://github.com/ant-design/ant-design-mini/pull/218)\n- feat(videoUpload): support different value type [`#219`](https://github.com/ant-design/ant-design-mini/pull/219)\n- fix(inputItem): fix input care color [`#217`](https://github.com/ant-design/ant-design-mini/pull/217)\n- docs: adjust Picker readme [`#215`](https://github.com/ant-design/ant-design-mini/pull/215)\n- feat(BladeView): remove useless refer and format style [`#211`](https://github.com/ant-design/ant-design-mini/pull/211)\n- fix(bladeView): fix sticky style and value name [`#214`](https://github.com/ant-design/ant-design-mini/pull/214)\n- Feat/picker [`#208`](https://github.com/ant-design/ant-design-mini/pull/208)\n- feat(Switch): modify handleIcon box-shadow [`#213`](https://github.com/ant-design/ant-design-mini/pull/213)\n- Feat/blade view [`#133`](https://github.com/ant-design/ant-design-mini/pull/133)\n- Feat/tabbar [`#209`](https://github.com/ant-design/ant-design-mini/pull/209)\n- feat(Tabbar): new component [`#151`](https://github.com/ant-design/ant-design-mini/pull/151)\n- feat(ProgressBar): new Component [`#140`](https://github.com/ant-design/ant-design-mini/pull/140)\n- Feat/demo [`#205`](https://github.com/ant-design/ant-design-mini/pull/205)\n- Feat/event data [`#202`](https://github.com/ant-design/ant-design-mini/pull/202)\n- Add event to input component‘event [`#196`](https://github.com/ant-design/ant-design-mini/pull/196)\n- Chore/docs [`#204`](https://github.com/ant-design/ant-design-mini/pull/204)\n- ci: update release workflow [`#200`](https://github.com/ant-design/ant-design-mini/pull/200)\n- feat(Switch): switch onChange support event [`#198`](https://github.com/ant-design/ant-design-mini/pull/198)\n- Feat/checkbox slot [`#197`](https://github.com/ant-design/ant-design-mini/pull/197)\n- feat(Checkbox): fix CheckboxGroup style [`#195`](https://github.com/ant-design/ant-design-mini/pull/195)\n- Feat/empty adjust [`#194`](https://github.com/ant-design/ant-design-mini/pull/194)\n- Feat/checkbox slot [`#193`](https://github.com/ant-design/ant-design-mini/pull/193)\n- feat(Checkbox): support slot [`#192`](https://github.com/ant-design/ant-design-mini/pull/192)\n- fix(Badge): fix position prop [`#191`](https://github.com/ant-design/ant-design-mini/pull/191)\n- feat(vTabs): add demo for switching content by tab click [`#189`](https://github.com/ant-design/ant-design-mini/pull/189)\n- feat(footer): new component [`#159`](https://github.com/ant-design/ant-design-mini/pull/159)\n- feat(divider): new component [`#161`](https://github.com/ant-design/ant-design-mini/pull/161)\n- feat(Grid): new Component [`#181`](https://github.com/ant-design/ant-design-mini/pull/181)\n- feat(Skeleton): new Component [`#182`](https://github.com/ant-design/ant-design-mini/pull/182)\n- Feat/checkbox [`#184`](https://github.com/ant-design/ant-design-mini/pull/184)\n- ci: update release workflow [`#185`](https://github.com/ant-design/ant-design-mini/pull/185)\n- feat(Selector): add maxSelectedCount、minSelectedCount  prop [`#162`](https://github.com/ant-design/ant-design-mini/pull/162)\n- feat: adjust doc style [`#183`](https://github.com/ant-design/ant-design-mini/pull/183)\n- Feat/docs: openbox [`#180`](https://github.com/ant-design/ant-design-mini/pull/180)\n- ci: fix publish step [`#167`](https://github.com/ant-design/ant-design-mini/pull/167)\n- feat(imageVideoUpload): add imageUpload and videoUpload [`#143`](https://github.com/ant-design/ant-design-mini/pull/143)\n- Feat/date picker [`#135`](https://github.com/ant-design/ant-design-mini/pull/135)\n- Fix/filter selector label [`#168`](https://github.com/ant-design/ant-design-mini/pull/168)\n- chore: update doc [`#166`](https://github.com/ant-design/ant-design-mini/pull/166)\n- ci: add release workflow [`#165`](https://github.com/ant-design/ant-design-mini/pull/165)\n- feat/ActionSheet [`#137`](https://github.com/ant-design/ant-design-mini/pull/137)\n- fix(Filter): 修复 selector onChange 数据格式 [`#164`](https://github.com/ant-design/ant-design-mini/pull/164)\n- docs(FloatPanel): add onScroll event [`#157`](https://github.com/ant-design/ant-design-mini/pull/157)\n- chore(doc): refine readme [`#152`](https://github.com/ant-design/ant-design-mini/pull/152)\n- fix(floatPanel): wrapper css add width:100% [`#150`](https://github.com/ant-design/ant-design-mini/pull/150)\n- feat: Icon、ListItem、Button support stopPropagation [`#149`](https://github.com/ant-design/ant-design-mini/pull/149)\n- chore(CheckboxGroup): fix checkboxgroup and radiogroup style [`#146`](https://github.com/ant-design/ant-design-mini/pull/146)\n- fix(Tabs): fix title style in IOS9 [`#148`](https://github.com/ant-design/ant-design-mini/pull/148)\n- fix(FloatPanel): scroll-view bug && demo ui [`#147`](https://github.com/ant-design/ant-design-mini/pull/147)\n- 修复不设置标题时，标题行占位的问题 [`#145`](https://github.com/ant-design/ant-design-mini/pull/145)\n- Feat/float panel [`#142`](https://github.com/ant-design/ant-design-mini/pull/142)\n- Feat/toast [`#141`](https://github.com/ant-design/ant-design-mini/pull/141)\n- Chore/checklist [`#123`](https://github.com/ant-design/ant-design-mini/pull/123)\n- feat(FloatPanel): new Component [`#102`](https://github.com/ant-design/ant-design-mini/pull/102)\n- Feat/container [`#138`](https://github.com/ant-design/ant-design-mini/pull/138)\n- Chore/doc [`#136`](https://github.com/ant-design/ant-design-mini/pull/136)\n- chore(Modal): adjust style & add zIndex disableSrcoll animation props… [`#128`](https://github.com/ant-design/ant-design-mini/pull/128)\n- chore(Selector): fix value dosen't work [`#127`](https://github.com/ant-design/ant-design-mini/pull/127)\n- chore(doc): refine picker checkbox checkboxgroup readme [`#122`](https://github.com/ant-design/ant-design-mini/pull/122)\n- fix: quick-start.md [`#119`](https://github.com/ant-design/ant-design-mini/pull/119)\n- Chore/picker [`#118`](https://github.com/ant-design/ant-design-mini/pull/118)\n- feat(swiper): support the swiper adjustHeight attribute [`#117`](https://github.com/ant-design/ant-design-mini/pull/117)\n- Chore/picker [`#116`](https://github.com/ant-design/ant-design-mini/pull/116)\n- fix: fix FormGroup radius props [`#97`](https://github.com/ant-design/ant-design-mini/pull/97)\n- Chore/tab [`#111`](https://github.com/ant-design/ant-design-mini/pull/111)\n- Chore/switch [`#110`](https://github.com/ant-design/ant-design-mini/pull/110)\n- Chore/picker [`#108`](https://github.com/ant-design/ant-design-mini/pull/108)\n- chore(dumi): fix conflict babal.config.js [`#109`](https://github.com/ant-design/ant-design-mini/pull/109)\n- fix(checkbox-group): onchange does not trigger [`#103`](https://github.com/ant-design/ant-design-mini/pull/103)\n- feat(Tips): 单行文本时关闭按钮垂直居中 [`#98`](https://github.com/ant-design/ant-design-mini/pull/98)\n- feat(doc): use google analytics [`#100`](https://github.com/ant-design/ant-design-mini/pull/100)\n- chore(Picker): this.dataList sync  with props.data [`#94`](https://github.com/ant-design/ant-design-mini/pull/94)\n- fix(CheckboxGroup): remove default value prop [`#96`](https://github.com/ant-design/ant-design-mini/pull/96)\n- fix(vTabs): fix click bottom tap jump to the tap before [`#95`](https://github.com/ant-design/ant-design-mini/pull/95)\n- fix(Icon): fix color style used in plugin [`#93`](https://github.com/ant-design/ant-design-mini/pull/93)\n- chore(CheckList): remove checkList and empty [`#85`](https://github.com/ant-design/ant-design-mini/pull/85)\n- feat(search-bar): 支持不同type input搜索 [`#73`](https://github.com/ant-design/ant-design-mini/pull/73)\n- feat(Tabs): add attributes for swiper [`#78`](https://github.com/ant-design/ant-design-mini/pull/78)\n- chore(stepper): remove useless code [`#84`](https://github.com/ant-design/ant-design-mini/pull/84)\n- Fix/loading [`#83`](https://github.com/ant-design/ant-design-mini/pull/83)\n- feat(dumi): real-time code preview supported [`#77`](https://github.com/ant-design/ant-design-mini/pull/77)\n- docs(modal): fix typo and markdown table [`#75`](https://github.com/ant-design/ant-design-mini/pull/75)\n- feat(Checklist): new checklist component [`#67`](https://github.com/ant-design/ant-design-mini/pull/67)\n- feat(empty): add empty compoennt [`#61`](https://github.com/ant-design/ant-design-mini/pull/61)\n- feat: update demo cdn [`#70`](https://github.com/ant-design/ant-design-mini/pull/70)\n- feat: adjust Steps、Filter、Collapse uid to page unique [`#68`](https://github.com/ant-design/ant-design-mini/pull/68)\n- feat(calendar): enhance onChange event [`#63`](https://github.com/ant-design/ant-design-mini/pull/63)\n- feat(swipe-action): support \"dataSet\" [`#64`](https://github.com/ant-design/ant-design-mini/pull/64)\n- fix(Form): fix Form in plugin mode [`#62`](https://github.com/ant-design/ant-design-mini/pull/62)\n- feat(icon): click support to copy icon Type [`#54`](https://github.com/ant-design/ant-design-mini/pull/54)\n- fix(RadioGroup): fix checked bug [`#43`](https://github.com/ant-design/ant-design-mini/pull/43)\n- Feat/tips [`#47`](https://github.com/ant-design/ant-design-mini/pull/47)\n- feat/LoadingDoc [`#49`](https://github.com/ant-design/ant-design-mini/pull/49)\n- Enhance/tabs [`#53`](https://github.com/ant-design/ant-design-mini/pull/53)\n- fix(tabs): fix sdkverison check error [`#52`](https://github.com/ant-design/ant-design-mini/pull/52)\n- Feat/cdn [`#51`](https://github.com/ant-design/ant-design-mini/pull/51)\n- Chore/docs [`#48`](https://github.com/ant-design/ant-design-mini/pull/48)\n- fix(publish): update package.json after publish [`#46`](https://github.com/ant-design/ant-design-mini/pull/46)\n- feat(tips): add visible and onClose props [`#39`](https://github.com/ant-design/ant-design-mini/pull/39)\n- fix: fix CheckboxGroup header prop [`#42`](https://github.com/ant-design/ant-design-mini/pull/42)\n- fix(compile): replace babel with tsc [`#45`](https://github.com/ant-design/ant-design-mini/pull/45)\n- fix(tabs): fix sdkverison check error [`#44`](https://github.com/ant-design/ant-design-mini/pull/44)\n- fix(compile): trnasform es6 ot es5 [`#41`](https://github.com/ant-design/ant-design-mini/pull/41)\n- Feat/tabs [`#26`](https://github.com/ant-design/ant-design-mini/pull/26)\n- Feat/cdn [`#37`](https://github.com/ant-design/ant-design-mini/pull/37)\n- chore(demo): rename demo less=&gt;acss [`#35`](https://github.com/ant-design/ant-design-mini/pull/35)\n- feat(plugin): update cdn [`#36`](https://github.com/ant-design/ant-design-mini/pull/36)\n- Feat/demo [`#34`](https://github.com/ant-design/ant-design-mini/pull/34)\n- feat(scripts): open dumi dev server once [`#33`](https://github.com/ant-design/ant-design-mini/pull/33)\n- Fix/popover [`#22`](https://github.com/ant-design/ant-design-mini/pull/22)\n- Chore/add container demo [`#20`](https://github.com/ant-design/ant-design-mini/pull/20)\n- feat(scripts): enhance docs deploy [`#32`](https://github.com/ant-design/ant-design-mini/pull/32)\n- feat(docs): adjust demo source file sort [`#31`](https://github.com/ant-design/ant-design-mini/pull/31)\n- feat(scripts): publish scripts [`#23`](https://github.com/ant-design/ant-design-mini/pull/23)\n- docs(plugin): enhance demo preview with only one simulator in docs [`#29`](https://github.com/ant-design/ant-design-mini/pull/29)\n- feat(swipe-action): add instance method to controll itemPosition [`#28`](https://github.com/ant-design/ant-design-mini/pull/28)\n- fix(__tests__): fix test error with ts types [`#25`](https://github.com/ant-design/ant-design-mini/pull/25)\n- chore(*): update contribute guide [`#24`](https://github.com/ant-design/ant-design-mini/pull/24)\n- Feat/rpx [`#21`](https://github.com/ant-design/ant-design-mini/pull/21)\n- chore(selector): fix xml condition determination issues to match 'vx' [`#19`](https://github.com/ant-design/ant-design-mini/pull/19)\n- fix(scripts): fix variable naming [`#17`](https://github.com/ant-design/ant-design-mini/pull/17)\n- feat(docs): generate docs auto [`#16`](https://github.com/ant-design/ant-design-mini/pull/16)\n- chore: gen CNAME file in docs-dist [`#14`](https://github.com/ant-design/ant-design-mini/pull/14)\n- fix(types): remove invalid use for my [`#13`](https://github.com/ant-design/ant-design-mini/pull/13)\n- Feat/docs [`#11`](https://github.com/ant-design/ant-design-mini/pull/11)\n- docs: update contribute link [`#12`](https://github.com/ant-design/ant-design-mini/pull/12)\n- docs: enable full mode for homepage [`#9`](https://github.com/ant-design/ant-design-mini/pull/9)\n- docs: workaround for simulator flicker problem [`#10`](https://github.com/ant-design/ant-design-mini/pull/10)\n- chore(*): first commit [`35af33b`](https://github.com/ant-design/ant-design-mini/commit/35af33bbbaa4f9ac7c5c0ad4fc6dfe46e7c48f0c)\n- fix: 同步文档 [`bf7dd13`](https://github.com/ant-design/ant-design-mini/commit/bf7dd13e9d99f1980a31fc95041e2cf4ac532147)\n- feat: slider 使用 functional 重写 [`9ae0ca3`](https://github.com/ant-design/ant-design-mini/commit/9ae0ca321178f45cadd63991d72a6d78a0402902)\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2022 Ant Design Team\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "<div align=\"center\">\n  <img src=\"https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*xfx9Q4kg62MAAAAAAAAAAAAADtF8AQ/original\" alt=\"logo\" width=\"200\" height=\"auto\" />\n\n  <h1>\n    Ant Design Mini\n  </h1>\n</div>\n\n<div align=\"center\">\n  <p>\n    Explore the Ultimate Experience of Mobile Mini Programs.\n  </p>\n\n  ![npm (tag)](https://img.shields.io/npm/v/antd-mini)\n  &nbsp;\n  ![npm](https://img.shields.io/npm/dw/antd-mini)\n  &nbsp;\n  ![GitHub](https://img.shields.io/github/license/ant-design/ant-design-mini)\n  &nbsp;\n  [![GitHub Release Date](https://img.shields.io/github/release-date/ant-design/ant-design-mini)](https://github.com/ant-design/ant-design-mini/releases) \n  &nbsp;\n  [![Commit Activity](https://img.shields.io/github/commit-activity/m/ant-design/ant-design-mini/master)](https://github.com/ant-design/ant-design-mini/graphs/contributors) \n  &nbsp;\n  [![Issues help wanted](https://img.shields.io/github/issues-raw/ant-design/ant-design-mini/help%20wanted?label=help%20wanted)](https://github.com/ant-design/ant-design-mini/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22)\n\n  <h4>\n    <a href=\"https://mini.ant.design/index-en\">English Doc</a>\n    <span> · </span>\n    <a href=\"https://mini.ant.design/\">中文文档</a>\n    <span> · </span>\n    <a href=\"https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/TpsVRagXjI8AAAAAAAAAAAAADoEQAQFr/original\">服务群1</a>\n    <span> · </span>\n    <a href=\"https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/gtL6Qrn45EwAAAAAAAAAAAAADoEQAQFr/original\">服务群2</a>\n  </h4>\n</div>\n\n```bash\n$ npm install antd-mini\n# or\n$ yarn add antd-mini\n# or\n$ pnpm add antd-mini\n# or\n$ bun add antd-mini\n```\n\nAnt Design Mini is a UI component library for Alipay mini programs that is also compatible with WeChat mini programs, it follows the Ant Design specifications. You can try it out by scanning the [Alipay QR code](https://mdn.alipayobjects.com/huamei_jlgevq/afts/img/A*2ZAZR7NQQJ4AAAAAAAAAAAAADtSSAQ/original) or visit the [official website](https://mini.ant.design/) for more information.\n\n- **Rich Component Library, Easy to Choose and Use**: A Wide Range of Practical Components to Meet Your Needs, with Flexible Customization and Expansion.\n- **Customizable Themes, International Languages**: Ant Design Mini Offers More Theme Styles and Seamless Switching of Component Text in Multiple Languages.\n- **Design Language and Development Framework**: Comprehensive Ecosystem for Rapid Application Development.\n- **Multi Platform Support**: Ant Design Mini supports use in both Alipay and WeChat mini programs, as well as running on uni-app. For more information, please refer to the [adaptation guide for WeChat](https://mini.ant.design/guide/using-wechat) and [adaptation guide for uni-app](https://mini.ant.design/guide/using-uni-app).\n\nThanks to all the [contributors of Ant Design Mini](https://github.com/ant-design/ant-design-mini/graphs/contributors).\n"
  },
  {
    "path": "config/alipay/.act.config.json",
    "content": "{\n  \"type\": \"app\",\n  \"bundle\": \"2.5\"\n}"
  },
  {
    "path": "config/alipay/app.less",
    "content": "@import '../src/style/themes/theme-mode.less';\n\npage {\n  background-color: var(--color-background);\n}\n\n.navigation-bar {\n  height: 88px;\n  background-color: var(--color-card);\n}\n"
  },
  {
    "path": "config/alipay/app.ts",
    "content": "App({\n  onLaunch(launchParams: any) {\n    ac.call('navigateTo', {\n      url: 'pages/index/index',\n    });\n  },\n  onRelaunch(launchParams: any) {},\n  onShow() {\n    // App 进入前台运行\n  },\n  onHide() {\n    // App 进入后台暂停运行\n  },\n  onDestroy() {\n    // App 销毁\n  },\n});\n"
  },
  {
    "path": "config/alipay/b2h.config.ts",
    "content": "export default {\n  compileOptions: {\n    typescript: {\n      checkTypes: false,\n    },\n  },\n};\n"
  },
  {
    "path": "config/alipay/mini.project.json",
    "content": "{\n  \"format\": 2,\n  \"compileOptions\": {\n    \"component2\": true\n  },\n  \"uploadExclude\": [\n    \"miniapptools_dist/**/*\"\n  ],\n  \"unknownConfig\": {\n    \"axmlStrictCheck\": false\n  }\n}\n"
  },
  {
    "path": "config/alipay/package.json",
    "content": "{\n  \"devDependencies\": {\n    \"@alipay/bundle2h-types\": \"^1.0.40\",\n    \"@alipay/bundle2h-cli\": \"^1.0.77\"\n  },\n  \"scripts\": {\n    \"build\": \"b2h build\",\n    \"serve\": \"b2h server\",\n    \"preview\": \"b2h preview --app-id=20002183\",\n    \"dev\": \"b2h alive --app-id=20002183 --debug\"\n  },\n  \"apps\": [\n    {\n      \"appId\": \"20002183\",\n      \"name\": \"alipaynative\"\n    }\n  ],\n  \"dependencies\": {}\n}"
  },
  {
    "path": "config/alipay/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"esModuleInterop\": true,\n    \"lib\": [\"ES2015\"],\n    \"types\": [\"@alipay/bundle2h-types\"]\n  }\n}\n"
  },
  {
    "path": "config/wechat/app.js",
    "content": "App({})"
  },
  {
    "path": "config/wechat/app.wxss",
    "content": "@import './src/style/themes/theme-mode.wxss';\n\npage {\n  background-color: var(--color-background);\n}\n"
  },
  {
    "path": "config/wechat/package.json",
    "content": "{\n  \"dependencies\": {\n    \"@mini-types/alipay\": \"^3.0.5\",\n    \"@preact/signals-core\": \"^1.7.0\",\n    \"async-validator\": \"^4.0.7\",\n    \"dayjs\": \"1.11.7\",\n    \"fast-deep-equal\": \"3.1.3\",\n    \"lodash.filter\": \"^4.6.0\",\n    \"lodash.get\": \"^4.4.2\",\n    \"lodash.isfunction\": \"^3.0.9\",\n    \"lodash.kebabcase\": \"^4.1.1\",\n    \"lodash.reduce\": \"^4.6.0\",\n    \"pinyin-firstletter\": \"^1.0.2\",\n    \"tslib\": \"2.5.0\"\n  },\n  \"repository\": \"git@github.com:ant-design/ant-design-mini.git\"\n}\n"
  },
  {
    "path": "copilot/Actions/check.sjs",
    "content": "/// #if ALIPAY\nfunction checkIcon(icon = '') {\n  return getRegExp('^[a-zA-Z]+$').test(icon);\n}\nexport default { checkIcon };\n/// #endif\n/// #if WECHAT\nfunction checkIcon(icon = '') {\n  return getRegExp('^[a-zA-Z]+$').test(icon);\n}\nmodule.exports = {\n  checkIcon\n}\n/// #endif\n"
  },
  {
    "path": "copilot/Actions/index.axml",
    "content": "<import-sjs from=\"./check.sjs\" name=\"sjs\" />\n\n<view class=\"ant-copilot-actions {{className}}\" style=\"{{style}}\">\n  <view\n    a:for=\"{{items}}\"\n    class=\"ant-copilot-actions-item\"\n    hover-class=\"ant-copilot-actions-item-hover\"\n    onTap=\"handleTapAction\"\n    data-action=\"{{item}}\"\n  >\n    <ant-icon\n      a:if=\"{{sjs.checkIcon(item.icon)}}\"\n      className=\"ant-copilot-actions-item-icon\"\n      type=\"{{item.icon}}\"\n    />\n    <image a:else class=\"ant-copilot-actions-item-icon\" src=\"{{item.icon}}\" />\n  </view>\n</view>\n"
  },
  {
    "path": "copilot/Actions/index.en.md",
    "content": "---\nnav:\n  path: /copilot\ngroup:\n  title: Express\n  order: 3\ntoc: 'content'\n---\n\n# Actions\n\n## When to use\n\nUse when you need to show a set of action options.\n\n## Code Sample\n\n### Basic Usage\n\n<code src='../../copilot-demo/pages/Actions/index'></code>\n\n## API\n\n### Property\n\n| Property | Description | Type | Default Value |\n| --- | --- | --- | --- |\n| className | Class Name | string | - |\n| style | Style | string | - |\n| items | Action Item List | ActionItem[] | [] |\n| onItemTap | Triggered when an action item is clicked | (item: ActionItem) => void | - |\n\n### ActionItem\n\n| Property | Description | Type | Default Value |\n| --- | --- | --- | --- |\n| label | Action Item Text | string | - |\n| icon | Action Item Icon | string | - |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For more information, see ConfigProvider Components.\n\n| Variable name | Default Value | Description |\n| --- | --- | --- |\n| --actions-background-color | #F7F7F7 | Background Color |\n| --actions-item-hover-background-color | #EEEEEE | Click background color |\n\n"
  },
  {
    "path": "copilot/Actions/index.json5",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-icon\": \"../Icon/index\"\n  }\n}\n"
  },
  {
    "path": "copilot/Actions/index.less",
    "content": "@import (reference) './variable.less';\n@import (reference) '../../src/style/mixins/hairline.less';\n\n@prefixCls: ant-copilot-actions;\n\n.@{prefixCls} {\n  display: inline-flex;\n  justify-content: space-between;\n  gap: @size-3;\n  background: @actions-background-color;\n  padding: @size-2 @size-3;\n  border-radius: @corner-radius-xl;\n\n  &-item {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    width: @size-7;\n    height: @size-7;\n    border-radius: @corner-radius-md-plus;\n    &:active {\n      background: @actions-item-hover-background-color;\n    }\n    &-icon {\n      font-size: @size-5;\n      width: @size-5;\n      height: @size-5;\n    }\n  }\n}\n\n"
  },
  {
    "path": "copilot/Actions/index.md",
    "content": "---\nnav:\n  path: /copilot\ngroup:\n  title: 表达\n  order: 3\ntoc: 'content'\n---\n\n# Actions 操作列表\n\n## 何时使用\n\n需要展示一组操作选项时使用。\n\n## 代码示例\n\n### 基础用法\n\n<code src='../../copilot-demo/pages/Actions/index'></code>\n\n## API\n\n### 属性\n\n| 属性 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- |\n| className | 类名 | string | - |\n| style | 样式 | string | - |\n| items | 动作项列表 | ActionItem[] | [] |\n| onItemTap | 点击动作项时触发 | (item: ActionItem) => void | - |\n\n### ActionItem\n\n| 属性 | 说明 | 类型 | 默认值 |\n| --- | --- | --- | --- |\n| label | 动作项文本 | string | - |\n| icon | 动作项图标 | string | - |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名 | 默认值 | 说明 |\n| --- | --- | --- |\n| --actions-background-color | #F7F7F7 | 背景色 |\n| --actions-item-hover-background-color | #EEEEEE | 点击态背景色 |\n\n"
  },
  {
    "path": "copilot/Actions/index.ts",
    "content": "// @ts-nocheck\nimport { Component, triggerEvent } from '../_util/simply';\nimport { ActionsProps } from './props';\n\nComponent({\n  props: ActionsProps,\n  methods: {\n    handleTapAction(e) {\n      const { action } = e.currentTarget.dataset;\n      triggerEvent(this, 'itemTap', action);\n    },\n  },\n});\n"
  },
  {
    "path": "copilot/Actions/props.ts",
    "content": "// @ts-nocheck\nimport { IBaseProps } from '../_util/base';\n\ninterface IActionItem {\n  /**\n   * @description 操作文本\n   */\n  label: string;\n  /**\n   * @description 图标地址\n   */\n  icon?: string;\n}\n\ninterface IActionsProps extends IBaseProps {\n  /**\n   * @description 操作列表\n   */\n  items: IActionItem[];\n  /**\n   * @description 点击操作的回调\n   */\n  onItemTap?: (action: IActionItem) => void;\n}\n\nexport const ActionsProps: IActionsProps = {\n  items: [],\n  onItemTap: () => {},\n};\n\nexport type { IActionsProps };\n"
  },
  {
    "path": "copilot/Actions/variable.less",
    "content": "@import (reference) '../../src/style/variables.less';\n@import (reference) '../../src/style/themes/index.less';\n\n// 背景色\n@actions-background-color: var(--actions-background-color, #F7F7F7);\n@actions-item-hover-background-color: var(--actions-item-hover-background-color, #EEEEEE);\n\n"
  },
  {
    "path": "copilot/Bubble/index.axml",
    "content": "<view\n  class=\"ant-copilot-bubble {{'ant-copilot-bubble-' + placement}} {{className}}\"\n  style=\"{{style}}\"\n>\n  <image a:if=\"{{avatar}}\" class=\"ant-copilot-bubble-avatar\" src=\"{{avatar}}\" />\n  <view class=\"ant-copilot-bubble-container\">\n    <slot name=\"header\"></slot>\n    <view class=\"ant-copilot-bubble-content {{shape}} {{variant}}\">\n      <slot name=\"content-header\"></slot>\n      <ant-loading a:if=\"{{loading}}\" type=\"mini\" color=\"#8C8C8C\"/>\n      <text a:if=\"{{!loading && bubbleText}}\">{{bubbleText}}</text>\n      <slot a:if=\"{{!loading}}\"></slot>\n      <slot name=\"content-footer\"></slot>\n    </view>\n    <slot name=\"footer\"></slot>\n  </view>\n</view>\n"
  },
  {
    "path": "copilot/Bubble/index.en.md",
    "content": "---\nnav:\n  path: /copilot\ngroup:\n  title: General\n  order: 1\ntoc: 'content'\n---\n\n# Bubble Dialogue Bubbles\n\n## When to use\n\nWhen you need to display the content of the dialogue, it supports a variety of bubble styles, typing animation and other effects.\n\n## Code Sample\n\n### Basic Usage\n\n<code src='../../copilot-demo/pages/Bubble/index'></code>\n\n## API\n\n### Property\n\n| Property             | Description               | Type                                               | Default Value    |\n| ---------------- | ------------------ | -------------------------------------------------- | --------- |\n| className        | Class Name               | string                                             | -         |\n| style            | Style               | string                                             | -         |\n| content          | Bubble Content           | string                                             | -         |\n| placement        | Bubble position           | 'start' \\| 'end'                                   | 'end'     |\n| shape            | Bubble shape           | 'round' \\| 'corner' \\| 'default'                   | 'default' |\n| variant          | Bubble Style           | 'filled' \\| 'borderless' \\| 'outlined' \\| 'shadow' | 'filled'  |\n| avatar           | avatar address           | string                                             | -         |\n| loading          | Loading         | boolean                                            | false     |\n| typing           | Typing Animation Configuration       | boolean \\| { step?: number, interval?: number }    | false     |\n| onTypingComplete | Triggers when typing animation completes | () => void                                         | -         |\n\n### Slots\n\n| Name    | Description                           |\n| ------- | ------------------------------ |\n| default | Custom bubble content                 |\n| header  | Custom header content (such as user name)       |\n| footer  | Customize the bottom content (e. g. custom actions, etc.) |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For more information, see ConfigProvider Components.\n\n| Variable name                         | Default Value           | Description               |\n| ------------------------------ | ---------------- | ------------------ |\n| --bubble-background-color      | #F7F7F7          | Bubble background color         |\n| --bubble-user-background-color | #1677FF          | User message bubble background color |\n| --bubble-outlined-color        | #EBEBEB          | The border color of the stroke style |\n| --bubble-text-color            | rgba(0,0,0,0.88) | Text Color           |\n| --bubble-text-color-user       | #ffffff          | User Message Text Color   |\n\n## FAQ\n\n### 1. How to achieve the typewriter effect?\n\nThe typing animation can be configured via the typing property:\n\n- Setup `typing=\"{{true}}\"` Use default configuration\n- Setup `typing=\"{{{ step: 1, interval: 50 }}}\"` Customize the number of characters per print and the interval\n- By `onTypingComplete` Monitor typing animation complete\n\n### 2. What bubble styles are supported?\n\nA variety of bubble styles can be achieved through the combination of shape and variant attributes:\n\n- shape: control bubble shape, support default/round/corner\n- variant: control bubble appearance, support filled/borderless/outlined/shadow\n"
  },
  {
    "path": "copilot/Bubble/index.json5",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-loading\": \"../Loading\"\n  }\n}\n"
  },
  {
    "path": "copilot/Bubble/index.less",
    "content": "@import (reference) './variable.less';\n\n@prefixCls: ant-copilot-bubble;\n\n.@{prefixCls} {\n  display: flex;\n  align-items: flex-start;\n  padding: 24rpx;\n\n  &-avatar {\n    margin-top: 8rpx;\n    width: @bubble-avatar-size;\n    height: @bubble-avatar-size;\n    border-radius: @corner-radius-circle;\n    flex-shrink: 0;\n  }\n\n  &-container {\n    margin: 0 24rpx;\n  }\n\n  &-content {\n    padding: @size-3 @size-4;\n    margin: @size-1 0;\n    border-radius: @corner-radius-xl;\n    background: @bubble-background-color;\n    font-size: var(--size-font6);\n    color: @bubble-text-color;\n    line-height: 1.5;\n    word-break: break-all;\n    &.round {\n      border-radius: @corner-radius-xxl;\n    }\n    &.corner {\n      border-radius: @corner-radius-sm @corner-radius-xl @corner-radius-xl @corner-radius-xl;\n    }\n    // &.filled {\n    //   background: @bubble-background-color;\n    // }\n    &.borderless {\n      background: transparent;\n    }\n    &.outlined {\n      background: transparent;\n      border: 1rpx solid @bubble-outlined-color;\n    }\n    &.shadow {\n      box-shadow: 0 0 4rpx 0 rgba(0,0,0,0.05), 0 0 12rpx -8rpx rgba(0,0,0,0.04), 0 4rpx 8rpx 0 rgba(0,0,0,0.04);\n    }\n  }\n\n  &-end {\n    flex-direction: row-reverse;\n\n    .@{prefixCls}-content {\n      background: @bubble-user-background-color;\n      color: @bubble-text-color-user;\n      &.corner {\n        border-radius: @corner-radius-xl @corner-radius-sm @corner-radius-xl @corner-radius-xl;\n      }\n    }\n  }\n}\n\n"
  },
  {
    "path": "copilot/Bubble/index.md",
    "content": "---\nnav:\n  path: /copilot\ngroup:\n  title: 通用\n  order: 1\ntoc: 'content'\n---\n\n# Bubble 对话气泡\n\n## 何时使用\n\n需要展示对话内容时使用,支持多种气泡样式、打字动画等效果。\n\n## 代码示例\n\n### 基础用法\n\n<code src='../../copilot-demo/pages/Bubble/index'></code>\n\n## API\n\n### 属性\n\n| 属性             | 说明               | 类型                                               | 默认值    |\n| ---------------- | ------------------ | -------------------------------------------------- | --------- |\n| className        | 类名               | string                                             | -         |\n| style            | 样式               | string                                             | -         |\n| content          | 气泡内容           | string                                             | -         |\n| placement        | 气泡位置           | 'start' \\| 'end'                                   | 'end'     |\n| shape            | 气泡形状           | 'round' \\| 'corner' \\| 'default'                   | 'default' |\n| variant          | 气泡样式           | 'filled' \\| 'borderless' \\| 'outlined' \\| 'shadow' | 'filled'  |\n| avatar           | 头像地址           | string                                             | -         |\n| loading          | 是否加载中         | boolean                                            | false     |\n| typing           | 打字动画配置       | boolean \\| { step?: number, interval?: number }    | false     |\n| onTypingComplete | 打字动画完成时触发 | () => void                                         | -         |\n\n### Slots\n\n| 名称           | 说明                           |\n| -------------- | ------------------------------ |\n| default        | 自定义气泡内容                 |\n| header         | 自定义头部内容(如用户名)       |\n| footer         | 自定义底部内容(如自定义操作等) |\n| content-header | 内容部分的头部                 |\n| content-footer | 内容部分的尾部                 |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                         | 默认值           | 说明               |\n| ------------------------------ | ---------------- | ------------------ |\n| --bubble-background-color      | #F7F7F7          | 气泡背景色         |\n| --bubble-user-background-color | #1677FF          | 用户消息气泡背景色 |\n| --bubble-outlined-color        | #EBEBEB          | 描边样式的边框颜色 |\n| --bubble-text-color            | rgba(0,0,0,0.88) | 文本颜色           |\n| --bubble-text-color-user       | #ffffff          | 用户消息文本颜色   |\n\n## FAQ\n\n### 1. 如何实现打字机效果?\n\n可以通过 typing 属性配置打字动画:\n\n- 设置 `typing=\"{{true}}\"` 使用默认配置\n- 设置 `typing=\"{{{ step: 1, interval: 50 }}}\"` 自定义每次打印字符数和间隔时间\n- 通过 `onTypingComplete` 监听打字动画完成\n\n### 2. 支持哪些气泡样式?\n\n通过 shape 和 variant 属性组合可以实现多种气泡样式:\n\n- shape: 控制气泡形状,支持 default/round/corner\n- variant: 控制气泡外观,支持 filled/borderless/outlined/shadow\n"
  },
  {
    "path": "copilot/Bubble/index.ts",
    "content": "// @ts-nocheck\nimport {\n  Component,\n  getValueFromProps,\n  triggerEventOnly,\n} from '../_util/simply';\nimport { BubbleProps } from './props';\n\nComponent({\n  props: BubbleProps,\n  data: {\n    bubbleText: '',\n  },\n  methods: {\n    startTyping() {\n      const [loading, typing, content] = getValueFromProps(this, [\n        'loading',\n        'typing',\n        'content',\n      ]);\n      if (loading) {\n        return;\n      }\n      if (content) {\n        const typingOptions = typing\n          ? typing === true\n            ? { step: 1, interval: 100 }\n            : typing\n          : false;\n        if (typingOptions) {\n          const { step = 1, interval = 100 } = typingOptions;\n          const bubbleText = content;\n          // todo 待优化\n          const typingLoop = (length: number, typedLength: number) => {\n            const typingText = bubbleText.slice(0, typedLength);\n            this.setData({\n              bubbleText: typingText,\n            });\n            if (typedLength < length) {\n              setTimeout(() => {\n                typingLoop(length, typedLength + step);\n              }, interval);\n            } else {\n              triggerEventOnly(this, 'typingComplete');\n            }\n          };\n          typingLoop(bubbleText.length, step);\n        } else {\n          this.setData({\n            bubbleText: content,\n          });\n          triggerEventOnly(this, 'typingComplete');\n        }\n      }\n    },\n  },\n\n  options: {\n    // 使用基础库内置的数据变化观测器\n    observers: true,\n    multipleSlots: true,\n  },\n  observers: {\n    loading: function (loading: boolean) {\n      if (!loading) {\n        this.startTyping();\n      }\n    },\n  },\n  /// #if ALIPAY\n  didMount() {\n    this.startTyping();\n  },\n  /// #endif\n  /// #if WECHAT\n  attached() {\n    this.startTyping();\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "copilot/Bubble/props.ts",
    "content": "// @ts-nocheck\nimport { IBaseProps } from '../_util/base';\n\ninterface IBubbleProps extends IBaseProps {\n  /**\n   * @description 气泡内容\n   */\n  content: string;\n  /**\n   * @description 是否为用户消息(右侧)\n   * @default start\n   */\n  placement?: 'start' | 'end';\n  /**\n   * @description 气泡形状\n   * @default 'default'\n   */\n  shape?: 'round' | 'corner' | 'default';\n  /**\n   * @description 气泡样式\n   * @default filled\n   */\n  variant?: 'filled' | 'borderless' | 'outlined' | 'shadow';\n  /**\n   * @description 头像地址\n   */\n  avatar?: string;\n  /**\n   * @description 是否正在加载中\n   * @default false\n   */\n  loading?: boolean;\n  /**\n   * @description 设置聊天内容打字动画\n   * @default false\n   */\n  typing?: boolean | { step?: number; interval?: number };\n  /**\n   * @description 打字动画完成时触发\n   */\n  onTypingComplete?: () => void;\n}\n\nexport const BubbleProps: IBubbleProps = {\n  content: '',\n  placement: 'start',\n  loading: false,\n  typing: false,\n  shape: 'default',\n  variant: 'filled',\n  avatar: '',\n};\n\nexport type { IBubbleProps };\n"
  },
  {
    "path": "copilot/Bubble/variable.less",
    "content": "@import (reference) '../../src/style/variables.less';\n@import (reference) '../../src/style/themes/index.less';\n\n// 背景色\n@bubble-background-color: var(--bubble-background-color, #F7F7F7);\n@bubble-user-background-color: var(--bubble-user-background-color, #1677FF);\n\n// 边框颜色\n@bubble-outlined-color: var(--bubble-outlined-color, #EBEBEB);\n\n// 文本颜色\n@bubble-text-color: var(--bubble-text-color, rgba(0,0,0,0.88));\n@bubble-text-color-user: var(--bubble-text-color-user, #ffffff);\n\n// 头像尺寸\n@bubble-avatar-size: 64rpx;\n"
  },
  {
    "path": "copilot/Conversations/index.axml",
    "content": "<view class=\"ant-copilot-conversations {{className}}\" style=\"{{style}}\">\n  <block\n    a:for=\"{{items}}\"\n    a:for-index=\"index\"\n    a:for-item=\"item\"\n    a:key=\"key\">\n    <view class=\"ant-copilot-conversations-swipe-item\">\n      <ant-swipe-action\n        data-item=\"{{item}}\"\n        data-index=\"{{index}}\"\n        rightButtons=\"{{menus}}\"\n        elasticity=\"{{true}}\"\n        disabled=\"{{item.disabledMenu}}\"\n        onButtonTap=\"onButtonTap\"\n      >\n        <view\n          class=\"ant-copilot-conversations-swipe-item-view\"\n          hover-start-time=\"{{20}}\"\n          hover-stay-time=\"{{40}}\"\n          hover-class=\"{{item.disabled ? '' : 'ant-copilot-conversations-hover'}}\"\n          onTouchStart=\"{{item.disabled ? '' : 'onTouchStart'}}\"\n          onTouchEnd=\"{{item.disabled ? '' : 'onItemTap'}}\"\n          data-item=\"{{item}}\"\n          data-index=\"{{index}}\"\n        >\n          <!-- #if ALIPAY -->\n          <slot item=\"{{item}}\" index=\"{{index}}\">\n          <!-- #endif -->\n            <image a:if=\"{{item.icon}}\" class=\"ant-copilot-conversations-swipe-item-view-icon\" src=\"{{item.icon}}\" />\n            <view class=\"ant-copilot-conversations-swipe-item-view-main\">\n              <view class=\"ant-copilot-conversations-swipe-item-view-main-top\">\n                <view a:if=\"{{item.label}}\" class=\"ant-copilot-conversations-swipe-item-view-label\">{{item.label}}</view>\n                <view a:if=\"{{item.timestamp}}\" class=\"ant-copilot-conversations-swipe-item-view-timestamp\">{{item.timestamp}}</view>\n              </view>\n              <view a:if=\"{{item.description}}\" class=\"ant-copilot-conversations-swipe-item-view-desc\">{{item.description}}</view>\n            </view>\n          <!-- #if ALIPAY -->\n          </slot>\n          <!-- #endif -->\n        </view>\n      </ant-swipe-action>\n    </view>\n  </block>\n</view>\n"
  },
  {
    "path": "copilot/Conversations/index.en.md",
    "content": "---\nnav:\n  path: /copilot\ngroup:\n  title: General\n  order: 1\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Conversations\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-conversations\": \"antd-mini/es/Conversations/index\"\n#endif\n#if WECHAT\n  \"ant-conversations\": \"antd-mini/Conversations/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<ant-conversations\n  items=\"{{items}}\"\n  menus=\"{{menus}}\"\n#if ALIPAY\n  onItemTap=\"handleItemTap\"\n  onMenuItemTap=\"handleMenuItemTap\"\n#endif\n#if WECHAT\n  binditemtap=\"handleItemTap\"\n  bindmenuitemtap=\"handleMenuItemTap\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    items: [\n      { key: '1', label: '给我推荐一首歌', description: '这是会话的部分富文本信息Description', icon: 'https://randomuser.me/api/portraits/thumb/women/4.jpg', timestamp: '10:23', disabled: false },\n      { key: '2', label: '请根据图片里的提示，写一篇小学二年级的数学题目', description: '这首歌来自英国歌手艾德·希兰旋律轻快，歌曲写自上个世纪落日', icon: '', timestamp: '10:22', disabled: false },\n      { key: '3', label: '禁用无法点击此条', description: '这是会话的部分富文本信息Description', icon: '', timestamp: '10:21', disabled: true },\n      { key: '4', label: '菜单禁用无法滑动', description: '这是会话的部分富文本信息Description', icon: '', timestamp: '10:18', disabled: false, disabledMenu: true },\n      { key: '5', label: '给我推荐一首歌', description: '这是会话的部分富文本信息Description', icon: '', timestamp: '09:11', disabled: false }\n    ],\n    menus: [\n      { text: '编辑', bgColor: '#FFA91B', color: '#fff', width: 160 },\n      { text: '删除', bgColor: '#FF2B00', color: '#fff', width: 160 }\n    ]\n  },\n  handleItemTap(i) {\n    let item = i;\n#if ALIPAY\n    my.showToast({ content: item.key });\n#endif\n#if WECHAT\n    item = i.detail[0];\n    wx.showToast({ title: item.key });\n#endif\n  },\n  handleMenuItemTap(menuItem, item) {\n#if ALIPAY\n    console.log(menuItem, item);\n    my.showToast({ content: `菜单${menuItem.index}_列表项${item.key}` });\n#endif\n#if WECHAT\n    console.log(menuItem.detail[0], menuItem.detail[1]);\n    wx.showToast({\n      title: `菜单${menuItem.detail[0].index}_列表项${menuItem.detail[1].key}`,\n    });\n#endif\n  },\n});\n```\n\n### Demo Code\n\n<code src='../../copilot-demo/pages/Conversations/index'></code>\n\n## API\n\n### Conversations\n\nThe following table describes the API properties for Conversations components:\n\n| Property                       | Description         | Type                                                                                     | Default Value |\n| -------------------------- | ------------ | ---------------------------------------------------------------------------------------- | ------ |\n| className                  | Class Name         | string                                                                                   | -      |\n| items                      | Session List     | [Conversation](#conversation)[]                                                          | []     |\n| menus                      | Session Action Menu | [MenuItem](#menuitem) []                                                                 | []     |\n| #if ALIPAY onItemTap       | Prompt for click callback | (item: [Conversation](#conversation),index:number) => void;                              | -      |\n| #if WECHAT binditemtap     | Prompt for click callback | (item: [Conversation](#conversation),index:number) => void;                              | -      |\n| #if ALIPAY onMenuItemTap   | Prompt for click callback | (item: {menuInfo:[MenuItem](#menuitem),itemInfo:[Conversation](#conversation)}) => void; | -      |\n| #if WECHAT bindmenuitemtap | Prompt for click callback | (item: {menuInfo:[MenuItem](#menuitem),itemInfo:[Conversation](#conversation)}) => void; | -      |\n\n### Conversation\n\n| Property         | Description                     | Type    | Default Value |\n| ------------ | ------------------------ | ------- | ------ |\n| key          | Unique identification to distinguish each session | string  | -      |\n| label        | Session Name                 | string  | -      |\n| description  | Description                     | string  | -      |\n| icon         | Session icon                 | string  | -      |\n| timestamp    | Session timestamp               | string  | -      |\n| disabled     | Whether to disable click             | boolean | false  |\n| disabledMenu | Whether the menu disables sliding         | boolean | false  |\n\n### MenuItem\n\n| Property        | Description                                      | Type   | Default Value |\n| ----------- | ----------------------------------------- | ------ | ------ |\n| text        | Button Text                                  | string | -      |\n| width       | Button width                                  | number | 150    |\n| bgColor     | Button background color                              | string | -      |\n| color       | Button Font Color                              | string | #fff   |\n| confirmText | Copy description for secondary confirmation; if blank, display `text` | string | -      |\n\n### Slot\n\n| Slot Name | Description           |\n| -------- | -------------- |\n| Default slot | List Item Content Slot |\n"
  },
  {
    "path": "copilot/Conversations/index.json5",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-swipe-action\": \"../SwipeAction/index\"\n  }\n}\n"
  },
  {
    "path": "copilot/Conversations/index.less",
    "content": "@import (reference) './variable.less';\n\n@buttonPrefix: ant-copilot-conversations;\n\n.@{buttonPrefix} {\n  &-hover {\n    opacity: 0.6;\n  }\n  &-swipe-item {\n    height: @conversations-swipe-item-height;\n    &-view {\n      height: 100%;\n      width: @conversations-swipe-item-view-width;\n      padding: 24 * @rpx 32 * @rpx;\n      box-sizing: border-box;\n      display: flex;\n      align-items: center;\n      &-main {\n        flex-grow: 1;\n        overflow: hidden;\n        &-top {\n          display: flex;\n          align-items: center;\n          justify-content: space-between;\n        }\n      }\n      &-icon {\n        flex-shrink: 0;\n        width: 72 * @rpx;\n        height: 72 * @rpx;\n        border-radius: 50%;\n        margin-right: 24 * @rpx;\n      }\n      &-label {\n        font-size: 28 * @rpx;\n        line-height: 40 * @rpx;\n        height: 40 * @rpx;\n        color: @conversations-swipe-item-view-label-color;\n        white-space: nowrap;\n        overflow: hidden;\n        text-overflow: ellipsis;\n      }\n      &-timestamp {\n        flex-shrink: 0;\n        margin-left: 28 * @rpx;\n        font-size: 28 * @rpx;\n        line-height: 44 * @rpx;\n        color: @conversations-swipe-item-view-timestamp-color;\n      }\n      &-desc {\n        font-size: 24 * @rpx;\n        line-height: 48 * @rpx;\n        height: 48 * @rpx;\n        color: @conversations-swipe-item-view-desc-color;\n        white-space: nowrap;\n        overflow: hidden;\n        text-overflow: ellipsis;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "copilot/Conversations/index.md",
    "content": "---\nnav:\n  path: /copilot\ngroup:\n  title: 通用\n  order: 1\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Conversations 管理会话\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-conversations\": \"antd-mini/es/Conversations/index\"\n#endif\n#if WECHAT\n  \"ant-conversations\": \"antd-mini/Conversations/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-conversations\n  items=\"{{items}}\"\n  menus=\"{{menus}}\"\n#if ALIPAY\n  onItemTap=\"handleItemTap\"\n  onMenuItemTap=\"handleMenuItemTap\"\n#endif\n#if WECHAT\n  binditemtap=\"handleItemTap\"\n  bindmenuitemtap=\"handleMenuItemTap\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    items: [\n      { key: '1', label: '给我推荐一首歌', description: '这是会话的部分富文本信息描述', icon: 'https://randomuser.me/api/portraits/thumb/women/4.jpg', timestamp: '10:23', disabled: false },\n      { key: '2', label: '请根据图片里的提示，写一篇小学二年级的数学题目', description: '这首歌来自英国歌手艾德·希兰旋律轻快，歌曲写自上个世纪落日', icon: '', timestamp: '10:22', disabled: false },\n      { key: '3', label: '禁用无法点击此条', description: '这是会话的部分富文本信息描述', icon: '', timestamp: '10:21', disabled: true },\n      { key: '4', label: '菜单禁用无法滑动', description: '这是会话的部分富文本信息描述', icon: '', timestamp: '10:18', disabled: false, disabledMenu: true },\n      { key: '5', label: '给我推荐一首歌', description: '这是会话的部分富文本信息描述', icon: '', timestamp: '09:11', disabled: false }\n    ],\n    menus: [\n      { text: '编辑', bgColor: '#FFA91B', color: '#fff', width: 160 },\n      { text: '删除', bgColor: '#FF2B00', color: '#fff', width: 160 }\n    ]\n  },\n  handleItemTap(i) {\n    let item = i;\n#if ALIPAY\n    my.showToast({ content: item.key });\n#endif\n#if WECHAT\n    item = i.detail[0];\n    wx.showToast({ title: item.key });\n#endif\n  },\n  handleMenuItemTap(menuItem, item) {\n#if ALIPAY\n    console.log(menuItem, item);\n    my.showToast({ content: `菜单${menuItem.index}_列表项${item.key}` });\n#endif\n#if WECHAT\n    console.log(menuItem.detail[0], menuItem.detail[1]);\n    wx.showToast({\n      title: `菜单${menuItem.detail[0].index}_列表项${menuItem.detail[1].key}`,\n    });\n#endif\n  },\n});\n```\n\n### Demo 代码\n\n<code src='../../copilot-demo/pages/Conversations/index'></code>\n\n## API\n\n### Conversations\n\n以下表格介绍了 Conversations 组件的 API 属性：\n\n| 属性                       | 说明         | 类型                                                                                     | 默认值 |\n| -------------------------- | ------------ | ---------------------------------------------------------------------------------------- | ------ |\n| className                  | 类名         | string                                                                                   | -      |\n| items                      | 会话列表     | [Conversation](#conversation)[]                                                          | []     |\n| menus                      | 会话操作菜单 | [MenuItem](#menuitem) []                                                                 | []     |\n| #if ALIPAY onItemTap       | 提示点击回调 | (item: [Conversation](#conversation),index:number) => void;                              | -      |\n| #if WECHAT binditemtap     | 提示点击回调 | (item: [Conversation](#conversation),index:number) => void;                              | -      |\n| #if ALIPAY onMenuItemTap   | 提示点击回调 | (item: {menuInfo:[MenuItem](#menuitem),itemInfo:[Conversation](#conversation)}) => void; | -      |\n| #if WECHAT bindmenuitemtap | 提示点击回调 | (item: {menuInfo:[MenuItem](#menuitem),itemInfo:[Conversation](#conversation)}) => void; | -      |\n\n### Conversation\n\n| 属性         | 说明                     | 类型    | 默认值 |\n| ------------ | ------------------------ | ------- | ------ |\n| key          | 唯一标识用于区分每个会话 | string  | -      |\n| label        | 会话名称                 | string  | -      |\n| description  | 描述                     | string  | -      |\n| icon         | 会话图标                 | string  | -      |\n| timestamp    | 会话时间戳               | string  | -      |\n| disabled     | 是否禁用点击             | boolean | false  |\n| disabledMenu | 是否菜单禁用滑动         | boolean | false  |\n\n### MenuItem\n\n| 属性        | 说明                                      | 类型   | 默认值 |\n| ----------- | ----------------------------------------- | ------ | ------ |\n| text        | 按钮文字                                  | string | -      |\n| width       | 按钮宽度                                  | number | 150    |\n| bgColor     | 按钮背景颜色                              | string | -      |\n| color       | 按钮字体颜色                              | string | #fff   |\n| confirmText | 二次确认的文案描述；若为空，则展示 `text` | string | -      |\n\n### 插槽 slot\n\n| 插槽名称 | 说明           |\n| -------- | -------------- |\n| 默认插槽 | 列表项内容插槽 |\n"
  },
  {
    "path": "copilot/Conversations/index.ts",
    "content": "// @ts-nocheck\nimport {\n  Component,\n  getValueFromProps,\n  triggerEventValues,\n} from '../_util/simply';\nimport { ConversationsProps } from './props';\n\nconst maxTouchMove = 10;\n\nComponent({\n  props: ConversationsProps,\n  methods: {\n    onTouchStart(e) {\n      // 这里需要通过 Touch 来实现点击效果，因为微信 movable-view 中的内容都不支持Tap\n      const touch = e.touches[0];\n      this.touchStartX = touch.clientX;\n      this.touchStartY = touch.clientY;\n    },\n    onItemTap(e) {\n      const touchEndX = e.changedTouches[0].clientX;\n      const touchEndY = e.changedTouches[0].clientY;\n      const deltaX = Math.abs(touchEndX - this.touchStartX);\n      const deltaY = Math.abs(touchEndY - this.touchStartY);\n      if (deltaX < maxTouchMove && deltaY < maxTouchMove) {\n        const { item, index } = e.currentTarget.dataset;\n        triggerEventValues(this, 'itemTap', [item, index], e);\n      }\n    },\n    onButtonTap(menu, e) {\n      const menus = getValueFromProps(this, 'menus');\n      let menuInfo, itemInfo;\n      /// #if ALIPAY\n      const { item, index } = e.currentTarget.dataset;\n      menuInfo = { ...menus[menu.btnIdx], index: menu.btnIdx };\n      itemInfo = { ...item, index };\n      /// #endif\n      /// #if WECHAT\n      const { item: itemW, index: indexW } = menu.currentTarget.dataset;\n      menuInfo = { ...menus[menu.detail.btnIdx], index: menu.detail.btnIdx };\n      itemInfo = { ...itemW, index: indexW };\n      /// #endif\n      triggerEventValues(this, 'menuItemTap', [menuInfo, itemInfo], e);\n    },\n  },\n});\n"
  },
  {
    "path": "copilot/Conversations/props.ts",
    "content": "/* eslint-disable @typescript-eslint/no-explicit-any */\n// @ts-nocheck\nimport { IBaseProps } from '../_util/base';\n\ninterface Conversation {\n  /**\n   * @description 唯一标识用于区分每个会话\n   */\n  key: string;\n  /**\n   * @description 会话名称\n   */\n  label?: string;\n  /**\n   * @description 描述\n   */\n  description?: string;\n  /**\n   * @description 会话图标\n   */\n  icon?: string;\n  /**\n   * @description 会话时间戳\n   */\n  timestamp?: string;\n  /**\n   * @description 是否禁用点击\n   */\n  disabled?: boolean;\n  /**\n   * @description 是否菜单禁用滑动\n   */\n  disabledMenu?: boolean;\n}\n\ninterface MenuItem {\n  /**\n   * @description 按钮文字\n   */\n  text: string;\n  /**\n   * @description 按钮宽度\n   * @default 150\n   */\n  width?: number;\n  /**\n   * @description 按钮背景颜色\n   */\n  bgColor?: string;\n  /**\n   * @description 按钮字体颜色\n   * @default \"#fff\"\n   */\n  color?: string;\n  /**\n   * @description 二次确认的文案描述；若为空，则展示 text\n   */\n  confirmText?: string;\n}\n\nexport interface IConversationsProps extends IBaseProps {\n  /**\n   * @description 会话列表\n   * @default []\n   */\n  items?: Conversation[];\n\n  /**\n   * @description 会话操作菜单\n   * @default []\n   */\n  menus?: MenuItem[];\n\n  /**\n   * @description 点击会话项之后的回调\n   */\n  onItemTap?: (item: Conversation, index: number) => void;\n\n  /**\n   * @description 点击菜单项之后的回调\n   */\n  onMenuItemTap?: (item: {\n    menuInfo: MenuItem;\n    itemInfo: Conversation;\n  }) => void;\n}\n\nexport const ConversationsProps: Partial<IConversationsProps> = {\n  className: '',\n  style: '',\n  items: [],\n  menus: [],\n  onItemTap() {},\n  onMenuItemTap() {},\n};\n"
  },
  {
    "path": "copilot/Conversations/variable.less",
    "content": "@import (reference) '../../src/style/variables.less';\n@import (reference) '../../src/style/themes/index.less';\n\n@conversations-swipe-item-height: var(\n  --conversations-swipe-item-height,\n  140 * @rpx\n);\n@conversations-swipe-item-view-width: var(\n  --conversations-swipe-item-view-width,\n  calc(100% - 300rpx)\n);\n\n@conversations-swipe-item-view-label-color: var(\n  --conversations-swipe-item-view-label-color,\n  rgba(0, 0, 0, 0.88)\n);\n\n@conversations-swipe-item-view-timestamp-color: var(\n  --conversations-swipe-item-view-timestamp-color,\n  #848484\n);\n\n@conversations-swipe-item-view-desc-color: var(\n  --conversations-swipe-item-view-desc-color,\n  rgba(0, 0, 0, 0.45)\n);\n"
  },
  {
    "path": "copilot/Prompts/index.axml",
    "content": "<import-sjs name=\"util\" from=\"./index.sjs\" />\n\n<view class=\"ant-copilot-prompts {{ className }}\" style=\"{{ style }}\">\n  <!-- #if ALIPAY -->\n  <slot name=\"prompts-title\">\n  <!-- #endif -->\n    <view a:if=\"{{ title }}\" class=\"ant-copilot-prompts-title\">\n      {{ title }}\n    </view>\n  <!-- #if ALIPAY -->\n  </slot>\n  <!-- #endif -->\n  <view a:if=\"{{vertical}}\" class=\"ant-copilot-prompts-vertical-list\">\n    <block a:for=\"{{ items }}\">\n      <!-- #if ALIPAY -->\n      <slot name=\"prompts-item\" item=\"{{ item }}\">\n      <!-- #endif -->\n        <view class=\"ant-copilot-prompts-vertical-list-item {{item.disabled ? 'disabled' : ''}}\" data-item=\"{{item}}\" data-index=\"{{index}}\" onTap=\"onItemTap\">\n          <ant-icon\n            a:if=\"{{!util.isUrl(item.icon)}}\"\n            type=\"{{item.icon}}\"\n            className=\"ant-copilot-prompts-vertical-list-item-icon\"\n          />\n          <image\n            mode=\"scaleToFill\"\n            a:else\n            src=\"{{ item.icon }}\"\n            class=\"ant-copilot-prompts-vertical-list-item-image\" />\n\n          <text a:if=\"{{ item.label }}\" class=\"ant-copilot-prompts-vertical-list-item-label\">{{ item.label }}</text>\n          <text a:if=\"{{ item.description }}\" class=\"ant-copilot-prompts-vertical-list-item-description\">{{ item.description }}</text>\n          <ant-icon a:if=\"{{ item.showArrow }}\" type=\"RightOutline\" class=\"ant-copilot-prompts-vertical-list-item-arrow\" />\n        </view>\n      <!-- #if ALIPAY -->\n      </slot>\n      <!-- #endif -->\n    </block>\n  </view>\n\n  <scroll-view a:else scroll-x=\"{{!wrap}}\" enable-flex=\"true\" class=\"ant-copilot-prompts-horizontal-list {{wrap ? 'wrap' : ''}}\">\n    <view a:for=\"{{items}}\" class=\"ant-copilot-prompts-horizontal-list-item {{item.disabled ? 'disabled' : ''}}\">\n      <!-- #if ALIPAY -->\n      <slot name=\"prompts-item\" item=\"{{item}}\" index=\"{{index}}\">\n      <!-- #endif -->\n        <ant-typography\n          className=\"ant-copilot-prompts-horizontal-list-item-typography\"\n          iconPosition=\"left\"\n          icon=\"{{item.icon}}\"\n          data-item=\"{{item}}\"\n          data-index=\"{{index}}\"\n          onTap=\"onItemTap\"\n        >\n          {{item.label}}\n        </ant-typography>\n      <!-- #if ALIPAY -->\n      </slot>\n      <!-- #endif -->\n    </view>\n  </scroll-view>\n\n</view>\n"
  },
  {
    "path": "copilot/Prompts/index.en.md",
    "content": "---\nnav:\n  path: /copilot\ngroup:\n  title: Wake\n  order: 2\ntoc: 'content'\n---\n\n# Prompts\n\nIt is used to allow users who are exposed to AI products for the first time to quickly understand what AI can do, and can clearly convey to users the scope of intent and expected functions that AI can achieve. The use of appropriate welcome recommend components can effectively reduce user learning costs, allowing users to quickly understand and start smoothly.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-prompts\": \"antd-mini/es/Prompts/index\"\n#endif\n#if WECHAT\n  \"ant-prompts\": \"antd-mini/Prompts/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<ant-prompts\n  items=\"{{baseList}}\"\n  title=\"{{promptsTitle}}\"\n#if ALIPAY\n  onItemTap=\"onItemTap\"\n#endif\n#if WECHAT\n  binditemtap=\"onItemTap\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    promptsTitle: '我可以帮您：',\n    baseList: [\n      {\n        title: 'Ant Design X 全新升级了什么？',\n      },\n      {\n        title: 'Ant Design X 组件资产内容',\n      },\n      {\n        title: '快速实现安装和Introduction组件',\n      },\n    ],\n  },\n  onItemTap(item) {\n    let item = i;\n#if ALIPAY\n    my.alert({\n      content: `点击了 ${item.title || ''} ${item.content || ''}`,\n    });\n#endif\n#if WECHAT\n    item = i.detail;\n    wx.showToast({ title: `点击了 ${item.title || ''} ${item.content || ''}` });\n#endif\n  },\n});\n```\n\n### Tip with arrow\n\n```xml\n<ant-prompts\n  items=\"{{ arrowList }}\"\n  title=\"{{ promptsTitle }}\"\n/>\n```\n\n```js\nPage({\n  data: {\n    promptsTitle: '我可以帮您：',\n    arrowList: [\n      {\n        showArrow: true,\n        title: '热门话题:',\n        image:\n          'https://mdn.alipayobjects.com/huamei_upibrs/afts/img/A*wJ5aRpr2q1wAAAAAAAAAAAAADkx8AQ/original',\n        content: 'Ant Design X 全新升级',\n      },\n      {\n        showArrow: true,\n        title: '组件查询:',\n        image:\n          'https://mdn.alipayobjects.com/huamei_upibrs/afts/img/A*R9L1RLo4x58AAAAAAAAAAAAADkx8AQ/original',\n        content: '欢迎组件',\n      },\n      {\n        showArrow: true,\n        title: '新手帮助:',\n        image:\n          'https://mdn.alipayobjects.com/huamei_upibrs/afts/img/A*7eRqQ4JpdccAAAAAAAAAAAAADkx8AQ/original',\n        content: '如何实现快速安装和Introduction',\n      },\n    ],\n  },\n});\n```\n\n### Custom Style\n\n```xml\n<ant-prompts\n  items=\"{{ styleList }}\"\n  className=\"customizeStyle\"\n  title=\"{{ promptsTitle }}\"\n/>\n```\n\n```css\n.customizeStyle .ant-copilot-prompts-list-item-content {\n  font-family: PingFangSC-Light;\n  font-size: 28rpx;\n  color: rgba(0, 0, 0, 0.45);\n  line-height: 44rpx;\n}\n```\n\n### Custom Prompt Title\n\n```xml\n<ant-prompts items=\"{{ arrowList }}\">\n  <view slot=\"prompts-title\" class=\"customize-prompts-title\">\n    Custom prompt title:\n  </view>\n</ant-prompts>\n```\n\n### Custom Prompt Item\n\n```xml\n<ant-prompts items=\"{{ baseList }}\">\n  <view slot=\"prompts-item\" slot-scope=\"props\" class=\"customize-prompts-item\">\n    Custom prompt items :{{ props.item.title}}\n  </view>\n</ant-prompts>\n```\n\n### Landscape mode\n\n```xml\n<ant-prompts\n  title=\"超长滑动\"\n  items=\"{{ horizontalList }}\"\n  vertical=\"{{false}}\"\n/>\n<ant-prompts\n  title=\"超长换行\"\n  items=\"{{ horizontalList }}\"\n  vertical=\"{{false}}\"\n  wrap\n/>\n<ant-prompts\n  title=\"自定义\"\n  items=\"{{ horizontalList }}\"\n  vertical=\"{{false}}\"\n  wrap\n>\n  <view slot=\"prompts-item\" slot-scope=\"props\">Custom:{{ props.item.label}}</view>\n</ant-prompts>\n```\n\n### Demo Code\n\n<code src='../../copilot-demo/pages/Prompts/index'></code>\n\n## API\n\n### Prompts\n\nThe following table describes the API properties for Prompts components:\n\n| Property                   | Description                 | Type                                                      | Default Value |\n| ---------------------- | -------------------- | --------------------------------------------------------- | ------ |\n| className              | Class Name                 | string                                                    | -      |\n| items                   | Prompt Items             | [PromptsItem](#promptsitem)[]                             | -      |\n| title           | Prompt Title             | string                                                    | -      |\n| vertical               | Under horizontal layout, automatic line wrap | boolean                                                   | true   |\n| wrap                   | Class Name                 | boolean                                                   | false  |\n| #if ALIPAY onItemTap   | Prompt for click callback         | (item: [PromptsItem](#promptsitem),index:number) => void; | -      |\n| #if WECHAT binditemtap | Prompt for click callback         | (item: [PromptsItem](#promptsitem),index:number) => void; | -      |\n\n### PromptsItem\n\n| Property        | Description                                     | Type    | Default Value |\n| ----------- | ---------------------------------------- | ------- | ------ |\n| key         | Unique identification is used to distinguish each prompt item               | string  | -      |\n| icon        | The icon image link in front supports incoming antd-icon. | string  | -      |\n| label       | The prompt label displays the main content of the prompt               | string  | -      |\n| description | Prompt description provides additional information                   | string  | -      |\n| showArrow   | Prompt whether to show the right arrow                   | boolean | -      |\n\n### Slot\n\n| Slot Name      | Description           |\n| ------------- | -------------- |\n| prompts-title | Title of Prompt Item |\n| prompts-item  | Prompt Subkey     |\n"
  },
  {
    "path": "copilot/Prompts/index.json5",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-icon\": \"../Icon/index\",\n    \"ant-typography\": \"../Typography\"\n  }\n}\n"
  },
  {
    "path": "copilot/Prompts/index.less",
    "content": "@import (reference) './variable.less';\n\n@buttonPrefix: ant-copilot-prompts;\n\n.@{buttonPrefix} {\n  &-title {\n    font-weight: 400;\n    font-size: @prompts-title-size;\n    color: @prompts-title-color;\n    line-height: @prompts-title-line-height;\n    padding-bottom: @prompts-title-padding-bottom;\n  }\n  &-vertical-list {\n    display: flex;\n    flex-direction: column;\n    justify-content: flex-start;\n    align-items: flex-start;\n    &-item {\n      display: flex;\n      flex-direction: row;\n      justify-content: flex-start;\n      align-items: center;\n\n      border: 2rpx solid @prompts-item-border-color;\n      /// #if ALIPAY\n      border-color: @prompts-item-border-color;\n      /// #endif\n      border-radius: 50vh;\n      padding: 20rpx 32rpx;\n\n      margin-bottom: @prompts-list-gap;\n      &:last-of-type {\n        margin-bottom: 0;\n      }\n\n      &.disabled {\n        opacity: 0.45;\n        pointer-events: none;\n      }\n\n      &-icon {\n        font-size: 32 * @rpx;\n      }\n\n      &-image {\n        width: 40rpx;\n        height: 40rpx;\n        flex-shrink: 0;\n        margin-right: @prompts-item-gap;\n      }\n\n      &-label {\n        font-weight: 500;\n        font-size: 28rpx;\n        color: @prompts-item-label-color;\n        line-height: @prompts-item-description-line-height;\n        text-wrap: nowrap;\n        flex-shrink: 0;\n        margin-right: @prompts-item-gap;\n      }\n\n      &-description {\n        font-weight: 400;\n        font-size: 28rpx;\n        color: @prompts-item-description-color;\n        line-height: @prompts-item-description-line-height;\n        margin-right: @prompts-item-gap;\n      }\n\n      &-arrow {\n        font-size: 32rpx;\n        color: @prompts-item-arrow-color;\n      }\n    }\n  }\n\n  &-horizontal-list {\n    box-sizing: border-box;\n    padding: 24 * @rpx 24 * @rpx 0 24 * @rpx;\n    display: flex;\n    &::-webkit-scrollbar {\n      display: none;\n    }\n    /// #if WECHAT\n    height: 106 * @rpx;\n    /// #endif\n    &.wrap {\n      flex-wrap: wrap;\n      /// #if WECHAT\n      height: unset;\n      /// #endif\n    }\n    &-item {\n      &.disabled {\n        opacity: 0.45;\n        pointer-events: none;\n      }\n      &:last-of-type {\n        margin-right: 0;\n      }\n      /// #if WECHAT\n      height: 58 * @rpx;\n      box-sizing: border-box;\n      /// #endif\n      flex-shrink: 0;\n      padding: 8 * @rpx 24 * @rpx;\n      border: 2 * @rpx solid @prompts-item-border-color;\n      border-color: @prompts-item-border-color;\n      border-radius: 30 * @rpx;\n      margin-right: 16 * @rpx;\n      display: flex;\n      align-items: center;\n      margin-bottom: 24rpx;\n      &-typography {\n        .ant-typography-icon-image {\n          width: 40 * @rpx;\n          height: 40 * @rpx;\n        }\n        .ant-typography-icon {\n          font-size: 32 * @rpx;\n        }\n        .ant-typography-text {\n          font-size: 30 * @rpx;\n          line-height: 42 * @rpx;\n          color: @prompts-item-label-color;\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "copilot/Prompts/index.md",
    "content": "---\nnav:\n  path: /copilot\ngroup:\n  title: 唤醒\n  order: 2\ntoc: 'content'\n---\n\n# Prompts 提示列表\n\n用于让首次接触 AI 产品的用户快速理解 AI 能做什么，可以清晰传达给用户 AI 可实现的意图范围和预期功能。使用合适的欢迎推荐组件，可以有效降低用户学习成本，让用户快速了解并顺利开始。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-prompts\": \"antd-mini/es/Prompts/index\"\n#endif\n#if WECHAT\n  \"ant-prompts\": \"antd-mini/Prompts/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-prompts\n  items=\"{{baseList}}\"\n  title=\"{{promptsTitle}}\"\n#if ALIPAY\n  onItemTap=\"onItemTap\"\n#endif\n#if WECHAT\n  binditemtap=\"onItemTap\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    promptsTitle: '我可以帮您：',\n    baseList: [\n      {\n        title: 'Ant Design X 全新升级了什么？',\n      },\n      {\n        title: 'Ant Design X 组件资产内容',\n      },\n      {\n        title: '快速实现安装和引入组件',\n      },\n    ],\n  },\n  onItemTap(item) {\n    let item = i;\n#if ALIPAY\n    my.alert({\n      content: `点击了 ${item.title || ''} ${item.content || ''}`,\n    });\n#endif\n#if WECHAT\n    item = i.detail;\n    wx.showToast({ title: `点击了 ${item.title || ''} ${item.content || ''}` });\n#endif\n  },\n});\n```\n\n### 提示有箭头\n\n```xml\n<ant-prompts\n  items=\"{{ arrowList }}\"\n  title=\"{{ promptsTitle }}\"\n/>\n```\n\n```js\nPage({\n  data: {\n    promptsTitle: '我可以帮您：',\n    arrowList: [\n      {\n        showArrow: true,\n        title: '热门话题:',\n        image:\n          'https://mdn.alipayobjects.com/huamei_upibrs/afts/img/A*wJ5aRpr2q1wAAAAAAAAAAAAADkx8AQ/original',\n        content: 'Ant Design X 全新升级',\n      },\n      {\n        showArrow: true,\n        title: '组件查询:',\n        image:\n          'https://mdn.alipayobjects.com/huamei_upibrs/afts/img/A*R9L1RLo4x58AAAAAAAAAAAAADkx8AQ/original',\n        content: '欢迎组件',\n      },\n      {\n        showArrow: true,\n        title: '新手帮助:',\n        image:\n          'https://mdn.alipayobjects.com/huamei_upibrs/afts/img/A*7eRqQ4JpdccAAAAAAAAAAAAADkx8AQ/original',\n        content: '如何实现快速安装和引入',\n      },\n    ],\n  },\n});\n```\n\n### 自定义样式\n\n```xml\n<ant-prompts\n  items=\"{{ styleList }}\"\n  className=\"customizeStyle\"\n  title=\"{{ promptsTitle }}\"\n/>\n```\n\n```css\n.customizeStyle .ant-copilot-prompts-list-item-content {\n  font-family: PingFangSC-Light;\n  font-size: 28rpx;\n  color: rgba(0, 0, 0, 0.45);\n  line-height: 44rpx;\n}\n```\n\n### 自定义提示标题\n\n```xml\n<ant-prompts items=\"{{ arrowList }}\">\n  <view slot=\"prompts-title\" class=\"customize-prompts-title\">\n    自定义提示标题:\n  </view>\n</ant-prompts>\n```\n\n### 自定义提示项\n\n```xml\n<ant-prompts items=\"{{ baseList }}\">\n  <view slot=\"prompts-item\" slot-scope=\"props\" class=\"customize-prompts-item\">\n    自定义提示项：{{ props.item.title }}\n  </view>\n</ant-prompts>\n```\n\n### 横向模式\n\n```xml\n<ant-prompts\n  title=\"超长滑动\"\n  items=\"{{ horizontalList }}\"\n  vertical=\"{{false}}\"\n/>\n<ant-prompts\n  title=\"超长换行\"\n  items=\"{{ horizontalList }}\"\n  vertical=\"{{false}}\"\n  wrap\n/>\n<ant-prompts\n  title=\"自定义\"\n  items=\"{{ horizontalList }}\"\n  vertical=\"{{false}}\"\n  wrap\n>\n  <view slot=\"prompts-item\" slot-scope=\"props\">自定义：{{ props.item.label }}</view>\n</ant-prompts>\n```\n\n### Demo 代码\n\n<code src='../../copilot-demo/pages/Prompts/index'></code>\n\n## API\n\n### Prompts\n\n以下表格介绍了 Prompts 组件的 API 属性：\n\n| 属性                   | 说明                 | 类型                                                      | 默认值 |\n| ---------------------- | -------------------- | --------------------------------------------------------- | ------ |\n| className              | 类名                 | string                                                    | -      |\n| items                  | 提示列表             | [PromptsItem](#promptsitem)[]                             | -      |\n| title                  | 提示标题             | string                                                    | -      |\n| vertical               | 横向布局下，自动换行 | boolean                                                   | true   |\n| wrap                   | 类名                 | boolean                                                   | false  |\n| #if ALIPAY onItemTap   | 提示点击回调         | (item: [PromptsItem](#promptsitem),index:number) => void; | -      |\n| #if WECHAT binditemtap | 提示点击回调         | (item: [PromptsItem](#promptsitem),index:number) => void; | -      |\n\n### PromptsItem\n\n| 属性        | 说明                                     | 类型    | 默认值 |\n| ----------- | ---------------------------------------- | ------- | ------ |\n| key         | 唯一标识用于区分每个提示项               | string  | -      |\n| icon        | 前面的 icon 图片链接，支持传入 antd-icon | string  | -      |\n| label       | 提示标签显示提示的主要内容               | string  | -      |\n| description | 提示描述提供额外的信息                   | string  | -      |\n| showArrow   | 提示是否展示右边的箭头                   | boolean | false  |\n| disabled    | 设置为 true 时禁用点击事件               | boolean | false  |\n\n### 插槽 slot\n\n| 插槽名称      | 说明           |\n| ------------- | -------------- |\n| prompts-title | 提示项的标题题 |\n| prompts-item  | 提示子项项     |\n"
  },
  {
    "path": "copilot/Prompts/index.sjs.ts",
    "content": "function isUrl(string) {\n  if (!string) return;\n  return !!(\n    string.indexOf('http://') === 0 || string.indexOf('https://') === 0\n  );\n}\n\nexport default {\n  isUrl,\n};\n"
  },
  {
    "path": "copilot/Prompts/index.ts",
    "content": "// @ts-nocheck\nimport { Component, triggerEventValues } from '../_util/simply';\nimport { PromptsProps } from './props';\n\nComponent({\n  props: PromptsProps,\n  methods: {\n    onItemTap(e) {\n      const { item, index } = e.currentTarget.dataset;\n      triggerEventValues(this, 'itemTap', [item, index], e);\n    },\n  },\n});\n"
  },
  {
    "path": "copilot/Prompts/props.ts",
    "content": "/* eslint-disable @typescript-eslint/no-explicit-any */\n// @ts-nocheck\nimport { IBaseProps } from '../_util/base';\n\ninterface IPromptsItem {\n  /**\n   * @description 唯一标识用于区分每个提示项\n   */\n  key: string;\n  /**\n   * @description 前面的icon图片链接\n   */\n  icon?: string;\n  /**\n   * @description 提示标签显示提示的主要内容\n   */\n  label?: string;\n  /**\n   * @description 提示描述提供额外的信息\n   */\n  description: string;\n  /**\n   * @description 提示是否展示右边的箭头\n   */\n  showArrow?: boolean;\n  /**\n   * @description  设置为 true 时禁用点击事件\n   */\n  disabled?: boolean;\n}\n\n/**\n * @description 按钮，用户只需单击一下即可执行操作并做出选择。\n * 常用于表单提交、界面跳转、模块引导点击。具体用法和小程序框架中 button 保持一致，在 button 基础上做了样式的封装。\n * 封装后的按钮可改变按钮形态、增加 loading，以及内置了几种不同样式的按钮。\n */\n\nexport interface IPromptsProps extends IBaseProps {\n  /**\n   * @description 提示列表\n   * @default []\n   */\n  items?: IPromptsItem[];\n\n  /**\n   * @description 提示列表的标题\n   * @default ''\n   */\n  title?: string;\n\n  /**\n   * @description 纵向布局\n   * @default true\n   */\n  vertical?: boolean;\n\n  /**\n   * @description 横向布局下，自动换行\n   * @default false\n   */\n  wrap?: boolean;\n\n  /**\n   * @description 点击选项之后的回调\n   */\n  onItemTap?: (item: IPromptsItem, index: number) => void;\n}\n\nexport const PromptsProps: Partial<IPromptsProps> = {\n  items: [],\n  className: '',\n  title: '',\n  vertical: true,\n  wrap: false,\n  onItemTap() {},\n};\n"
  },
  {
    "path": "copilot/Prompts/variable.less",
    "content": "@import (reference) '../../src/style/variables.less';\n@import (reference) '../../src/style/themes/index.less';\n\n/* size 提示列表标题行高 */\n@prompts-title-line-height: var(--prompts-title-line-height, @size-6);\n/* size 提示列表标题行高 */\n@prompts-title-size: var(--prompts-title-size, @size-4);\n/* color 提示列表标题颜色 */\n@prompts-title-color: var(--prompts-title-color, rgba(0, 0, 0, 0.25));\n/* size 提示列表标题行高 */\n@prompts-title-padding-bottom: var(--prompts-title-padding-bottom, @size-2);\n/* size 列表的间距 */\n@prompts-list-gap: var(--prompts-list-gap, @size-3);\n\n/* size 提示项内容行高 */\n@prompts-item-description-line-height: var(\n  --prompts-item-description-line-height,\n  44 * @rpx\n);\n/* size 提示子项内容的间距 */\n@prompts-item-gap: var(--prompts-item-gap, @size-2);\n/* color 提示子项边框颜色 */\n@prompts-item-border-color: var(\n  --prompts-item-border-color,\n  rgba(0, 0, 0, 0.1)\n);\n/* color 提示子项标题颜色 */\n@prompts-item-label-color: var(--prompts-item-label-color, rgba(0, 0, 0, 0.88));\n/* color 提示子项内容颜色 */\n@prompts-item-description-color: var(\n  --prompts-item-description-color,\n  rgba(0, 0, 0, 0.88)\n);\n/* color 提示子项箭头颜色 */\n@prompts-item-arrow-color: var(--prompts-item-arrow-color, rgba(0, 0, 0, 0.45));\n"
  },
  {
    "path": "copilot/Sender/index.axml",
    "content": "<view class=\"ant-copilot-sender {{className}}\" style=\"{{style}}\">\n  <slot name=\"header\"></slot>\n  <view class=\"ant-copilot-sender-contain-wrapper\">\n    <slot name=\"wrapper-prefix\"></slot>\n    <view class=\"ant-copilot-sender-contain\">\n      <slot name=\"input-header\"></slot>\n      <view class=\"ant-copilot-sender-content {{disabled ? 'disabled' : ''}}\">\n        <slot name=\"prefix\"></slot>\n        <view class=\"ant-copilot-sender-content-input\">\n          <textarea\n            id=\"ant-copilot-sender-input\"\n            class=\"ant-copilot-sender-input\"\n            value=\"{{value}}\"\n            placeholder=\"{{placeholder}}\"\n            disabled=\"{{disabled}}\"\n            maxlength=\"{{-1}}\"\n            show-count=\"{{false}}\"\n            auto-height=\"{{true}}\"\n            confirm-type=\"send\"\n            enableNative=\"{{enableNative}}\"\n            controlled=\"{{controlled}}\"\n            always-system=\"{{alwaysSystem}}\"\n            onInput=\"handleInput\"\n            onFocus=\"handleFocus\"\n            onBlur=\"handleBlur\"\n            onConfirm=\"handleConfirm\"\n          />\n        </view>\n        <slot name=\"suffix\"></slot>\n        <view class=\"ant-copilot-sender-content-button {{loading ? 'loading' : ''}}\" onTap=\"handleMainBtn\"></view>\n      </view>\n    </view>\n    <slot name=\"wrapper-suffix\"></slot>\n  </view>\n  <slot name=\"footer\"></slot>\n</view>\n"
  },
  {
    "path": "copilot/Sender/index.en.md",
    "content": "---\nnav:\n  path: /copilot\ngroup:\n  title: Express\n  order: 3\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Sender\n\n## When to use\n\nUsed when user input is required and a message is sent. Support adaptive height, send status, custom slot and other functions.\n\n## Code Sample\n\n### Basic Usage\n\n<code src='../../copilot-demo/pages/Sender/index'></code>\n\n## API\n\n### Property\n\n| Property | Description | Type | Default Value |\n| --- | --- | --- | --- |\n| className | Class Name | string | - |\n| style | Style | string | - |\n| value | Value of the input box | string | - |\n| placeholder | Input box placeholder | string | \"You can ask me any question ~' |\n| disabled | Disable | boolean | false |\n| loading | Sending | boolean | false |\n\n### Event\n\n| Event Name | Description | Type |\n| --- | --- | --- |\n| onChange | Triggered when input box content changes | (value: string) => void |\n| onSubmit | Triggered when the send button is clicked | (value: string) => void |\n| onCancel | Triggered when the Cancel button is clicked (in loading state) | () => void |\n\n### Slots\n\n| Name | Description |\n| --- | --- |\n| header | Custom header content, typically used to place input suggestions and shortcuts |\n| input-header | Customize the content above the input box, which can be used to place pictures, reference copy, etc. |\n| prefix | Custom input box prefix content |\n| suffix | Customize the suffix content of the input box |\n| footer | Custom bottom content that can be used to host some shortcut functions |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For more information, see ConfigProvider Components.\n\n| Variable name | Default Value | Description |\n| --- | --- | --- |\n| --sender-background-color | #ffffff | Input box background color |\n| --sender-text-color | #333333 | Input box text color |\n| --sender-placeholder-color | rgba(0, 0, 0, 0.25) | Input box placeholder text color |\n| --sender-send-color | #1677ff | Send Button Color |\n| --sender-input-text-color | #000000 | Input box content text color |\n| --sender-input-caret-color | #1677ff | Input box cursor color |\n| --sender-focus-border-color | #1677ff | Border color when the input box is focused |\n| --sender-max-height | 192rpx | Maximum height of input box |\n\n## FAQ\n\n### 1. How do I handle the sending status?\n\nComponent provides the loading properties and onCancel events for handling send status:\n- Send button appears loaded when loading = true\n- Clicking the button in the loading state will trigger the onCancel event\n- It is recommended to set the loading to false after sending\n\n"
  },
  {
    "path": "copilot/Sender/index.json5",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {}\n}\n"
  },
  {
    "path": "copilot/Sender/index.less",
    "content": "@import (reference) './variable.less';\n\n@prefixCls: ant-copilot-sender;\n\n.@{prefixCls} {\n  width: 100%;\n  padding: 0 @size-3;\n  box-sizing: border-box;\n  &-contain {\n    &-wrapper {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n    }\n    display: flex;\n    flex-direction: column;\n    flex-grow: 1;\n    background: @sender-background-color;\n    box-shadow: 0 6rpx 16rpx -8rpx rgba(0, 10, 26, 0.08),\n      0 9rpx 28rpx 0 rgba(0, 10, 26, 0.05),\n      0 12rpx 48rpx 16rpx rgba(0, 10, 26, 0.03);\n    border-radius: 48rpx;\n    padding: @size-3;\n    box-sizing: border-box;\n    &:focus-within {\n      box-shadow: 0 0 0 1rpx @sender-focus-border-color inset;\n    }\n    .@{prefixCls}-content {\n      flex: 1;\n      display: flex;\n      align-items: center;\n      gap: @size-3;\n      &-input {\n        flex: 1;\n        // height: 100%;\n        box-sizing: border-box;\n        overflow: hidden;\n        .ant-copilot-sender-input {\n          width: 100%;\n          margin-left: @size-1;\n          padding: 0;\n          font-size: 30rpx;\n          line-height: 48rpx;\n          background: @sender-background-color;\n          color: @sender-input-text-color;\n          caret-color: @sender-input-caret-color;\n          max-height: @sender-max-height;\n          box-sizing: border-box;\n          resize: none;\n          overflow-y: hidden;\n          &::placeholder {\n            color: @sender-placeholder-color;\n          }\n          .a-textarea-content {\n            height: 48rpx;\n          }\n        }\n      }\n      &-button {\n        align-self: flex-end;\n        width: 48rpx;\n        height: 48rpx;\n        background-image: url('https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/KFh1TbUBh5gAAAAAAAAAAAAADoEQAQFr/original');\n        background-size: 100% 100%;\n        background-repeat: no-repeat;\n        background-position: center;\n        border-radius: @corner-radius-circle;\n        &.loading {\n          background-image: url('https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/Zt4xRJ5QGnMAAAAAAAAAAAAADoEQAQFr/original');\n        }\n        &:active {\n          opacity: 0.8;\n        }\n      }\n      &.disabled {\n        .@{prefixCls}-content-button {\n          opacity: 0.5;\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "copilot/Sender/index.md",
    "content": "---\nnav:\n  path: /copilot\ngroup:\n  title: 表达\n  order: 3\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Sender 消息发送\n\n## 何时使用\n\n需要用户输入并发送消息时使用。支持自适应高度、发送状态、自定义插槽等功能。\n\n## 代码示例\n\n### 基础用法\n\n<code src='../../copilot-demo/pages/Sender/index'></code>\n\n## API\n\n### 属性\n\n| 属性        | 说明         | 类型    | 默认值              |\n| ----------- | ------------ | ------- | ------------------- |\n| className   | 类名         | string  | -                   |\n| style       | 样式         | string  | -                   |\n| value       | 输入框的值   | string  | -                   |\n| placeholder | 输入框占位符 | string  | '可以问我任何问题~' |\n| disabled    | 是否禁用     | boolean | false               |\n| loading     | 是否发送中   | boolean | false               |\n\n### 事件\n\n| 事件名    | 说明                               | 类型                    |\n| --------- | ---------------------------------- | ----------------------- |\n| onChange  | 输入框内容变化时触发               | (value: string) => void |\n| onSubmit  | 点击发送按钮时触发                 | (value: string) => void |\n| onCancel  | 点击取消按钮时触发(loading 状态下) | () => void              |\n| onConfirm | 点击输入法中的确认按钮时触发       | (value: string) => void |\n| onFocus   | 输入框聚焦时触发                   | () => void              |\n| onBlur    | 输入框失焦时触发                   | () => void              |\n\n### Slots\n\n| 名称           | 说明                                                 |\n| -------------- | ---------------------------------------------------- |\n| header         | 自定义头部内容，一般可用来放置输入建议和快捷功能     |\n| input-header   | 自定义输入框上方内容，一般可用来放置图片、引用文案等 |\n| prefix         | 自定义输入框前缀内容                                 |\n| suffix         | 自定义输入框后缀内容                                 |\n| wrapper-prefix | 输入框整体左侧，一般可用来放语音输入切换按钮         |\n| wrapper-suffix | 输入框整体右侧，一般可用来自定义发送按钮在输入框外部 |\n| footer         | 自定义底部内容，可用于承载一些快捷功能               |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                      | 默认值              | 说明                   |\n| --------------------------- | ------------------- | ---------------------- |\n| --sender-background-color   | #ffffff             | 输入框背景色           |\n| --sender-text-color         | #333333             | 输入框文本颜色         |\n| --sender-placeholder-color  | rgba(0, 0, 0, 0.25) | 输入框占位文字颜色     |\n| --sender-send-color         | #1677ff             | 发送按钮颜色           |\n| --sender-input-text-color   | #000000             | 输入框内容文本颜色     |\n| --sender-input-caret-color  | #1677ff             | 输入框光标颜色         |\n| --sender-focus-border-color | #1677ff             | 输入框聚焦时的边框颜色 |\n| --sender-max-height         | 192rpx              | 输入框最大高度         |\n\n## FAQ\n\n### 1. 如何处理发送状态?\n\n组件提供了 loading 属性和 onCancel 事件用于处理发送状态:\n\n- loading=true 时发送按钮会显示为加载状态\n- 点击加载状态的按钮会触发 onCancel 事件\n- 建议在发送完成后将 loading 设为 false\n"
  },
  {
    "path": "copilot/Sender/index.ts",
    "content": "// @ts-nocheck\nimport {\n  Component,\n  getValueFromProps,\n  triggerEvent,\n  triggerEventOnly,\n} from '../_util/simply';\nimport { SenderProps } from './props';\n\nComponent({\n  props: SenderProps,\n  multipleSlots: true,\n  methods: {\n    handleMainBtn() {\n      const [loading] = getValueFromProps(this, ['loading']);\n      if (loading) {\n        this.handleCancel();\n      } else {\n        this.handleSubmit();\n      }\n    },\n    handleConfirm() {\n      const [value] = getValueFromProps(this, ['value']);\n      triggerEvent(this, 'confirm', value);\n    },\n    handleSubmit() {\n      const [value] = getValueFromProps(this, ['value']);\n      triggerEvent(this, 'submit', value);\n    },\n    handleCancel() {\n      triggerEventOnly(this, 'cancel');\n    },\n    handleInput(e) {\n      triggerEvent(this, 'change', e.detail.value);\n    },\n    handleFocus() {\n      triggerEvent(this, 'focus');\n    },\n    handleBlur() {\n      triggerEvent(this, 'blur');\n    },\n  },\n});\n"
  },
  {
    "path": "copilot/Sender/props.ts",
    "content": "// @ts-nocheck\nimport { IBaseProps } from '../_util/base';\n\ninterface ISenderProps extends IBaseProps {\n  /**\n   * @description 输入框的值\n   */\n  value?: string;\n  /**\n   * @description 输入框占位符\n   * @default \"可以问我任何问题~\"\n   */\n  placeholder?: string;\n  /**\n   * @description 是否禁用\n   * @default false\n   */\n  disabled?: boolean;\n  /**\n   * @description 是否发送中\n   * @default false\n   */\n  loading?: boolean;\n  /**\n   * @description 输入框内容变化时触发\n   */\n  onChange?: (value: string) => void;\n  /**\n   * @description 点击发送按钮时触发\n   */\n  onSubmit?: (value: string) => void;\n  /**\n   * @description 点击取消按钮时触发\n   */\n  onCancel?: () => void;\n  /**\n   * @description 点击输入法中的确认按钮时触发\n   */\n  onConfirm?: (value: string) => void;\n  /**\n   * @description 输入框聚焦时触发\n   */\n  onFocus?: () => void;\n  /**\n   * @description 输入框失焦时触发\n   */\n  onBlur?: () => void;\n}\n\nexport const SenderProps: ISenderProps = {\n  value: '',\n  placeholder: '可以问我任何问题~',\n  disabled: false,\n  loading: false,\n};\n\nexport type { ISenderProps };\n"
  },
  {
    "path": "copilot/Sender/variable.less",
    "content": "@import (reference) '../../src/style/variables.less';\n@import (reference) '../../src/style/themes/index.less';\n\n// 背景色\n@sender-background-color: var(--sender-background-color, #ffffff);\n\n// 占位符颜色\n@sender-placeholder-color: var(--sender-placeholder-color, rgba(0, 0, 0, 0.25));\n\n// 发送按钮颜色\n// @sender-send-color: var(--sender-send-color, #1677ff);\n\n// 输入框文本颜色\n@sender-input-text-color: var(--sender-input-text-color, #000000);\n\n// 输入框光标颜色\n@sender-input-caret-color: var(--sender-input-caret-color, #1677ff);\n\n// 聚焦时的边框颜色\n@sender-focus-border-color: var(--sender-focus-border-color, #1677ff);\n\n// 最大高度\n@sender-max-height: var(--sender-max-height, 192rpx);\n"
  },
  {
    "path": "copilot/ThoughtChain/index.axml",
    "content": "<import-sjs from=\"./index.sjs\" name=\"utils\" />\n<view class=\"ant-copilot-thoughtchain {{ className }}\">\n  <view a:for=\"{{items}}\" class=\"ant-copilot-thoughtchain-node\">\n    <view onTap=\"onTitleTap\" data-index=\"{{index}}\" data-key=\"{{item.key || index}}\">\n      <view class=\"ant-copilot-thoughtchain-node-title\">\n        <image\n          a:if=\"{{item.icon && item.icon.includes('https://')}}\"\n          class=\"ant-copilot-thoughtchain-node-title-icon\"\n          mode=\"widthFix\"\n          src=\"{{item.icon}}\"\n        />\n        <ant-icon a:else type=\"{{item.icon || 'CheckCircleOutline'}}\" class=\"ant-copilot-thoughtchain-node-title-icon\" />\n        {{item.title}}\n        <view a:if=\"{{collapsible}}\" class=\"ant-copilot-thoughtchain-node-title-collapse\">\n          <ant-icon type=\"{{utils.isExpand(collapsible, item.key || index, foldStatusMap) ? 'UpOutline' : 'DownOutline'}}\" />\n        </view>\n      </view>\n    </view>\n    <!-- #if ALIPAY -->\n    <view\n      a:if=\"{{utils.isExpand(collapsible, item.key || index, foldStatusMap)}}\"\n      class=\"ant-copilot-thoughtchain-node-content\"\n    >\n      <slot name=\"content\" content=\"{{item.content}}\" item=\"{{item}}\">\n        <view\n          class=\"ant-copilot-thoughtchain-node-content-text\"\n          onTap=\"onContentTap\"\n          data-key=\"{{item.key || index}}\"\n          data-content=\"{{item.content}}\"\n        >\n          <view>{{item.content}}</view>\n        </view>\n      </slot>\n    </view>\n    <!-- #endif -->\n    <!-- #if WECHAT -->\n    <view\n      a:if=\"{{utils.isExpand(collapsible, item.key || index, foldStatusMap)}}\"\n      class=\"ant-copilot-thoughtchain-node-content\"\n    >\n      <view\n        class=\"ant-copilot-thoughtchain-node-content-text\"\n        onTap=\"onContentTap\"\n        data-key=\"{{item.key || index}}\"\n        data-content=\"{{item.content}}\"\n      >\n        <view>{{item.content}}</view>\n      </view>\n    </view>\n    <!-- #endif -->\n  </view>\n</view>"
  },
  {
    "path": "copilot/ThoughtChain/index.en.md",
    "content": "---\nnav:\n  path: /copilot\ngroup:\n  title: Confirm\n  order: 4\ntoc: 'content'\n---\n\n# ThoughtChain\n\nUse to visualize the process and status of AI processing requests, generating content, or executing tasks. This is an animation-related component that needs to provide props and API for each node animation to interact with users.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-thought-chain\": \"antd-mini/es/ThoughtChain/index\"\n#endif\n#if WECHAT\n  \"ant-thought-chain\": \"antd-mini/ThoughtChain/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\nThis example renders multiple nodes\n\n```xml\n  <ant-thought-chain items=\"{{basicList}}\" onContentTap=\"onContentTap\" collapsible=\"{{true}}\">\n  </ant-thought-chain>\n```\n\n```javascript\nPage({\n  data: {\n    basicList: [\n      {\n        title: '理解问题',\n        content: '3A游戏',\n        icon: 'CheckCircleOutline'\n      },\n      {\n        title: '没有In本地找到结果',\n        content: '当前主流显卡',\n        icon: 'CheckCircleOutline'\n      },\n      {\n        title: 'In互联网上搜索问题',\n        content: '黑神话悟空所需显卡',\n        icon: 'MoreOutline',\n      },\n    ],\n  },\n  onContentTap(e) {\n    const { content } = e.currentTarget.dataset || {};\n    my.alert({\n      content: `点击了内容「${content}」`,\n    });\n  },\n});\n```\n\n### Custom Content\ncontent slot supports custom node content. Only Alipay supports custom content, WeChat does not support custom content.\n```xml\n <ant-thought-chain items=\"{{basicList}}\" onContentTap=\"onContentTap\" collapsible=\"{{false}}\">\n    <view slot=\"content\" slot-scope=\"module\" style=\"color: red\">\n      {{module.content}}\n    </view>\n  </ant-thought-chain>\n```\n\n### secondary node\nYou can customize node content through slots and render secondary nodes through nested thought-chain components. Only Alipay supports custom content, WeChat does not support custom content.\n\n```xml\n <ant-thought-chain items=\"{{customList}}\" onContentTap=\"onContentTap\" collapsible=\"{{true}}\">\n    <view slot=\"content\" slot-scope=\"module\">\n      <view a:if=\"{{typeof(module.content) === 'object'}}\" class=\"secondLevel\">\n        <ant-thought-chain\n          className=\"second-thoughtchain\"\n          items=\"{{module.content}}\"\n          collapsible=\"{{false}}\"\n        >\n          <view slot=\"content\" slot-scope=\"secondModule\" a:if=\"{{typeof(secondModule.content) === 'object'}}\">\n            <view class=\"second-thoughtchain-content\" a:for=\"{{secondModule.content}}\">\n              {{item}}\n            </view>\n          </view>\n          <view a:else class=\"second-thoughtchain-content\">\n            {{secondModule.content}}\n          </view>\n        </ant-thought-chain>\n      </view>\n      <view a:else>{{module.content}}</view>\n    </view>\n  </ant-thought-chain>\n```\n```javascript\nPage({\n  data: {\n    customList: [\n      {\n        title: '理解问题',\n        content: '解析语法结构',\n      },\n      {\n        status: 'loading',\n        title: '搜索问题',\n        content: [\n          {\n            title: '理解问题',\n          },\n          {\n            title: '联网搜索',\n            content: '1. 黑神话悟空介绍',\n          },\n          {\n            title: '已根据搜索结果精选3篇资料',\n            content: [\n              '1. 黑神话悟空介绍',\n              '2. 对于1080p显示器，4060ti和4060该选哪个？',\n              '3. 黑神话悟空官方建议配置',\n            ],\n          },\n          {\n            title: '联想更多结果',\n          },\n        ],\n      },\n    ]\n  },\n  onContentItemTap(e) {\n    const { content } = e.target.dataset || {};\n    my.alert({\n      content: `点击了内容「${content}」`,\n    });\n  },\n});\n```\n\n### Demo Code\n\n<code src='../../copilot-demo/pages/ThoughtChain/index'></code>\n\n## API\n\n### ThoughtChain\n\nThe following table describes the API properties for ThoughtChain components:\n\n| Property      | Description     | Type                     | Default Value |\n| --------- | -------- | ------------------------ | ------ |\n| className | Class Name     | string                   | -      |\n| items      | Node List | IThoughtChainItemProps[] | []      |\n| collapsible      | Whether to support | boolean\\|ICollapsibleOptions | true      |\n| style      | Custom Style | string | -      |\n\n\nIThoughtChainItemProps Properties\n| Property        | Description                                                    | Type                                   | Default Value |\n| ----------- | ------------------------------------------------------- | -------------------------------------- | ------ |\n| icon      | The icon before the title can use the type in ant-icon or pass in https picture link.                                                | string | CheckCircleOutline     |\n| title       | Node Title                                                | string                                 | -      |\n| content     | Node Content                                                | string                    | - |\n\n\nSlot\n\n| Slot Name | Description           |\n| -------- | -------------- |\n| content  | Custom Node Content |  |\n\nICollapsibleOptions Properties\n| Property        | Description                                                    | Type                                   | Default Value |\n| ----------- | ------------------------------------------------------- | -------------------------------------- | ------ |\n| expandedKeys      | expanded node key list | string[] | []      |\n\n\n### Event\n\n| Event Name | Description | Type |\n| --- | --- | --- |\n| onTap | Trigger when a description is clicked | (e) => void |\n| onContentTap | Trigger when content is clicked | (e) => void |\n| onExpand | Trigger on deploy/stow | (expandedKeys: string[], clickKey: string) => void |\n\n"
  },
  {
    "path": "copilot/ThoughtChain/index.json5",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-icon\": \"../Icon/index\",\n    \"ant-loading\": \"../Loading/index\"\n  }\n}\n"
  },
  {
    "path": "copilot/ThoughtChain/index.less",
    "content": "@import (reference) './variable.less';\n\n@buttonPrefix: ant-copilot-thoughtchain;\n\n.@{buttonPrefix} {\n  &-node {\n    margin-bottom: 36rpx;\n\n    &:last-child {\n      margin-bottom: 0;\n    }\n\n    &-title {\n      display: flex;\n      align-items: center;\n      line-height: 44rpx;\n      color: @thought-chain-title-color;\n\n      &-icon {\n        width: 32rpx;\n        margin-right: 16rpx;\n      }\n\n      &-collapse {\n        margin-left: 16rpx;\n        font-size: 36rpx;\n      }\n    }\n\n    &-content {\n      padding-left: 58rpx;\n      margin-top: 18rpx;\n      \n\n      &-text,\n      &-link {\n        color: @thought-chain-text-color;\n        font-size: 28rpx;\n        &-item {\n          line-height: 40rpx;\n          margin-bottom: 16rpx;\n\n          &:last-child {\n            margin-bottom: 0;\n          }\n        }\n      }\n\n      &-link {\n        color: @thought-chain-link-color;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "copilot/ThoughtChain/index.md",
    "content": "---\nnav:\n  path: /copilot\ngroup:\n  title: 确认\n  order: 4\ntoc: 'content'\n---\n\n# ThoughtChain 思维链\n\n用于可视化展示 AI 处理请求、生成内容或执行任务的进程与状态。这是一个与动画相关的组件，需要提供各节点动画的 props 和 API 和使用方进行交互。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-thought-chain\": \"antd-mini/es/ThoughtChain/index\"\n#endif\n#if WECHAT\n  \"ant-thought-chain\": \"antd-mini/ThoughtChain/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n这个示例渲染了多个节点\n\n```xml\n  <ant-thought-chain items=\"{{basicList}}\" onContentTap=\"onContentTap\" collapsible=\"{{true}}\">\n  </ant-thought-chain>\n```\n\n```javascript\nPage({\n  data: {\n    basicList: [\n      {\n        title: '理解问题',\n        content: '3A游戏',\n        icon: 'CheckCircleOutline'\n      },\n      {\n        title: '没有在本地找到结果',\n        content: '当前主流显卡',\n        icon: 'CheckCircleOutline'\n      },\n      {\n        title: '在互联网上搜索问题',\n        content: '黑神话悟空所需显卡',\n        icon: 'MoreOutline',\n      },\n    ],\n  },\n  onContentTap(e) {\n    const { content } = e.currentTarget.dataset || {};\n    my.alert({\n      content: `点击了内容「${content}」`,\n    });\n  },\n});\n```\n\n### 自定义内容\ncontent slot支持自定义节点内容。仅支付宝端支持自定义内容，微信端不支持自定义内容。\n```xml\n <ant-thought-chain items=\"{{basicList}}\" onContentTap=\"onContentTap\" collapsible=\"{{false}}\">\n    <view slot=\"content\" slot-scope=\"module\" style=\"color: red\">\n      {{module.content}}\n    </view>\n  </ant-thought-chain>\n```\n\n### 二级节点\n支持通过slot自定义节点内容，通过嵌套thought-chain组件进行二级节点的渲染。仅支付宝端支持自定义内容，微信端不支持自定义内容。\n\n```xml\n <ant-thought-chain items=\"{{customList}}\" onContentTap=\"onContentTap\" collapsible=\"{{true}}\">\n    <view slot=\"content\" slot-scope=\"module\">\n      <view a:if=\"{{typeof(module.content) === 'object'}}\" class=\"secondLevel\">\n        <ant-thought-chain\n          className=\"second-thoughtchain\"\n          items=\"{{module.content}}\"\n          collapsible=\"{{false}}\"\n        >\n          <view slot=\"content\" slot-scope=\"secondModule\" a:if=\"{{typeof(secondModule.content) === 'object'}}\">\n            <view class=\"second-thoughtchain-content\" a:for=\"{{secondModule.content}}\">\n              {{item}}\n            </view>\n          </view>\n          <view a:else class=\"second-thoughtchain-content\">\n            {{secondModule.content}}\n          </view>\n        </ant-thought-chain>\n      </view>\n      <view a:else>{{module.content}}</view>\n    </view>\n  </ant-thought-chain>\n```\n```javascript\nPage({\n  data: {\n    customList: [\n      {\n        title: '理解问题',\n        content: '解析语法结构',\n      },\n      {\n        status: 'loading',\n        title: '搜索问题',\n        content: [\n          {\n            title: '理解问题',\n          },\n          {\n            title: '联网搜索',\n            content: '1. 黑神话悟空介绍',\n          },\n          {\n            title: '已根据搜索结果精选3篇资料',\n            content: [\n              '1. 黑神话悟空介绍',\n              '2. 对于1080p显示器，4060ti和4060该选哪个？',\n              '3. 黑神话悟空官方建议配置',\n            ],\n          },\n          {\n            title: '联想更多结果',\n          },\n        ],\n      },\n    ]\n  },\n  onContentItemTap(e) {\n    const { content } = e.target.dataset || {};\n    my.alert({\n      content: `点击了内容「${content}」`,\n    });\n  },\n});\n```\n\n### Demo 代码\n\n<code src='../../copilot-demo/pages/ThoughtChain/index'></code>\n\n## API\n\n### ThoughtChain\n\n以下表格介绍了 ThoughtChain 组件的 API 属性：\n\n| 属性      | 说明     | 类型                     | 默认值 |\n| --------- | -------- | ------------------------ | ------ |\n| className | 类名     | string                   | -      |\n| items      | 节点列表 | IThoughtChainItemProps[] | []      |\n| collapsible      | 是否支持 | boolean\\|ICollapsibleOptions | true      |\n| style      | 自定义样式 | string | -      |\n\n\nIThoughtChainItemProps 属性\n| 属性        | 说明                                                    | 类型                                   | 默认值 |\n| ----------- | ------------------------------------------------------- | -------------------------------------- | ------ |\n| icon      | 标题前图标，可以使用ant-icon里的类型，也可以传入https图片链接                                                | string | CheckCircleOutline     |\n| title       | 节点标题                                                | string                                 | -      |\n| content     | 节点内容                                                | string                    | - |\n\n\n插槽 slot\n\n| 插槽名称 | 说明           |\n| -------- | -------------- |\n| content  | 自定义节点内容 |  |\n\nICollapsibleOptions 属性\n| 属性        | 说明                                                    | 类型                                   | 默认值 |\n| ----------- | ------------------------------------------------------- | -------------------------------------- | ------ |\n| expandedKeys      | 展开的节点key列表 | string[] | []      |\n\n\n### 事件\n\n| 事件名 | 说明 | 类型 |\n| --- | --- | --- |\n| onContentTap | 点击内容时触发 | (e) => void |\n| onExpand | 展开/收起时触发 | (expandedKeys: string[], clickKey: string) => void |\n\n"
  },
  {
    "path": "copilot/ThoughtChain/index.sjs.ts",
    "content": "function isExpand(collapsible, key, foldStatusMap) {\n  if (collapsible) {\n    if (collapsible.expandedKeys) {\n      return collapsible.expandedKeys.includes(key);\n    }\n    return !foldStatusMap[key];\n  }\n  return true;\n}\n\nfunction hasExpandArrow(collapsible) {\n  if (collapsible) return true;\n}\n\nexport default { isExpand, hasExpandArrow };\n"
  },
  {
    "path": "copilot/ThoughtChain/index.ts",
    "content": "// @ts-nocheck\nimport {\n  Component,\n  getValueFromProps,\n  triggerEventValues,\n} from '../_util/simply';\nimport { ThoughtChainProps } from './props';\n\nComponent({\n  props: ThoughtChainProps,\n  data: {\n    foldStatusMap: {},\n  },\n  methods: {\n    onContentTap(e) {\n      triggerEventValues(this, 'contentTap', [e], e);\n    },\n    onTitleTap(e) {\n      const [collapsible, onExpand] = getValueFromProps(this, [\n        'collapsible',\n        'onExpand',\n      ]);\n      if (!collapsible) return;\n      // 受控模式\n      if (onExpand && collapsible?.expandedKeys) {\n        const { expandedKeys } = collapsible;\n        const { key } = e.currentTarget.dataset;\n        const isExpandNow = expandedKeys.includes(key);\n        const newExpandedKeys = [...expandedKeys];\n        if (isExpandNow) {\n          newExpandedKeys.splice(newExpandedKeys.indexOf(key), 1);\n        } else {\n          newExpandedKeys.push(key);\n        }\n        triggerEventValues(this, 'expand', [newExpandedKeys, key]);\n      } else {\n        const { key } = e.currentTarget.dataset;\n        const foldStatusMap = { ...this.data.foldStatusMap };\n        const isFold = foldStatusMap[key];\n        foldStatusMap[key] = !isFold;\n        this.setData({\n          foldStatusMap,\n        });\n      }\n    },\n  },\n});\n"
  },
  {
    "path": "copilot/ThoughtChain/props.ts",
    "content": "/* eslint-disable @typescript-eslint/no-explicit-any */\n// @ts-nocheck\nimport { IBaseProps } from '../_util/base';\n\ninterface IThoughtChainItemProps {\n  /**\n   * @description 节点标题\n   */\n  title?: string;\n\n  /**\n   * @description 内容\n   */\n  content?: any;\n\n  /**\n   * @description UUID\n   */\n  key?: string;\n  /**\n   * @description 标题图标\n   */\n  icon?: string;\n\n  /**\n   * @description 二级思维链\n   */\n  items?: IThoughtChainItemProps[];\n}\n\nexport interface ICollapsibleOptions extends IBaseProps {\n  expandedKeys?: string[];\n}\n\n/**\n * @description 思维链\n * 用于可视化展示AI处理请求、生成内容或执行任务的进程与状态\n * 这是一个与动画相关的组件，需要提供各节点动画的props和API和使用方进行交互。\n */\n\nexport interface IThoughtChainProps extends IBaseProps {\n  /**\n   * @description 思维节点列表\n   * @default default\n   */\n  items?: IThoughtChainItemProps[];\n\n  className?: string;\n\n  /**\n   * @description 是否可折叠\n   * @default true\n   */\n  collapsible?: boolean | ICollapsibleOptions;\n  /**\n   * @description 样式\n   */\n  style?: string;\n\n  onExpand?: (expandedKeys: string[], currentExpandeKey: string) => void;\n  /** 内容点击事件 */\n  onContentTap?: (e) => void;\n}\n\nexport const ThoughtChainProps: Partial<IThoughtChainProps> = {\n  items: [],\n  className: '',\n  collapsible: true,\n  style: '',\n  onExpand: () => {},\n  onContentTap: () => {},\n};\n"
  },
  {
    "path": "copilot/ThoughtChain/variable.less",
    "content": "@import (reference) '../../src/style/variables.less';\n@import (reference) '../../src/style/themes/index.less';\n\n/* size 提示列表标题行高 */\n@thought-chain-title-color: var(\n  --thought-chain-title-color,\n  rgba(0, 0, 0, 0.45)\n);\n@thought-chain-text-color: var(\n  --thought-chain-content-color,\n  rgba(0, 0, 0, 0.55)\n);\n@thought-chain-link-color: var(--button-color, #1677ff);\n"
  },
  {
    "path": "copilot/Welcome/index.axml",
    "content": "<view class=\"ant-copilot-welcome {{ className }}\">\n  <view class=\"ant-copilot-welcome-title\">{{title}}</view>\n  <view class=\"ant-copilot-welcome-content\" onTap=\"onContentTap\">{{description}}</view>\n</view>"
  },
  {
    "path": "copilot/Welcome/index.en.md",
    "content": "---\nnav:\n  path: /copilot\ngroup:\n  title: Wake\n  order: 2\ntoc: 'content'\n---\n\n# Welcome\n\nThis is a welcome prompt component based on the Ant Design design system to show users the product identity and core value proposition.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-welcome\": \"antd-mini/es/Welcome/index\"\n#endif\n#if WECHAT\n  \"ant-welcome\": \"antd-mini/Welcome/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n```xml\n  <ant-welcome title=\"👋🏻 你好，我是 Ant Design X\" description=\"基于 Ant Design 的 AGI 产品界面解决方案，创造更美好的智能视界～\" />\n```\n\n### Demo Code\n\n<code src='../../copilot-demo/pages/Welcome/index'></code>\n\n## API\n\n### Welcome\n\nThe following table describes the API properties for Welcome components:\n\n| Property      | Description     | Type                     | Default Value |\n| --------- | -------- | ------------------------ | ------ |\n| className | Class Name     | string                   | -      |\n| styles      | Custom Style | string | -      |\n| title      | Title | string | -      |\n| description      | Description Introduction | string | -      |\n\n\n### Event\n\n| Event Name | Description | Type |\n| --- | --- | --- |\n| onTap | Trigger when a description is clicked | (e) => void |\n"
  },
  {
    "path": "copilot/Welcome/index.json5",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-icon\": \"../Icon/index\"\n  }\n}\n"
  },
  {
    "path": "copilot/Welcome/index.less",
    "content": "@import (reference) './variable.less';\n\n@buttonPrefix: ant-copilot-welcome;\n\n.@{buttonPrefix} {\n  background-image: @welcome-background-color;\n  border-radius: 24rpx;\n  padding: 24rpx;\n  box-sizing: border-box;\n\n  &-title {\n    font-size: 40rpx;\n    color: @welcome-text-color;\n    font-weight: 600;\n    margin-bottom: 24rpx;\n  }\n  &-content {\n    font-size: 32rpx;\n    color: @welcome-text-color;\n    line-height: 48rpx;\n  }\n}\n"
  },
  {
    "path": "copilot/Welcome/index.md",
    "content": "---\nnav:\n  path: /copilot\ngroup:\n  title: 唤醒\n  order: 2\ntoc: 'content'\n---\n\n# Welcome 欢迎\n\n这是一个基于 Ant Design 设计系统的欢迎提示组件，用于向用户展示产品身份和核心价值主张。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-welcome\": \"antd-mini/es/Welcome/index\"\n#endif\n#if WECHAT\n  \"ant-welcome\": \"antd-mini/Welcome/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n```xml\n  <ant-welcome title=\"👋🏻 你好，我是 Ant Design X\" description=\"基于 Ant Design 的 AGI 产品界面解决方案，创造更美好的智能视界～\" />\n```\n\n### Demo 代码\n\n<code src='../../copilot-demo/pages/Welcome/index'></code>\n\n## API\n\n### Welcome\n\n以下表格介绍了 Welcome 组件的 API 属性：\n\n| 属性      | 说明     | 类型                     | 默认值 |\n| --------- | -------- | ------------------------ | ------ |\n| className | 类名     | string                   | -      |\n| styles      | 自定义样式 | string | -      |\n| title      | 标题 | string | -      |\n| description      | 描述介绍 | string | -      |\n\n\n### 事件\n\n| 事件名 | 说明 | 类型 |\n| --- | --- | --- |\n| onTap | 点击描述时触发 | (e) => void |\n"
  },
  {
    "path": "copilot/Welcome/index.sjs.ts",
    "content": "function isExpand(collapsible, key, foldStatusMap) {\n  if (collapsible) {\n    if (collapsible.expandedKeys) {\n      return collapsible.expandedKeys.includes(key);\n    }\n    return !foldStatusMap[key];\n  }\n  return true;\n}\n\nfunction hasExpandArrow(collapsible) {\n  if (collapsible) return true;\n}\n\nexport default { isExpand, hasExpandArrow };\n"
  },
  {
    "path": "copilot/Welcome/index.ts",
    "content": "// @ts-nocheck\nimport { Component, triggerEvent } from '../_util/simply';\nimport { WelcomeProps } from './props';\n\nComponent({\n  props: WelcomeProps,\n  methods: {\n    onContentTap(e) {\n      triggerEvent(this, 'tap', e);\n    },\n  },\n});\n"
  },
  {
    "path": "copilot/Welcome/props.ts",
    "content": "/* eslint-disable @typescript-eslint/no-explicit-any */\n// @ts-nocheck\nimport { IBaseProps } from '../_util/base';\n\nexport interface IWelcomeProps extends IBaseProps {\n  className?: string;\n\n  /**\n   * @description 样式\n   */\n  styles?: string;\n  /**\n   * @description 标题\n   */\n  title: string;\n  /**\n   * @description 描述\n   */\n  description: string;\n  onTap?: (e) => void;\n}\n\nexport const WelcomeProps: Partial<IWelcomeProps> = {\n  className: '',\n  styles: '',\n  title: '',\n  description: '',\n  onTap: () => {},\n};\n"
  },
  {
    "path": "copilot/Welcome/variable.less",
    "content": "@import (reference) '../../src/style/variables.less';\n@import (reference) '../../src/style/themes/index.less';\n\n/* size 提示列表标题行高 */\n@welcome-background-color: var(--welcome-background-color, rgb(244, 246, 253));\n@welcome-text-color: var(--welcome-text-color, rgba(0, 0, 0, 0.88));\n"
  },
  {
    "path": "copilot-demo/pages/Actions/index.axml",
    "content": "<view class=\"navigation-bar\" />\n\n<ant-container title=\"基础用法\">\n  <ant-actions items=\"{{basicActions}}\" onItemTap=\"handleTapAction\" />\n</ant-container>\n\n<ant-container title=\"配合 Bubble 使用\">\n  <ant-switch checked=\"{{ showBubble }}\" onChange=\"toggleBubble\" />\n  <ant-bubble\n    a:if=\"{{ showBubble }}\"\n    content=\"永和九年，岁在癸丑，暮春之初，会于会稽山阴之兰亭，修禊事也。群贤毕至，少长咸集。此地有崇山峻岭，茂林修竹，又有清流激湍，映带左右，引以为流觞曲水，列坐其次。虽无丝竹管弦之盛，一觞一咏，亦足以畅叙幽情。\"\n    typing=\"{{ { step: 2, interval: 50 } }}\"\n    onTypingComplete=\"onTypingComplete\"\n  >\n    <ant-actions\n      a:if=\"{{ loaded }}\"\n      slot=\"footer\"\n      items=\"{{bubbleActions}}\"\n      onItemTap=\"handleBubbleAction\"\n    />\n  </ant-bubble>\n</ant-container>\n"
  },
  {
    "path": "copilot-demo/pages/Actions/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Actions\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Actions\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-actions\": \"../../../src/Actions/index\",\n    \"ant-bubble\": \"../../../src/Bubble/index\",\n    \"ant-switch\": \"../../../src/Switch/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "copilot-demo/pages/Actions/index.less",
    "content": ""
  },
  {
    "path": "copilot-demo/pages/Actions/index.ts",
    "content": "Page({\n  data: {\n    liked: false,\n    loaded: false,\n    showBubble: true,\n    basicActions: [\n      {\n        label: 'copy',\n        icon: 'TextOutline',\n      },\n      {\n        label: 'like',\n        icon: 'LikeOutline',\n      },\n      {\n        label: 'collect',\n        icon: 'StarOutline',\n      },\n      {\n        label: 'edit',\n        icon: 'EditSOutline',\n      },\n    ],\n    bubbleActions: [\n      {\n        label: 'copy',\n        icon: 'TextOutline',\n      },\n      {\n        label: 'collect',\n        icon: 'StarOutline',\n      },\n    ],\n  },\n\n  handleTapAction(item) {\n    /// #if WECHAT\n    // @ts-ignore\n    item = item.detail;\n    /// #endif\n    const basicActions = [...this.data.basicActions];\n    if (item.label === 'like') {\n      this.setData({\n        liked: !this.data.liked,\n      });\n      basicActions.find((action) => action.label === 'like').icon = this.data.liked\n        ? 'https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/JmVoRp-2UwMAAAAAAAAAAAAADoEQAQFr/original'\n        : 'LikeOutline';\n    } else {\n      /// #if ALIPAY\n      my.showToast({\n        content: `${item.label} tapped`,\n      });\n      /// #endif\n      /// #if WECHAT\n      // @ts-ignore\n      wx.showToast({\n        title: `${item.label} tapped`,\n      });\n      /// #endif\n    }\n    this.setData({\n      basicActions,\n    });\n  },\n  handleBubbleAction(item) {\n    /// #if WECHAT\n    // @ts-ignore\n    item = item.detail;\n    /// #endif\n    /// #if ALIPAY\n    my.showToast({\n      content: `${item.label} tapped`,\n    });\n    /// #endif\n    /// #if WECHAT\n    // @ts-ignore\n    wx.showToast({\n      title: `${item.label} tapped`,\n    });\n    /// #endif\n  },\n  onTypingComplete() {\n    this.setData({\n      loaded: true,\n    });\n  },\n  toggleBubble() {\n    this.setData({\n      showBubble: !this.data.showBubble,\n      loaded: false,\n    });\n  },\n});\n"
  },
  {
    "path": "copilot-demo/pages/Bubble/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基础用法\">\n  <ant-bubble content=\"这是一条普通消息\" avatar=\"https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ\" />\n</ant-container>\n\n<ant-container title=\"打字动画\">\n  <ant-switch checked=\"{{ showTyping }}\" onChange=\"onTypingChange\" />\n  <block a:if=\"{{ showTyping }}\">\n    <ant-bubble content=\"你好，这是一段打字效果动画\" typing=\"{{true}}\" onTypingComplete=\"onTypingComplete\" />\n    <ant-bubble content=\"你好，这是一段快速的打字效果动画\" typing=\"{{{ step: 1, interval: 50 }}}\" onTypingComplete=\"onTypingComplete\" />\n    <ant-bubble content=\"这是一段很长的文本消息，用于测试打字效果动画。该条消息会一次打印多个字符\" typing=\"{{{ step: 3, interval: 100 }}}\" onTypingComplete=\"onTypingComplete\" />\n  </block>\n</ant-container>\n<ant-container title=\"用户消息\">\n  <ant-bubble content=\"这是用户发送的消息\" placement=\"end\" avatar=\"https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ\" />\n</ant-container>\n\n<ant-container title=\"长文本\">\n  <ant-bubble\n    content=\"这是一段很长的文本消息，用于测试气泡的自动换行效果。气泡会根据内容自动调整宽度，这样可以保证良好的阅读体验。\"\n    avatar=\"https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ\"\n  />\n</ant-container>\n\n<ant-container title=\"对话场景\">\n  <ant-bubble content=\"你好,请问有什么可以帮你?\" avatar=\"https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ\" />\n  <ant-bubble content=\"我想了解一下这个产品的功能\" placement=\"end\" avatar=\"https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ\" />\n  <ant-bubble content=\"好的,这个产品主要有以下功能...\" avatar=\"https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ\" />\n</ant-container>\n\n<!-- 各种形状 -->\n<ant-container title=\"各种形状\">\n  <ant-bubble content=\"shape: default\" shape=\"default\" />\n  <ant-bubble content=\"shape: round\" shape=\"round\" />\n  <ant-bubble content=\"shape: corner\" shape=\"corner\" placement=\"end\" />\n  <ant-bubble content=\"variant: borderless\" variant=\"borderless\" />\n  <ant-bubble content=\"variant: outlined\" variant=\"outlined\" />\n  <ant-bubble content=\"variant: shadow\" variant=\"shadow\" />\n</ant-container>\n\n<ant-container title=\"用户名和操作\">\n  <ant-bubble content=\"你好,请问有什么可以帮你?\" avatar=\"https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ\">\n    <view slot=\"header\">\n      <text class=\"ant-copilot-bubble-name\">Ant Design Mini</text>\n    </view>\n    <view slot=\"footer\">\n      <ant-actions items=\"{{basicActions}}\" onItemTap=\"handleTapAction\" />\n    </view>\n  </ant-bubble>\n</ant-container>\n\n<ant-container title=\"加载中\">\n  <ant-switch checked=\"{{ loading }}\" onChange=\"onSwitchChange\" />\n  <ant-bubble content=\"你好，这是一段加载后显示的内容\" loading=\"{{loading}}\" />\n  <ant-bubble content=\"你好，这是一段加载后显示的内容，同时附带打字效果\" loading=\"{{loading}}\" typing=\"{{true}}\" />\n</ant-container>\n\n<ant-container title=\"自定义内容\">\n  <ant-bubble placement=\"end\">\n    <view>这是一段图文组合消息</view>\n    <image class=\"ant-copilot-bubble-image\" src=\"https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ\" />\n  </ant-bubble>\n</ant-container>\n\n"
  },
  {
    "path": "copilot-demo/pages/Bubble/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Bubble\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Bubble\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n  \"usingComponents\": {\n    \"ant-bubble\": \"../../../src/Bubble/index\",\n    \"ant-actions\": \"../../../src/Actions/index\",\n    \"ant-container\": \"../../../src/Container/index\",\n    \"ant-switch\": \"../../../src/Switch/index\"\n  }\n}\n"
  },
  {
    "path": "copilot-demo/pages/Bubble/index.less",
    "content": ".ant-copilot-bubble-name {\n  font-weight: 400;\n  font-size: 24rpx;\n  color: #737373;\n  line-height: 40rpx;\n}\n\n.ant-copilot-bubble-image {\n  width: 400rpx;\n  height: 400rpx;\n  border-radius: 10rpx;\n}\n"
  },
  {
    "path": "copilot-demo/pages/Bubble/index.ts",
    "content": "Page({\n  data: {\n    loading: true,\n    showTyping: true,\n    basicActions: [\n      {\n        label: 'copy',\n        icon: 'TextOutline',\n      },\n      {\n        label: 'like',\n        icon: 'LikeOutline',\n      },\n    ],\n  },\n  onTypingComplete() {\n    console.log('typing complete at', Date.now());\n  },\n  onTypingChange(e) {\n    this.setData({\n      showTyping: !this.data.showTyping,\n    });\n  },\n  onSwitchChange() {\n    this.setData({\n      loading: !this.data.loading,\n    });\n  },\n  handleTapAction(item) {\n    /// #if WECHAT\n    // @ts-ignore\n    item = item.detail;\n    /// #endif\n    /// #if ALIPAY\n    my.showToast({\n      content: `${item.label} tapped`,\n    });\n    /// #endif\n    /// #if WECHAT\n    // @ts-ignore\n    wx.showToast({\n      title: `${item.label} tapped`,\n    });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "copilot-demo/pages/Conversations/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基础用法\">\n  <ant-conversations\n    items=\"{{items}}\"\n    menus=\"{{menus}}\"\n    onItemTap=\"handleItemTap\"\n    onMenuItemTap=\"handleMenuItemTap\"\n  />\n</ant-container>\n\n<!-- #if ALIPAY -->\n<ant-container title=\"自定义插槽\">\n  <ant-conversations\n    items=\"{{items.slice(2,5)}}\"\n    menus=\"{{menus}}\"\n    onItemTap=\"handleItemTap\"\n    onMenuItemTap=\"handleMenuItemTap\"\n  >\n    <view slot-scope=\"props\">\n      <view style=\"color: #1677ff;\">{{props.item.label}}</view>\n      <view style=\"color: #bbbbbb;\">{{props.item.description}}</view>\n    </view>\n  </ant-conversations>\n</ant-container>\n<!-- #endif -->\n\n<ant-container title=\"抽屉中展示\">\n  <ant-button onTap=\"handleOpenHistory\" inline size=\"small\">历史记录</ant-button>\n  <ant-popup\n    className=\"history-popup\"\n    visible=\"{{ visible }}\"\n    height=\"{{ 250 }}\"\n    width=\"{{ 250 }}\"\n    position=\"left\"\n    animation\n    onClose=\"handlePopupClose\"\n  >\n    <ant-conversations\n      items=\"{{items}}\"\n      menus=\"{{menus}}\"\n      onItemTap=\"handleItemTap\"\n      onMenuItemTap=\"handleMenuItemTap\"\n    />\n  </ant-popup>\n</ant-container>\n"
  },
  {
    "path": "copilot-demo/pages/Conversations/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Conversations\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Conversations\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-container\": \"../../../src/Container/index\",\n    \"ant-conversations\": \"../../../src/Conversations/index\",\n    \"ant-popup\": \"../../../src/Popup/index\",\n    \"ant-button\": \"../../../src/Button/index\"\n  }\n}\n"
  },
  {
    "path": "copilot-demo/pages/Conversations/index.less",
    "content": ".history-popup {\n  .ant-popup-transform-left {\n    /// #if ALIPAY\n    padding-top: 90px;\n    /// #endif\n  }\n}\n"
  },
  {
    "path": "copilot-demo/pages/Conversations/index.ts",
    "content": "Page({\n  data: {\n    visible: false,\n    items: [\n      {\n        key: '1',\n        label: '给我推荐一首歌',\n        description: '这是会话的部分富文本信息描述',\n        icon: 'https://randomuser.me/api/portraits/thumb/women/4.jpg',\n        timestamp: '10:23',\n        disabled: false,\n      },\n      {\n        key: '2',\n        label: '请根据图片里的提示，写一篇小学二年级的数学题目',\n        description:\n          '这首歌来自英国歌手艾德·希兰旋律轻快，歌曲写自上个世纪落日',\n        icon: '',\n        timestamp: '10:22',\n        disabled: false,\n      },\n      {\n        key: '3',\n        label: '禁用无法点击此条',\n        description: '这是会话的部分富文本信息描述',\n        icon: '',\n        timestamp: '10:21',\n        disabled: true,\n      },\n      {\n        key: '4',\n        label: '菜单禁用无法滑动',\n        description: '这是会话的部分富文本信息描述',\n        icon: '',\n        timestamp: '10:18',\n        disabled: false,\n        disabledMenu: true,\n      },\n      {\n        key: '5',\n        label: '给我推荐一首歌',\n        description: '这是会话的部分富文本信息描述',\n        icon: '',\n        timestamp: '09:11',\n        disabled: false,\n      },\n    ],\n    menus: [\n      {\n        text: '编辑',\n        bgColor: '#FFA91B',\n        color: '#fff',\n        width: 160,\n      },\n      {\n        text: '删除',\n        bgColor: '#FF2B00',\n        color: '#fff',\n        width: 160,\n      },\n    ],\n  },\n  handleItemTap(i) {\n    let item = i;\n    /// #if ALIPAY\n    console.log(item);\n    my.showToast({ content: item.key });\n    /// #endif\n    /// #if WECHAT\n    item = i.detail[0];\n    console.log(item);\n    // @ts-ignore\n    wx.showToast({ title: item.key });\n    /// #endif\n  },\n  handleMenuItemTap(menuItem, item) {\n    /// #if ALIPAY\n    console.log(menuItem, item);\n    my.showToast({ content: `菜单${menuItem.index}_列表项${item.key}` });\n    /// #endif\n    /// #if WECHAT\n    console.log(menuItem.detail[0], menuItem.detail[1]);\n    // @ts-ignore\n    wx.showToast({\n      title: `菜单${menuItem.detail[0].index}_列表项${menuItem.detail[1].key}`,\n    });\n    /// #endif\n  },\n\n  handleOpenHistory() {\n    this.setData({\n      visible: true,\n    });\n  },\n  handlePopupClose() {\n    this.setData({\n      visible: false,\n    });\n  },\n});\n"
  },
  {
    "path": "copilot-demo/pages/Prompts/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基础用法\">\n  <ant-prompts\n    items=\"{{ baseList }}\"\n    title=\"{{ promptsTitle }}\"\n    onItemTap=\"onItemTap\"  />\n</ant-container>\n\n<ant-container title=\"有箭头\">\n  <ant-prompts\n    items=\"{{ arrowList }}\"\n    title=\"{{ promptsTitle }}\"\n    onItemTap=\"onItemTap\"  />\n</ant-container>\n\n<ant-container title=\"样式覆盖\">\n  <ant-prompts\n    items=\"{{ styleList }}\"\n    className=\"customizeStyle\"\n    title=\"{{ promptsTitle }}\"\n    onItemTap=\"onItemTap\"  />\n</ant-container>\n\n<ant-container title=\"横向展示\">\n  <ant-prompts\n    title=\"超长滑动\"\n    items=\"{{ horizontalList }}\"\n    vertical=\"{{false}}\"\n    onItemTap=\"onItemTap\"\n  />\n  <ant-prompts\n    title=\"超长换行\"\n    items=\"{{ horizontalList }}\"\n    vertical=\"{{false}}\"\n    wrap\n    onItemTap=\"onItemTap\"\n  />\n  <ant-prompts\n    title=\"自定义\"\n    items=\"{{ horizontalList }}\"\n    vertical=\"{{false}}\"\n    wrap\n    onItemTap=\"onItemTap\"\n  >\n    <view slot=\"prompts-item\" slot-scope=\"props\">自定义：{{ props.item.label }}</view>\n  </ant-prompts>\n</ant-container>\n\n<!-- #if ALIPAY -->\n<ant-container title=\"自定义提示标题\">\n  <ant-prompts\n    items=\"{{ arrowList }}\"\n    onItemTap=\"onItemTap\">\n    <view slot=\"prompts-title\" class=\"customize-prompts-title\">\n      我可以帮助您：\n    </view>\n  </ant-prompts>\n</ant-container>\n\n<ant-container title=\"自定义提示项\">\n  <ant-prompts\n    items=\"{{ baseList }}\"\n    onItemTap=\"onItemTap\">\n    <view slot=\"prompts-item\" slot-scope=\"props\" class=\"customize-prompts-item\">\n      自定义提示项：{{ props.item.label }}\n    </view>\n  </ant-prompts>\n</ant-container>\n<!-- #endif -->\n"
  },
  {
    "path": "copilot-demo/pages/Prompts/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Prompts\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Prompts\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-container\": \"../../../src/Container/index\",\n    \"ant-prompts\": \"../../../src/Prompts/index\"\n  }\n}\n"
  },
  {
    "path": "copilot-demo/pages/Prompts/index.less",
    "content": "page {\n  padding: 12rpx;\n}\n\n.customizeStyle {\n  .ant-copilot-prompts-list-item-content {\n    font-family: PingFangSC-Light;\n    font-size: 28rpx;\n    color: #bbbbbb;\n    line-height: 44rpx;\n  }\n}\n\n.customize-prompts-title {\n  color: #b76b01;\n  font: 500;\n  font-size: 36rpx;\n  padding-bottom: 24rpx;\n}\n\n.customize-prompts-item {\n  color: #ffffff;\n  font-size: 24rpx;\n  padding: 24rpx;\n  background: #aaaaaa;\n  border-radius: 16rpx;\n}\n"
  },
  {
    "path": "copilot-demo/pages/Prompts/index.ts",
    "content": "Page({\n  data: {\n    promptsTitle: '我可以帮您：',\n    baseList: [\n      {\n        label: 'Ant Design X 全新升级了什么？',\n        key: '1',\n      },\n      {\n        label: 'Ant Design X 组件资产内容',\n        key: '2',\n      },\n      {\n        label: '快速实现安装和引入组件',\n        key: '3',\n      },\n    ],\n    arrowList: [\n      {\n        showArrow: true,\n        label: '热门话题:',\n        icon: 'https://mdn.alipayobjects.com/huamei_upibrs/afts/img/A*wJ5aRpr2q1wAAAAAAAAAAAAADkx8AQ/original',\n        description: 'Ant Design X 全新升级',\n        key: '1',\n      },\n      {\n        showArrow: true,\n        label: '组件查询:',\n        icon: 'https://mdn.alipayobjects.com/huamei_upibrs/afts/img/A*R9L1RLo4x58AAAAAAAAAAAAADkx8AQ/original',\n        description: '欢迎组件',\n        key: '2',\n      },\n      {\n        showArrow: true,\n        label: '新手帮助:',\n        icon: 'https://mdn.alipayobjects.com/huamei_upibrs/afts/img/A*7eRqQ4JpdccAAAAAAAAAAAAADkx8AQ/original',\n        description: '如何实现快速安装和引入',\n        key: '3',\n      },\n      {\n        showArrow: true,\n        label: '禁用:',\n        icon: 'https://mdn.alipayobjects.com/huamei_upibrs/afts/img/A*7eRqQ4JpdccAAAAAAAAAAAAADkx8AQ/original',\n        description: '如何实现快速安装和引入',\n        key: '4',\n        disabled: true,\n      },\n    ],\n    styleList: [\n      {\n        label: '我的日程',\n        icon: 'https://mdn.alipayobjects.com/huamei_upibrs/afts/img/A*LzX3QIQ3EXMAAAAAAAAAAAAADkx8AQ/original',\n        description: '每日日程提醒，不错过每一个日程',\n        key: '1',\n      },\n      {\n        label: '组件查询',\n        icon: 'https://mdn.alipayobjects.com/huamei_upibrs/afts/img/A*2TQ2QaONoRYAAAAAAAAAAAAADkx8AQ/original',\n        description: '每日审批提醒，不漏信息',\n        key: '2',\n      },\n      {\n        label: '会议邀约',\n        icon: 'https://mdn.alipayobjects.com/huamei_upibrs/afts/img/A*Fw-tQIDYFvsAAAAAAAAAAAAADkx8AQ/original',\n        description: '实时会邀提醒，不错过重要会议',\n        key: '3',\n      },\n      {\n        label: '更多',\n        icon: 'https://mdn.alipayobjects.com/huamei_upibrs/afts/img/A*YDWcQbavX8QAAAAAAAAAAAAADkx8AQ/original',\n        description: '点击了解更多技能',\n        key: '4',\n      },\n    ],\n    horizontalList: [\n      {\n        icon: 'https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*AdC9RZfDwicAAAAAAAAAAAAADtF8AQ/original',\n        label: '我的日程',\n        value: 'schedule',\n        key: '1',\n      },\n      {\n        icon: 'https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*Mbi1R5eGTecAAAAAAAAAAAAADtF8AQ/original',\n        label: '快捷功能',\n        value: 'suggestion',\n        key: '2',\n      },\n      {\n        icon: 'https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*WqBJSZEpPbwAAAAAAAAAAAAADtF8AQ/original',\n        label: '诊断分析',\n        value: 'analyze',\n        key: '3',\n      },\n      {\n        icon: 'https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*WqBJSZEpPbwAAAAAAAAAAAAADtF8AQ/original',\n        label: '禁用',\n        value: 'analyze',\n        key: '4',\n        disabled: true,\n      },\n      {\n        // 支持 antd-icon\n        icon: 'MoreOutline',\n        label: '更多',\n        value: 'more',\n        key: '5',\n      },\n    ],\n  },\n  onItemTap(i) {\n    let item = i;\n    /// #if ALIPAY\n    console.log(item);\n    my.showToast({ content: item.key });\n    /// #endif\n    /// #if WECHAT\n    item = i.detail[0];\n    console.log(item);\n    // @ts-ignore\n    wx.showToast({ title: item.key });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "copilot-demo/pages/Sender/index.axml",
    "content": "<view class=\"navigation-bar\" />\n\n\n<ant-container title=\"基础用法\">\n  <ant-sender value=\"{{value}}\" onChange=\"handleChange\" onSubmit=\"handleSend\" />\n</ant-container>\n\n<ant-container title=\"发送 loading 状态\">\n  <ant-sender\n    value=\"{{value1}}\"\n    placeholder=\"输入你想说的话...\"\n    onChange=\"handleChange1\"\n    onSubmit=\"handleSend1\"\n    onCancel=\"handleCancel\"\n    loading=\"{{loading}}\"\n  />\n</ant-container>\n\n<ant-container title=\"禁用状态\">\n  <ant-sender disabled=\"{{true}}\" placeholder=\"输入框已禁用\" />\n</ant-container>\n\n<ant-container title=\"配合 ImageUpload 组件\">\n  <ant-sender\n    value=\"{{value3}}\"\n    placeholder=\"可以配合其他组件使用\"\n    onChange=\"handleChange3\"\n    onSubmit=\"handleSend3\"\n  >\n    <view slot=\"input-header\">\n      <ant-upload defaultFileList=\"{{[{ url: 'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*znK_ToIL8rQAAAAAAAAAAAAAARQnAQ', status: 'done' }]}}\" />\n    </view>\n  </ant-sender>\n</ant-container>\n\n<ant-container title=\"配合 Bubble 和 Prompts\">\n  <scroll-view scroll-y style=\"height: 600rpx;\" scroll-into-view=\"{{scrollToView}}\">\n    <view a:for=\"{{bubbleList}}\" id=\"msg-{{index}}\">\n      <ant-bubble\n        content=\"{{item.content}}\"\n        placement=\"{{index%2 ? 'end' : 'start'}}\"\n        shape=\"{{index%2 ? 'corner' : 'default'}}\"\n        typing=\"{{index%2 === 0}}\"\n      />\n    </view>\n  </scroll-view>\n  <ant-sender value=\"{{value4}}\" placeholder=\"组合使用\" onChange=\"handleChange4\" onSubmit=\"handleSend4\">\n    <view slot=\"wrapper-prefix\">\n      <ant-icon className=\"audioIcon\" type=\"AudioOutline\"></ant-icon>\n    </view>\n    <ant-prompts\n      slot=\"header\"\n      items=\"{{horizontalList}}\"\n      vertical=\"{{false}}\"\n      onItemTap=\"onItemTap\"\n    >\n    </ant-prompts>\n  </ant-sender>\n</ant-container>\n"
  },
  {
    "path": "copilot-demo/pages/Sender/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Sender\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Sender\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n  \"usingComponents\": {\n    \"ant-sender\": \"../../../src/Sender/index\",\n    \"ant-upload\": \"../../../src/ImageUpload/index\",\n    \"ant-prompts\": \"../../../src/Prompts/index\",\n    \"ant-bubble\": \"../../../src/Bubble/index\",\n    \"ant-container\": \"../../../src/Container/index\",\n    \"ant-icon\": \"../../../src/Icon/index\"\n  }\n}\n"
  },
  {
    "path": "copilot-demo/pages/Sender/index.less",
    "content": ".audioIcon {\n  font-size: 40rpx;\n  margin-right: 16rpx;\n}\n"
  },
  {
    "path": "copilot-demo/pages/Sender/index.ts",
    "content": "const mockResponse = [\n  '很高兴见到你！让我们开始愉快的对话吧。',\n  '你说得很有意思，能详细说说吗？',\n  '这是个很好的问题，我来仔细想想...',\n  '我明白你的想法，确实值得深入讨论。',\n  '感谢分享，这让我想到了一些新的观点。',\n  '你提到的这点很有启发性，我们可以进一步探讨。',\n];\nPage({\n  senderTimer: null,\n  data: {\n    value: '',\n    value1: '',\n    value3: '',\n    value4: '',\n    loading: false,\n    scrollToView: '',\n    bubbleList: [{ content: '你好，世界！' }],\n    horizontalList: [\n      {\n        icon: 'https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*AdC9RZfDwicAAAAAAAAAAAAADtF8AQ/original',\n        label: '我的日程',\n        value: 'schedule',\n        key: '1',\n      },\n      {\n        icon: 'https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*Mbi1R5eGTecAAAAAAAAAAAAADtF8AQ/original',\n        label: '快捷功能',\n        value: 'suggestion',\n        key: '2',\n      },\n      {\n        icon: 'https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*WqBJSZEpPbwAAAAAAAAAAAAADtF8AQ/original',\n        label: '诊断分析',\n        value: 'analyze',\n        key: '3',\n      },\n      {\n        // 支持 antd-icon\n        icon: 'MoreOutline',\n        label: '更多',\n        value: 'more',\n        key: '4',\n      },\n    ],\n  },\n  /** 基础用法  */\n  handleChange(value: string) {\n    /// #if WECHAT\n    // @ts-ignore\n    value = value.detail;\n    /// #endif\n    this.setData({ value });\n  },\n  handleSend() {\n    this.setData({ value: '' });\n  },\n  /** 发送loading状态  */\n  handleChange1(value: string) {\n    /// #if WECHAT\n    // @ts-ignore\n    value = value.detail;\n    /// #endif\n    this.setData({ value1: value });\n  },\n  handleSend1() {\n    this.setData({ loading: true });\n    this.senderTimer = setTimeout(() => {\n      this.setData({ value1: '', loading: false });\n    }, 2000);\n  },\n  handleCancel() {\n    clearTimeout(this.senderTimer);\n    this.setData({ loading: false });\n  },\n  /** 配合upload组件 */\n  handleChange3(value: string) {\n    /// #if WECHAT\n    // @ts-ignore\n    value = value.detail;\n    /// #endif\n    this.setData({ value3: value });\n  },\n  handleSend3() {\n    this.setData({ value3: '' });\n  },\n  /** 配合bubble和prompts */\n  addBubble(value: string) {\n    const bubbleList = [...this.data.bubbleList];\n    bubbleList.push({ content: value });\n    this.setData({ bubbleList }, () => {\n      this.setData({ scrollToView: `msg-${bubbleList.length - 1}` });\n    });\n  },\n  handleChange4(value: string) {\n    /// #if WECHAT\n    // @ts-ignore\n    value = value.detail;\n    /// #endif\n    this.setData({ value4: value });\n  },\n  onItemTap(e) {\n    /// #if WECHAT\n    // @ts-ignore\n    e = e.detail;\n    /// #endif\n    this.handleSend4(e.label)\n  },\n  handleSend4(val: string) {\n    if (!this.data.value4 && !val) return;\n    this.addBubble(val || this.data.value4);\n    this.setData({ value4: '' });\n    setTimeout(() => {\n      this.addBubble(\n        mockResponse[Math.floor(Math.random() * mockResponse.length)]\n      );\n    }, 500);\n  },\n});\n"
  },
  {
    "path": "copilot-demo/pages/ThoughtChain/index.axml",
    "content": "<view class=\"navigation-bar\" />\n<!-- #if ALIPAY -->\n<ant-container title=\"基础用法\">\n  <ant-thought-chain items=\"{{basicList}}\" onContentTap=\"onContentItemTap\" collapsible=\"{{true}}\">\n  </ant-thought-chain>\n</ant-container>\n\n<ant-container title=\"自定义内容\">\n  <ant-thought-chain items=\"{{basicList}}\" onContentTap=\"onContentItemTap\" collapsible=\"{{false}}\">\n    <view slot=\"content\" slot-scope=\"module\" style=\"color: red\">\n      {{module.content}}\n    </view>\n  </ant-thought-chain>\n</ant-container>\n<ant-container title=\"二级节点\">\n  <ant-thought-chain items=\"{{customList}}\" onContentTap=\"onContentItemTap\" collapsible=\"{{true}}\">\n    <view slot=\"content\" slot-scope=\"module\">\n      <view a:if=\"{{typeof(module.content) === 'object'}}\" class=\"secondLevel\">\n        <ant-thought-chain\n          className=\"second-thoughtchain\"\n          items=\"{{module.content}}\"\n          collapsible=\"{{false}}\"\n        >\n          <view slot=\"content\" slot-scope=\"secondModule\" a:if=\"{{typeof(secondModule.content) === 'object'}}\">\n            <view class=\"second-thoughtchain-content\" a:for=\"{{secondModule.content}}\">\n              {{item}}\n            </view>\n          </view>\n          <view a:else class=\"second-thoughtchain-content\">\n            {{secondModule.content}}\n          </view>\n        </ant-thought-chain>\n      </view>\n      <view a:else>{{module.content}}</view>\n    </view>\n  </ant-thought-chain>\n</ant-container>\n<!-- #endif -->\n <!-- #if WECHAT -->\n<ant-container title=\"基础用法\">\n  <ant-thought-chain items=\"{{basicList}}\" onContentTap=\"onContentItemTap\" collapsible=\"{{true}}\">\n  </ant-thought-chain>\n</ant-container>\n<!-- #endif -->\n"
  },
  {
    "path": "copilot-demo/pages/ThoughtChain/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"ThoughtChain\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"ThoughtChain\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-container\": \"../../../src/Container/index\",\n    \"ant-thought-chain\": \"../../../src/ThoughtChain/index\"\n  },\n  \"transparentTitle\": \"always\"\n}\n"
  },
  {
    "path": "copilot-demo/pages/ThoughtChain/index.less",
    "content": "page {\n  // background: #f5f5f5;\n  padding: 12rpx;\n  /* 浅色模式的css变量 */\n@media (prefers-color-scheme: light) {\n  --background-color: #f5f5f5;\n  --title-color: #000;\n  --content-color: #999;\n}\n\n/* 深色模式的css变量 */\n@media (prefers-color-scheme: dark) {\n  --background-color: #0A0A0A;\n  --title-color: #fff;\n  --content-color: #666;\n}\n  .secondLevel {\n    padding: 24rpx;\n    background-color: var(--background-color);\n    border-radius: 24rpx;\n    margin-left: -58rpx;\n  }\n  .second-thoughtchain {\n    .ant-copilot-thoughtchain-node-title {\n      color: var(--title-color);\n    }\n    .second-thoughtchain-content {\n      color: var(--content-color);\n    }\n  }\n}\n"
  },
  {
    "path": "copilot-demo/pages/ThoughtChain/index.ts",
    "content": "//@ts-ignore\n\nPage({\n  data: {\n    basicList: [\n      {\n        title: '理解问题',\n        content: '3A游戏',\n        icon: 'CheckCircleOutline',\n      },\n      {\n        title: '没有在本地找到结果',\n        content: '当前主流显卡',\n        icon: 'CheckCircleOutline',\n      },\n      {\n        title: '在互联网上搜索问题',\n        content: '黑神话悟空所需显卡',\n        icon: 'MoreOutline',\n      },\n    ],\n    customList: [\n      {\n        title: '理解问题',\n        content: '解析语法结构',\n      },\n      {\n        status: 'loading',\n        title: '搜索问题',\n        content: [\n          {\n            title: '理解问题',\n          },\n          {\n            title: '联网搜索',\n            content: '1. 黑神话悟空介绍',\n          },\n          {\n            title: '已根据搜索结果精选3篇资料',\n            content: [\n              '1. 黑神话悟空介绍',\n              '2. 对于1080p显示器，4060ti和4060该选哪个？',\n              '3. 黑神话悟空官方建议配置',\n            ],\n          },\n          {\n            title: '联想更多结果',\n          },\n        ],\n      },\n    ],\n  },\n  onContentItemTap(e) {\n    const { content } = e.currentTarget.dataset || {};\n    /// #if ALIPAY\n    my.showToast({ content: content });\n    /// #endif\n    /// #if WECHAT\n    // @ts-ignore\n    wx.showToast({ title: content });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "copilot-demo/pages/Welcome/index.axml",
    "content": "<view class=\"navigation-bar\" />\n\n<ant-container title=\"基础用法\">\n  <ant-welcome title=\"👋🏻 你好，我是 Ant Design X\" description=\"基于 Ant Design 的 AGI 产品界面解决方案，创造更美好的智能视界～\" />\n</ant-container>"
  },
  {
    "path": "copilot-demo/pages/Welcome/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Welcome\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Welcome\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-container\": \"../../../src/Container/index\",\n    \"ant-welcome\": \"../../../src/Welcome/index\"\n  },\n  \"transparentTitle\": \"always\"\n}\n"
  },
  {
    "path": "copilot-demo/pages/Welcome/index.less",
    "content": "page {\n  // background: #f5f5f5;\n  padding: 12rpx;\n  .secondLevel {\n    padding: 24rpx;\n    background-color: #f5f5f5;\n    border-radius: 24rpx;\n    margin-left: -58rpx;\n  }\n  .second-thoughtchain {\n    .ant-copilot-thoughtchain-node-title {\n      color: #000;\n    }\n    .second-thoughtchain-content {\n      color: #999;\n    }\n  }\n}\n"
  },
  {
    "path": "copilot-demo/pages/Welcome/index.ts",
    "content": "//@ts-ignore\n\nPage({});\n"
  },
  {
    "path": "demo/components/Calendar/collapse-container/cn-day/index.axml",
    "content": "<view\n  class=\"cn-day {{ festival ? 'festival' : '' }} {{ unset ? 'unset' : '' }}\">\n  {{ cnday }}\n</view>\n"
  },
  {
    "path": "demo/components/Calendar/collapse-container/cn-day/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\"\n}\n"
  },
  {
    "path": "demo/components/Calendar/collapse-container/cn-day/index.less",
    "content": ".cn-day {\n  color: #999999;\n}\n\n.festival {\n  color: red;\n}\n\n.unset {\n  color: unset;\n}\n"
  },
  {
    "path": "demo/components/Calendar/collapse-container/cn-day/index.ts",
    "content": "import dayjs from 'dayjs';\nimport equal from 'fast-deep-equal';\nimport { Component, getValueFromProps } from '../../../../../src/_util/simply';\nimport Converter from './js-calendar-converter';\n\ninterface Props {\n  cell: any;\n}\n\nComponent({\n  props: {\n    cell: null,\n  } as Props,\n  data: {\n    cnday: '',\n    festival: '',\n    unset: '',\n  },\n  methods: {\n    updateData() {\n      const cell = getValueFromProps(this, 'cell');\n      const time = dayjs(cell?.time);\n      const vs = Converter.solar2lunar(\n        time.get('year'),\n        time.get('month') + 1,\n        time.get('date')\n      );\n      if (vs === -1) {\n        this.setData({\n          cnday: '',\n        });\n        return;\n      }\n      this.setData({\n        cnday: vs.lunarFestival || vs.festival || vs.IDayCn,\n        festival: !!vs.festival || !!vs.lunarFestival,\n        unset: cell?.isSelectedBegin || cell?.isSelectedEnd,\n      });\n    },\n  },\n\n  /// #if ALIPAY\n  onInit() {\n    this.updateData();\n  },\n  didUpdate(prevProps) {\n    const cell = getValueFromProps(this, 'cell');\n    if (!equal(prevProps.cell, cell)) {\n      this.updateData();\n    }\n  },\n  /// #endif\n  /// #if WECHAT\n  attached() {\n    this.updateData();\n  },\n  observers: {\n    '**': function (data) {\n      const prevData = this._prevData || this.data;\n      this._prevData = { ...data };\n      if (!equal(prevData.cell, data.cell)) {\n        this.updateData();\n      }\n    },\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "demo/components/Calendar/collapse-container/cn-day/js-calendar-converter.js",
    "content": "var lunarInfo = [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,\n//1900-1909\n0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977,\n//1910-1919\n0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970,\n//1920-1929\n0x06566, 0x0d4a0, 0x0ea50, 0x16a95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950,\n//1930-1939\n0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557,\n//1940-1949\n0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0,\n//1950-1959\n0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0,\n//1960-1969\n0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6,\n//1970-1979\n0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570,\n//1980-1989\n0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x05ac0, 0x0ab60, 0x096d5, 0x092e0,\n//1990-1999\n0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5,\n//2000-2009\n0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930,\n//2010-2019\n0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530,\n//2020-2029\n0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45,\n//2030-2039\n0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0,\n//2040-2049\n/**Add By JJonline@JJonline.Cn**/\n0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0,\n//2050-2059\n0x092e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4,\n//2060-2069\n0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0,\n//2070-2079\n0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160,\n//2080-2089\n0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252,\n//2090-2099\n0x0d520]; //2100\n\nvar solarMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\nvar Gan = [\"\\u7532\", \"\\u4E59\", \"\\u4E19\", \"\\u4E01\", \"\\u620A\", \"\\u5DF1\", \"\\u5E9A\", \"\\u8F9B\", \"\\u58EC\", \"\\u7678\"];\nvar Zhi = [\"\\u5B50\", \"\\u4E11\", \"\\u5BC5\", \"\\u536F\", \"\\u8FB0\", \"\\u5DF3\", \"\\u5348\", \"\\u672A\", \"\\u7533\", \"\\u9149\", \"\\u620C\", \"\\u4EA5\"];\n\nvar ChineseZodiac = [\"\\u9F20\", \"\\u725B\", \"\\u864E\", \"\\u5154\", \"\\u9F99\", \"\\u86C7\", \"\\u9A6C\", \"\\u7F8A\", \"\\u7334\", \"\\u9E21\", \"\\u72D7\", \"\\u732A\"];\n\nvar festival = {\n  '1-1': {\n    title: '元旦节'\n  },\n  '2-14': {\n    title: '情人节'\n  },\n  '5-1': {\n    title: '劳动节'\n  },\n  '5-4': {\n    title: '青年节'\n  },\n  '6-1': {\n    title: '儿童节'\n  },\n  '9-10': {\n    title: '教师节'\n  },\n  '10-1': {\n    title: '国庆节'\n  },\n  '12-25': {\n    title: '圣诞节'\n  },\n  '3-8': {\n    title: '妇女节'\n  },\n  '3-12': {\n    title: '植树节'\n  },\n  '4-1': {\n    title: '愚人节'\n  },\n  '5-12': {\n    title: '护士节'\n  },\n  '7-1': {\n    title: '建党节'\n  },\n  '8-1': {\n    title: '建军节'\n  },\n  '12-24': {\n    title: '平安夜'\n  }\n};\nvar lFestival = {\n  '12-30': {\n    title: '除夕'\n  },\n  '1-1': {\n    title: '春节'\n  },\n  '1-15': {\n    title: '元宵节'\n  },\n  '2-2': {\n    title: '龙抬头'\n  },\n  '5-5': {\n    title: '端午节'\n  },\n  '7-7': {\n    title: '七夕节'\n  },\n  '7-15': {\n    title: '中元节'\n  },\n  '8-15': {\n    title: '中秋节'\n  },\n  '9-9': {\n    title: '重阳节'\n  },\n  '10-1': {\n    title: '寒衣节'\n  },\n  '10-15': {\n    title: '下元节'\n  },\n  '12-8': {\n    title: '腊八节'\n  },\n  '12-23': {\n    title: '北方小年'\n  },\n  '12-24': {\n    title: '南方小年'\n  }\n};\n\nvar solarTerm = [\"\\u5C0F\\u5BD2\", \"\\u5927\\u5BD2\", \"\\u7ACB\\u6625\", \"\\u96E8\\u6C34\", \"\\u60CA\\u86F0\", \"\\u6625\\u5206\", \"\\u6E05\\u660E\", \"\\u8C37\\u96E8\", \"\\u7ACB\\u590F\", \"\\u5C0F\\u6EE1\", \"\\u8292\\u79CD\", \"\\u590F\\u81F3\", \"\\u5C0F\\u6691\", \"\\u5927\\u6691\", \"\\u7ACB\\u79CB\", \"\\u5904\\u6691\", \"\\u767D\\u9732\", \"\\u79CB\\u5206\", \"\\u5BD2\\u9732\", \"\\u971C\\u964D\", \"\\u7ACB\\u51AC\", \"\\u5C0F\\u96EA\", \"\\u5927\\u96EA\", \"\\u51AC\\u81F3\"];\nvar sTermInfo = ['9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '9778397bd19801ec9210c965cc920e', '97b6b97bd19801ec95f8c965cc920f', '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd197c36c9210c9274c91aa', '97b6b97bd19801ec95f8c965cc920e', '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec95f8c965cc920e', '97bcf97c3598082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '9778397bd19801ec9210c9274c920e', '97b6b97bd19801ec95f8c965cc920f', '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', '97b6b97bd19801ec95f8c965cc920f', '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bd07f1487f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c91aa', '97b6b97bd197c36c9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', '97b6b7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36b0b70c9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c91aa', '97b6b7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '977837f0e37f149b0723b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c35b0b6fc9210c8dc2', '977837f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc9210c8dc2', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0723b06bd', '7f07e7f0e37f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e37f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e37f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f149b0723b0787b0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0723b06bd', '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0723b06bd', '7f07e7f0e37f14998083b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14898082b0723b02d5', '7f07e7f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66aa89801e9808297c35', '665f67f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66a449801e9808297c35', '665f67f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e36665b66a449801e9808297c35', '665f67f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e26665b66a449801e9808297c35', '665f67f0e37f1489801eb072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722'];\n\nvar nStr1 = [\"\\u65E5\", \"\\u4E00\", \"\\u4E8C\", \"\\u4E09\", \"\\u56DB\", \"\\u4E94\", \"\\u516D\", \"\\u4E03\", \"\\u516B\", \"\\u4E5D\", \"\\u5341\"];\nvar nStr2 = [\"\\u521D\", \"\\u5341\", \"\\u5EFF\", \"\\u5345\"];\nvar nStr3 = [\"\\u6B63\", \"\\u4E8C\", \"\\u4E09\", \"\\u56DB\", \"\\u4E94\", \"\\u516D\", \"\\u4E03\", \"\\u516B\", \"\\u4E5D\", \"\\u5341\", \"\\u51AC\", \"\\u814A\"];\n\n/**\r\n * @1900-2100区间内的公历、农历互转\r\n * @charset UTF-8\r\n * @Author  Jea杨(JJonline@JJonline.Cn)\r\n * @Time    2014-7-21\r\n * @Time    2016-8-13 Fixed 2033hex、Attribution Annals\r\n * @Time    2016-9-25 Fixed lunar LeapMonth Param Bug\r\n * @Time    2017-7-24 Fixed use getTerm Func Param Error.use solar year,NOT lunar year\r\n * @Version 1.0.3\r\n * @公历转农历：calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0]\r\n * @农历转公历：calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0]\r\n */\nvar calendar = {\n  /**\r\n   * 农历1900-2100的润大小信息表\r\n   * @Array Of Property\r\n   * @return Hex\r\n   */\n  lunarInfo: lunarInfo,\n  /**\r\n   * 公历每个月份的天数普通表\r\n   * @Array Of Property\r\n   * @return Number\r\n   */\n  solarMonth: solarMonth,\n  /**\r\n   * 天干地支之天干速查表\r\n   * @Array Of Property trans[\"甲\",\"乙\",\"丙\",\"丁\",\"戊\",\"己\",\"庚\",\"辛\",\"壬\",\"癸\"]\r\n   * @return Cn string\r\n   */\n  Gan: Gan,\n  /**\r\n   * 天干地支之地支速查表\r\n   * @Array Of Property\r\n   * @trans[\"子\",\"丑\",\"寅\",\"卯\",\"辰\",\"巳\",\"午\",\"未\",\"申\",\"酉\",\"戌\",\"亥\"]\r\n   * @return Cn string\r\n   */\n  Zhi: Zhi,\n  /**\r\n   * 天干地支之地支速查表<=>生肖\r\n   * @Array Of Property\r\n   * @trans[\"鼠\",\"牛\",\"虎\",\"兔\",\"龙\",\"蛇\",\"马\",\"羊\",\"猴\",\"鸡\",\"狗\",\"猪\"]\r\n   * @return Cn string\r\n   */\n  Animals: ChineseZodiac,\n  /**\r\n   * 阳历节日\r\n   */\n  festival: festival,\n  /**\r\n   * 农历节日\r\n   */\n  lFestival: lFestival,\n  /**\r\n   * 24节气速查表\r\n   * @Array Of Property\r\n   * @trans[\"小寒\",\"大寒\",\"立春\",\"雨水\",\"惊蛰\",\"春分\",\"清明\",\"谷雨\",\"立夏\",\"小满\",\"芒种\",\"夏至\",\"小暑\",\"大暑\",\"立秋\",\"处暑\",\"白露\",\"秋分\",\"寒露\",\"霜降\",\"立冬\",\"小雪\",\"大雪\",\"冬至\"]\r\n   * @return Cn string\r\n   */\n  solarTerm: solarTerm,\n  /**\r\n   * 1900-2100各年的24节气日期速查表\r\n   * @Array Of Property\r\n   * @return 0x string For splice\r\n   */\n  sTermInfo: sTermInfo,\n  /**\r\n   * 数字转中文速查表\r\n   * @Array Of Property\r\n   * @trans ['日','一','二','三','四','五','六','七','八','九','十']\r\n   * @return Cn string\r\n   */\n  nStr1: nStr1,\n  /**\r\n   * 日期转农历称呼速查表\r\n   * @Array Of Property\r\n   * @trans ['初','十','廿','卅']\r\n   * @return Cn string\r\n   */\n  nStr2: nStr2,\n  /**\r\n   * 月份转农历称呼速查表\r\n   * @Array Of Property\r\n   * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊']\r\n   * @return Cn string\r\n   */\n  nStr3: nStr3,\n  /**\r\n   * 返回默认定义的阳历节日\r\n   */\n  getFestival: function getFestival() {\n    return this.festival;\n  },\n  /**\r\n   * 返回默认定义的内容里节日\r\n   */\n  getLunarFestival: function getLunarFestival() {\n    return this.lFestival;\n  },\n  /**\r\n   *\r\n   * @param param {Object} 按照festival的格式输入数据，设置阳历节日\r\n   */\n  setFestival: function setFestival() {\n    var param = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    this.festival = param;\n  },\n  /**\r\n   *\r\n   * @param param {Object} 按照lFestival的格式输入数据，设置农历节日\r\n   */\n  setLunarFestival: function setLunarFestival() {\n    var param = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    this.lFestival = param;\n  },\n  /**\r\n   * 返回农历y年一整年的总天数\r\n   * @param y lunar Year\r\n   * @return Number\r\n   * @eg:var count = calendar.lYearDays(1987) ;//count=387\r\n   */\n  lYearDays: function lYearDays(y) {\n    var i,\n      sum = 348;\n    for (i = 0x8000; i > 0x8; i >>= 1) {\n      sum += this.lunarInfo[y - 1900] & i ? 1 : 0;\n    }\n    return sum + this.leapDays(y);\n  },\n  /**\r\n   * 返回农历y年闰月是哪个月；若y年没有闰月 则返回0\r\n   * @param y lunar Year\r\n   * @return Number (0-12)\r\n   * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6\r\n   */\n  leapMonth: function leapMonth(y) {\n    //闰字编码 \\u95f0\n    return this.lunarInfo[y - 1900] & 0xf;\n  },\n  /**\r\n   * 返回农历y年闰月的天数 若该年没有闰月则返回0\r\n   * @param y lunar Year\r\n   * @return Number (0、29、30)\r\n   * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29\r\n   */\n  leapDays: function leapDays(y) {\n    if (this.leapMonth(y)) {\n      return this.lunarInfo[y - 1900] & 0x10000 ? 30 : 29;\n    }\n    return 0;\n  },\n  /**\r\n   * 返回农历y年m月（非闰月）的总天数，计算m为闰月时的天数请使用leapDays方法\r\n   * @param y lunar Year\r\n   * @param m lunar Month\r\n   * @return Number (-1、29、30)\r\n   * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29\r\n   */\n  monthDays: function monthDays(y, m) {\n    if (m > 12 || m < 1) {\n      return -1;\n    } //月份参数从1至12，参数错误返回-1\n    return this.lunarInfo[y - 1900] & 0x10000 >> m ? 30 : 29;\n  },\n  /**\r\n   * 返回公历(!)y年m月的天数\r\n   * @param y solar Year\r\n   * @param m solar Month\r\n   * @return Number (-1、28、29、30、31)\r\n   * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30\r\n   */\n  solarDays: function solarDays(y, m) {\n    if (m > 12 || m < 1) {\n      return -1;\n    } //若参数错误 返回-1\n    var ms = m - 1;\n    if (ms === 1) {\n      //2月份的闰平规律测算后确认返回28或29\n      return y % 4 === 0 && y % 100 !== 0 || y % 400 === 0 ? 29 : 28;\n    } else {\n      return this.solarMonth[ms];\n    }\n  },\n  /**\r\n   * 农历年份转换为干支纪年\r\n   * @param  lYear 农历年的年份数\r\n   * @return Cn string\r\n   */\n  toGanZhiYear: function toGanZhiYear(lYear) {\n    var ganKey = (lYear - 3) % 10;\n    var zhiKey = (lYear - 3) % 12;\n    if (ganKey === 0) ganKey = 10; //如果余数为0则为最后一个天干\n    if (zhiKey === 0) zhiKey = 12; //如果余数为0则为最后一个地支\n    return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1];\n  },\n  /**\r\n   * 公历月、日判断所属星座\r\n   * @param  cMonth [description]\r\n   * @param  cDay [description]\r\n   * @return Cn string\r\n   */\n  toAstro: function toAstro(cMonth, cDay) {\n    var s = \"\\u6469\\u7FAF\\u6C34\\u74F6\\u53CC\\u9C7C\\u767D\\u7F8A\\u91D1\\u725B\\u53CC\\u5B50\\u5DE8\\u87F9\\u72EE\\u5B50\\u5904\\u5973\\u5929\\u79E4\\u5929\\u874E\\u5C04\\u624B\\u6469\\u7FAF\";\n    var arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22];\n    return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + \"\\u5EA7\"; //座\n  },\n\n  /**\r\n   * 传入offset偏移量返回干支\r\n   * @param offset 相对甲子的偏移量\r\n   * @return Cn string\r\n   */\n  toGanZhi: function toGanZhi(offset) {\n    return this.Gan[offset % 10] + this.Zhi[offset % 12];\n  },\n  /**\r\n   * 传入公历(!)y年获得该年第n个节气的公历日期\r\n   * @param y y公历年(1900-2100)\r\n   * @param n n二十四节气中的第几个节气(1~24)；从n=1(小寒)算起\r\n   * @return day Number\r\n   * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春\r\n   */\n  getTerm: function getTerm(y, n) {\n    if (y < 1900 || y > 2100 || n < 1 || n > 24) {\n      return -1;\n    }\n    var _table = this.sTermInfo[y - 1900];\n    var _calcDay = [];\n    for (var index = 0; index < _table.length; index += 5) {\n      var chunk = parseInt('0x' + _table.substr(index, 5)).toString();\n      _calcDay.push(chunk[0], chunk.substr(1, 2), chunk[3], chunk.substr(4, 2));\n    }\n    return parseInt(_calcDay[n - 1]);\n  },\n  /**\r\n   * 传入农历数字月份返回汉语通俗表示法\r\n   * @param m lunar month\r\n   * @return Cn string\r\n   * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月'\r\n   */\n  toChinaMonth: function toChinaMonth(m) {\n    // 月 => \\u6708\n    if (m > 12 || m < 1) {\n      return -1;\n    } //若参数错误 返回-1\n    var s = this.nStr3[m - 1];\n    s += \"\\u6708\"; //加上月字\n    return s;\n  },\n  /**\r\n   * 传入农历日期数字返回汉字表示法\r\n   * @param d lunar day\r\n   * @return Cn string\r\n   * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一'\r\n   */\n  toChinaDay: function toChinaDay(d) {\n    //日 => \\u65e5\n    var s;\n    switch (d) {\n      case 10:\n        s = \"\\u521D\\u5341\";\n        break;\n      case 20:\n        s = \"\\u4E8C\\u5341\";\n        break;\n      case 30:\n        s = \"\\u4E09\\u5341\";\n        break;\n      default:\n        s = this.nStr2[Math.floor(d / 10)];\n        s += this.nStr1[d % 10];\n    }\n    return s;\n  },\n  /**\r\n   * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春”\r\n   * @param y year\r\n   * @return Cn string\r\n   * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔'\r\n   */\n  getAnimal: function getAnimal(y) {\n    return this.Animals[(y - 4) % 12];\n  },\n  /**\r\n   * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON\r\n   * !important! 公历参数区间1900.1.31~2100.12.31\r\n   * @param yPara  solar year\r\n   * @param mPara  solar month\r\n   * @param dPara  solar day\r\n   * @return JSON object\r\n   * @eg:console.log(calendar.solar2lunar(1987,11,01));\r\n   */\n  solar2lunar: function solar2lunar(yPara, mPara, dPara) {\n    var y = parseInt(yPara);\n    var m = parseInt(mPara);\n    var d = parseInt(dPara);\n    //年份限定、上限\n    if (y < 1900 || y > 2100) {\n      return -1; // undefined转换为数字变为NaN\n    }\n    //公历传参最下限\n    if (y === 1900 && m === 1 && d < 31) {\n      return -1;\n    }\n\n    //未传参  获得当天\n    var objDate;\n    if (!y) {\n      objDate = new Date();\n    } else {\n      objDate = new Date(y, parseInt(m) - 1, d);\n    }\n    var i,\n      leap = 0,\n      temp = 0;\n    //修正ymd参数\n    y = objDate.getFullYear();\n    m = objDate.getMonth() + 1;\n    d = objDate.getDate();\n    var offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0, 31)) / 86400000;\n    for (i = 1900; i < 2101 && offset > 0; i++) {\n      temp = this.lYearDays(i);\n      offset -= temp;\n    }\n    if (offset < 0) {\n      offset += temp;\n      i--;\n    }\n\n    //是否今天\n    var isTodayObj = new Date(),\n      isToday = false;\n    if (isTodayObj.getFullYear() === y && isTodayObj.getMonth() + 1 === m && isTodayObj.getDate() === d) {\n      isToday = true;\n    }\n    //星期几\n    var nWeek = objDate.getDay(),\n      cWeek = this.nStr1[nWeek];\n    //数字表示周几顺应天朝周一开始的惯例\n    if (nWeek === 0) {\n      nWeek = 7;\n    }\n    //农历年\n    var year = i;\n    leap = this.leapMonth(i); //闰哪个月\n    var isLeap = false;\n\n    //效验闰月\n    for (i = 1; i < 13 && offset > 0; i++) {\n      //闰月\n      if (leap > 0 && i === leap + 1 && isLeap === false) {\n        --i;\n        isLeap = true;\n        temp = this.leapDays(year); //计算农历闰月天数\n      } else {\n        temp = this.monthDays(year, i); //计算农历普通月天数\n      }\n      //解除闰月\n      if (isLeap === true && i === leap + 1) {\n        isLeap = false;\n      }\n      offset -= temp;\n    }\n    // 闰月导致数组下标重叠取反\n    if (offset === 0 && leap > 0 && i === leap + 1) {\n      if (isLeap) {\n        isLeap = false;\n      } else {\n        isLeap = true;\n        --i;\n      }\n    }\n    if (offset < 0) {\n      offset += temp;\n      --i;\n    }\n    //农历月\n    var month = i;\n    //农历日\n    var day = offset + 1;\n    //天干地支处理\n    var sm = m - 1;\n    var gzY = this.toGanZhiYear(year);\n\n    // 当月的两个节气\n    // bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year`\n    var firstNode = this.getTerm(y, m * 2 - 1); //返回当月「节」为几日开始\n    var secondNode = this.getTerm(y, m * 2); //返回当月「节」为几日开始\n\n    // 依据12节气修正干支月\n    var gzM = this.toGanZhi((y - 1900) * 12 + m + 11);\n    if (d >= firstNode) {\n      gzM = this.toGanZhi((y - 1900) * 12 + m + 12);\n    }\n\n    //传入的日期的节气与否\n    var isTerm = false;\n    var Term = null;\n    if (firstNode === d) {\n      isTerm = true;\n      Term = this.solarTerm[m * 2 - 2];\n    }\n    if (secondNode === d) {\n      isTerm = true;\n      Term = this.solarTerm[m * 2 - 1];\n    }\n    //日柱 当月一日与 1900/1/1 相差天数\n    var dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10;\n    var gzD = this.toGanZhi(dayCyclical + d - 1);\n    //该日期所属的星座\n    var astro = this.toAstro(m, d);\n    var solarDate = y + '-' + m + '-' + d;\n    var lunarDate = year + '-' + month + '-' + day;\n    var festival = this.festival;\n    var lFestival = this.lFestival;\n    var festivalDate = m + '-' + d;\n    var lunarFestivalDate = month + '-' + day;\n\n    // bugfix https://github.com/jjonline/calendar.js/issues/29\n    // 农历节日修正：农历12月小月则29号除夕，大月则30号除夕\n    // 此处取巧修正：当前为农历12月29号时增加一次判断并且把lunarFestivalDate设置为12-30以正确取得除夕\n    // 天朝农历节日遇闰月过前不过后的原则，此处取农历12月天数不考虑闰月\n    // 农历润12月在本工具支持的200年区间内仅1574年出现\n    if (month === 12 && day === 29 && this.monthDays(year, month) === 29) {\n      lunarFestivalDate = '12-30';\n    }\n    return {\n      date: solarDate,\n      lunarDate: lunarDate,\n      festival: festival[festivalDate] ? festival[festivalDate].title : null,\n      lunarFestival: lFestival[lunarFestivalDate] ? lFestival[lunarFestivalDate].title : null,\n      'lYear': year,\n      'lMonth': month,\n      'lDay': day,\n      'Animal': this.getAnimal(year),\n      'IMonthCn': (isLeap ? \"\\u95F0\" : '') + this.toChinaMonth(month),\n      'IDayCn': this.toChinaDay(day),\n      'cYear': y,\n      'cMonth': m,\n      'cDay': d,\n      'gzYear': gzY,\n      'gzMonth': gzM,\n      'gzDay': gzD,\n      'isToday': isToday,\n      'isLeap': isLeap,\n      'nWeek': nWeek,\n      'ncWeek': \"\\u661F\\u671F\" + cWeek,\n      'isTerm': isTerm,\n      'Term': Term,\n      'astro': astro\n    };\n  },\n  /**\r\n   * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON\r\n   * !important! 参数区间1900.1.31~2100.12.1\r\n   * @param y  lunar year\r\n   * @param m  lunar month\r\n   * @param d  lunar day\r\n   * @param isLeapMonth  lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可]\r\n   * @return JSON object\r\n   * @eg:console.log(calendar.lunar2solar(1987,9,10));\r\n   */\n  lunar2solar: function lunar2solar(y, m, d, isLeapMonth) {\n    y = parseInt(y);\n    m = parseInt(m);\n    d = parseInt(d);\n    isLeapMonth = !!isLeapMonth;\n    var leapMonth = this.leapMonth(y);\n    this.leapDays(y);\n    if (isLeapMonth && leapMonth !== m) {\n      return -1;\n    } //传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同\n    if (y === 2100 && m === 12 && d > 1 || y === 1900 && m === 1 && d < 31) {\n      return -1;\n    } //超出了最大极限值\n    var day = this.monthDays(y, m);\n    var _day = day;\n    //bugFix 2016-9-25\n    //if month is leap, _day use leapDays method\n    if (isLeapMonth) {\n      _day = this.leapDays(y, m);\n    }\n    if (y < 1900 || y > 2100 || d > _day) {\n      return -1;\n    } //参数合法性效验\n\n    //计算农历的时间差\n    var offset = 0;\n    var i;\n    for (i = 1900; i < y; i++) {\n      offset += this.lYearDays(i);\n    }\n    var leap = 0,\n      isAdd = false;\n    for (i = 1; i < m; i++) {\n      leap = this.leapMonth(y);\n      if (!isAdd) {\n        //处理闰月\n        if (leap <= i && leap > 0) {\n          offset += this.leapDays(y);\n          isAdd = true;\n        }\n      }\n      offset += this.monthDays(y, i);\n    }\n    //转换闰月农历 需补充该年闰月的前一个月的时差\n    if (isLeapMonth) {\n      offset += day;\n    }\n    //1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点)\n    var strap = Date.UTC(1900, 1, 30, 0, 0, 0);\n    var calObj = new Date((offset + d - 31) * 86400000 + strap);\n    var cY = calObj.getUTCFullYear();\n    var cM = calObj.getUTCMonth() + 1;\n    var cD = calObj.getUTCDate();\n    return this.solar2lunar(cY, cM, cD);\n  }\n};\n\nexport { calendar as default };\n"
  },
  {
    "path": "demo/components/Calendar/collapse-container/index.axml",
    "content": "<ant-container title=\"{{ containerTitle }}\">\n  <view\n    slot=\"headerRight\"\n    onTap=\"handleToggle\"\n    data-id=\"demo1\">\n    <!-- display: inline -->\n    <text a:if=\"{{ !collapse }}\">收起</text>\n    <!-- display: inline -->\n    <text a:else>展示</text>\n  </view>\n  <view a:if=\"{{ !collapse }}\">\n    <slot name=\"content\" />\n  </view>\n  <view\n    a:else\n    onTap=\"handleToggle\">\n    <slot name=\"description\" />\n    <view class=\"placeholder\">展示</view>\n  </view>\n</ant-container>\n"
  },
  {
    "path": "demo/components/Calendar/collapse-container/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-container\": \"../../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/components/Calendar/collapse-container/index.less",
    "content": ".placeholder {\n  text-align: center;\n  color: #999999;\n}\n"
  },
  {
    "path": "demo/components/Calendar/collapse-container/index.ts",
    "content": "/*\n * @Author: rayhomie 1572801584@qq.com\n * @Date: 2025-05-22 19:18:44\n * @LastEditors: rayhomie 1572801584@qq.com\n * @LastEditTime: 2025-05-22 23:13:29\n * @FilePath: /ant-design-mini/demo/components/collapse-container/index.ts\n * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\n */\nimport { Component, getValueFromProps } from '../../../../src/_util/simply';\n\nexport interface Props {\n  hide?: boolean;\n  defaultCollapse?: boolean;\n  title?: string;\n  handleClick?(id: string): void;\n}\n\nComponent({\n  props: {\n    hide: false,\n    defaultCollapse: null,\n    title: '',\n  } as Props,\n  data: {\n    collapse: true,\n    internalHide: false,\n    containerTitle: '',\n  },\n  methods: {\n    handleToggle() {\n      const { collapse } = this.data;\n      this.setData({\n        collapse: !collapse,\n      });\n    },\n  },\n\n  /// #if ALIPAY\n  onInit() {\n    const [defaultCollapse, hide, title] = getValueFromProps(this, [\n      'defaultCollapse',\n      'hide',\n      'title',\n    ]);\n    this.setData({\n      collapse: defaultCollapse ?? true,\n      internalHide: hide,\n      containerTitle: title,\n    });\n  },\n  /// #endif\n  /// #if WECHAT\n  attached() {\n    const [defaultCollapse, hide, title] = getValueFromProps(this, [\n      'defaultCollapse',\n      'hide',\n      'title',\n    ]);\n    this.setData({\n      collapse: defaultCollapse ?? true,\n      internalHide: hide,\n      containerTitle: title,\n    });\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "demo/components/Form/checklist/index.axml",
    "content": "<import-sjs\n  from=\"./index.sjs\"\n  name=\"utils\" />\n\n<form-item\n  className=\"{{ className }}\"\n  position=\"{{ position }}\"\n  label=\"{{ label }}\"\n  status=\"{{ formData.status }}\"\n  errors=\"{{ formData.errors }}\"\n  tooltip=\"{{ tooltip }}\"\n  required=\"{{ formData.required }}\"\n  requiredMark=\"{{ requiredMark }}\"\n  validateStatus=\"{{ validateStatus }}\"\n  help=\"{{ help }}\">\n  <view\n    class=\"input\"\n    onTap=\"showPopup\">\n    <view class=\"input-items\">\n      <block\n        a:for=\"{{ formData.value }}\"\n        a:for-index=\"index\"\n        a:for-item=\"item\">\n        <view class=\"input-item\">{{ utils.getTitle(options, item) }}</view>\n      </block>\n    </view>\n\n    <view class=\"choose\">\n      请选择\n      <icon type=\"RightOutline\" />\n    </view>\n  </view>\n  <view slot=\"extra\">\n    <!-- #if ALIPAY -->\n    <slot name=\"extra\">\n    <!-- #endif -->\n      {{ extra }}\n    <!-- #if ALIPAY -->\n    </slot>\n    <!-- #endif -->\n  </view>\n</form-item>\n\n<popup\n  visible=\"{{ visible }}\"\n  height=\"{{ 250 }}\"\n  width=\"{{ 250 }}\"\n  position=\"right\"\n  onClose=\"handlePopupClose\">\n  <view style=\"padding: 12px\">\n    <checklist\n      options=\"{{ options }}\"\n      multiple\n      value=\"{{ formData.value }}\"\n      onChange=\"onChange\" />\n  </view>\n</popup>\n"
  },
  {
    "path": "demo/components/Form/checklist/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  \"component\": true,\n\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Form\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Form\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"form-item\": \"../../../../src/Form/FormItem/index\",\n    \"checklist\": \"../../../../src/Checklist/index\",\n    \"icon\": \"../../../../src/Icon/index\",\n    \"popup\": \"../../../../src/Popup/index\"\n  }\n}\n"
  },
  {
    "path": "demo/components/Form/checklist/index.less",
    "content": ".input {\n  border: 1px solid var(--color-border);\n  padding: 4px;\n  min-height: 25px;\n  border-radius: 4px;\n  display: flex;\n  align-items: center;\n}\n\n.choose {\n  color: var(--color-text-weak);\n}\n\n.input-items {\n  flex: 1;\n  display: flex;\n}\n\n.input-item {\n  text-align: center;\n  padding: 0 8px 0 8px;\n  margin-right: 8px;\n  background-color: var(--color-grey-card);\n}\n"
  },
  {
    "path": "demo/components/Form/checklist/index.sjs.ts",
    "content": "function getTitle(options, value) {\n  const obj = options.find((item) => item.value === value);\n  if (obj) {\n    return obj.title;\n  }\n}\n\nexport default { getTitle };\n"
  },
  {
    "path": "demo/components/Form/checklist/index.ts",
    "content": "import { createForm } from '../../../../src/Form/form';\n\nComponent({\n  mixins: [createForm()],\n  data: {\n    visible: false,\n  },\n  methods: {\n    showPopup() {\n      this.setData({\n        visible: true,\n      });\n    },\n    handlePopupClose() {\n      this.setData({\n        visible: false,\n      });\n    },\n    onChange(value, e) {\n      this.emit('onChange', value);\n    },\n  },\n});\n"
  },
  {
    "path": "demo/components/Form/form-json/index.axml",
    "content": "<block a:for=\"{{config.formItems}}\">\n  <form-input\n    a:if=\"{{item.type === 'input'}}\"\n    label=\"{{item.label}}\"\n    name=\"{{item.name}}\"\n    required=\"{{item.required}}\"\n    message=\"{{item.message}}\"\n    placeholder=\"{{item.placeholder}}\"\n    ref=\"handleRef\" />\n\n  <form-switch\n    a:elif=\"{{item.type === 'switch'}}\"\n    label=\"{{item.label}}\"\n    name=\"{{item.name}}\"\n    message=\"{{item.message}}\"\n    ref=\"handleRef\" />\n\n  <form-stepper\n    a:elif=\"{{item.type === 'stepper'}}\"\n    label=\"{{item.label}}\"\n    name=\"{{item.name}}\"\n    required=\"{{item.required}}\"\n    message=\"{{item.message}}\"\n    ref=\"handleRef\" />\n\n  <slot\n    a:else\n    name=\"{{item.type}}\"\n    value=\"{{item}}\" />\n</block>\n\n<button\n  type=\"{{config.submit.type}}\"\n  style=\"{{config.submit.style}}\"\n  onTap=\"submit\">\n  {{config.submit.text}}\n</button>\n\n<button\n  type=\"{{config.reset.type}}\"\n  style=\"{{config.reset.style}}\"\n  onTap=\"reset\">\n  {{config.reset.text}}\n</button>\n"
  },
  {
    "path": "demo/components/Form/form-json/index.json",
    "content": "{\n  \"component\": true,\n  \"defaultTitle\": \"Form\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  \"usingComponents\": {\n    \"form-item\": \"../../../../src/Form/FormItem/index\",\n    \"form-input\": \"../../../../src/Form/FormInput/index\",\n    \"form-stepper\": \"../../../../src/Form/FormStepper/index\",\n    \"button\": \"../../../../src/Button/index\"\n  },\n  \"styleIsolation\": \"shared\"\n}\n"
  },
  {
    "path": "demo/components/Form/form-json/index.less",
    "content": ""
  },
  {
    "path": "demo/components/Form/form-json/index.ts",
    "content": "import { Form } from '../../../../src/Form/form';\n\n\nComponent({\n  onInit() {\n    this.form = new Form();\n    this.form.setInitialValues(this.props.config.initialValues);\n    this.form.reset();\n  },\n\n  methods: {\n    handleRef(ref) {\n      this.form.addItem(ref);\n    },\n    async submit() {\n      const values = await this.form.submit();\n      this.props.onSuccess(values);\n    },\n    reset() {\n      this.form.reset();\n    },\n  }\n});\n"
  },
  {
    "path": "demo/components/Form/location/index.axml",
    "content": "<form-item\n  className=\"{{ className }}\"\n  position=\"{{ position }}\"\n  label=\"{{ label }}\"\n  status=\"{{ formData.status }}\"\n  errors=\"{{ formData.errors }}\"\n  tooltip=\"{{ tooltip }}\"\n  required=\"{{ formData.required }}\"\n  requiredMark=\"{{ requiredMark }}\"\n  validateStatus=\"{{ validateStatus }}\"\n  help=\"{{ help }}\">\n  <view\n    class=\"input\"\n    onTap=\"showPopup\">\n    <view class=\"input-location\">\n      <view a:if=\"{{ formData.value }}\">{{ formData.value.name }}</view>\n      <view a:if=\"{{ formData.value }}\">{{ formData.value.address }}</view>\n    </view>\n\n    <view class=\"choose\">\n      请选择\n      <icon type=\"RightOutline\" />\n    </view>\n  </view>\n  <view slot=\"extra\">\n    <!-- #if ALIPAY -->\n    <slot name=\"extra\">\n    <!-- #endif -->\n      {{ extra }}\n    <!-- #if ALIPAY -->\n    </slot>\n    <!-- #endif -->\n  </view>\n</form-item>\n"
  },
  {
    "path": "demo/components/Form/location/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  \"component\": true,\n\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Form\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Form\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"form-item\": \"../../../../src/Form/FormItem/index\",\n    \"checklist\": \"../../../../src/Checklist/index\",\n    \"icon\": \"../../../../src/Icon/index\",\n    \"popup\": \"../../../../src/Popup/index\"\n  }\n}\n"
  },
  {
    "path": "demo/components/Form/location/index.less",
    "content": ".input {\n  border: 1px solid var(--color-border);\n  padding: 4px;\n  min-height: 25px;\n  border-radius: 4px;\n  display: flex;\n  align-items: center;\n}\n\n.choose {\n  color: var(--color-text-weak);\n}\n\n.input-location {\n  flex: 1;\n}\n"
  },
  {
    "path": "demo/components/Form/location/index.sjs.ts",
    "content": "function getTitle(options, value) {\n  const obj = options.find(item => item.value === value);\n  if (obj) {\n    return obj.title;\n  }\n}\n\nexport default { getTitle };\n"
  },
  {
    "path": "demo/components/Form/location/index.ts",
    "content": "import { createForm } from '../../../../src/Form/form';\n\n\nComponent({\n  mixins: [createForm()],\n  data: {\n    visible: false,\n  },\n  methods: {\n    showPopup() {\n      my.chooseLocation({\n        success:(res) => {\n          this.emit('onChange', res);\n        },\n      });\n    },\n    handlePopupClose() {\n      this.setData({\n        visible: false,\n      });\n    },\n    onChange(value, e) {\n      this.emit('onChange', value);\n    },\n  }\n});\n"
  },
  {
    "path": "demo/pages/ActionSheet/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基础用法\">\n  <ant-button\n    onTap=\"handleOpenBasic\"\n    inline=\"{{ true }}\"\n    size=\"large\"\n    data-index=\"1\">\n    基础用法\n  </ant-button>\n</ant-container>\n<ant-container title=\"选项状态\">\n  <ant-button\n    onTap=\"handleOpenBasic\"\n    inline=\"{{ true }}\"\n    size=\"large\"\n    data-index=\"2\">\n    危险状态&禁用状态\n  </ant-button>\n</ant-container>\n<ant-container title=\"带注释及icon\">\n  <ant-button\n    onTap=\"handleOpenBasic\"\n    inline=\"{{ true }}\"\n    size=\"large\"\n    data-index=\"3\">\n    带注释及icon\n  </ant-button>\n</ant-container>\n<ant-action-sheet\n  title=\"请选择你要进行的操作\"\n  visible=\"{{ visible1 }}\"\n  actions=\"{{ actions1 }}\"\n  data-index=\"1\"\n  onAction=\"handleAction\"\n  onClose=\"handleCloseBasic\" />\n<ant-action-sheet\n  title=\"请选择你要进行的操作\"\n  visible=\"{{ visible2 }}\"\n  actions=\"{{ actions2 }}\"\n  data-index=\"2\"\n  onAction=\"handleAction\"\n  onClose=\"handleCloseBasic\" />\n<ant-action-sheet\n  title=\"请选择你要进行的操作\"\n  visible=\"{{ visible3 }}\"\n  actions=\"{{ actions3 }}\"\n  data-index=\"3\"\n  onAction=\"handleAction\"\n  onClose=\"handleCloseBasic\" />\n"
  },
  {
    "path": "demo/pages/ActionSheet/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"ActionSheet\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"ActionSheet\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-button\": \"../../../src/Button/index\",\n    \"ant-action-sheet\": \"../../../src/ActionSheet/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/ActionSheet/index.less",
    "content": ""
  },
  {
    "path": "demo/pages/ActionSheet/index.ts",
    "content": "/* eslint-disable @typescript-eslint/ban-ts-comment */\nPage({\n  data: {\n    visible1: false,\n    visible2: false,\n    visible3: false,\n    actions1: [\n      {\n        text: '复制',\n        key: 'copy',\n      },\n      {\n        text: '修改',\n        key: 'modify',\n      },\n    ],\n    actions2: [\n      {\n        text: '复制',\n        key: 'copy',\n        description: '请选择复制内容',\n      },\n      {\n        text: '修改',\n        key: 'modify',\n        disabled: true,\n      },\n      {\n        text: '删除',\n        key: 'delete',\n        danger: true,\n      },\n    ],\n\n    actions3: [\n      {\n        text: '备份',\n        key: 'backup',\n        description: '请选择要备份的内容',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_e7937b/afts/img/A*I0oNS4RCQzUAAAAAAAAAAAAAARQnAQ',\n      },\n      {\n        text: '保存',\n        key: 'save',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_e7937b/afts/img/A*BNczQ7hmp2gAAAAAAAAAAAAAARQnAQ',\n      },\n      {\n        text: '同步',\n        key: 'sync',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_e7937b/afts/img/A*eRaVSrV56dIAAAAAAAAAAAAAARQnAQ',\n      },\n    ],\n  },\n\n  handleOpenBasic(e) {\n    const { index } = e.currentTarget.dataset;\n    this.setData({\n      [`visible${index}`]: true,\n    });\n  },\n\n  handleCloseBasic(e) {\n    const { index } = e.currentTarget.dataset;\n    this.setData({\n      [`visible${index}`]: false,\n    });\n  },\n\n  handleAction(item, index, e) {\n    /// #if ALIPAY\n    if (item.key === 'delete') {\n      my.confirm({\n        content: '你确定要删除吗?',\n      });\n      return;\n    }\n    my.alert({\n      content: `你点击了${item.key}`,\n    });\n    /// #endif\n\n    /// #if WECHAT\n    const [clickItem, clickIndex] = item.detail;\n    //@ts-ignore\n    wx.showToast({\n      title: `你点击了${clickItem.key}(${clickIndex})`,\n    });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/AutoResize/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基本用法\">\n  <ant-container title=\"中文\">\n    <ant-auto-resize text=\"页面遇到一些小问题\" minFontSize=\"24\" maxFontSize=\"60\">\n      <view class=\"card\" style=\"height: 60rpx;\">页面遇到一些小问题</view>\n    </ant-auto-resize>\n  </ant-container>\n  <ant-container title=\"英文\">\n    <ant-auto-resize text=\"The page is experiencing some minor issues\" minFontSize=\"24\" maxFontSize=\"60\">\n      <view class=\"card\" style=\"height: 60rpx;\">\n        The page is experiencing some minor issues\n      </view>\n    </ant-auto-resize>\n  </ant-container>\n  <ant-container title=\"英文-ratio\">\n    <ant-auto-resize text=\"The page is experiencing some minor issues\" ratio=\"{{ 4 }}\" minFontSize=\"24\" maxFontSize=\"60\">\n      <view class=\"card\" style=\"height: 60rpx;\">\n        The page is experiencing some minor issues\n      </view>\n    </ant-auto-resize>\n  </ant-container>\n  <ant-container title=\"日文\">\n    <ant-auto-resize text=\"ページにいくつかの小さな問題が発生しています\" minFontSize=\"24\" maxFontSize=\"60\">\n      <view class=\"card\" style=\"height: 60rpx;\">\n        ページにいくつかの小さな問題が発生しています\n      </view>\n    </ant-auto-resize>\n  </ant-container>\n  <ant-container title=\"韩文\">\n    <ant-auto-resize text=\"페이지에 작은 문제가 발생했습니다\" minFontSize=\"24\" maxFontSize=\"60\">\n      <view class=\"card\" style=\"height: 60rpx;\">페이지에 작은 문제가 발생했습니다</view>\n    </ant-auto-resize>\n  </ant-container>\n  <ant-container title=\"阿拉伯\">\n    <ant-auto-resize text=\"تواجه الصفحة بعض المشكلات البسيطة\"  minFontSize=\"24\" maxFontSize=\"60\">\n      <view class=\"card\" style=\"height: 60rpx;\">\n        تواجه الصفحة بعض المشكلات البسيطة\n      </view>\n    </ant-auto-resize>\n  </ant-container>\n  <ant-container title=\"西班牙\">\n    <ant-auto-resize text=\"La página ha encontrado algunos pequeños problemas\" minFontSize=\"24\" maxFontSize=\"60\">\n      <view class=\"card\" style=\"height: 60rpx;\">\n        La página ha encontrado algunos pequeños problemas\n      </view>\n    </ant-auto-resize>\n  </ant-container>\n  <ant-container title=\"俄语\">\n    <ant-auto-resize text=\"На странице возникли небольшие проблемы\" minFontSize=\"24\" maxFontSize=\"60\">\n      <view class=\"card\" style=\"height: 60rpx;\">\n        На странице возникли небольшие проблемы\n      </view>\n    </ant-auto-resize>\n  </ant-container>\n  <ant-container title=\"法语\">\n    <ant-auto-resize text=\"La page rencontre quelques problèmes mineurs\" minFontSize=\"24\" maxFontSize=\"60\">\n      <view class=\"card\" style=\"height: 60rpx;\">\n        La page rencontre quelques problèmes mineurs\n      </view>\n    </ant-auto-resize>\n  </ant-container>\n  <ant-container title=\"德语\">\n    <ant-auto-resize text=\"Auf der Seite treten einige kleinere Probleme auf\" minFontSize=\"24\" maxFontSize=\"60\">\n      <view class=\"card\" style=\"height: 60rpx;\">\n        Auf der Seite treten einige kleinere Probleme auf\n      </view>\n    </ant-auto-resize>\n  </ant-container>\n</ant-container>\n"
  },
  {
    "path": "demo/pages/AutoResize/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"AutoResize\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"AutoResize\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-auto-resize\": \"../../../src/AutoResize/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/AutoResize/index.less",
    "content": "page {\n  /// #if WECHAT\n  box-sizing: border-box;\n  /// #endif\n}\n\n.card {\n  background-color: var(--color-grey-card);\n  color: var(--color-text-primary);\n}\n"
  },
  {
    "path": "demo/pages/AutoResize/index.ts",
    "content": "Page({\n  data: {},\n});\n"
  },
  {
    "path": "demo/pages/Avatar/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基础用法-四种尺寸\">\n  <block\n    a:for=\"{{ images }}\"\n    a:for-index=\"index\"\n    a:for-item=\"item\">\n    <ant-avatar\n      src=\"{{ item }}\"\n      className=\"avatar\" />\n  </block>\n</ant-container>\n\n<ant-container title=\"占位头像\">\n  <ant-avatar size=\"{{ item }}\" />\n</ant-container>\n\n<ant-container title=\"不同大小\">\n  <block\n    a:for=\"{{ sizes }}\"\n    a:for-index=\"index\"\n    a:for-item=\"item\"\n    a:key=\"{{ item }}\">\n    <ant-avatar\n      size=\"{{ item }}\"\n      src=\"{{ images[0] }}\"\n      className=\"avatar\" />\n  </block>\n</ant-container>\n\n<ant-container\n  title=\"配合列表使用\"\n  className=\"container\">\n  <ant-list-item brief=\"Deserunt dolor ea eaque eos\">\n    Novalee Spicer\n    <ant-avatar\n      slot=\"image\"\n      src=\"{{ images[0] }}\" />\n  </ant-list-item>\n</ant-container>\n\n<ant-container title=\"自定义\">\n  <ant-avatar\n    size=\"{{ item }}\"\n    src=\"{{ images[0] }}\"\n    className=\"avatar-custom\" />\n</ant-container>\n"
  },
  {
    "path": "demo/pages/Avatar/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Avatar\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Avatar\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-avatar\": \"../../../src/Avatar/index\",\n    \"ant-list-item\": \"../../../src/List/ListItem/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Avatar/index.less",
    "content": ".avatar {\n  margin: 8px;\n}\n\n.avatar-custom {\n  margin: 8px;\n}\n\n.avatar-custom image {\n  width: 40px;\n  height: 40px;\n}\n"
  },
  {
    "path": "demo/pages/Avatar/index.ts",
    "content": "Page({\n  data: {\n    sizes: ['x-small', 'small', 'medium', 'large'],\n    images: [\n      'https://images.unsplash.com/photo-1548532928-b34e3be62fc6?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&fit=crop&h=200&w=200&ixid=eyJhcHBfaWQiOjE3Nzg0fQ',\n      'https://images.unsplash.com/photo-1493666438817-866a91353ca9?ixlib=rb-0.3.5&q=80&fm=jpg&crop=faces&fit=crop&h=200&w=200&s=b616b2c5b373a80ffc9636ba24f7a4a9',\n      'https://images.unsplash.com/photo-1542624937-8d1e9f53c1b9?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&fit=crop&h=200&w=200&ixid=eyJhcHBfaWQiOjE3Nzg0fQ',\n      'https://images.unsplash.com/photo-1546967191-fdfb13ed6b1e?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&fit=crop&h=200&w=200&ixid=eyJhcHBfaWQiOjE3Nzg0fQ',\n    ],\n  },\n});\n"
  },
  {
    "path": "demo/pages/Badge/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<view class=\"page\">\n  <ant-container title=\"基本用法\">\n    <view class=\"badge-list\">\n      <ant-badge\n        type=\"dot\"\n        position=\"top-right\">\n        <view class=\"box\" />\n      </ant-badge>\n      <ant-badge\n        type=\"text\"\n        text=\"新\"\n        position=\"top-right\">\n        <view class=\"box\" />\n      </ant-badge>\n      <ant-badge\n        type=\"number\"\n        text=\"{{ 2 }}\"\n        position=\"top-right\">\n        <view class=\"box\" />\n      </ant-badge>\n      <ant-badge\n        type=\"number\"\n        text=\"{{ 100 }}\"\n        position=\"top-right\">\n        <view class=\"box\" />\n      </ant-badge>\n      <ant-badge\n        type=\"bubble\"\n        text=\"new\"\n        position=\"top-right\">\n        <view class=\"box\" />\n      </ant-badge>\n    </view>\n  </ant-container>\n\n  <ant-container title=\"带边框\">\n    <view class=\"badge-list\">\n      <ant-badge\n        type=\"dot\"\n        stroke\n        position=\"top-right\">\n        <view class=\"box\" />\n      </ant-badge>\n      <ant-badge\n        type=\"text\"\n        text=\"新\"\n        stroke\n        position=\"top-right\">\n        <view class=\"box\" />\n      </ant-badge>\n      <ant-badge\n        type=\"number\"\n        text=\"{{ 1 }}\"\n        stroke\n        position=\"top-right\">\n        <view class=\"box\" />\n      </ant-badge>\n      <ant-badge\n        type=\"number\"\n        text=\"{{ 100 }}\"\n        stroke\n        position=\"top-right\">\n        <view class=\"box\" />\n      </ant-badge>\n      <ant-badge\n        type=\"bubble\"\n        text=\"new\"\n        stroke\n        position=\"top-right\">\n        <view class=\"box\" />\n      </ant-badge>\n    </view>\n  </ant-container>\n\n  <ant-container title=\"自定义背景和位置\">\n    <view class=\"badge-list\">\n      <ant-badge\n        type=\"number\"\n        text=\"{{ 1 }}\"\n        position=\"top-left\">\n        <view class=\"box\" />\n      </ant-badge>\n      <ant-badge\n        type=\"bubble\"\n        text=\"1\"\n        position=\"bottom-right\">\n        <view class=\"box\" />\n      </ant-badge>\n      <ant-badge\n        type=\"number\"\n        text=\"{{ 100 }}\"\n        stroke\n        bgColor=\"#1677FF\">\n        <view class=\"box\" />\n      </ant-badge>\n      <ant-badge\n        type=\"text\"\n        text=\"new\"\n        bgColor=\"#FF9F18\"\n        position=\"top-center\">\n        <view class=\"box\" />\n      </ant-badge>\n      <ant-badge\n        type=\"bubble\"\n        text=\"new\"\n        stroke\n        bgColor=\"#34B368\">\n        <view class=\"box\" />\n      </ant-badge>\n    </view>\n  </ant-container>\n\n  <ant-container title=\"设置偏移\">\n    <view class=\"badge-list\">\n      <ant-badge\n        type=\"text\"\n        text=\"1\"\n        offsetX=\"-20px\"\n        offsetY=\"0px\">\n        <view class=\"box\" />\n      </ant-badge>\n      <ant-badge\n        type=\"text\"\n        text=\"1\"\n        position=\"bottom-right\"\n        offsetX=\"-20px\"\n        offsetY=\"-14px\">\n        <view class=\"box\" />\n      </ant-badge>\n      <ant-badge\n        type=\"bubble\"\n        text=\"new\"\n        position=\"top-right\"\n        offsetX=\"2px\"\n        offsetY=\"-8px\">\n        <view class=\"box\" />\n      </ant-badge>\n    </view>\n  </ant-container>\n\n  <ant-container title=\"自定义内容\">\n    <view class=\"badge-list\">\n      <ant-badge\n        type=\"text\"\n        position=\"top-right\">\n        <ant-icon\n          type=\"GlobalOutline\"\n          slot=\"text\" />\n        <view class=\"box\" />\n      </ant-badge>\n    </view>\n  </ant-container>\n</view>\n"
  },
  {
    "path": "demo/pages/Badge/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Badge\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Badge\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-badge\": \"../../../src/Badge/index\",\n    \"ant-container\": \"../../../src/Container/index\",\n    \"ant-icon\": \"../../../src/Icon/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Badge/index.less",
    "content": ".page {\n  padding: 24rpx;\n}\n\n.badge-list {\n  display: flex;\n}\n\n.ant-badge {\n  margin-right: 16px;\n}\n.box {\n  width: 40px;\n  height: 40px;\n  display: block;\n  border-radius: 8px;\n  background: #b3b3b3;\n}\n"
  },
  {
    "path": "demo/pages/Badge/index.ts",
    "content": "Page({\n  data: {},\n});\n"
  },
  {
    "path": "demo/pages/Button/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container\n  title=\"按钮类型\"\n  className=\"list\"\n>\n  <ant-button\n    type=\"primary\"\n    onTap=\"handleTap\"\n  >\n    主要按钮\n  </ant-button>\n  <ant-button\n    type=\"default\"\n    onTap=\"handleTap\"\n  >\n    操作线框按钮\n  </ant-button>\n  <ant-button\n    type=\"text\"\n    onTap=\"handleTap\"\n  >\n    文本按钮\n  </ant-button>\n</ant-container>\n<ant-container\n  title=\"辅助按钮 只有default和primary类型有\"\n  className=\"list\"\n>\n  <ant-button\n    type=\"primary\"\n    aide\n    onTap=\"handleTap\"\n  >\n    辅助按钮\n  </ant-button>\n  <ant-button\n    type=\"primary\"\n    aide\n    disabled\n    onTap=\"handleTap\"\n  >\n    辅助按钮\n  </ant-button>\n  <ant-button\n    type=\"default\"\n    aide\n    onTap=\"handleTap\"\n  >\n    操作线框辅助按钮\n  </ant-button>\n  <ant-button\n    type=\"default\"\n    aide\n    disabled\n    onTap=\"handleTap\"\n  >\n    操作线框辅助按钮\n  </ant-button>\n</ant-container>\n<ant-container\n  title=\"带辅助文案按钮\"\n  className=\"list\"\n>\n  <ant-button\n    type=\"primary\"\n    subText=\"副标题\"\n    onTap=\"handleTap\"\n  >\n    主要按钮\n  </ant-button>\n  <ant-button\n    type=\"default\"\n    subText=\"副标题\"\n    onTap=\"handleTap\"\n  >\n    次要按钮\n  </ant-button>\n  <ant-button\n    type=\"text\"\n    subText=\"副标题\"\n    onTap=\"handleTap\"\n  >\n    文本按钮\n  </ant-button>\n</ant-container>\n<ant-container\n  title=\"禁用\"\n  className=\"list\"\n>\n  <ant-button\n    type=\"primary\"\n    disabled\n    onTap=\"handleTap\"\n    onDisabledTap=\"handleDisabledTap\"\n  >\n    主要按钮\n  </ant-button>\n  <ant-button\n    type=\"default\"\n    onTap=\"handleTap\"\n    disabled\n  >\n    次要按钮\n  </ant-button>\n  <ant-button\n    type=\"text\"\n    onTap=\"handleTap\"\n    disabled\n  >\n    文本按钮\n  </ant-button>\n</ant-container>\n<ant-container\n  title=\"加载状态\"\n  className=\"list\"\n>\n  <ant-button\n    type=\"primary\"\n    loading\n  >\n    主要按钮\n  </ant-button>\n  <ant-button\n    type=\"default\"\n    loading\n  >\n    次要按钮\n  </ant-button>\n  <ant-button\n    type=\"text\"\n    loading\n  >\n    文本\n  </ant-button>\n</ant-container>\n<ant-container\n  title=\"危险\"\n  className=\"list\"\n>\n  <ant-button\n    type=\"primary\"\n    danger\n    onTap=\"handleTap\"\n  >\n    主要按钮\n  </ant-button>\n  <ant-button\n    type=\"default\"\n    danger\n    onTap=\"handleTap\"\n  >\n    次要按钮\n  </ant-button>\n  <ant-button\n    type=\"text\"\n    danger\n    onTap=\"handleTap\"\n  >\n    文本按钮\n  </ant-button>\n</ant-container>\n\n<ant-container\n  title=\"自定义大小\"\n  className=\"list\"\n>\n  <ant-button\n    type=\"primary\"\n    icon=\"SmileOutline\"\n    onTap=\"handleTap\"\n    className=\"btn\"\n  >\n    主要按钮\n  </ant-button>\n  <ant-button\n    type=\"primary\"\n    onTap=\"handleTap\"\n    icon=\"SmileOutline\"\n    className=\"btn\"\n    inline\n  >\n    主要按钮\n  </ant-button>\n  <ant-button\n    type=\"primary\"\n    onTap=\"handleTap\"\n    icon=\"ForbidFill\"\n    className=\"btn\"\n    inline\n    danger\n  >\n    主要按钮\n  </ant-button>\n</ant-container>\n<ant-container\n  title=\"round\"\n  className=\"list\"\n>\n  <ant-button\n    type=\"primary\"\n    icon=\"SearchOutline\"\n    onTap=\"handleTap\"\n    inline\n    className=\"round\"\n  >\n    主要按钮\n  </ant-button>\n  <ant-button\n    type=\"primary\"\n    onTap=\"handleTap\"\n    inline\n    danger\n    className=\"round\"\n  >\n    主要按钮\n  </ant-button>\n</ant-container>\n\n<ant-container title=\"icon\">\n  <ant-button\n    type=\"primary\"\n    icon=\"SmileOutline\"\n  >\n    Icon\n  </ant-button>\n  <ant-button\n    type=\"default\"\n    icon=\"SmileOutline\"\n  >\n    Icon\n  </ant-button>\n  <ant-button\n    type=\"text\"\n    icon=\"SmileOutline\"\n  >\n    Icon\n  </ant-button>\n  <ant-button\n    type=\"primary\"\n    danger\n    icon=\"ForbidFill\"\n  >\n    Icon\n  </ant-button>\n  <ant-button\n    type=\"default\"\n    danger\n    icon=\"ForbidFill\"\n  >\n    Icon\n  </ant-button>\n  <ant-button\n    type=\"text\"\n    danger\n    icon=\"ForbidFill\"\n  >\n    Icon\n  </ant-button>\n</ant-container>\n<ant-container title=\"inline button\">\n  <ant-button\n    type=\"primary\"\n    icon=\"SmileOutline\"\n    inline\n    size=\"large\"\n  >\n    Icon\n  </ant-button>\n  <ant-button\n    type=\"primary\"\n    icon=\"SmileOutline\"\n    inline\n    size=\"medium\"\n  >\n    Icon\n  </ant-button>\n  <ant-button\n    type=\"primary\"\n    icon=\"SmileOutline\"\n    inline\n    size=\"small\"\n  >\n    Icon\n  </ant-button>\n</ant-container>\n<ant-container title=\"inline danger icon\">\n  <ant-button\n    type=\"primary\"\n    icon=\"ForbidFill\"\n    inline\n    danger\n    size=\"large\"\n  >\n    Icon\n  </ant-button>\n  <ant-button\n    type=\"primary\"\n    icon=\"ForbidFill\"\n    inline\n    danger\n    size=\"medium\"\n  >\n    Icon\n  </ant-button>\n  <ant-button\n    type=\"primary\"\n    icon=\"ForbidFill\"\n    inline\n    danger\n    size=\"small\"\n  >\n    Icon\n  </ant-button>\n</ant-container>\n<ant-container title=\"loading icon\">\n  <ant-button\n    type=\"primary\"\n    icon=\"SmileOutline\"\n    onTap=\"handleTap\"\n    inline\n    loading\n  >\n    loading\n  </ant-button>\n  <ant-button\n    type=\"primary\"\n    icon=\"ForbidFill\"\n    onTap=\"handleTap\"\n    inline\n    danger\n    loading\n  >\n    loading\n  </ant-button>\n  <ant-button\n    type=\"primary\"\n    icon=\"SmileOutline\"\n    onTap=\"handleTap\"\n    loading\n  >\n    loading\n  </ant-button>\n</ant-container>\n<ant-container title=\"disabled icon\">\n  <ant-button\n    type=\"primary\"\n    icon=\"SmileOutline\"\n    onTap=\"handleTap\"\n    inline\n    disabled\n  >\n    disabled\n  </ant-button>\n  <ant-button\n    type=\"primary\"\n    icon=\"ForbidFill\"\n    onTap=\"handleTap\"\n    inline\n    danger\n    disabled\n  >\n    disabled\n  </ant-button>\n  <ant-button\n    type=\"primary\"\n    icon=\"SmileOutline\"\n    onTap=\"handleTap\"\n    disabled\n  >\n    disabled\n  </ant-button>\n</ant-container>\n\n<ant-container\n  title=\"按钮类型\"\n  className=\"list\"\n>\n  <ant-button\n    type=\"primary\"\n    inline\n    onTap=\"handleTap\"\n  >\n    主要按钮\n  </ant-button>\n  <ant-button\n    type=\"default\"\n    inline\n    onTap=\"handleTap\"\n  >\n    次要按钮\n  </ant-button>\n  <ant-button\n    type=\"text\"\n    inline\n    onTap=\"handleTap\"\n  >\n    文本按钮\n  </ant-button>\n</ant-container>\n<ant-container\n  title=\"按钮尺寸\"\n  className=\"list\"\n>\n  <ant-button\n    type=\"primary\"\n    inline\n    size=\"large\"\n    onTap=\"handleTap\"\n  >\n    主要按钮\n  </ant-button>\n  <ant-button\n    type=\"primary\"\n    inline\n    size=\"medium\"\n    onTap=\"handleTap\"\n  >\n    主要按钮\n  </ant-button>\n  <ant-button\n    type=\"primary\"\n    inline\n    size=\"small\"\n    onTap=\"handleTap\"\n  >\n    主要按钮\n  </ant-button>\n</ant-container>\n<ant-container\n  title=\"危险\"\n  className=\"list\"\n>\n  <ant-button\n    type=\"primary\"\n    inline\n    danger\n    onTap=\"handleTap\"\n  >\n    主要按钮\n  </ant-button>\n  <ant-button\n    type=\"default\"\n    inline\n    danger\n    onTap=\"handleTap\"\n  >\n    次要按钮\n  </ant-button>\n  <ant-button\n    type=\"text\"\n    inline\n    danger\n    onTap=\"handleTap\"\n  >\n    文本按钮\n  </ant-button>\n</ant-container>\n<ant-container\n  title=\"禁用\"\n  className=\"list\"\n>\n  <ant-button\n    type=\"primary\"\n    inline\n    disabled\n  >\n    主要按钮\n  </ant-button>\n  <ant-button\n    type=\"default\"\n    inline\n    disabled\n  >\n    次要按钮\n  </ant-button>\n  <ant-button\n    type=\"text\"\n    inline\n    disabled\n  >\n    文本按钮\n  </ant-button>\n</ant-container>\n<ant-container\n  title=\"加载状态\"\n  className=\"list\"\n>\n  <ant-button\n    type=\"primary\"\n    inline\n    loading\n  >\n    主要按钮\n  </ant-button>\n  <ant-button\n    type=\"default\"\n    inline\n    loading\n  >\n    次要按钮\n  </ant-button>\n  <ant-button\n    type=\"text\"\n    inline\n    loading\n  >\n    文本\n  </ant-button>\n</ant-container>\n"
  },
  {
    "path": "demo/pages/Button/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Button\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Button\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-button\": \"../../../src/Button/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Button/index.less",
    "content": ".ant-button {\n  margin-bottom: 8px;\n}\n"
  },
  {
    "path": "demo/pages/Button/index.ts",
    "content": "Page({\n  handleTap() {\n    /// #if ALIPAY\n    my.alert({\n      title: '点击按钮',\n    });\n    /// #endif\n\n    /// #if WECHAT\n    //@ts-ignore\n    wx.showToast({\n      title: '点击按钮',\n    });\n    /// #endif\n  },\n  handleDisabledTap() {\n    /// #if ALIPAY\n    my.alert({\n      title: '禁用点击',\n    });\n    /// #endif\n\n    /// #if WECHAT\n    //@ts-ignore\n    wx.showToast({\n      title: '禁用点击',\n    });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/Calendar/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<view class=\"page\">\n  <collapse-container\n    a:if=\"{{ demo1.visible }}\"\n    title=\"默认多选，范围 3 个月\">\n    <view\n      slot=\"content\"\n      style=\"height: 1000rpx\">\n      <ant-calendar defaultValue=\"{{ demo1.defaultValue }}\" />\n    </view>\n  </collapse-container>\n\n  <collapse-container\n    a:if=\"{{ demo2.visible }}\"\n    title=\"单选\">\n    <view\n      slot=\"content\"\n      style=\"height: 1000rpx\">\n      <ant-calendar\n        selectionMode=\"single\"\n        defaultValue=\"{{ demo2.defaultValue }}\"\n        changedScrollIntoView />\n    </view>\n  </collapse-container>\n\n  <collapse-container\n    a:if=\"{{ demo3.visible }}\"\n    title=\"自定义日历顶部\">\n    <view slot=\"content\">\n      <view class=\"custom-header\">\n        <view\n          onTap=\"demo3PreviousMonth\"\n          class=\"custom-header-left\">\n          <ant-icon type=\"LeftOutline\" />\n          上个月\n        </view>\n        <view>{{ demo3.title }}</view>\n        <view\n          onTap=\"demo3NextMonth\"\n          class=\"custom-header-right\">\n          下个月\n          <ant-icon type=\"RightOutline\" />\n        </view>\n      </view>\n      <ant-calendar monthRange=\"{{ demo3.monthRange }}\">\n        <view slot=\"calendarTitle\" />\n      </ant-calendar>\n    </view>\n  </collapse-container>\n\n  <collapse-container\n    a:if=\"{{ demo8.visible }}\"\n    title=\"自定义日期单元格\">\n    <view slot=\"content\">\n      <ant-calendar\n        monthRange=\"{{ demo8.monthRange }}\"\n        showSelectableDatesOnly\n        onFormatter=\"{{ demo8Formatter ? demo8Formatter : 'demo8Formatter' }}\"\n        onMonthFormatter=\"{{ demo8MonthFormatter ? demo8MonthFormatter : 'demo8MonthFormatter' }}\" />\n    </view>\n  </collapse-container>\n\n  <collapse-container\n    a:if=\"{{ demo4.visible }}\"\n    title=\"动态控制，只允许选择前后三天\">\n    <view slot=\"content\">\n      <ant-calendar\n        monthRange=\"{{ demo4.monthRange }}\"\n        onFormatter=\"{{ demoFormatter ? demoFormatter : 'demoFormatter' }}\" />\n    </view>\n  </collapse-container>\n\n  <collapse-container\n    a:if=\"{{ demo5.visible }}\"\n    title=\"从周一开始\">\n    <view\n      slot=\"content\"\n      style=\"height: 1000rpx\">\n      <ant-calendar weekStartsOn=\"Monday\" />\n    </view>\n  </collapse-container>\n\n  <!-- #if ALIPAY -->\n  <collapse-container\n    a:if=\"{{ demo6.visible }}\"\n    title=\"通过 slot 实现农历\">\n    <view slot=\"content\">\n      <ant-calendar monthRange=\"{{ demo6.monthRange }}\">\n        <view\n          slot=\"cell-bottom\"\n          slot-scope=\"prop\">\n          <cn-day cell=\"{{ prop.cell }}\" />\n        </view>\n      </ant-calendar>\n    </view>\n  </collapse-container>\n  <!-- #endif -->\n\n  <collapse-container\n    a:if=\"{{ demo7.visible }}\"\n    title=\"国际化\">\n    <view slot=\"content\">\n      <ant-calendar\n        monthRange=\"{{ demo7.monthRange }}\"\n        localeText=\"{{ demo7.localeText }}\" />\n    </view>\n  </collapse-container>\n\n  <collapse-container\n    a:if=\"{{ demo9.visible }}\"\n    title=\"受控模式\">\n    <view\n      slot=\"content\"\n      style=\"height: 1000rpx;overflow: scroll;\">\n      <ant-calendar\n        ref=\"handleRef\"\n        value=\"{{ demo9.value }}\"\n        onChange=\"demo9HandleChange\"\n        selectionMode=\"single\"\n        changedScrollIntoView />\n      <ant-button\n        type=\"primary\"\n        onTap=\"demo9HandlePreviousDay\">\n        上一天\n      </ant-button>\n      <ant-button\n        style=\"margin-top: 8rpx\"\n        type=\"primary\"\n        onTap=\"demo9HandleNextDay\">\n        下一天\n      </ant-button>\n      <ant-button\n        style=\"margin-top: 8rpx\"\n        type=\"primary\"\n        onTap=\"demo9HandleScrollIntoView\">\n        滚动到下个月的今天\n      </ant-button>\n    </view>\n  </collapse-container>\n\n  <ant-button\n    style=\"margin-top: 8rpx\"\n    type=\"primary\"\n    onTap=\"onPopupOpen\">\n    在弹层中使用\n  </ant-button>\n  <ant-popup\n    visible=\"{{demo10.visible}}\"\n    width=\"{{250}}\"\n    height=\"{{600}}\"\n    onClose=\"onPopupClose\">\n    <ant-calendar\n      monthRange=\"{{demo10.monthRange}}\"\n      selectionMode=\"single\"\n      ></ant-calendar>\n  </ant-popup>\n\n</view>\n"
  },
  {
    "path": "demo/pages/Calendar/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Calendar\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Calendar\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-icon\": \"../../../src/Icon/index\",\n    \"collapse-container\": \"../../components/Calendar/collapse-container/index\",\n    \"ant-button\": \"../../../src/Button/index\",\n    \"ant-calendar\": \"../../../src/Calendar/index\",\n    \"cn-day\": \"../../components/Calendar/collapse-container/cn-day/index\",\n    \"ant-popup\": \"../../../src/Popup/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Calendar/index.less",
    "content": ".page {\n  padding: 24rpx;\n  box-sizing: border-box;\n}\n\n.custom-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  height: 60rpx;\n}\n\n.custom-header-left {\n  display: flex;\n  align-items: center;\n}\n\n.custom-header-right {\n  display: flex;\n  align-items: center;\n}\n\n.odd {\n  color: red;\n}\n\n.even {\n  color: blue;\n}\n\n.ant-calendar-cell.hidden {\n  opacity: 0;\n  pointer-events: none;\n}\n\n.ant-calendar-body-container.shrink {\n  height: 100px;\n  overflow: hidden;\n}\n"
  },
  {
    "path": "demo/pages/Calendar/index.ts",
    "content": "import dayjs from 'dayjs';\n\nconst localeText = {\n  weekdayNames: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],\n  format: 'YYYY/MM',\n  today: 'Today',\n  start: 'Start',\n  end: 'End',\n  startAndEnd: 'Start/End',\n};\n\nfunction demo8Formatter(cell) {\n  const isOdd = dayjs(cell.time).date() % 2 === 1;\n  const isNotBeginEnd = !cell.isSelectedBegin && !cell.isSelectedEnd;\n\n  const isWeekend = dayjs(cell.time).day() > 4;\n\n  let topClassName;\n  if (isNotBeginEnd) {\n    topClassName = isOdd ? 'odd' : 'even';\n  }\n\n  return {\n    top: {\n      className: topClassName,\n      label: isOdd ? '奇数' : '偶数',\n    },\n    bottom: {\n      label: isWeekend ? '周末' : '',\n    },\n  };\n}\n\nfunction demo8MonthFormatter(month) {\n  return {\n    ...month,\n  };\n}\n\nfunction demoFormatter(cell, value) {\n  if (Array.isArray(value) && value.length == 1) {\n    const current = value[0];\n    return {\n      disabled: dayjs(cell.time).diff(dayjs(current), 'days') > 3,\n      bottom:\n        dayjs(cell.time).diff(dayjs(current), 'days') > 3\n          ? {\n              label: '不可选',\n            }\n          : undefined,\n    };\n  }\n  return {};\n}\n\nconst nowDate = Date.now();\nPage({\n  data: {\n    demo1: {\n      defaultValue: [nowDate, nowDate],\n      visible: true,\n    },\n    demo2: {\n      defaultValue: dayjs().add(1, 'M').toDate().getTime(),\n      visible: true,\n    },\n    demo3: {\n      title: dayjs(new Date().getTime()).format('YYYY年MM月'),\n      monthRange: [new Date().getTime(), new Date().getTime()],\n      visible: true,\n    },\n    demo4: {\n      visible: true,\n    },\n    demo5: {\n      visible: true,\n    },\n    demo6: {\n      monthRange: [new Date().getTime(), new Date().getTime()],\n      visible: true,\n    },\n    demo7: {\n      localeText,\n      visible: true,\n      monthRange: [new Date().getTime(), new Date().getTime()],\n    },\n    demo8: {\n      visible: true,\n      monthRange: [\n        dayjs().toDate().getTime(),\n        dayjs().add(1, 'M').toDate().getTime(),\n      ],\n    },\n    /// #if WECHAT\n    demoFormatter,\n    demo8Formatter,\n    demo8MonthFormatter,\n    /// #endif\n    demo9: {\n      visible: true,\n      value: nowDate,\n    },\n    demo10: {\n      visible: false,\n      monthRange: [\n        dayjs().subtract(1, 'year').valueOf(),\n        dayjs().add(1, 'year').valueOf(),\n      ],\n    },\n  },\n  demo3NextMonth() {\n    const current = this.data.demo3.monthRange[0];\n    const newMonth = dayjs(current).add(1, 'month').toDate().getTime();\n\n    this.setData({\n      'demo3.title': dayjs(newMonth).format('YYYY年MM月'),\n      'demo3.monthRange': [newMonth, newMonth],\n    });\n  },\n  demo3PreviousMonth() {\n    const current = this.data.demo3.monthRange[0];\n    const newMonth = dayjs(current).add(-1, 'month').toDate().getTime();\n\n    this.setData({\n      'demo3.title': dayjs(newMonth).format('YYYY年MM月'),\n      'demo3.monthRange': [newMonth, newMonth],\n    });\n  },\n  demoFormatter,\n  demo8Formatter,\n  demo8MonthFormatter,\n  demo9HandleChange(value) {\n    /// #if ALIPAY\n    this.setData({\n      'demo9.value': value,\n    });\n    /// #endif\n    /// #if WECHAT\n    this.setData({\n      'demo9.value': value.detail,\n    });\n    /// #endif\n  },\n  demo9HandlePreviousDay() {\n    this.setData({\n      'demo9.value': this.data.demo9.value - 1000 * 24 * 3600,\n    });\n  },\n  demo9HandleNextDay() {\n    this.setData({\n      'demo9.value': this.data.demo9.value + 1000 * 24 * 3600,\n    });\n  },\n  demo9HandleScrollIntoView() {\n    this.ref.scrollIntoView(dayjs().add(1, 'M').toDate().getTime());\n  },\n  onPopupOpen() {\n    this.setData({\n      'demo10.visible': true,\n    });\n  },\n  onPopupClose() {\n    this.setData({\n      'demo10.visible': false,\n    });\n  },\n  handleRef(ref) {\n    /// #if ALIPAY\n    this.ref = ref;\n    /// #endif\n    /// #if WECHAT\n    this.ref = ref.detail;\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/Card/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基础用法\">\n  <ant-card onOperateClick=\"handleLinkClick\" title=\"标题\" operateText=\"操作\">\n    <view>\n      我是卡片内容\n    </view>\n  </ant-card>\n</ant-container>\n\n<ant-container title=\"带分割线\">\n  <ant-card onOperateClick=\"handleLinkClick\" title=\"标题\" operateText=\"操作\" divider>\n    <view>\n      标题内容间带分割线\n    </view>\n  </ant-card>\n</ant-container>\n\n<ant-container title=\"标题区域吸顶\">\n  <ant-card\n    title=\"标题\"\n    className=\"card-title-radius {{ titleSticky ? 'card-demo-sticky' : '' }}\"\n    headSticky=\"{{true}}\"\n    stickyTop=\"{{100}}\"\n    stickyTransparentTitle=\"{{ false }}\"\n    onTitleSticky=\"handleTitleSticky\"\n  >\n    <view style=\"height: 400px\">\n      模拟一个长卡片内容\n    </view>\n  </ant-card>\n</ant-container>\n\n<ant-container title=\"可折叠\">\n  <ant-card\n    title=\"标题\"\n    needFold\n  >\n    <view>\n      内容区域可展开/收起\n    </view>\n  </ant-card>\n</ant-container>\n\n<ant-container title=\"自定义头部右侧操作按钮\">\n  <ant-card onOperateClick=\"handleLinkClick\" title=\"标题\" operateText=\"操作\">\n    <view slot=\"headerRight\">自定义</view>\n    <view>\n      我是卡片内容\n    </view>\n  </ant-card>\n</ant-container>\n\n<ant-container title=\"单标题\">\n  <ant-card title=\"标题\">\n    <view>\n      我是卡片内容\n    </view>\n  </ant-card>\n</ant-container>\n\n<ant-container title=\"无标题\">\n  <ant-card>\n    <view>\n      我是卡片内容\n    </view>\n  </ant-card>\n</ant-container>\n\n<ant-container title=\"自定义受控可折叠\">\n  <ant-card\n    title=\"标题\"\n    foldStatus=\"{{foldStatus}}\"\n  >\n    <view\n      slot=\"headerRight\"\n      onTap=\"handleTapFoldBtn\"\n    >\n      {{ foldStatus ? '查看更多内容' : '收起' }}\n    </view>\n    <view>\n      内容区域可展开/收起\n    </view>\n  </ant-card>\n</ant-container>\n\n<view style=\"height: 140rpx\"></view>\n"
  },
  {
    "path": "demo/pages/Card/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Card\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Card\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-container\": \"../../../src/Container/index\",\n    \"ant-card\": \"../../../src/Card/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Card/index.less",
    "content": "#__react-content {\n  overflow: unset !important;\n}\n\n.ant-container {\n  background: transparent;\n}\n\n.card-title-radius {\n  border-radius: 32rpx;\n}\n\n.card-title-radius .ant-card-header {\n  background: var(--color-grey-card);\n  border-radius: 32rpx 32rpx 0 0;\n}\n\n.card-demo-sticky .ant-card-header {\n  border-radius: 0;\n}\n"
  },
  {
    "path": "demo/pages/Card/index.ts",
    "content": "Page({\n  data: {\n    foldStatus: false,\n    titleSticky: false,\n  },\n  handleLinkClick() {\n    /// #if ALIPAY\n    my.showToast({ content: '被点击了' });\n    /// #endif\n    /// #if WECHAT\n    // @ts-ignore\n    wx.showToast({ title: '被点击了' });\n    /// #endif\n  },\n  handleTapFoldBtn() {\n    console.log('收起展开态发生变化');\n    this.setData({ foldStatus: !this.data.foldStatus });\n  },\n  handleTitleSticky(status) {\n    this.setData({ titleSticky: status });\n  },\n});\n"
  },
  {
    "path": "demo/pages/Checkbox/index.axml",
    "content": "<import-sjs\n  from=\"./index.sjs\"\n  name=\"utils\" />\n\n<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"Checkbox 用法\">\n  <view>\n    <ant-checkbox onChange=\"onChange\">基础使用</ant-checkbox>\n  </view>\n  <view class=\"line\">\n    <ant-checkbox defaultChecked=\"{{ true }}\">设置默认值</ant-checkbox>\n  </view>\n\n\n  <view class=\"line\">\n    <ant-checkbox disabled>禁用模式未选中</ant-checkbox>\n    <ant-checkbox\n      defaultChecked\n      disabled>\n      禁用模式已选中\n    </ant-checkbox>\n  </view>\n\n  <view class=\"line\">\n    <ant-checkbox\n      color=\"red\"\n      defaultChecked>\n      自定义颜色\n    </ant-checkbox>\n  </view>\n\n  <view class=\"line\">\n    <view style=\"margin-bottom: 20rpx;\">\n      <ant-checkbox\n        checked=\"{{ checked }}\"\n        onChange=\"handleCheckedChange\">\n        受控模式\n      </ant-checkbox>\n    </view>\n    <ant-button onTap=\"toggleChange\">切换</ant-button>\n  </view>\n</ant-container>\n\n\n<ant-container title=\"CheckboxGroup 用法\">\n  <view>\n    <view class=\"title\">基础使用</view>\n    <ant-checkbox-group\n      options=\"{{ options }}\"\n      onChange=\"onChange\" />\n  </view>\n  <view class=\"line\">\n    <view class=\"title\">设置默认值</view>\n    <ant-checkbox-group\n      defaultValue=\"{{ ['banana'] }}\"\n      options=\"{{ options }}\"\n      onChange=\"onChange\" />\n  </view>\n\n  <view class=\"line\">\n    <view class=\"title\">横向布局</view>\n    <ant-checkbox-group\n      options=\"{{ options }}\"\n      position=\"horizontal\" />\n  </view>\n\n  <view class=\"line\">\n    <view class=\"title\">禁用模式</view>\n    <ant-checkbox-group\n      options=\"{{ options }}\"\n      disabled />\n  </view>\n\n  <view class=\"line\">\n    <view class=\"title\">受控模式</view>\n    <ant-checkbox-group\n      value=\"{{ value }}\"\n      options=\"{{ options }}\"\n      onChange=\"handleValueChange\" />\n  </view>\n\n  <view class=\"line\">\n    <view class=\"title\">自定义颜色</view>\n    <ant-checkbox-group\n      options=\"{{ options }}\"\n      defaultValue=\"{{ ['apple', 'banana'] }}\"\n      color=\"red\" />\n  </view>\n\n  <!-- #if ALIPAY -->\n  <view class=\"line\">\n    <view class=\"title\">自定义标题</view>\n    <ant-checkbox-group options=\"{{ options }}\">\n      <view\n        slot=\"label\"\n        slot-scope=\"item\">\n        {{ item.index + 1 }} {{ item.value.label }}\n      </view>\n    </ant-checkbox-group>\n  </view>\n  <!-- #endif -->\n</ant-container>\n\n\n<ant-container title=\"CheckboxCustomGroup 用法\">\n  <block\n    a:for=\"{{ customOptions }}\"\n    a:for-index=\"index\"\n    a:for-item=\"option\"\n    a:key=\"title\">\n    <ant-list header=\"{{ option.title }}\">\n      <block\n        a:for=\"{{ option.list }}\"\n        a:for-index=\"index\"\n        a:for-item=\"item\"\n        a:key=\"value\">\n        <ant-list-item>\n          <ant-checkbox\n            data-value=\"{{ item.value }}\"\n            checked=\"{{ utils.indexOf(customValue, item.value) > -1 }}\"\n            onChange=\"handleCustomChange\">\n            {{ item.title }}\n          </ant-checkbox>\n        </ant-list-item>\n      </block>\n    </ant-list>\n  </block>\n</ant-container>\n"
  },
  {
    "path": "demo/pages/Checkbox/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"CheckBox\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"CheckBox\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-checkbox\": \"../../../src/Checkbox/index\",\n    \"ant-container\": \"../../../src/Container/index\",\n    \"ant-button\": \"../../../src/Button/index\",\n    \"ant-checkbox-group\": \"../../../src/Checkbox/CheckboxGroup/index\",\n    \"ant-list\": \"../../../src/List/index\",\n    \"ant-list-item\": \"../../../src/List/ListItem/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Checkbox/index.less",
    "content": ".line {\n  margin-top: 40rpx;\n}\n.title {\n  color: #999;\n}\n"
  },
  {
    "path": "demo/pages/Checkbox/index.sjs.ts",
    "content": "function indexOf(array, value) {\n  return array.indexOf(value);\n}\n\nexport default { indexOf };\n"
  },
  {
    "path": "demo/pages/Checkbox/index.ts",
    "content": "Page({\n  data: {\n    checked: false,\n    value: ['banana'],\n    options: [\n      { value: 'apple', label: 'Apple' },\n      { value: 'orange', label: 'Orange' },\n      { value: 'banana', label: 'Banana' },\n    ],\n    customOptions: [\n      {\n        title: '分组一',\n        list: [\n          {\n            title: '选项一',\n            value: '1',\n          },\n          {\n            title: '选项二',\n            value: '2',\n          },\n          {\n            title: '选项三',\n            value: '3',\n          },\n        ],\n      },\n      {\n        title: '分组二',\n        list: [\n          {\n            title: '选项四',\n            value: '4',\n          },\n          {\n            title: '选项五',\n            value: '5',\n          },\n          {\n            title: '选项六',\n            value: '6',\n          },\n        ],\n      },\n    ],\n    customValue: [],\n  },\n  onChange(value, e) {\n    console.log(value, e);\n  },\n\n  handleCheckedChange(checked) {\n    /// #if WECHAT\n    this.setData({\n      checked: checked.detail,\n    });\n    /// #endif\n\n    /// #if ALIPAY\n    this.setData({\n      checked,\n    });\n    /// #endif\n  },\n  handleValueChange(value) {\n    /// #if WECHAT\n    this.setData({\n      value: value.detail,\n    });\n    /// #endif\n    /// #if ALIPAY\n    this.setData({\n      value,\n    });\n    /// #endif\n  },\n\n  toggleChange() {\n    this.setData({\n      checked: !this.data.checked,\n    });\n  },\n\n  handleCustomChange(checked, e) {\n    let value = this.data.customValue;\n\n    /// #if WECHAT\n    const event = checked;\n    if (event.detail) {\n      value = value.concat(event.target.dataset.value);\n    } else {\n      value = value.filter((v) => v !== event.target.dataset.value);\n    }\n    /// #endif\n\n    /// #if ALIPAY\n    if (checked) {\n      value = value.concat(e.target.dataset.value);\n    } else {\n      value = value.filter((v) => v !== e.target.dataset.value);\n    }\n    /// #endif\n\n    this.setData({ customValue: value });\n    console.log(value);\n  },\n});\n"
  },
  {
    "path": "demo/pages/Checklist/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"简单布局-单选\">\n  <ant-checklist\n    defaultValue=\"{{ [1] }}\"\n    options=\"{{ options_1 }}\"\n    data-options=\"{{ options_1 }}\"\n    onChange=\"onChange\" />\n</ant-container>\n\n<ant-container title=\"复杂布局-多选\">\n  <ant-checklist\n    defaultValue=\"{{ [1, 2] }}\"\n    options=\"{{ options_2 }}\"\n    multiple\n    onChange=\"onChange\" />\n</ant-container>\n\n<ant-container title=\"受控模式\">\n  <ant-checklist\n    value=\"{{ value }}\"\n    options=\"{{ options_2 }}\"\n    multiple\n    onChange=\"onChangeControlled\" />\n</ant-container>\n\n<ant-container title=\"禁用状态\">\n  <ant-checklist\n    defaultValue=\"{{ [2] }}\"\n    options=\"{{ options_3 }}\"\n    multiple\n    onChange=\"onChange\" />\n</ant-container>\n\n<ant-container title=\"只读状态\">\n  <ant-checklist\n    defaultValue=\"{{ [2] }}\"\n    options=\"{{ options_4 }}\"\n    multiple\n    onChange=\"onChange\" />\n</ant-container>\n\n<!-- #if ALIPAY -->\n<ant-container title=\"自定义勾选图标&&组件内容\">\n  <ant-checklist\n    defaultValue=\"{{ [2] }}\"\n    options=\"{{ options_3 }}\"\n    multiple\n    onChange=\"onChange\">\n    <view slot=\"icon\">\n      <ant-icon\n        style=\"color: red\"\n        type=\"LikeOutline\"\n        className=\"demo-checklist-checked-icon\" />\n    </view>\n    <view\n      slot=\"content\"\n      slot-scope=\"props\">\n      title: {{ props.item.title }}\n    </view>\n  </ant-checklist>\n</ant-container>\n<!-- #endif -->\n"
  },
  {
    "path": "demo/pages/Checklist/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Checklist\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Checklist\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-checklist\": \"../../../src/Checklist/index\",\n    \"ant-icon\": \"../../../src/Icon/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Checklist/index.less",
    "content": ".demo-checklist-label {\n  font-size: 32rpx;\n  padding: 36rpx 0 16rpx 16rpx;\n}\n\n.demo-checklist-checked-icon {\n  font-size: 36rpx;\n}\n"
  },
  {
    "path": "demo/pages/Checklist/index.ts",
    "content": "Page({\n  data: {\n    value: [1, 2],\n    options_1: [\n      {\n        value: 1,\n        title: '可勾选列表项1',\n      },\n      {\n        value: 2,\n        title: '可勾选列表项2',\n      },\n      {\n        value: 3,\n        title: '可勾选列表项3',\n      },\n    ],\n    options_2: [\n      {\n        value: 1,\n        image:\n          'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ',\n        description: '这里是描述信息',\n        title: '可勾选列表项1',\n      },\n      {\n        value: 2,\n        image:\n          'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ',\n        description: '这里是描述信息',\n        title: '可勾选列表项2',\n      },\n      {\n        value: 3,\n        image:\n          'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ',\n        description: '这里是描述信息',\n        title: '可勾选列表项3',\n      },\n    ],\n    options_3: [\n      {\n        value: 1,\n        title: '可勾选列表项1',\n      },\n      {\n        value: 2,\n        title: '禁用列表项2',\n        disabled: true,\n      },\n      {\n        value: 3,\n        title: '可勾选列表项3',\n      },\n    ],\n    options_4: [\n      {\n        value: 1,\n        title: '可勾选列表项1',\n      },\n      {\n        value: 2,\n        title: '只读列表项2',\n        readonly: true,\n      },\n      {\n        value: 3,\n        title: '可勾选列表项3',\n      },\n    ],\n  },\n  onChange(v, items, e) {\n    console.log('当前选中的值为：', v, items, e);\n  },\n  onChangeControlled(value) {\n    /// #if ALIPAY\n    this.setData({ value });\n    /// #endif\n\n    /// #if WECHAT\n    this.setData({ value: value.detail[0] });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/Collapse/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container\n  title=\"基本使用\"\n  class=\"container\"\n>\n  <ant-collapse\n    items=\"{{ items1 }}\"\n    onChange=\"onChange\"\n  />\n</ant-container>\n\n<ant-container\n  title=\"手风琴效果\"\n  class=\"container\"\n>\n  <ant-collapse\n    accordion\n    items=\"{{ items1 }}\"\n  />\n</ant-container>\n\n<ant-container\n  title=\"列表项控制\"\n  class=\"container\"\n>\n  <ant-button\n    onTap=\"addItems\"\n    inline\n  >\n    添加items\n  </ant-button>\n\n  <ant-collapse\n    items=\"{{ items2 }}\"\n  />\n</ant-container>\n\n<!-- #if ALIPAY || WECHAT -->\n<ant-container\n  title=\"带 Checkbox\"\n  class=\"container\"\n>\n  <!-- #if WECHAT -->\n  <text>由于微信小程序平台的限制, Collapse 暂时不支持 Slot</text>\n  <!-- #endif -->\n\n  <ant-collapse items=\"{{ items3 }}\">\n    <view\n      slot=\"title\"\n      slot-scope=\"item\"\n      class=\"title\"\n    >\n      <view class=\"collapse-item\">\n        <ant-checkbox\n          data-index=\"{{ item.index }}\"\n          onChange=\"onCheckboxChange\"\n        />\n        {{ item.value.title }}\n      </view>\n    </view>\n\n    <view\n      slot=\"content\"\n      slot-scope=\"item\"\n      class=\"content\"\n    >\n      {{ item.value.content }}\n    </view>\n  </ant-collapse>\n</ant-container>\n<!-- #endif -->"
  },
  {
    "path": "demo/pages/Collapse/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Collapse\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Collapse\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    /// #if ALIPAY || WECHAT\n    \"ant-checkbox\": \"../../../src/Checkbox/index\",\n    /// #endif\n    \"ant-collapse\": \"../../../src/Collapse/index\",\n    \"ant-container\": \"../../../src/Container/index\",\n    \"ant-button\": \"../../../src/Button/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Collapse/index.less",
    "content": ".container {\n  background: transparent;\n  padding: 0;\n}\n\n.collapse-item {\n  display: flex;\n  align-items: center;\n}\n"
  },
  {
    "path": "demo/pages/Collapse/index.ts",
    "content": "const items1 = [\n  {\n    title: '第一项',\n    content: 'Pariatur dolore commodo commodo elit adipisicing sunt adipisicing ex duis labore nisi sunt. Magna ut minim deserunt. Sunt velit occaecat incididunt aliqua. Dolore officia voluptate aute reprehenderit anim excepteur elit.'\n  },\n  {\n    title: '第二项',\n    content: 'Dolor reprehenderit cillum aliqua qui id Lorem elit anim do minim mollit. Commodo id cupidatat est tempor anim. Fugiat ipsum dolor nostrud officia mollit. Aliquip aliqua pariatur tempor excepteur commodo non et adipisicing magna ex nostrud dolore cillum exercitation enim. In sunt velit laboris ullamco et in reprehenderit sit excepteur aute in dolor. Sunt minim incididunt consectetur laborum sint fugiat voluptate sunt culpa fugiat duis. Ad consectetur ad aliquip aute labore magna commodo est cupidatat.'\n  },\n  {\n    title: '第三项',\n    content: 'Ad ut ullamco exercitation do excepteur ipsum ipsum consectetur nulla fugiat est et. Occaecat ullamco nulla mollit cupidatat dolore nulla minim cillum proident laboris mollit. Veniam consectetur esse consectetur. Fugiat in laborum anim.'\n  },\n  {\n    title:'禁止选项',\n    disabled: true,\n  }\n]\n\nconst items2 = [\n  {\n    title: '第一项',\n    content: 'Pariatur dolore commodo commodo elit adipisicing sunt adipisicing ex duis labore nisi sunt. Magna ut minim deserunt. Sunt velit occaecat incididunt aliqua. Dolore officia voluptate aute reprehenderit anim excepteur elit.'\n  },\n  {\n    title: '第二项',\n    content: 'Dolor reprehenderit cillum aliqua qui id Lorem elit anim do minim mollit. Commodo id cupidatat est tempor anim. Fugiat ipsum dolor nostrud officia mollit. Aliquip aliqua pariatur tempor excepteur commodo non et adipisicing magna ex nostrud dolore cillum exercitation enim. In sunt velit laboris ullamco et in reprehenderit sit excepteur aute in dolor. Sunt minim incididunt consectetur laborum sint fugiat voluptate sunt culpa fugiat duis. Ad consectetur ad aliquip aute labore magna commodo est cupidatat.'\n  },\n];\n\nconst items3 = [\n  {\n    title: '第一项',\n    content: 'Pariatur dolore commodo commodo elit adipisicing sunt adipisicing ex duis labore nisi sunt. Magna ut minim deserunt. Sunt velit occaecat incididunt aliqua. Dolore officia voluptate aute reprehenderit anim excepteur elit.'\n  },\n  {\n    title: '第二项',\n    content: 'Dolor reprehenderit cillum aliqua qui id Lorem elit anim do minim mollit. Commodo id cupidatat est tempor anim. Fugiat ipsum dolor nostrud officia mollit. Aliquip aliqua pariatur tempor excepteur commodo non et adipisicing magna ex nostrud dolore cillum exercitation enim. In sunt velit laboris ullamco et in reprehenderit sit excepteur aute in dolor. Sunt minim incididunt consectetur laborum sint fugiat voluptate sunt culpa fugiat duis. Ad consectetur ad aliquip aute labore magna commodo est cupidatat.'\n  },\n  {\n    title: '第三项',\n    content: 'Ad ut ullamco exercitation do excepteur ipsum ipsum consectetur nulla fugiat est et. Occaecat ullamco nulla mollit cupidatat dolore nulla minim cillum proident laboris mollit. Veniam consectetur esse consectetur. Fugiat in laborum anim.'\n  },\n]\n\nPage({\n  data: {\n    items1,\n    items2,\n    items3,\n    checkboxList: items3.map((item) => false),\n  },\n  onChange(current) {\n    console.log(current);\n  },\n  addItems() {\n    const items2 = [\n      ...this.data.items2,\n      {\n        title: this.data.items2.length,\n        content:\n          'Pariatur dolore commodo commodo elit adipisicing sunt adipisicing ex duis labore nisi sunt. Magna ut minim deserunt. Sunt velit occaecat incididunt aliqua. Dolore officia voluptate aute reprehenderit anim excepteur elit.',\n      },\n    ];\n    this.setData({\n      items2,\n    });\n  },\n  onCheckboxChange(checked, e) {\n    const { index } = e.currentTarget.dataset;\n    const checkboxList = [...this.data.checkboxList];\n    checkboxList[index] = checked;\n    this.setData({\n      checkboxList,\n    });\n  },\n});\n"
  },
  {
    "path": "demo/pages/ConfigProvider/ar-SA.ts",
    "content": "const arSA ={\n  // locales for all components\n  locale: 'ar-SA',\n  global: {\n    placeholder: 'يرجى الاختيار',\n    emptyText: 'لا توجد بيانات حتى الآن',\n    okText: 'تأكيد',\n    cancelText: 'إلغاء',\n  },\n  input: {\n    placeholder: 'الرجاء إدخال',\n  },\n  calendar: {\n    weekdayNames: [\n      'الإثنين',\n      'الثلاثاء',\n      'الأربعاء',\n      'الخميس',\n      'الجمعة',\n      'السبت',\n      'الأحد',\n    ],\n    today: 'اليوم',\n    start: 'ابدأ',\n    end: 'النهاية',\n    startAndEnd: 'البداية/النهاية',\n    format: 'MM/YYYY',\n  },\n  rangePicker: {\n    startPlaceholder: 'لم يبدأ الاختيار',\n    endPlaceholder: 'لم يكتمل الاختيار',\n  },\n  guideTour: {\n    gotItText: 'فهمت ذلك',\n    nextStepText: 'الخطوة التالية',\n    prevStepText: 'الخطوة السابقة',\n    jumpText: 'تخطي',\n  },\n  imageUpload: {\n    uploadingText: 'جارٍ التحميل',\n    uploadfailedText: 'فشل في التحميل',\n  },\n  pageContainer: {\n    failed: {\n      title: 'تواجه الصفحة بعض المشكلات البسيطة',\n      message: 'سأحاول ذلك لاحقًا',\n    },\n    disconnected: {\n      title: 'الشبكة مشغولة بعض الشيء',\n      message: 'حرّك إصبعك للمساعدة في الإصلاح',\n    },\n    empty: {\n      title: 'لا يوجد شيء هنا',\n      message: 'انظر إلى أشياء أخرى',\n    },\n    busy: {\n      title: 'الازدحام الأمامي',\n      message: 'جرّب الانتعاش.',\n    },\n  },\n};\n\nexport default arSA;\n"
  },
  {
    "path": "demo/pages/ConfigProvider/es-US.ts",
    "content": "const enUS = {\n  // locales for all components\n  locale: 'en-US',\n  global: {\n    placeholder: 'Please select',\n    emptyText: 'No data available',\n    okText: 'Ok',\n    cancelText: 'Cancel',\n  },\n  input: {\n    placeholder: 'Please enter',\n  },\n  calendar: {\n    weekdayNames: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],\n    today: 'Today',\n    start: 'Start',\n    end: 'End',\n    startAndEnd: 'Start/End',\n    format: 'MMM D, YYYY',\n  },\n  rangePicker: {\n    startPlaceholder: 'No selection started',\n    endPlaceholder: 'Incomplete selection',\n  },\n  guideTour: {\n    gotItText: 'Got it',\n    nextStepText: 'Next step',\n    prevStepText: 'Prev step',\n    jumpText: 'Skip',\n  },\n  imageUpload: {\n    uploadingText: 'Uploading',\n    uploadfailedText: 'Upload failed',\n  },\n  pageContainer: {\n    failed: {\n      title: 'The page is experiencing some minor issues',\n      message: \"I'll try it later\",\n    },\n    disconnected: {\n      title: 'The network is a bit busy',\n      message: 'Move your fingers to help repair',\n    },\n    empty: {\n      title: \"There's nothing here\",\n      message: 'Check out the others',\n    },\n    busy: {\n      title: 'Congestion ahead',\n      message: 'Try refreshing',\n    },\n  },\n};\n\nexport default enUS;\n"
  },
  {
    "path": "demo/pages/ConfigProvider/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n<!-- #if ALIPAY || WECHAT -->\n<ant-container>\n  <ant-config-provider locale=\"{{locale}}\">\n    <ant-list>\n      <ant-list-item>\n        City\n        <ant-picker\n          slot=\"extra\"\n          onCancel=\"handleDismissPicker\"\n          onVisibleChange=\"handleTriggerPicker\"\n          onOk=\"handleOk\"\n          defaultValue=\"{{ defaultValue }}\"\n          title=\"pelese Select\"\n          onChange=\"handleChange\"\n          options=\"{{ list }}\"\n        />\n      </ant-list-item>\n      <ant-list-item>\n        Date\n        <ant-range-picker\n          slot=\"extra\"\n          defaultValue=\"{{ defaultDateRange }}\"\n          onPickerChange=\"handlePickerRangeChange\"\n          onVisibleChange=\"handleTriggerPicker\"\n          onOk=\"handleRangeOk\"\n        />\n      </ant-list-item>\n    </ant-list>\n  </ant-config-provider>\n</ant-container>\n<!-- #endif -->\n<ant-container title=\"DarkMode\">\n  <ant-config-provider theme='dark' locale=\"{{locale}}\">\n    <ant-button type=\"primary\" onTap=\"handleTap\">\n      Dark\n    </ant-button>\n  </ant-config-provider>\n</ant-container>\n<ant-container title=\"Theme\">\n  <ant-config-provider themeVars=\"{{themeVars}}\" locale=\"{{locale}}\">\n    <ant-button type=\"primary\" onTap=\"handleTap\">\n      Theme\n    </ant-button>\n  </ant-config-provider>\n</ant-container>\n"
  },
  {
    "path": "demo/pages/ConfigProvider/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"ConfigProvider\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"ConfigProvider\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-button\": \"../../../src/Button/index\",\n    \"ant-list\": \"../../../src/List/index\",\n    \"ant-list-item\": \"../../../src/List/ListItem/index\",\n    \"ant-config-provider\": \"../../../src/ConfigProvider/index\",\n    /// #if ALIPAY || WECHAT\n    \"ant-picker\": \"../../../src/Picker/index\",\n    \"ant-range-picker\": \"../../../src/DatePicker/RangePicker/index\",\n    /// #endif\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/ConfigProvider/index.less",
    "content": "page {\n  /// #if WECHAT\n  box-sizing: border-box;\n  /// #endif\n  // 变量复写\n  --button-primary-color: #fff;\n  --button-primary-background-color: #ff4040;\n}\n"
  },
  {
    "path": "demo/pages/ConfigProvider/index.ts",
    "content": "import enUS from './es-US';\n// import arSA from './ar-SA';\n\nPage({\n  data: {\n    locale: enUS,\n    defaultValue: '',\n    value: '',\n    list: ['BeiJing', 'ShangHai', 'GuangZhou', 'ShenZhen', 'HangZhou', 'ChengDu', 'ChangSha'],\n    themeVars: {\n      'button-primary-color': 'yellow',\n      'button-primary-background-color': 'green',\n    },\n    defaultDate: new Date('2019/02/02').getTime(),\n    defaultDateRange: [\n      new Date('2022/03/21').getTime(),\n      new Date('2022/05/20').getTime(),\n    ],\n  },\n  handleTap() {\n    /// #if ALIPAY\n    my.alert({\n      title: '点击按钮',\n    });\n    /// #endif\n\n    /// #if WECHAT\n    //@ts-ignore\n    wx.showToast({\n      title: '点击按钮',\n    });\n    /// #endif\n  },\n\n  handleOk(value, column, e) {\n    console.log('onOk value', value, 'onOk  column', column, e);\n  },\n\n  handleChange(value, column, e) {\n    console.log('onChange value', value, 'onChange  column', column, e);\n  },\n  handleTriggerPicker(visible, e) {\n    console.log('onVisibleChange', visible, e);\n  },\n  handlePickerRangeChange(type, date, dateStr, e) {\n    console.log('onPickerRangeChange', type, date, dateStr, e);\n  },\n});\n"
  },
  {
    "path": "demo/pages/Container/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<view class=\"page\">\n  <ant-container title=\"标题\">\n    <view class=\"content\">这里是卡片内容</view>\n  </ant-container>\n  <ant-container headerInBox=\"{{ false }}\">\n    <view slot=\"title\">\n      <view class=\"icon\">\n        <ant-icon\n          type=\"SmileOutline\"\n          style=\"margin-right: 8px\" />\n        标题\n      </view>\n    </view>\n    <view slot=\"headerRight\">右侧内容</view>\n    <view class=\"content\" />\n  </ant-container>\n  <ant-container title=\"标题\">\n    <view slot=\"headerRight\">右侧内容</view>\n    <view class=\"content\">\n      <view class=\"box\" />\n      <view class=\"box\" />\n      <view class=\"box\" />\n    </view>\n  </ant-container>\n  <ant-container>\n    <view class=\"content\" />\n    <view slot=\"headerRight\">右侧内容</view>\n  </ant-container>\n  <ant-container>\n    <view class=\"content\" />\n  </ant-container>\n</view>\n"
  },
  {
    "path": "demo/pages/Container/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Container\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Container\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-icon\": \"../../../src/Icon/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Container/index.less",
    "content": ".page {\n  padding: 12px;\n  /// #if WECHAT\n  box-sizing: border-box;\n  /// #endif\n}\n.content {\n  height: 70px;\n  display: flex;\n\n  .box {\n    background-color: var(--color-grey-card);\n    &:not(:first-of-type) {\n      margin-left: 8px;\n    }\n    flex: 1;\n    border-radius: 4px;\n  }\n}\n"
  },
  {
    "path": "demo/pages/Container/index.ts",
    "content": "Page({});\n"
  },
  {
    "path": "demo/pages/Countdown/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基础用法\">\n  <ant-countdown countdownEndTime=\"{{ countdownDay }}\" countdownType=\"day\" onCountdownChange=\"handleCountdownChange\">\n    <text slot=\"prefix\">剩余时间</text>\n    <text slot=\"suffix\">就开始抢购啦</text>\n  </ant-countdown>\n\n  <ant-countdown className=\"marginTop\" countdownEndTime=\"{{ countdownAutoDay }}\" countdownType=\"day\" onCountdownChange=\"handleCountdownChange\">\n    <text slot=\"prefix\">剩余时间</text>\n    <text slot=\"suffix\">就开始抢购啦</text>\n  </ant-countdown>\n</ant-container>\n\n<ant-container title=\"基础用法-插槽形式\">\n  <ant-countdown countdownEndTime=\"{{ countdownDay }}\" countdownType=\"day\">\n    <view slot-scope=\"module\">\n      <view>还剩{{ module.day }}天，{{ module.hour }}:{{ module.min }}:{{ module.sec }}</view>\n    </view>\n  </ant-countdown>\n</ant-container>\n\n<ant-container title=\"终止时间戳\">\n  <ant-countdown countdownEndTime=\"{{ countdownTen }}\" onCountdownFinish=\"handleCountdownEnd\"></ant-countdown>\n</ant-container>\n\n<ant-container title=\"倒计时时间\">\n  <ant-countdown time=\"{{ 15 }}\"></ant-countdown>\n</ant-container>\n\n<ant-container title=\"起止时间戳且起点和本地差别不大，以本地为准\">\n  <ant-countdown countdownStartTime=\"{{ currentDelayed }}\" countdownEndTime=\"{{ countdownTen }}\"></ant-countdown>\n</ant-container>\n\n<ant-container title=\"起止时间戳但起点和本地差别大，按起终点差值算\">\n  <ant-countdown countdownStartTime=\"{{ wrongCurrent }}\" countdownEndTime=\"{{ countdownTen }}\"></ant-countdown>\n</ant-container>\n\n<ant-container title=\"超长时间下正常倒计时与天维度的倒计时\">\n  <ant-countdown countdownEndTime=\"{{ countdownDay }}\"></ant-countdown>\n  <ant-countdown countdownEndTime=\"{{ countdownDay }}\" countdownType=\"day\" onCountdownChange=\"handleCountdownChange\"></ant-countdown>\n</ant-container>\n\n<ant-container title=\"上来就是0\">\n  <ant-countdown countdownEndTime=\"{{ countdownCurrent }}\" onCountdownFinish=\"handleCountdownEnd\"></ant-countdown>\n</ant-container>\n\n<view style=\"height: 140rpx\"></view>\n"
  },
  {
    "path": "demo/pages/Countdown/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Countdown\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Countdown\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-countdown\": \"../../../src/Countdown/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Countdown/index.less",
    "content": ".marginTop {\n  margin-top: 24rpx;\n}\n"
  },
  {
    "path": "demo/pages/Countdown/index.ts",
    "content": "Page({\n  data: {\n    countdownTen: +new Date() + 10000, // 截止时间戳，当前时间加10s，即倒计时10s\n    currentDelayed: +new Date() + 500, // 有些许偏差的起点时间戳，模拟正常设备正常网络时，服务端下发的起始时间戳\n    wrongCurrent: +new Date() - 50000, // 当前时间戳减50s，会被判定为偏差大\n    countdownDay: +new Date() + 500000000, // 当前时间戳减50s，会被判定为偏差大\n    countdownCurrent: +new Date(), // 截止时间戳，当前时间，用于测试初始就是0的情况\n    countdownAutoDay: +new Date() + 86405000, // 自动计算“天”的展示\n  },\n  handleCountdownChange(e) {\n    console.log('倒计时变化', JSON.stringify(e));\n  },\n  handleCountdownEnd() {\n    console.log('倒计时结束');\n  },\n});\n"
  },
  {
    "path": "demo/pages/DatePicker/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-list header=\"基础用法\">\n  <ant-list-item>\n    请选择日期\n    <ant-date-picker\n      min=\"{{ min }}\"\n      max=\"{{ max }}\"\n      slot=\"extra\"\n      defaultValue=\"{{ defaultDate }}\"\n      placeholder=\"请选择\"\n      onPickerChange=\"handlePickerChange\"\n      onVisibleChange=\"handleTriggerPicker\"\n      onCancel=\"handleDismiss\"\n      onOk=\"handleOk\" >\n      <view slot=\"content-header\">插入一些内容</view>\n    </ant-date-picker>\n  </ant-list-item>\n  <ant-list-item>\n    请选择日期（点击蒙层不关闭）\n    <ant-date-picker\n      min=\"{{ min }}\"\n      max=\"{{ max }}\"\n      slot=\"extra\"\n      defaultValue=\"{{ defaultDate }}\"\n      placeholder=\"请选择\"\n      onPickerChange=\"handlePickerChange\"\n      onVisibleChange=\"handleTriggerPicker\"\n      maskClosable=\"{{ false }}\"\n      onOk=\"handleOk\" />\n  </ant-list-item>\n</ant-list>\n<ant-list header=\"选择精度\">\n  <ant-list-item>\n    请选择年度\n    <ant-date-picker\n      slot=\"extra\"\n      precision=\"year\"\n      format=\"YYYY\"\n      placeholder=\"选择\"\n      onOk=\"handleOk\" />\n  </ant-list-item>\n  <ant-list-item>\n    请选择月份\n    <ant-date-picker\n      slot=\"extra\"\n      precision=\"month\"\n      format=\"YYYY-MM\"\n      placeholder=\"选择\"\n      onVisibleChange=\"handleTriggerPicker\"\n      onOk=\"handleOk\" />\n  </ant-list-item>\n  <ant-list-item>\n    请选择时间\n    <ant-date-picker\n      slot=\"extra\"\n      precision=\"minute\"\n      format=\"YYYY-MM-DD HH:mm\"\n      placeholder=\"选择\"\n      onVisibleChange=\"handleTriggerPicker\"\n      onOk=\"handleOk\" />\n  </ant-list-item>\n</ant-list>\n<ant-list header=\"禁用状态\">\n  <ant-list-item>\n    请选择日期\n    <ant-date-picker\n      slot=\"extra\"\n      defaultValue=\"{{ defaultDate }}\"\n      disabled />\n  </ant-list-item>\n</ant-list>\n<ant-list header=\"自定义选择默认时间\">\n  <ant-list-item>\n    请选择时间\n    <ant-date-picker\n      min=\"{{ min }}\"\n      max=\"{{ max }}\"\n      slot=\"extra\"\n      defaultPickerValue=\"{{ defaultDate }}\"\n      precision=\"minute\"\n      placeholder=\"选择\"\n      onPickerChange=\"handlePickerChange\"\n      onVisibleChange=\"handleTriggerPicker\"\n      onCancel=\"handleDismiss\"\n      onOk=\"handleOk\" />\n  </ant-list-item>\n</ant-list>\n<ant-list header=\"自定义每列的渲染内容\">\n  <ant-list-item>\n    每列不显示单位\n    <ant-date-picker\n      min=\"{{ min }}\"\n      max=\"{{ max }}\"\n      slot=\"extra\"\n      defaultValue=\"{{ defaultDate }}\"\n      placeholder=\"请选择\"\n      onPickerChange=\"handlePickerChange\"\n      onVisibleChange=\"handleTriggerPicker\"\n      onCancel=\"handleDismiss\"\n      onOk=\"handleOk\"\n      onFormatLabel=\"{{ handleFormatLabel ? handleFormatLabel : 'handleFormatLabel' }}\" />\n  </ant-list-item>\n</ant-list>\n<ant-list header=\"时间范围选择\">\n  <ant-list-item>\n    日期范围\n    <ant-range-picker\n      slot=\"extra\"\n      placeholder=\"请选择\"\n      value=\"{{ controlledDateRange }}\"\n      onPickerChange=\"handlePickerRangeChange\"\n      onVisibleChange=\"handleTriggerPicker\"\n      onOk=\"handleRangeOk\" >\n      <view slot=\"content-header\" onTap=\"changeDateRange\">范围一</view>\n    </ant-date-picker>\n  </ant-list-item>\n  <ant-list-item>\n    受控模式\n    <ant-range-picker\n      slot=\"extra\"\n      placeholder=\"请选择\"\n      value=\"{{ controlledDateRange }}\"\n      onOk=\"handleControlledRangeOk\" />\n  </ant-list-item>\n  <ant-list-item>\n    每列不显示单位\n    <ant-range-picker\n      slot=\"extra\"\n      placeholder=\"请选择\"\n      defaultValue=\"{{ defaultDateRange }}\"\n      onPickerChange=\"handlePickerRangeChange\"\n      onVisibleChange=\"handleTriggerPicker\"\n      onOk=\"handleRangeOk\"\n      onFormatLabel=\"{{ handleFormatLabel ? handleFormatLabel : 'handleFormatLabel' }}\" />\n  </ant-list-item>\n</ant-list>\n<ant-container style=\"margin-top: 20rpx\">\n  <ant-list header=\"外部控制选择器是否显示\">\n    <ant-list-item>\n      请选择时间\n      <ant-date-picker\n        min=\"{{ min }}\"\n        max=\"{{ max }}\"\n        slot=\"extra\"\n        visible=\"{{ pickerVisible }}\"\n        defaultValue=\"{{ defaultDate }}\"\n        placeholder=\"请选择\"\n        onPickerChange=\"handlePickerChange\"\n        onVisibleChange=\"handleTriggerControlledPicker\"\n        onCancel=\"handleDismiss\"\n        onOk=\"handleOk\" />\n    </ant-list-item>\n  </ant-list>\n\n  <ant-button\n    size=\"medium\"\n    type=\"primary\"\n    onTap=\"handleOpenPicker\">\n    打开 DatePicker\n  </ant-button>\n</ant-container>\n<ant-container style=\"margin-top: 20rpx\">\n  <ant-list header=\"外部控制日期范围选择器是否显示\">\n    <ant-list-item>\n      请选择日期范围\n      <ant-range-picker\n        slot=\"extra\"\n        visible=\"{{ dateRangePickerVisible }}\"\n        placeholder=\"请选择\"\n        defaultValue=\"{{ defaultDateRange }}\"\n        onPickerChange=\"handlePickerRangeChange\"\n        onVisibleChange=\"handleTriggerControlledDateRangePicker\"\n        onOk=\"handleRangeOk\" />\n    </ant-list-item>\n  </ant-list>\n\n  <ant-button\n    size=\"medium\"\n    type=\"primary\"\n    onTap=\"handleOpenDateRangePicker\">\n    打开 DateRangePicker\n  </ant-button>\n</ant-container>\n"
  },
  {
    "path": "demo/pages/DatePicker/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"DatePicker\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"DatePicker\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-date-picker\": \"../../../src/DatePicker/index\",\n    \"ant-range-picker\": \"../../../src/DatePicker/RangePicker/index\",\n    \"ant-list-item\": \"../../../src/List/ListItem/index\",\n    \"ant-list\": \"../../../src/List/index\",\n    \"ant-button\": \"../../../src/Button/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/DatePicker/index.less",
    "content": ""
  },
  {
    "path": "demo/pages/DatePicker/index.ts",
    "content": "Page({\n  data: {\n    pickerVisible: false,\n    dateRangePickerVisible: false,\n    min: new Date('2019/01/15').getTime(),\n    max: new Date('2023/08/20').getTime(),\n    defaultDate: new Date('2019/02/02').getTime(),\n    defaultDateRange: [\n      new Date('2022/03/21').getTime(),\n      new Date('2022/05/20').getTime(),\n    ],\n    controlledDateRange: [\n      new Date('2022/03/21').getTime(),\n      new Date('2022/05/20').getTime(),\n    ],\n    /// #if WECHAT\n    handleFormatLabel(type, value) {\n      return String(value);\n    },\n    /// #endif\n  },\n  handleControlledRangeOk(value) {\n    console.log('handleControlledRangeOk');\n    console.log(value);\n    /// #if WECHAT\n    this.setData({\n      // 微信只支持传递时间戳\n      controlledDateRange: value.detail[0].map((o) => o.getTime()),\n    });\n    /// #endif\n\n    /// #if ALIPAY\n    this.setData({\n      controlledDateRange: value,\n    });\n    /// #endif\n  },\n  handlePickerChange(date, dateStr, e) {\n    console.log('onPickerChange', date, dateStr, e);\n  },\n  handleOk(date, format, e) {\n    console.log('onOk', date, format, e);\n  },\n  handlePickerRangeChange(type, date, dateStr, e) {\n    console.log('onPickerRangeChange', type, date, dateStr, e);\n  },\n  handleRangeOk(date, format, e) {\n    console.log('onRangeOk', date, format, e);\n    this.setData({ controlledDateRange: date });\n  },\n  handleChangeDate() {\n    this.setData({ defaultDate: new Date('2019/05/02').getTime() });\n  },\n  handleTriggerPicker(visible, e) {\n    console.log('onVisibleChange', visible, e);\n  },\n\n  handleDismiss(e) {\n    console.log('e', e);\n  },\n  handleFormatLabel(type, value) {\n    return String(value);\n  },\n  handleTriggerControlledPicker(visible, e) {\n    /// #if WECHAT\n    console.log('handleTriggerControlledPicker', visible);\n    this.setData({\n      pickerVisible: visible.detail,\n    });\n    /// #endif\n\n    /// #if ALIPAY\n    console.log('handleTriggerControlledPicker', visible, e);\n    this.setData({\n      pickerVisible: visible,\n    });\n    /// #endif\n  },\n\n  changeDateRange() {\n    this.setData({\n      controlledDateRange: [\n        new Date('2022/09/10').getTime(),\n        new Date('2022/09/30').getTime(),\n      ],\n    });\n  },\n\n  handleOpenPicker() {\n    this.setData({\n      pickerVisible: true,\n    });\n  },\n  handleTriggerControlledDateRangePicker(visible, e) {\n    /// #if WECHAT\n    console.log('handleTriggerControlledDateRangePicker', visible);\n    this.setData({\n      dateRangePickerVisible: visible.detail,\n    });\n    /// #endif\n\n    /// #if ALIPAY\n    console.log('handleTriggerControlledDateRangePicker', visible, e);\n    this.setData({\n      dateRangePickerVisible: visible,\n    });\n    /// #endif\n  },\n\n  handleOpenDateRangePicker() {\n    this.setData({\n      dateRangePickerVisible: true,\n    });\n  },\n});\n"
  },
  {
    "path": "demo/pages/Dialog/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-dialog\n  content=\"人在天边月上明\"\n  visible=\"{{ basicVisible }}\"\n  onClose=\"handleClose\"\n  closable=\"{{ false }}\"\n  footer=\"{{ footer1 }}\"\n  onButtonTap=\"onButtonTap\"\n  primaryButtonText=\"我知道了\"\n  />\n<ant-dialog\n  title=\"带标题的弹窗\"\n  content=\"人在天边月上明\"\n  onButtonTap=\"onButtonTap\"\n  visible=\"{{ withTitleVisible }}\"\n  onClose=\"handleClose\"\n  footer=\"{{ footer1 }}\"\n  />\n<ant-dialog\n  title=\"带头图\"\n  headerImage=\"https://mdn.alipayobjects.com/huamei_ahikbw/afts/img/A*Q5ekTJUJW8IAAAAAAAAAAAAADiWwAQ/original\"\n  content=\"人在天边月上明\"\n  onButtonTap=\"onButtonTap\"\n  visible=\"{{ withImageVisible }}\"\n  onClose=\"handleClose\"\n  footer=\"{{ footer1 }}\"\n  />\n<ant-dialog\n  title=\"确定删除吗？\"\n  content=\"删除后无法恢复\"\n  visible=\"{{ basicTwoVisible }}\"\n  onClose=\"handleClose\"\n  onButtonTap=\"onButtonTap\"\n  footer=\"{{ footer2 }}\"\n  />\n<ant-dialog\n  title=\"标题\"\n  content=\"人在天边月上明\"\n  visible=\"{{ basicThreeVisible }}\"\n  onClose=\"handleClose\"\n  onButtonTap=\"onButtonTap\"\n  footer=\"{{ footer3 }}\"\n  />\n<ant-dialog\n  title=\"签到成功!获得积分奖励\"\n  content=\"积分可用于好礼兑换\"\n  visible=\"{{ slotWeakVisible }}\"\n  onClose=\"handleClose\"\n  className=\"activity-dialog\"\n  onButtonTap=\"onButtonTap\"\n>\n  <image\n    slot=\"header\"\n    mode=\"widthFix\"\n    class=\"activity-dialog-header-image\"\n    src=\"https://mdn.alipayobjects.com/huamei_ahikbw/afts/img/A*HTNoQoZlIfAAAAAAAAAAAAAADiWwAQ/original\" />\n  <image\n    slot=\"content-extra\"\n    mode=\"widthFix\"\n    class=\"activity-dialog-content-image\"\n    src=\"https://mdn.alipayobjects.com/huamei_ahikbw/afts/img/A*DNXISIKmwBUAAAAAAAAAAAAADiWwAQ/original\" />\n  <view slot=\"footer\" class=\"activity-dialog-footer\">\n    <view class=\"activity-dialog-footer-button\" onTap=\"onClickActivityModalButton\">\n      开心收下\n    </view>\n    <view class=\"activity-dialog-footer-extra\">\n      奖品可在我的奖品中查看\n    </view>\n  </view>\n</ant-dialog>\n\n<ant-dialog\n  title=\"恭喜获得出行红包\"\n  content=\"出行打车小程序专用\"\n  visible=\"{{ slotStrongVisible }}\"\n  onClose=\"handleClose\"\n  className=\"activity-dialog activity-dialog-strong\"\n  onButtonTap=\"onButtonTap\"\n>\n  <image\n    slot=\"dialog-top\"\n    mode=\"widthFix\"\n    class=\"activity-dialog-strong-header-image\"\n    src=\"https://mdn.alipayobjects.com/huamei_ahikbw/afts/img/A*Sp52SL4mObQAAAAAAAAAAAAADiWwAQ/original\" />\n  <image\n    slot=\"content-extra\"\n    mode=\"widthFix\"\n    class=\"activity-dialog-content-image\"\n    src=\"https://mdn.alipayobjects.com/huamei_ahikbw/afts/img/A*Oju8Q4diuA0AAAAAAAAAAAAADiWwAQ/original\" />\n  <view slot=\"footer\" class=\"activity-dialog-footer\">\n    <view class=\"activity-dialog-footer-button\" onTap=\"onClickActivityModalButton\">\n      去使用\n    </view>\n    <view class=\"activity-dialog-footer-extra\">\n      奖品可在我的奖品中查看\n    </view>\n  </view>\n</ant-dialog>\n<!-- #if ALIPAY -->\n<ant-dialog\n  visible=\"{{ customBodyVisible }}\"\n  closable=\"{{ false }}\"\n  onClose=\"handleClose\">\n  <view class=\"body\">\n    <image\n      mode=\"scaleToFill\"\n      src=\"https://mdn.alipayobjects.com/huamei_yujk1o/afts/img/A*xYjqRJiKsvoAAAAAAAAAAAAADuaJAQ/original\"\n      class=\"bodyImg\" />\n    <view class=\"bodyAction\">\n      <ant-icon\n        type=\"CloseCircleOutline\"\n        onTap=\"handleClose\" />\n    </view>\n  </view>\n</ant-dialog>\n<!-- #endif -->\n\n<ant-container\n  title=\"基础用法\"\n  className=\"list\">\n  <ant-button\n    data-field=\"basicVisible\"\n    onTap=\"handleOpen\">\n    最简单的弹框\n  </ant-button>\n  <ant-button\n    data-field=\"withTitleVisible\"\n    onTap=\"handleOpen\">\n    带有标题\n  </ant-button>\n  <ant-button\n    data-field=\"withImageVisible\"\n    onTap=\"handleOpen\">\n    带头图\n  </ant-button>\n  <ant-button\n    data-field=\"basicTwoVisible\"\n    onTap=\"handleOpen\">\n    两个按钮 横排\n  </ant-button>\n  <ant-button\n    data-field=\"basicThreeVisible\"\n    onTap=\"handleOpen\">\n    三个按钮 竖排\n  </ant-button>\n</ant-container>\n\n<!-- #if ALIPAY -->\n<ant-container\n  title=\"局部插槽\"\n  className=\"list\">\n  <ant-button\n    data-field=\"slotWeakVisible\"\n    onTap=\"handleOpen\">\n    弱活动氛围弹框\n  </ant-button>\n  <ant-button\n    data-field=\"slotStrongVisible\"\n    onTap=\"handleOpen\">\n    强活动氛围弹框\n  </ant-button>\n</ant-container>\n<!-- #endif -->\n\n<!-- #if ALIPAY -->\n<ant-container\n  title=\"自定义\"\n  className=\"list\">\n  <ant-button\n    data-field=\"customBodyVisible\"\n    onTap=\"handleOpen\">\n    完全自定义内容区\n  </ant-button>\n</ant-container>\n<!-- #endif -->\n"
  },
  {
    "path": "demo/pages/Dialog/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Dialog\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Dialog\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-dialog\": \"../../../src/Dialog/index\",\n    \"ant-button\": \"../../../src/Button/index\",\n    \"ant-icon\": \"../../../src/Icon/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Dialog/index.less",
    "content": ".bodyImg {\n  width: 424rpx;\n  height: 528rpx;\n  border-radius: 8rpx;\n}\n.bodyAction {\n  padding-top: 32rpx;\n  font-size: 48rpx;\n  text-align: center;\n  color: #fff;\n}\n\n.list .ant-button {\n  margin-bottom: 8px;\n}\n\n.activity-dialog {\n  .ant-dialog-body {\n    background-image: linear-gradient(\n      0deg,\n      #ffffff 75%,\n      rgba(255, 255, 255, 0.95) 91%,\n      rgba(255, 242, 218, 0.93) 100%\n    );\n    box-shadow: 0 2px 56px 0 rgba(0, 0, 0, 0.18);\n  }\n  .ant-dialog-body-title {\n    padding-bottom: 10rpx;\n  }\n  .ant-dialog-body-content {\n    color: #999999;\n    padding-bottom: 0rpx;\n  }\n  &-header-image {\n    width: 250rpx;\n    height: 250rpx;\n    position: relative;\n    margin-top: -220rpx;\n    margin-left: 50%;\n    margin-bottom: 21rpx;\n    transform: translateX(-50%);\n  }\n  &-content-image {\n    width: 516rpx;\n    margin: 64rpx auto 0 auto;\n  }\n  &-footer {\n    padding-top: 64rpx;\n    display: flex;\n    justify-content: flex-start;\n    align-items: center;\n    flex-direction: column;\n    &-button {\n      background: #ff4000;\n      border-radius: 55rpx;\n      font-weight: 500;\n      font-size: 36rpx;\n      line-height: 50rpx;\n      color: #ffffff;\n      text-align: center;\n      width: 360rpx;\n      height: 96rpx;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n    }\n    &-extra {\n      font-size: 24rpx;\n      color: #999999;\n      letter-spacing: 0;\n      text-align: center;\n      line-height: 36rpx;\n      padding-top: 20rpx;\n    }\n  }\n}\n\n.activity-dialog-strong {\n  &-header-image {\n    width: 100%;\n    position: absolute;\n    top: -160rpx;\n    left: 0;\n    z-index: -1;\n  }\n  .activity-dialog-footer {\n    padding-top: 75rpx;\n  }\n  .activity-dialog-content-image {\n    width: 528rpx;\n    margin-top: 60rpx;\n  }\n  .ant-dialog-body {\n    background-image: linear-gradient(\n      180deg,\n      rgba(255, 255, 255, 0.57) 0%,\n      rgba(255, 255, 255, 0.91) 8%,\n      #ffffff 17%\n    );\n    box-shadow: 0;\n    padding-top: 30rpx;\n  }\n}\n"
  },
  {
    "path": "demo/pages/Dialog/index.ts",
    "content": "Page({\n  data: {\n    basicVisible: false,\n    withTitleVisible: false,\n    basicTwoVisible: false,\n    basicThreeVisible: false,\n    focusOneVisible: false,\n    focusTwoVisible: false,\n    customBodyVisible: false,\n    withImageVisible: false,\n    slotWeakVisible: false,\n    slotStrongVisible: false,\n    footer1: {\n      buttons: [{ text: '我知道了' }],\n    },\n    footer2: {\n      buttons: [{ text: '取消', type: 'default' }, { text: '确定', type: 'primary' }],\n      layout: 'horizontal',\n    },\n    footer3: {\n      buttons: [{ text: '主按钮', type: 'primary' }, { text: '更多', type: 'default' }, { text: '取消', type: 'text' }],\n    },\n  },\n  onClickActivityModalButton() {\n    this.showToast(`点击了活动弹框「开心收下」`);\n    this.handleClose();\n  },\n  onButtonTap(buttonItem) {\n    console.log('点击的按钮: ', buttonItem);\n    this.showToast(`点击了${buttonItem.text }`);\n    this.handleClose();\n  },\n  handleOpen(e) {\n    const { field } = e.target.dataset;\n    this.setData({ [field]: true });\n  },\n  handleClose() {\n    this.setData({\n      basicVisible: false,\n      withTitleVisible: false,\n      basicTwoVisible: false,\n      basicThreeVisible: false,\n      focusOneVisible: false,\n      focusTwoVisible: false,\n      customBodyVisible: false,\n      withImageVisible: false,\n      slotWeakVisible: false,\n      slotStrongVisible: false,\n    });\n  },\n\n  showToast(content: string) {\n    /// #if ALIPAY\n    my.showToast({ content, duration: 1000 });\n    /// #endif\n\n    /// #if WECHAT\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    //@ts-ignore\n    wx.showToast({\n      title: content,\n    });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/Divider/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<view class=\"page\">\n  <ant-container\n    title=\"水平分割线\"\n    headerInBox=\"{{ false }}\">\n    <ant-divider />\n  </ant-container>\n\n  <ant-container\n    title=\"水平分割线-带文字\"\n    headerInBox=\"{{ false }}\">\n    <ant-divider text=\"中间内容\" />\n    <ant-divider\n      text=\"左侧内容\"\n      textPosition=\"left\" />\n    <ant-divider\n      text=\"右侧内容\"\n      textPosition=\"right\" />\n  </ant-container>\n\n  <ant-container\n    title=\"水平分割线-自定义\"\n    headerInBox=\"{{ false }}\">\n    <ant-divider\n      text=\"自定义样式\"\n      textStyle=\"color:#1677ff; fontWeight:600\"\n      lineHeight=\"{{ 2 }}\"\n      lineType=\"dashed\"\n      lineColor=\"#1677ff\" />\n  </ant-container>\n\n  <ant-container\n    title=\"垂直分割线\"\n    headerInBox=\"{{ false }}\">\n    <view class=\"divider-vertical\">\n      <view>100m</view>\n      <ant-divider direction=\"vertical\" />\n      <view>浙江省杭州市西湖区西溪路556号</view>\n    </view>\n  </ant-container>\n</view>\n"
  },
  {
    "path": "demo/pages/Divider/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Divider\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Divider\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-divider\": \"../../../src/Divider/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Divider/index.less",
    "content": "@import '../../../src/style/themes/color.less';\n\n.page {\n  padding: 24rpx;\n\n  /// #if WECHAT\n  box-sizing: border-box;\n  /// #endif\n}\n\n.divider-vertical {\n  display: flex;\n  justify-content: flex-start;\n  align-items: center;\n  color: @COLOR_TEXT_WEAK;\n}\n"
  },
  {
    "path": "demo/pages/Divider/index.ts",
    "content": "Page({\n  data: {\n   \n  },\n})"
  },
  {
    "path": "demo/pages/Empty/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基础样式\">\n  <ant-empty\n    title=\"这里什么也没有\"\n    message=\"看看其它吧\" />\n</ant-container>\n\n<ant-container title=\"基础样式-水平操作按钮\">\n  <ant-empty\n    title=\"这里什么也没有\"\n    size=\"small\"\n    onClickButton=\"onClickButton\"\n    buttonInfo=\"{{ horizontalButtonInfo }}\"\n    message=\"看看其它吧\" />\n</ant-container>\n\n<ant-container title=\"基础样式-垂直操作按钮\">\n  <ant-empty\n    title=\"这里什么也没有\"\n    onClickButton=\"onClickButton\"\n    buttonInfo=\"{{ verticalButtonInfo }}\"\n    message=\"看看其它吧\" />\n</ant-container>\n\n<ant-container title=\"添加操作按钮组\">\n  <ant-empty\n    title=\"这里什么也没有\"\n    message=\"看看其它吧\">\n    <view slot=\"extra\">\n      <ant-button\n        size=\"small\"\n        inline>\n        操作1\n      </ant-button>\n      <ant-button\n        type=\"primary\"\n        size=\"small\"\n        inline\n        style=\"margin-left: 12px\">\n        操作2\n      </ant-button>\n    </view>\n  </ant-empty>\n</ant-container>\n\n<ant-container title=\"自定义图片\">\n  <ant-empty\n    title=\"这里什么也没有\"\n    message=\"看看其它吧\"\n    image=\"{{ imageUrl }}\" />\n</ant-container>\n"
  },
  {
    "path": "demo/pages/Empty/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Empty\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Empty\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-empty\": \"../../../src/Empty/index\",\n    \"ant-container\": \"../../../src/Container/index\",\n    \"ant-button\": \"../../../src/Button/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Empty/index.less",
    "content": ""
  },
  {
    "path": "demo/pages/Empty/index.ts",
    "content": "const BUTTON_LISt = [\n  {\n    type: 'primary',\n    text: '刷新重试',\n  },\n  {\n    type: 'default',\n    text: '网络诊断',\n  },\n];\nPage({\n  data: {\n    imageUrl:\n      'https://mdn.alipayobjects.com/huamei_mnxlps/afts/img/A*oV92T4FXR64AAAAAAAAAAAAADkqGAQ/original',\n    mode: 'page',\n    modeList: [\n      {\n        label: '全页空状态',\n        value: 'page',\n      },\n      {\n        label: '局部空状态',\n        value: 'section',\n      },\n    ],\n    horizontalButtonInfo: {\n      layout: 'horizontal',\n      list: BUTTON_LISt,\n    },\n    verticalButtonInfo: {\n      layout: 'vertical',\n      list: BUTTON_LISt,\n    },\n  },\n  onClickButton(buttonInfo) {\n    console.log('onClickButton buttonInfo: ', buttonInfo);\n    /// #if ALIPAY\n    my.showToast({ content: `点击了按钮「${buttonInfo.text}」` });\n    /// #endif\n    /// #if WECHAT\n    // @ts-ignore\n    wx.showToast({ title: `点击了按钮「${buttonInfo.detail.text}」` });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/Feedback/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"高量引导反馈\">\n  <view slot=\"headerRight\">\n    <ant-feedback\n      type=\"popover\"\n      visible=\"{{ visible1 }}\"\n      popoverType=\"default\"\n      placement=\"bottom-right\"\n      onVisibleChange=\"onVisibleChange1\"\n      className=\"feedback-demo\">\n      <view class=\"feedback-demo-target\">\n        <ant-icon style=\"font-size: 30px\" type=\"MoreOutline\" />\n      </view>\n      <view slot=\"popover-content\" class=\"feedback-content\">\n        <ant-list\n          slot=\"content\"\n          className=\"popover\"\n        >\n          <ant-list-item\n            onTap=\"handleTapItem\"\n          >\n          <view class=\"feedback-content-selector\">\n            内容反馈\n            <ant-selector options=\"{{ selectorOption }}\" />\n            </view>\n          </ant-list-item>\n          <ant-list-item\n            onTap=\"handleTapItem\"\n            arrow=\"right\"\n          >\n            管理「 推荐卡片」\n          </ant-list-item>\n          <ant-list-item\n            onTap=\"handleTapItem\"\n            arrow=\"right\"\n          >\n            反馈与投诉\n          </ant-list-item>\n          <ant-list-item\n            arrow=\"right\"\n            onTap=\"handleTapItem\"\n          >\n            图片\n          </ant-list-item>\n        </ant-list>\n      </view>\n    </ant-feedback>\n  </view>\n  点击右上角的icon 展示反馈内容\n</ant-container>\n\n<ant-container title=\"点引导反馈\">\n  点击下面的内容 展示点引导反馈\n  <view class=\"feedback-container-flex\">\n    <ant-feedback\n      type=\"popover\"\n      list=\"{{ feedList }}\"\n      visible=\"{{ visible2 }}\"\n      popoverType=\"circle\"\n      title=\"点引导反馈\"\n      onTapFeedItem=\"onTapFeedItem2\"\n      placement=\"bottom\"\n      onVisibleChange=\"onVisibleChange2\"\n      className=\"feedback-demo2\">\n      <image\n        mode=\"widthFix\"\n        style=\"width: 345rpx;\"\n        src=\"https://mdn.alipayobjects.com/huamei_mnxlps/afts/img/A*yhbvR5XObugAAAAAAAAAAAAADkqGAQ/original\"\n      />\n    </ant-feedback>\n    <ant-feedback\n      type=\"popover\"\n      list=\"{{ feedList }}\"\n      visible=\"{{ visible4 }}\"\n      popoverType=\"circle\"\n      title=\"点引导反馈\"\n      onTapFeedItem=\"onTapFeedItem4\"\n      placement=\"bottom\"\n      onVisibleChange=\"onVisibleChange4\"\n      className=\"feedback-demo4\">\n      <image\n        mode=\"widthFix\"\n        style=\"width: 345rpx;\"\n        src=\"https://mdn.alipayobjects.com/huamei_mnxlps/afts/img/A*yhbvR5XObugAAAAAAAAAAAAADkqGAQ/original\"\n      />\n    </ant-feedback>\n  </view>\n</ant-container>\n\n<ant-container title=\"反馈卡片\">\n  <ant-feedback\n    a:if=\"{{ visible3 }}\"\n    list=\"{{ feedList }}\"\n    type=\"card\"\n    title=\"喜欢推荐的内容吗？\"\n    onTapFeedItem=\"onTapFeedItem3\"\n    className=\"feedback-demo\"\n    onVisibleChange=\"onVisibleChange3\">\n  </ant-feedback>\n  <ant-button data-filed=\"visible3\" onTap=\"onShowFeedback\" a:else size=\"small\" inline>\n    点击 展示反馈卡片\n  </ant-button>\n</ant-container>\n"
  },
  {
    "path": "demo/pages/Feedback/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Feedback\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Feedback\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-container\": \"../../../src/Container/index\",\n    \"ant-icon\": \"../../../src/Icon/index\",\n    \"ant-popover\": \"../../../src/Popover/index\",\n    \"ant-selector\": \"../../../src/Selector/index\",\n    \"ant-list\": \"../../../src/List/index\",\n    \"ant-list-item\": \"../../../src/List/ListItem/index\",\n    \"ant-feedback\": \"../../../src/Feedback/index\",\n    \"ant-button\": \"../../../src/Button/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Feedback/index.less",
    "content": ".feedback-content {\n  &-selector {\n    display: flex;\n    flex-direction: column;\n    justify-content: flex-start;\n    align-items: flex-start;\n  }\n}\n.feedback-container-flex {\n  display: flex;\n  justify-content: space-between;\n}\n.feedback-demo {\n  .feedback-demo-target {\n    width: 50rpx;\n    height: 40rpx;\n    background: var(--color-background2);\n    border-radius: 8rpx;\n\n    display: flex;\n    justify-content: center;\n    align-items: center;\n  }\n  .ant-selector-content-container {\n    margin-left: -6px;\n    margin-right: -6px;\n  }\n  .ant-popover-inner {\n    padding: 0;\n  }\n  .ant-popover-arrow {\n    right: 46rpx !important;\n  }\n  .ant-popover-bottom-right {\n    right: -40rpx !important;\n  }\n}\n.feedback-demo2,\n.feedback-demo4 {\n  margin: 40rpx 0 0 0 !important;\n  .ant-popover-inner {\n    padding: 0;\n  }\n}\n.feedback-gray-container {\n  .ant-container-content {\n    background: var(--color-background);\n    color: var(--color-text-primary);\n  }\n  .ant-feedback-content-card {\n    width: 345rpx;\n    box-sizing: border-box;\n  }\n}\n"
  },
  {
    "path": "demo/pages/Feedback/index.ts",
    "content": "Page({\n  data: {\n    visible3: true,\n    visible2: false,\n    visible1: false,\n    visible4: false,\n    selectorOption: [\n      { text: '选项一', value: '1' },\n      { text: '选项二', value: '2' },\n      { text: '选项三', value: '3' },\n      { text: '选项四', value: '4' },\n      { text: '选项五', value: '5' },\n      { text: '选项六', value: '6' },\n    ],\n    feedList: [\n      {\n        icon: 'HeartOutline',\n        text: '喜欢推荐内容',\n        id: '1',\n      },\n      {\n        icon: 'FrownOutline',\n        text: '我不感兴趣',\n        id: '2',\n      },\n      {\n        image:\n          'https://gw.alipayobjects.com/mdn/rms_ce4c6f/afts/img/A*XMCgSYx3f50AAAAAAAAAAABkARQnAQ',\n        text: '看过类似内容',\n        id: '3',\n      },\n      {\n        icon: 'ExclamationCircleOutline',\n        text: '夸张博眼球',\n        id: '4',\n      },\n    ],\n  },\n  onVisibleChange1(visible) {\n    this.updateVisible('visible1', visible);\n  },\n  onVisibleChange3(visible) {\n    this.updateVisible('visible3', visible);\n  },\n  onVisibleChange2(visible) {\n    this.updateVisible('visible2', visible);\n  },\n  onVisibleChange4(visible) {\n    this.updateVisible('visible4', visible);\n  },\n  updateVisible(field, visible) {\n    /// #if ALIPAY\n    this.setData({\n      [field]: visible,\n    });\n    /// #endif\n    /// #if WECHAT\n    this.setData({\n      [field]: visible.detail,\n    });\n    /// #endif\n  },\n  onShowFeedback(e) {\n    const filed = e.target.dataset.filed;\n    this.setData({\n      [filed]: true,\n    });\n  },\n  onTapFeedItem2(feedItem) {\n    /// #if ALIPAY\n    my.showToast({\n      content: `点击了反馈项${feedItem.text}`,\n    });\n    this.updateVisible('visible2', false);\n    /// #endif\n    /// #if WECHAT\n    // @ts-ignore\n    wx.showToast({\n      title: `点击了反馈项${feedItem.text}`,\n    });\n    this.updateVisible('visible2', { detail: false });\n    /// #endif\n  },\n  onTapFeedItem4(feedItem) {\n    /// #if ALIPAY\n    my.showToast({\n      content: `点击了反馈项${feedItem.text}`,\n    });\n    this.updateVisible('visible4', false);\n    /// #endif\n    /// #if WECHAT\n    // @ts-ignore\n    wx.showToast({\n      title: `点击了反馈项${feedItem.text}`,\n    });\n    this.updateVisible('visible4', { detail: false });\n    /// #endif\n  },\n  onTapFeedItem3(feedItem) {\n    /// #if ALIPAY\n    my.showToast({\n      content: `点击了反馈项${feedItem.text}`,\n    });\n    this.updateVisible('visible3', false);\n    /// #endif\n    /// #if WECHAT\n    // @ts-ignore\n    wx.showToast({\n      title: `点击了反馈项${feedItem.text}`,\n    });\n    this.updateVisible('visible3', { detail: false });\n    /// #endif\n  },\n  handleTapItem() {\n    /// #if ALIPAY\n    my.showToast({\n      content: `已反馈`,\n    });\n    this.updateVisible('visible1', false);\n    /// #endif\n    /// #if WECHAT\n    // @ts-ignore\n    wx.showToast({\n      title: `已反馈`,\n    });\n    this.updateVisible('visible1', { detail: false });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/Footer/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<view class=\"page\">\n  <ant-container title=\"基础页脚\">\n    <ant-footer label=\"没有更多了\" />\n    <ant-footer label=\"没有更多了\" noLabelDivider/>\n    <!-- #if ALIPAY -->\n    <ant-footer label=\"placeholder\">\n      <view slot=\"label\">\n        <ant-icon type=\"HandPayCircleOutline\" style=\"margin-right: 4px\"/>\n        蚂蚁财富\n      </view>\n    </ant-footer>\n    <!-- #endif -->\n  </ant-container>\n\n  <ant-container title=\"带内容的页脚\">\n    <ant-footer\n      content=\"@ 2004-2020 Alipay.com All rights reserved\"\n    />\n    <!-- #if ALIPAY -->\n    <ant-footer\n      content=\"placeholder\"\n    >\n      <view slot=\"content\">\n        © 蚂蚁科技集团股份有限公司\n      </view>\n    </ant-footer>\n    <!-- #endif -->\n  </ant-container>\n\n  <ant-container title=\"带链接的页脚\">\n    <ant-footer\n      links=\"{{links1}}\"\n      onLinkTap=\"handleLinkTap\"\n    />\n    <ant-footer\n      links=\"{{links2}}\"\n      onLinkTap=\"handleLinkTap\"\n    />\n  </ant-container>\n\n  <ant-container title=\"带标签的页脚\">\n    <ant-footer\n      chips=\"{{chips}}\"\n      onChipTap=\"handleChipTap\"\n    />\n  </ant-container>\n\n  <ant-container title=\"组合使用\">\n\n    <!-- #if ALIPAY -->\n    <ant-footer\n      label=\"placeholder\"\n      content=\"过往业绩不预示产品未来表现，市场有风险，投资需谨慎\"\n      noLabelDivider\n    >\n      <view slot=\"label\">\n        <ant-icon type=\"HandPayCircleOutline\" style=\"margin-right: 4px\"/>\n        蚂蚁财富\n      </view>\n    </ant-footer>\n\n    <view style=\"height:24px;\"/>\n\n    <!-- #endif -->\n\n\n    <ant-footer\n      links=\"{{links2}}\"\n      content=\"@ 2004-2020 Alipay.com All rights reserved\"\n      onLinkTap=\"handleLinkTap\"\n    />\n\n    <view style=\"height:24px;\"/>\n\n    <ant-footer\n      content=\"没找到需要的？搜一下试试\"\n      chips=\"{{chips}}\"\n      onChipTap=\"handleChipTap\"\n    />\n\n    <view style=\"height:24px;\"/>\n\n    <ant-footer\n      label=\"没有更多了\"\n      content=\"@ 2004-2020 Alipay.com All rights reserved\"\n      links=\"{{links2}}\"\n      chips=\"{{chips}}\"\n      onLinkTap=\"handleLinkTap\"\n      onChipTap=\"handleChipTap\"\n    />\n  </ant-container>\n</view>\n"
  },
  {
    "path": "demo/pages/Footer/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Footer\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Footer\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-icon\": \"../../../src/Icon/index\",\n    \"ant-footer\": \"../../../src/Footer/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Footer/index.less",
    "content": ".page {\n  padding: 24rpx;\n}\n"
  },
  {
    "path": "demo/pages/Footer/index.ts",
    "content": "Page({\n  data: {\n    links1: [\n      {\n        key: 'alipay',\n        text: '支付宝',\n      },\n    ],\n    links2: [\n      {\n        key: 'alicloud',\n        text: '阿里云',\n      },\n      {\n        key: 'alipay',\n        text: '支付宝',\n      },\n    ],\n    chips: [\n      {\n        key: 'jiebei',\n        text: '蚂蚁借呗',\n      },\n      {\n        key: 'beiyongjin',\n        text: '备用金',\n      },\n      {\n        key: 'huabei',\n        text: '花呗收钱',\n        disabled: true,\n      },\n    ],\n  },\n\n  handleLinkTap(item) {\n    if (item.disabled) return;\n    /// #if ALIPAY\n    if (item.disabled) return;\n    my.showToast({ content: item.key });\n    /// #endif\n    /// #if WECHAT\n    if (item.detail.disabled) return;\n    // @ts-ignore\n    wx.showToast({\n      title: item.detail.key,\n    });\n    /// #endif\n  },\n  handleChipTap(item) {\n    /// #if ALIPAY\n    if (item.disabled) return;\n    my.showToast({ content: item.key });\n    /// #endif\n    /// #if WECHAT\n    if (item.detail.disabled) return;\n    // @ts-ignore\n    wx.showToast({\n      title: item.detail.key,\n    });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/Form/FormBasic/city.ts",
    "content": "export default [\n  {\n    label: '北京',\n    children: [\n      {\n        label: '北京',\n        value: '110',\n      },\n    ],\n    value: '11',\n  },\n  {\n    label: '河北',\n    children: [\n      {\n        label: '石家庄',\n        value: '188',\n      },\n      {\n        label: '唐山',\n        value: '181',\n      },\n      {\n        label: '秦皇岛',\n        value: '182',\n      },\n      {\n        label: '邯郸',\n        value: '186',\n      },\n      {\n        label: '邢台',\n        value: '185',\n      },\n      {\n        label: '保定',\n        value: '187',\n      },\n      {\n        label: '张家口',\n        value: '184',\n      },\n      {\n        label: '承德',\n        value: '189',\n      },\n      {\n        label: '廊坊',\n        value: '183',\n      },\n      {\n        label: '沧州',\n        value: '180',\n      },\n      {\n        label: '衡水',\n        value: '720',\n      },\n      {\n        label: '雄安',\n        value: '782',\n      },\n    ],\n    value: '18',\n  },\n  {\n    label: '福建',\n    children: [\n      {\n        label: '福州',\n        value: '380',\n      },\n      {\n        label: '厦门',\n        value: '390',\n      },\n      {\n        label: '泉州',\n        value: '480',\n      },\n      {\n        label: '漳州',\n        value: '395',\n      },\n      {\n        label: '宁德',\n        value: '386',\n      },\n      {\n        label: '莆田',\n        value: '385',\n      },\n      {\n        label: '南平',\n        value: '387',\n      },\n      {\n        label: '三明',\n        value: '389',\n      },\n      {\n        label: '龙岩',\n        value: '384',\n      },\n    ],\n    value: '38',\n  },\n  {\n    label: '江西',\n    children: [\n      {\n        label: '南昌',\n        value: '750',\n      },\n      {\n        label: '九江',\n        value: '755',\n      },\n      {\n        label: '上饶',\n        value: '757',\n      },\n      {\n        label: '抚州',\n        value: '759',\n      },\n      {\n        label: '宜春',\n        value: '756',\n      },\n      {\n        label: '吉安',\n        value: '751',\n      },\n      {\n        label: '赣州',\n        value: '752',\n      },\n      {\n        label: '景德镇',\n        value: '740',\n      },\n      {\n        label: '萍乡',\n        value: '758',\n      },\n      {\n        label: '新余',\n        value: '753',\n      },\n      {\n        label: '鹰潭',\n        value: '754',\n      },\n    ],\n    value: '75',\n  },\n  {\n    label: '山东',\n    children: [\n      {\n        label: '济南',\n        value: '170',\n      },\n      {\n        label: '青岛',\n        value: '166',\n      },\n      {\n        label: '淄博',\n        value: '150',\n      },\n      {\n        label: '枣庄',\n        value: '157',\n      },\n      {\n        label: '东营',\n        value: '156',\n      },\n      {\n        label: '烟台',\n        value: '161',\n      },\n      {\n        label: '潍坊',\n        value: '155',\n      },\n      {\n        label: '济宁',\n        value: '158',\n      },\n      {\n        label: '泰安',\n        value: '172',\n      },\n      {\n        label: '威海',\n        value: '152',\n      },\n      {\n        label: '日照',\n        value: '154',\n      },\n      {\n        label: '莱芜',\n        value: '160',\n      },\n      {\n        label: '临沂',\n        value: '153',\n      },\n      {\n        label: '德州',\n        value: '173',\n      },\n      {\n        label: '聊城',\n        value: '174',\n      },\n      {\n        label: '滨州',\n        value: '151',\n      },\n      {\n        label: '菏泽',\n        value: '159',\n      },\n    ],\n    value: '17',\n  },\n  {\n    label: '河南',\n    children: [\n      {\n        label: '郑州',\n        value: '760',\n      },\n      {\n        label: '洛阳',\n        value: '761',\n      },\n      {\n        label: '开封',\n        value: '762',\n      },\n      {\n        label: '焦作',\n        value: '763',\n      },\n      {\n        label: '新乡',\n        value: '764',\n      },\n      {\n        label: '许昌',\n        value: '765',\n      },\n      {\n        label: '漯河',\n        value: '766',\n      },\n      {\n        label: '安阳',\n        value: '767',\n      },\n      {\n        label: '商丘',\n        value: '768',\n      },\n      {\n        label: '平顶山',\n        value: '769',\n      },\n      {\n        label: '周口',\n        value: '770',\n      },\n      {\n        label: '驻马店',\n        value: '771',\n      },\n      {\n        label: '三门峡',\n        value: '772',\n      },\n      {\n        label: '濮阳',\n        value: '773',\n      },\n      {\n        label: '鹤壁',\n        value: '774',\n      },\n      {\n        label: '济源',\n        value: '775',\n      },\n      {\n        label: '信阳',\n        value: '776',\n      },\n      {\n        label: '南阳',\n        value: '777',\n      },\n    ],\n    value: '76',\n  },\n  {\n    label: '湖北',\n    children: [\n      {\n        label: '武汉',\n        value: '710',\n      },\n      {\n        label: '宜昌',\n        value: '711',\n      },\n      {\n        label: '荆州',\n        value: '712',\n      },\n      {\n        label: '黄冈',\n        value: '714',\n      },\n      {\n        label: '黄石',\n        value: '715',\n      },\n      {\n        label: '襄阳',\n        value: '716',\n      },\n      {\n        label: '孝感',\n        value: '717',\n      },\n      {\n        label: '鄂州',\n        value: '718',\n      },\n      {\n        label: '咸宁',\n        value: '719',\n      },\n      {\n        label: '十堰',\n        value: '721',\n      },\n      {\n        label: '随州',\n        value: '723',\n      },\n      {\n        label: '荆门',\n        value: '724',\n      },\n      {\n        label: '仙桃/潜江/天门',\n        value: '713',\n      },\n      {\n        label: '恩施',\n        value: '727',\n      },\n    ],\n    value: '71',\n  },\n  {\n    label: '湖南',\n    children: [\n      {\n        label: '长沙',\n        value: '741',\n      },\n      {\n        label: '衡阳',\n        value: '744',\n      },\n      {\n        label: '株洲',\n        value: '742',\n      },\n      {\n        label: '湘潭',\n        value: '743',\n      },\n      {\n        label: '岳阳',\n        value: '745',\n      },\n      {\n        label: '邵阳',\n        value: '792',\n      },\n      {\n        label: '郴州',\n        value: '748',\n      },\n      {\n        label: '常德',\n        value: '749',\n      },\n      {\n        label: '益阳',\n        value: '747',\n      },\n      {\n        label: '怀化',\n        value: '795',\n      },\n      {\n        label: '永州',\n        value: '796',\n      },\n      {\n        label: '娄底',\n        value: '791',\n      },\n      {\n        label: '湘西',\n        value: '793',\n      },\n      {\n        label: '张家界',\n        value: '794',\n      },\n    ],\n    value: '74',\n  },\n  {\n    label: '广东',\n    children: [\n      {\n        label: '广州',\n        value: '510',\n      },\n      {\n        label: '深圳',\n        value: '540',\n      },\n      {\n        label: '东莞',\n        value: '580',\n      },\n      {\n        label: '佛山',\n        value: '530',\n      },\n      {\n        label: '惠州',\n        value: '570',\n      },\n      {\n        label: '珠海',\n        value: '620',\n      },\n      {\n        label: '中山',\n        value: '556',\n      },\n      {\n        label: '江门',\n        value: '550',\n      },\n      {\n        label: '汕头',\n        value: '560',\n      },\n      {\n        label: '湛江',\n        value: '520',\n      },\n      {\n        label: '揭阳',\n        value: '526',\n      },\n      {\n        label: '肇庆',\n        value: '536',\n      },\n      {\n        label: '清远',\n        value: '535',\n      },\n      {\n        label: '韶关',\n        value: '558',\n      },\n      {\n        label: '潮州',\n        value: '531',\n      },\n      {\n        label: '茂名',\n        value: '568',\n      },\n      {\n        label: '河源',\n        value: '670',\n      },\n      {\n        label: '汕尾',\n        value: '525',\n      },\n      {\n        label: '阳江',\n        value: '565',\n      },\n      {\n        label: '梅州',\n        value: '528',\n      },\n      {\n        label: '云浮',\n        value: '538',\n      },\n    ],\n    value: '51',\n  },\n  {\n    label: '广西',\n    children: [\n      {\n        label: '南宁',\n        value: '591',\n      },\n      {\n        label: '柳州',\n        value: '593',\n      },\n      {\n        label: '桂林',\n        value: '592',\n      },\n      {\n        label: '梧州',\n        value: '594',\n      },\n      {\n        label: '玉林',\n        value: '595',\n      },\n      {\n        label: '百色',\n        value: '596',\n      },\n      {\n        label: '钦州',\n        value: '597',\n      },\n      {\n        label: '河池',\n        value: '598',\n      },\n      {\n        label: '北海',\n        value: '599',\n      },\n      {\n        label: '防城港',\n        value: '590',\n      },\n      {\n        label: '贵港',\n        value: '589',\n      },\n      {\n        label: '贺州',\n        value: '588',\n      },\n      {\n        label: '崇左',\n        value: '600',\n      },\n      {\n        label: '来宾',\n        value: '601',\n      },\n    ],\n    value: '59',\n  },\n  {\n    label: '天津',\n    children: [\n      {\n        label: '天津',\n        value: '130',\n      },\n    ],\n    value: '13',\n  },\n  {\n    label: '海南',\n    children: [\n      {\n        label: '海口',\n        value: '501',\n      },\n    ],\n    value: '50',\n  },\n  {\n    label: '重庆',\n    children: [\n      {\n        label: '重庆',\n        value: '831',\n      },\n    ],\n    value: '83',\n  },\n  {\n    label: '四川',\n    children: [\n      {\n        label: '成都',\n        value: '810',\n      },\n      {\n        label: '自贡',\n        value: '818',\n      },\n      {\n        label: '雅安',\n        value: '811',\n      },\n      {\n        label: '绵阳',\n        value: '824',\n      },\n      {\n        label: '乐山',\n        value: '814',\n      },\n      {\n        label: '德阳',\n        value: '825',\n      },\n      {\n        label: '攀枝花',\n        value: '813',\n      },\n      {\n        label: '宜宾',\n        value: '817',\n      },\n      {\n        label: '阿坝',\n        value: '829',\n      },\n      {\n        label: '内江',\n        value: '816',\n      },\n      {\n        label: '眉山',\n        value: '819',\n      },\n      {\n        label: '资阳',\n        value: '830',\n      },\n      {\n        label: '泸州',\n        value: '815',\n      },\n      {\n        label: '南充',\n        value: '822',\n      },\n      {\n        label: '达州',\n        value: '820',\n      },\n      {\n        label: '遂宁',\n        value: '821',\n      },\n      {\n        label: '广元',\n        value: '826',\n      },\n      {\n        label: '广安',\n        value: '823',\n      },\n      {\n        label: '巴中',\n        value: '827',\n      },\n      {\n        label: '凉山',\n        value: '812',\n      },\n      {\n        label: '甘孜',\n        value: '828',\n      },\n    ],\n    value: '81',\n  },\n  {\n    label: '山西',\n    children: [\n      {\n        label: '太原',\n        value: '190',\n      },\n      {\n        label: '大同',\n        value: '193',\n      },\n      {\n        label: '阳泉',\n        value: '192',\n      },\n      {\n        label: '长治',\n        value: '195',\n      },\n      {\n        label: '晋城',\n        value: '194',\n      },\n      {\n        label: '朔州',\n        value: '199',\n      },\n      {\n        label: '忻州',\n        value: '198',\n      },\n      {\n        label: '晋中',\n        value: '191',\n      },\n      {\n        label: '吕梁',\n        value: '200',\n      },\n      {\n        label: '临汾',\n        value: '197',\n      },\n      {\n        label: '运城',\n        value: '196',\n      },\n    ],\n    value: '19',\n  },\n  {\n    label: '贵州',\n    children: [\n      {\n        label: '贵阳',\n        value: '850',\n      },\n      {\n        label: '遵义',\n        value: '787',\n      },\n      {\n        label: '安顺',\n        value: '789',\n      },\n      {\n        label: '黔南',\n        value: '788',\n      },\n      {\n        label: '黔东南',\n        value: '786',\n      },\n      {\n        label: '铜仁',\n        value: '785',\n      },\n      {\n        label: '毕节',\n        value: '851',\n      },\n      {\n        label: '六盘水',\n        value: '853',\n      },\n      {\n        label: '黔西南',\n        value: '852',\n      },\n    ],\n    value: '85',\n  },\n  {\n    label: '云南',\n    children: [\n      {\n        label: '昆明',\n        value: '860',\n      },\n      {\n        label: '德宏',\n        value: '730',\n      },\n      {\n        label: '保山',\n        value: '731',\n      },\n      {\n        label: '文山',\n        value: '732',\n      },\n      {\n        label: '临沧',\n        value: '733',\n      },\n      {\n        label: '怒江',\n        value: '734',\n      },\n      {\n        label: '迪庆',\n        value: '735',\n      },\n      {\n        label: '西双版纳',\n        value: '736',\n      },\n      {\n        label: '红河',\n        value: '861',\n      },\n      {\n        label: '大理',\n        value: '862',\n      },\n      {\n        label: '丽江',\n        value: '863',\n      },\n      {\n        label: '楚雄',\n        value: '864',\n      },\n      {\n        label: '玉溪',\n        value: '865',\n      },\n      {\n        label: '曲靖',\n        value: '866',\n      },\n      {\n        label: '昭通',\n        value: '867',\n      },\n      {\n        label: '普洱',\n        value: '869',\n      },\n    ],\n    value: '86',\n  },\n  {\n    label: '西藏',\n    children: [\n      {\n        label: '拉萨',\n        value: '790',\n      },\n      {\n        label: '日喀则',\n        value: '797',\n      },\n      {\n        label: '山南',\n        value: '798',\n      },\n      {\n        label: '林芝',\n        value: '799',\n      },\n      {\n        label: '昌都',\n        value: '800',\n      },\n      {\n        label: '那曲',\n        value: '801',\n      },\n      {\n        label: '阿里',\n        value: '802',\n      },\n    ],\n    value: '79',\n  },\n  {\n    label: '陕西',\n    children: [\n      {\n        label: '西安',\n        value: '841',\n      },\n      {\n        label: '咸阳',\n        value: '844',\n      },\n      {\n        label: '渭南',\n        value: '843',\n      },\n      {\n        label: '宝鸡',\n        value: '840',\n      },\n      {\n        label: '汉中',\n        value: '849',\n      },\n      {\n        label: '延安',\n        value: '842',\n      },\n      {\n        label: '榆林',\n        value: '845',\n      },\n      {\n        label: '铜川',\n        value: '846',\n      },\n      {\n        label: '安康',\n        value: '848',\n      },\n      {\n        label: '商洛',\n        value: '847',\n      },\n    ],\n    value: '84',\n  },\n  {\n    label: '甘肃',\n    children: [\n      {\n        label: '兰州',\n        value: '870',\n      },\n      {\n        label: '酒泉',\n        value: '931',\n      },\n      {\n        label: '庆阳',\n        value: '873',\n      },\n      {\n        label: '天水',\n        value: '877',\n      },\n      {\n        label: '武威',\n        value: '874',\n      },\n      {\n        label: '临夏',\n        value: '878',\n      },\n      {\n        label: '白银',\n        value: '879',\n      },\n      {\n        label: '定西',\n        value: '871',\n      },\n      {\n        label: '平凉',\n        value: '872',\n      },\n      {\n        label: '陇南',\n        value: '960',\n      },\n      {\n        label: '张掖',\n        value: '875',\n      },\n      {\n        label: '嘉峪关',\n        value: '876',\n      },\n      {\n        label: '金昌',\n        value: '930',\n      },\n      {\n        label: '甘南',\n        value: '961',\n      },\n    ],\n    value: '87',\n  },\n  {\n    label: '青海',\n    children: [\n      {\n        label: '西宁',\n        value: '700',\n      },\n      {\n        label: '海东',\n        value: '701',\n      },\n      {\n        label: '格尔木',\n        value: '702',\n      },\n      {\n        label: '海西',\n        value: '704',\n      },\n      {\n        label: '海北',\n        value: '706',\n      },\n      {\n        label: '海南',\n        value: '705',\n      },\n      {\n        label: '黄南',\n        value: '707',\n      },\n      {\n        label: '果洛',\n        value: '708',\n      },\n      {\n        label: '玉树',\n        value: '709',\n      },\n    ],\n    value: '70',\n  },\n  {\n    label: '宁夏',\n    children: [\n      {\n        label: '银川',\n        value: '880',\n      },\n      {\n        label: '石嘴山',\n        value: '884',\n      },\n      {\n        label: '吴忠',\n        value: '883',\n      },\n      {\n        label: '固原',\n        value: '885',\n      },\n      {\n        label: '中卫',\n        value: '886',\n      },\n    ],\n    value: '88',\n  },\n  {\n    label: '新疆',\n    children: [\n      {\n        label: '乌鲁木齐',\n        value: '890',\n      },\n      {\n        label: '昌吉',\n        value: '891',\n      },\n      {\n        label: '石河子',\n        value: '893',\n      },\n      {\n        label: '奎屯',\n        value: '892',\n      },\n      {\n        label: '塔城',\n        value: '952',\n      },\n      {\n        label: '克拉玛依',\n        value: '899',\n      },\n      {\n        label: '伊犁',\n        value: '898',\n      },\n      {\n        label: '博乐',\n        value: '951',\n      },\n      {\n        label: '阿勒泰',\n        value: '953',\n      },\n      {\n        label: '吐鲁番',\n        value: '894',\n      },\n      {\n        label: '哈密',\n        value: '900',\n      },\n      {\n        label: '巴音郭楞',\n        value: '895',\n      },\n      {\n        label: '阿克苏',\n        value: '896',\n      },\n      {\n        label: '喀什',\n        value: '897',\n      },\n      {\n        label: '和田',\n        value: '955',\n      },\n      {\n        label: '克孜勒苏',\n        value: '954',\n      },\n    ],\n    value: '89',\n  },\n  {\n    label: '内蒙古',\n    children: [\n      {\n        label: '呼和浩特',\n        value: '101',\n      },\n      {\n        label: '包头',\n        value: '102',\n      },\n      {\n        label: '乌海',\n        value: '106',\n      },\n      {\n        label: '赤峰',\n        value: '107',\n      },\n      {\n        label: '呼伦贝尔',\n        value: '108',\n      },\n      {\n        label: '兴安盟',\n        value: '113',\n      },\n      {\n        label: '通辽',\n        value: '109',\n      },\n      {\n        label: '乌兰察布',\n        value: '103',\n      },\n      {\n        label: '巴彦淖尔',\n        value: '105',\n      },\n      {\n        label: '阿拉善盟',\n        value: '114',\n      },\n      {\n        label: '鄂尔多斯',\n        value: '104',\n      },\n      {\n        label: '锡林郭勒盟',\n        value: '111',\n      },\n    ],\n    value: '10',\n  },\n  {\n    label: '辽宁',\n    children: [\n      {\n        label: '沈阳',\n        value: '910',\n      },\n      {\n        label: '大连',\n        value: '940',\n      },\n      {\n        label: '鞍山',\n        value: '912',\n      },\n      {\n        label: '抚顺',\n        value: '913',\n      },\n      {\n        label: '本溪',\n        value: '914',\n      },\n      {\n        label: '丹东',\n        value: '915',\n      },\n      {\n        label: '锦州',\n        value: '916',\n      },\n      {\n        label: '营口',\n        value: '917',\n      },\n      {\n        label: '阜新',\n        value: '918',\n      },\n      {\n        label: '辽阳',\n        value: '919',\n      },\n      {\n        label: '铁岭',\n        value: '911',\n      },\n      {\n        label: '朝阳',\n        value: '920',\n      },\n      {\n        label: '盘锦',\n        value: '921',\n      },\n      {\n        label: '葫芦岛',\n        value: '922',\n      },\n    ],\n    value: '91',\n  },\n  {\n    label: '吉林',\n    children: [\n      {\n        label: '长春',\n        value: '901',\n      },\n      {\n        label: '吉林',\n        value: '902',\n      },\n      {\n        label: '延边',\n        value: '909',\n      },\n      {\n        label: '四平',\n        value: '903',\n      },\n      {\n        label: '通化',\n        value: '905',\n      },\n      {\n        label: '白城',\n        value: '907',\n      },\n      {\n        label: '辽源',\n        value: '906',\n      },\n      {\n        label: '松原',\n        value: '904',\n      },\n      {\n        label: '白山',\n        value: '908',\n      },\n    ],\n    value: '90',\n  },\n  {\n    label: '黑龙江',\n    children: [\n      {\n        label: '哈尔滨',\n        value: '971',\n      },\n      {\n        label: '齐齐哈尔',\n        value: '973',\n      },\n      {\n        label: '牡丹江',\n        value: '988',\n      },\n      {\n        label: '佳木斯',\n        value: '976',\n      },\n      {\n        label: '绥化',\n        value: '989',\n      },\n      {\n        label: '大庆',\n        value: '981',\n      },\n      {\n        label: '鸡西',\n        value: '991',\n      },\n      {\n        label: '黑河',\n        value: '990',\n      },\n      {\n        label: '伊春',\n        value: '996',\n      },\n      {\n        label: '双鸭山',\n        value: '994',\n      },\n      {\n        label: '鹤岗',\n        value: '993',\n      },\n      {\n        label: '七台河',\n        value: '992',\n      },\n      {\n        label: '大兴安岭',\n        value: '995',\n      },\n    ],\n    value: '97',\n  },\n  {\n    label: '上海',\n    children: [\n      {\n        label: '上海',\n        value: '310',\n      },\n    ],\n    value: '31',\n  },\n  {\n    label: '江苏',\n    children: [\n      {\n        label: '南京',\n        value: '340',\n      },\n      {\n        label: '苏州',\n        value: '450',\n      },\n      {\n        label: '无锡',\n        value: '330',\n      },\n      {\n        label: '常州',\n        value: '440',\n      },\n      {\n        label: '扬州',\n        value: '430',\n      },\n      {\n        label: '镇江',\n        value: '343',\n      },\n      {\n        label: '南通',\n        value: '358',\n      },\n      {\n        label: '徐州',\n        value: '350',\n      },\n      {\n        label: '泰州',\n        value: '445',\n      },\n      {\n        label: '盐城',\n        value: '348',\n      },\n      {\n        label: '淮安',\n        value: '354',\n      },\n      {\n        label: '连云港',\n        value: '346',\n      },\n      {\n        label: '宿迁',\n        value: '349',\n      },\n    ],\n    value: '34',\n  },\n  {\n    label: '浙江',\n    children: [\n      {\n        label: '杭州',\n        value: '360',\n      },\n      {\n        label: '宁波',\n        value: '370',\n      },\n      {\n        label: '温州',\n        value: '470',\n      },\n      {\n        label: '台州',\n        value: '476',\n      },\n      {\n        label: '金华',\n        value: '367',\n      },\n      {\n        label: '嘉兴',\n        value: '363',\n      },\n      {\n        label: '绍兴',\n        value: '365',\n      },\n      {\n        label: '湖州',\n        value: '362',\n      },\n      {\n        label: '丽水',\n        value: '469',\n      },\n      {\n        label: '衢州',\n        value: '468',\n      },\n      {\n        label: '舟山',\n        value: '364',\n      },\n    ],\n    value: '36',\n  },\n  {\n    label: '安徽',\n    children: [\n      {\n        label: '合肥',\n        value: '305',\n      },\n      {\n        label: '安庆',\n        value: '302',\n      },\n      {\n        label: '蚌埠',\n        value: '301',\n      },\n      {\n        label: '亳州',\n        value: '318',\n      },\n      {\n        label: '池州',\n        value: '317',\n      },\n      {\n        label: '滁州',\n        value: '312',\n      },\n      {\n        label: '阜阳',\n        value: '306',\n      },\n      {\n        label: '淮北',\n        value: '314',\n      },\n      {\n        label: '淮南',\n        value: '307',\n      },\n      {\n        label: '黄山',\n        value: '316',\n      },\n      {\n        label: '六安',\n        value: '304',\n      },\n      {\n        label: '马鞍山',\n        value: '300',\n      },\n      {\n        label: '宿州',\n        value: '313',\n      },\n      {\n        label: '铜陵',\n        value: '308',\n      },\n      {\n        label: '芜湖',\n        value: '303',\n      },\n      {\n        label: '宣城',\n        value: '311',\n      },\n    ],\n    value: '30',\n  },\n];\n"
  },
  {
    "path": "demo/pages/Form/FormBasic/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<form-input\n  label=\"账号\"\n  name=\"account\"\n  placeholder=\"请输入账号\"\n  allowClear\n  ref=\"handleRef\">\n  <view slot=\"tooltip\">\n    <ant-icon\n      onTap=\"showToast\"\n      type=\"QuestionCircleOutline\" />\n  </view>\n</form-input>\n<form-input\n  label=\"密码\"\n  name=\"password\"\n  placeholder=\"请输入密码\"\n  tooltip=\"密码说明\"\n  allowClear\n  ref=\"handleRef\">\n</form-input>\n<form-input label=\"数字\" name=\"number\" type=\"number\" max=\"{{100}}\" min=\"{{20}}\" precision=\"{{2}}\" ref=\"handleRef\" />\n<form-input\n  label=\"地址\"\n  name=\"address\"\n  placeholder=\"请输入地址\"\n  allowClear\n  ref=\"handleRef\" />\n<form-switch\n  label=\"选择\"\n  name=\"needDelivery\"\n  ref=\"handleRef\" />\n<form-stepper\n  label=\"数量\"\n  name=\"quantity\"\n  ref=\"handleRef\" />\n<form-picker\n  label=\"水果\"\n  arrow\n  name=\"fruit\"\n  options=\"{{ fruitList }}\"\n  ref=\"handleRef\" />\n<form-date-picker\n  label=\"出生日期\"\n  arrow\n  name=\"birthday\"\n  ref=\"handleRef\" />\n<form-range-picker\n  label=\"时间范围\"\n  arrow\n  name=\"range\"\n  ref=\"handleRef\" />\n<form-cascader-picker\n  label=\"城市\"\n  arrow\n  options=\"{{ cityList }}\"\n  name=\"city\"\n  tooltip=\"选择城市\"\n  placeholder=\"请输入城市\"\n  ref=\"handleRef\" />\n<form-radio-group\n  label=\"动物单选\"\n  name=\"animalChoose\"\n  color=\"red\"\n  options=\"{{ radioGroupOptions }}\"\n  ref=\"handleRef\" />\n<form-checkbox-group\n  label=\"蔬菜多选\"\n  name=\"fruitChoose\"\n  options=\"{{ checkboxGroupOptions }}\"\n  ref=\"handleRef\" />\n<form-selector\n  label=\"喜好\"\n  name=\"likeChoose\"\n  options=\"{{ selectorOptions }}\"\n  ref=\"handleRef\" />\n<form-slider\n  label=\"选择分数\"\n  name=\"slider\"\n  showTooltip\n  ref=\"handleRef\" />\n<form-upload-image\n  label=\"图片\"\n  name=\"image\"\n  onUpload=\"{{ onUpload ? onUpload : 'onUpload' }}\"\n  ref=\"handleRef\" />\n<form-textarea\n  label=\"说明\"\n  name=\"description\"\n  placeholder=\"请输入说明\"\n  allowClear\n  autoHeight\n  ref=\"handleRef\" />\n<form-rate\n  label=\"评分\"\n  name=\"rate\"\n  ref=\"handleRef\" />\n<view class=\"buttons\">\n  <ant-button\n    type=\"primary\"\n    onTap=\"submit\"\n    style=\"margin-bottom: 12px\">\n    提交\n  </ant-button>\n  <ant-button\n    onTap=\"reset\"\n    style=\"margin-bottom: 12px\"\n    >重置\n  </ant-button>\n  <ant-button onTap=\"update\">更新</ant-button>\n</view>\n<ant-toast\n  content=\"账号的自定义 tooltip\"\n  visible=\"{{ toastShow }}\"\n  onClose=\"handleCloseToast\" />\n"
  },
  {
    "path": "demo/pages/Form/FormBasic/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Form\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Form\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"form-input\": \"../../../../src/Form/FormInput/index\",\n    \"form-switch\": \"../../../../src/Form/FormSwitch/index\",\n    \"form-stepper\": \"../../../../src/Form/FormStepper/index\",\n    \"form-picker\": \"../../../../src/Form/FormPicker/index\",\n    \"form-date-picker\": \"../../../../src/Form/FormDatePicker/index\",\n    \"form-range-picker\": \"../../../../src/Form/FormRangePicker/index\",\n    \"form-cascader-picker\": \"../../../../src/Form/FormCascaderPicker/index\",\n    \"form-checkbox-group\": \"../../../../src/Form/FormCheckboxGroup/index\",\n    \"form-radio-group\": \"../../../../src/Form/FormRadioGroup/index\",\n    \"form-slider\": \"../../../../src/Form/FormSlider/index\",\n    \"form-selector\": \"../../../../src/Form/FormSelector/index\",\n    \"form-upload-image\": \"../../../../src/Form/FormImageUpload/index\",\n    \"form-rate\": \"../../../../src/Form/FormRate/index\",\n    \"form-textarea\": \"../../../../src/Form/FormTextarea/index\",\n    \"ant-button\": \"../../../../src/Button/index\",\n    \"ant-icon\": \"../../../../src/Icon/index\",\n    \"ant-toast\": \"../../../../src/Toast/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Form/FormBasic/index.less",
    "content": ".buttons {\n  background: var(--color-card);\n  padding: 12px 12px 48px 12px;\n}\n\ntextarea {\n  min-height: 100px;\n}\n"
  },
  {
    "path": "demo/pages/Form/FormBasic/index.ts",
    "content": "import { Form } from '../../../../src/Form/form';\nimport cityList from './city';\n\nPage({\n  data: {\n    /// #if WECHAT\n    onUpload(localFile) {\n      return new Promise((resolve) => {\n        console.log('上传的图片为：', localFile);\n        setTimeout(() => {\n          resolve(\n            'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ'\n          );\n        }, 2000);\n      });\n    },\n    /// #endif\n    fruitList: ['苹果', '香蕉', '橘子', '西瓜'],\n    cityList,\n    radioGroupOptions: [\n      { value: 'cat', label: '🐱' },\n      { value: 'fox', label: '🦊' },\n    ],\n    checkboxGroupOptions: [\n      { value: 'tomato', label: '🍅' },\n      { value: 'potato', label: '🥔' },\n      { value: 'eggplant', label: '🍆' },\n    ],\n    selectorOptions: [\n      { value: 'basketball', text: '🏀' },\n      { value: 'football', text: '⚽️' },\n      { value: 'badminton', text: '🏸️' },\n    ],\n    toastShow: false,\n  },\n  onLoad() {\n    this.form = new Form({\n      initialValues: { user: { account: 'andy', phone: '10000' } },\n      rules: {\n        account: [\n          {\n            required: true,\n            message: '请输入账号',\n          },\n          () => ({\n            // 一定需要时异步函数，返回Promise对象\n            validator: async (_, value) => {\n              if (value.length < 6) {\n                throw new Error('请输入至少6位');\n              }\n            },\n          }),\n        ],\n      },\n    });\n    this.form.onValueChange('user.account', (value, allValues) => {\n      const validates = this.form.getFieldsValidatorStatus();\n      console.log('onValueChange:', value, allValues, validates);\n    });\n    this.form.onValuesChange((value, allValues) => {\n      const validates = this.form.getFieldsValidatorStatus();\n      console.log('onValuesChange:', value, allValues, validates);\n    });\n    /// #if WECHAT\n    if (this.formRefList) {\n      this.formRefList.forEach((ref) => {\n        this.form.addItem(ref);\n      });\n    }\n    /// #endif\n  },\n  handleRef(ref) {\n    /// #if ALIPAY\n    this.form.addItem(ref);\n    /// #endif\n\n    /// #if WECHAT\n    if (!this.formRefList) {\n      this.formRefList = [];\n    }\n    this.formRefList.push(ref.detail);\n    /// #endif\n  },\n  reset() {\n    this.form.reset({ user: { phone: '10000' } });\n  },\n  update() {\n    this.form.setFieldsValue({\n      user: { account: 'pony', phone: '10086', password: '123456' },\n      address: '312312',\n      needDelivery: true,\n      quantity: 20,\n      fruit: '西瓜',\n      birthday: Date.now(),\n      range: [Date.now(), Date.now() + 86400000],\n      city: ['36', '360'],\n      animalChoose: 'fox',\n      fruitChoose: ['potato', 'eggplant'],\n      likeChoose: 'badminton',\n      slider: 44,\n      image: [\n        {\n          path: 'https://resource/apml3bc4f816b58586ab65e1b54980a10c87.jpg',\n          size: 2352941,\n          status: 'done',\n          uid: '201-1720155950249-1',\n          url: 'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ',\n        },\n      ],\n      description: '说明一下情况',\n      rate: 4,\n    });\n  },\n  async submit() {\n    const values = await this.form.submit();\n    /// #if ALIPAY\n    my.alert({\n      title: '提交',\n      content: JSON.stringify(values, null, 2),\n    });\n    /// #endif\n    console.log(values);\n  },\n  /// #if ALIPAY\n  onUpload(localFile) {\n    return new Promise((resolve) => {\n      console.log('上传的图片为：', localFile);\n      setTimeout(() => {\n        resolve(\n          'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ'\n        );\n      }, 2000);\n    });\n  },\n  /// #endif\n  showToast() {\n    this.setData({\n      toastShow: true,\n    });\n  },\n  handleCloseToast() {\n    this.setData({\n      toastShow: false,\n    });\n  },\n});\n"
  },
  {
    "path": "demo/pages/Form/FormCustom/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<form-input\n  label=\"用户名\"\n  name=\"account\"\n  required\n  message=\"需要输入用户名\"\n  placeholder=\"请输入用户名\"\n  position=\"vertical\"\n  inputClassName=\"input\"\n  ref=\"handleRef\" />\n\n<form-checklist\n  label=\"喜欢\"\n  name=\"like\"\n  required\n  message=\"需要选择\"\n  options=\"{{ likeOptions }}\"\n  position=\"vertical\"\n  ref=\"handleRef\" />\n\n<form-location\n  label=\"位置\"\n  name=\"location\"\n  required\n  message=\"需要选择位置\"\n  position=\"vertical\"\n  ref=\"handleRef\" />\n\n<view class=\"buttons\">\n  <ant-button\n    type=\"primary\"\n    onTap=\"submit\"\n    className=\"button\">\n    提交\n  </ant-button>\n  <ant-button\n    onTap=\"reset\"\n    className=\"button\">\n    重置\n  </ant-button>\n</view>\n"
  },
  {
    "path": "demo/pages/Form/FormCustom/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Form\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Form\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"form-input\": \"../../../../src/Form/FormInput/index\",\n    \"form-checklist\": \"../../../components/Form/checklist\",\n    \"form-location\": \"../../../components/Form/location\",\n    \"ant-button\": \"../../../../src/Button/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Form/FormCustom/index.less",
    "content": ".buttons {\n  background: var(--color-card);\n  padding: 12px;\n}\n\n.button {\n  margin-bottom: 12px;\n}\n\n.input {\n  border: 1px solid var(--color-border);\n  padding: 4px;\n  border-radius: 4px;\n}\n"
  },
  {
    "path": "demo/pages/Form/FormCustom/index.ts",
    "content": "import { Form } from '../../../../src/Form/form';\n\n\nPage({\n  data: {\n    likeOptions: [\n      { value: 'basketball', title: '🏀' },\n      { value: 'football', title: '⚽️' },\n      { value: 'badminton', title: '🏸️' },\n    ],\n    chooseOptions: [\n      { value: '1', label: '1111' }\n    ]\n  },\n  form: new Form(),\n  handleRef(ref) {\n    this.form.addItem(ref);\n  },\n  reset() {\n    this.form.reset();\n  },\n  async submit() {\n    const values = await this.form.submit();\n    my.alert({\n      title: '提交',\n      content: JSON.stringify(values),\n    });\n  }\n});\n"
  },
  {
    "path": "demo/pages/Form/FormCustomError/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<!-- #if WECHAT -->\n<text>\n  由于微信小程序不支持 slot-scope=\"item\", 所以暂时不支持自定义 Error\n</text>\n<!-- #endif -->\n<ant-form-input\n  label=\"用户名\"\n  name=\"account\"\n  required\n  placeholder=\"请输入用户名\"\n  message=\"需要输入用户名\"\n  validateStatus=\"success\"\n  ref=\"handleRef\">\n  <view\n    slot=\"footer\"\n    slot-scope=\"item\">\n    <view\n      a:if=\"{{ item.status === 'error' }}\"\n      class=\"errors\">\n      <ant-icon\n        type=\"CloseCircleOutline\"\n        style=\"margin-right: 4px\" />\n      {{ item.errors }}\n    </view>\n  </view>\n</ant-form-input>\n\n<ant-form-input\n  label=\"地址\"\n  name=\"address\"\n  required\n  placeholder=\"请输入地址\"\n  message=\"需要输入地址\"\n  validateStatus=\"success\"\n  ref=\"handleRef\">\n  <view\n    slot=\"footer\"\n    slot-scope=\"item\">\n    <view\n      a:if=\"{{ item.status === 'error' }}\"\n      class=\"errors\">\n      <ant-icon\n        type=\"CloseCircleOutline\"\n        style=\"margin-right: 4px\" />\n      {{ item.errors }}\n    </view>\n  </view>\n</ant-form-input>\n\n<view class=\"buttons\">\n  <ant-button\n    type=\"primary\"\n    onTap=\"submit\"\n    style=\"margin-bottom: 12px\">\n    提交\n  </ant-button>\n  <ant-button\n    onTap=\"reset\"\n    style=\"margin-bottom: 12px\">\n    重置\n  </ant-button>\n</view>\n"
  },
  {
    "path": "demo/pages/Form/FormCustomError/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Form\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Form\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-form-input\": \"../../../../src/Form/FormInput/index\",\n    \"ant-icon\": \"../../../../src/Icon/index\",\n    \"ant-button\": \"../../../../src/Button/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Form/FormCustomError/index.less",
    "content": ".errors {\n  background: #fff3f4;\n  border: 1px solid rgba(255, 49, 65, 0.2);\n  border-radius: 8px;\n  color: #ff3141;\n  margin-top: 8px;\n  padding: 8px;\n}\n\n.buttons {\n  background: var(--color-card);\n  padding: 12px;\n}\n"
  },
  {
    "path": "demo/pages/Form/FormCustomError/index.ts",
    "content": "import { Form } from '../../../../src/Form/form';\n\nPage({\n  onLoad() {\n    this.form = new Form();\n    /// #if WECHAT\n    if (this.formRefList) {\n      this.formRefList.forEach((ref) => {\n        this.form.addItem(ref);\n      });\n    }\n    /// #endif\n  },\n  handleRef(ref) {\n    /// #if ALIPAY\n    this.form.addItem(ref);\n    /// #endif\n\n    /// #if WECHAT\n    if (!this.formRefList) {\n      this.formRefList = [];\n    }\n    this.formRefList.push(ref.detail);\n    /// #endif\n  },\n  reset() {\n    this.form.reset();\n  },\n  async submit() {\n    const values = await this.form.submit();\n    /// #if ALIPAY\n    my.alert({\n      title: '提交',\n      content: JSON.stringify(values),\n    });\n    /// #endif\n    console.log(values);\n  },\n});\n"
  },
  {
    "path": "demo/pages/Form/FormDependency/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<form-switch\n  label=\"需要水果\"\n  name=\"needFruit\"\n  onChange=\"onChange\"\n  ref=\"handleRef\" />\n\n<view a:if=\"{{ needFruit }}\">\n  <form-stepper\n    label=\"数量\"\n    name=\"quantity\"\n    ref=\"handleRef\" />\n  <form-input\n    label=\"收货地址\"\n    name=\"address\"\n    required\n    message=\"需要填写收货地址\"\n    ref=\"handleRef\" />\n</view>\n\n<view class=\"buttons\">\n  <ant-button\n    type=\"primary\"\n    onTap=\"submit\"\n    style=\"margin-bottom: 12px\">\n    提交\n  </ant-button>\n  <ant-button onTap=\"reset\">重置</ant-button>\n</view>\n"
  },
  {
    "path": "demo/pages/Form/FormDependency/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Form\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Form\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"form-input\": \"../../../../src/Form/FormInput/index\",\n    \"form-switch\": \"../../../../src/Form/FormSwitch/index\",\n    \"form-stepper\": \"../../../../src/Form/FormStepper/index\",\n    \"ant-button\": \"../../../../src/Button/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Form/FormDependency/index.less",
    "content": ".buttons {\n  background: var(--color-card);\n  padding: 12px;\n}\n"
  },
  {
    "path": "demo/pages/Form/FormDependency/index.ts",
    "content": "import { Form } from '../../../../src/Form/form';\n\nPage({\n  onLoad() {\n    this.form = new Form();\n    /// #if WECHAT\n    if (this.formRefList) {\n      this.formRefList.forEach((ref) => {\n        this.form.addItem(ref);\n      });\n    }\n    /// #endif\n  },\n  handleRef(ref) {\n    /// #if ALIPAY\n    this.form.addItem(ref);\n    /// #endif\n\n    /// #if WECHAT\n    if (this.form) {\n      this.form.addItem(ref.detail);\n    } else if (!this.formRefList) {\n      this.formRefList = [ref.detail];\n    } else {\n      this.formRefList.push(ref.detail);\n    }\n    /// #endif\n  },\n  data: {\n    needFruit: false,\n  },\n  onChange(value) {\n    /// #if ALIPAY\n    this.setData({\n      needFruit: value,\n    });\n    /// #endif\n\n    /// #if WECHAT\n    this.setData({\n      needFruit: value.detail,\n    });\n    /// #endif\n  },\n  reset() {\n    this.setData({\n      needFruit: false,\n    });\n    this.form.reset();\n  },\n  async submit() {\n    const values = await this.form.submit();\n    console.log(values);\n    /// #if ALIPAY\n    my.alert({\n      title: '提交',\n      content: JSON.stringify(values),\n    });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/Form/FormDynamic/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<block\n  a:for=\"{{ list }}\"\n  a:for-index=\"index\"\n  a:for-item=\"item\"\n  a:key=\"id\">\n  <ant-form-input\n    label=\"{{ list[index].id }}\"\n    name=\"account{{ list[index].id }}\"\n    required\n    message=\"需要输入用户名\"\n    ref=\"handleRef\">\n    <view\n      slot=\"extra\"\n      onTap=\"minus\"\n      data-index=\"{{ index }}\">\n      <ant-icon type=\"MinusCircleOutline\" />\n    </view>\n  </ant-form-input>\n</block>\n<view class=\"buttons\">\n  <ant-button\n    onTap=\"add\"\n    className=\"button\">\n    添加用户\n    <ant-icon type=\"AddCircleOutline\" />\n  </ant-button>\n  <ant-button\n    type=\"primary\"\n    onTap=\"submit\"\n    className=\"button\">\n    提交\n  </ant-button>\n  <ant-button\n    onTap=\"reset\"\n    className=\"button\">\n    重置\n  </ant-button>\n</view>\n"
  },
  {
    "path": "demo/pages/Form/FormDynamic/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Form\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Form\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-form-input\": \"../../../../src/Form/FormInput/index\",\n    \"ant-button\": \"../../../../src/Button/index\",\n    \"ant-icon\": \"../../../../src/Icon/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Form/FormDynamic/index.less",
    "content": ".buttons {\n  background: var(--color-card);\n  padding: 12px;\n}\n\n.button {\n  margin-bottom: 12px;\n}\n"
  },
  {
    "path": "demo/pages/Form/FormDynamic/index.ts",
    "content": "import { Form } from '../../../../src/Form/form';\n\nlet account = 1;\nPage({\n  data: {\n    list: [\n      {\n        id: `Account${account++}`,\n      },\n      {\n        id: `Account${account++}`,\n      },\n    ],\n  },\n  onLoad() {\n    this.form = new Form();\n    /// #if WECHAT\n    if (this.formRefList) {\n      this.formRefList.forEach((ref) => {\n        this.form.addItem(ref);\n      });\n    }\n    /// #endif\n  },\n  handleRef(ref) {\n    /// #if ALIPAY\n    this.form.addItem(ref);\n    /// #endif\n\n    /// #if WECHAT\n    if (this.form) {\n      this.form.addItem(ref.detail);\n    } else {\n      if (!this.formRefList) {\n        this.formRefList = [];\n      }\n      this.formRefList.push(ref.detail);\n    }\n    /// #endif\n  },\n  reset() {\n    this.form.reset();\n  },\n  add() {\n    this.setData({\n      list: [\n        ...this.data.list,\n        {\n          id: `Account${account++}`,\n        },\n      ],\n    });\n  },\n  minus(e) {\n    const { index } = e.currentTarget.dataset;\n    const list = [...this.data.list];\n    list.splice(index, 1);\n    this.setData({\n      list,\n    });\n  },\n  async submit() {\n    const values = await this.form.submit();\n    console.log(values);\n  },\n});\n"
  },
  {
    "path": "demo/pages/Form/FormImageUploadRules/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-form-input\n  label=\"用户名\"\n  name=\"username\"\n  ref=\"handleRef\" />\n<ant-form-image-upload\n  label=\"图片上传\"\n  name=\"imageList\"\n  onUpload=\"{{ onUpload ? onUpload : 'onUpload' }}\"\n  maxCount=\"{{ 3 }}\"\n  tooltip=\"需要上传3张图片\"\n  ref=\"handleRef\" />\n<view class=\"buttons\">\n  <ant-button\n    type=\"primary\"\n    onTap=\"submit\"\n    style=\"margin-bottom: 12px\">\n    提交\n  </ant-button>\n  <ant-button onTap=\"reset\">重置</ant-button>\n</view>\n"
  },
  {
    "path": "demo/pages/Form/FormImageUploadRules/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Form\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Form\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-form-input\": \"../../../../src/Form/FormInput/index\",\n    \"ant-form-image-upload\": \"../../../../src/Form/FormImageUpload/index\",\n    \"ant-button\": \"../../../../src/Button/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Form/FormImageUploadRules/index.less",
    "content": ".buttons {\n  background: var(--color-card);\n  padding: 12px;\n}\n"
  },
  {
    "path": "demo/pages/Form/FormImageUploadRules/index.ts",
    "content": "import { Form } from '../../../../src/Form/form';\n\nPage({\n  data: {\n    /// #if WECHAT\n    onUpload(localFile) {\n      return new Promise((resolve) => {\n        console.log('上传的图片为：', localFile);\n        setTimeout(() => {\n          resolve(\n            'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ'\n          );\n        }, 2000);\n      });\n    },\n    /// #endif\n  },\n  onLoad() {\n    this.form = new Form({\n      rules: {\n        imageList: [\n          {\n            required: true,\n            message: '需要上传图片',\n          },\n          () => ({\n            async validator(_, fileList = []) {\n              if (fileList.length !== 3) {\n                throw new Error('需要上传3张图片');\n              }\n              if (fileList.find((file) => file.status !== 'done')) {\n                throw new Error('图片需要上传完成');\n              }\n            },\n          }),\n        ],\n      },\n    });\n    /// #if WECHAT\n    if (this.formRefList) {\n      this.formRefList.forEach((ref) => {\n        this.form.addItem(ref);\n      });\n    }\n    /// #endif\n  },\n  handleRef(ref) {\n    /// #if ALIPAY\n    this.form.addItem(ref);\n    /// #endif\n\n    /// #if WECHAT\n    if (!this.formRefList) {\n      this.formRefList = [];\n    }\n    this.formRefList.push(ref.detail);\n    /// #endif\n  },\n  reset() {\n    this.form.reset();\n  },\n  async submit() {\n    const values = await this.form.submit();\n    console.log(values);\n    /// #if ALIPAY\n    my.alert({\n      title: '提交',\n      content: JSON.stringify(values),\n    });\n    /// #endif\n  },\n  /// #if ALIPAY\n  onUpload(localFile) {\n    return new Promise((resolve) => {\n      console.log('上传的图片为：', localFile);\n      setTimeout(() => {\n        resolve(\n          'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ'\n        );\n      }, 2000);\n    });\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "demo/pages/Form/FormInitialValues/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-form-input\n  label=\"用户名\"\n  name=\"account\"\n  tooltip=\"用户账户对应名称\"\n  allowClear\n  required\n  message=\"需要填写用户名\"\n  ref=\"handleRef\" />\n\n<ant-form-input\n  label=\"地址\"\n  name=\"address\"\n  allowClear\n  ref=\"handleRef\" />\n\n<ant-form-switch\n  label=\"选择\"\n  name=\"needDelivery\"\n  ref=\"handleRef\" />\n\n<ant-form-stepper\n  label=\"数量\"\n  name=\"quantity\"\n  ref=\"handleRef\" />\n\n<view class=\"buttons\">\n  <ant-button\n    type=\"primary\"\n    onTap=\"submit\"\n    style=\"margin-bottom: 12px\">\n    提交\n  </ant-button>\n  <ant-button onTap=\"reset\">重置</ant-button>\n</view>\n"
  },
  {
    "path": "demo/pages/Form/FormInitialValues/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Form\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Form\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-form-input\": \"../../../../src/Form/FormInput/index\",\n    \"ant-form-switch\": \"../../../../src/Form/FormSwitch/index\",\n    \"ant-form-stepper\": \"../../../../src/Form/FormStepper/index\",\n    \"ant-button\": \"../../../../src/Button/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Form/FormInitialValues/index.less",
    "content": ".buttons {\n  background: var(--color-card);\n  padding: 12px;\n}\n"
  },
  {
    "path": "demo/pages/Form/FormInitialValues/index.ts",
    "content": "import { Form } from '../../../../src/Form/form';\n\nPage({\n  onLoad() {\n    this.form = new Form({\n      initialValues: {\n        account: 'lily',\n        address: 'alipay',\n        needDelivery: true,\n        quantity: 1,\n      },\n    });\n    /// #if WECHAT\n    if (this.formRefList) {\n      this.formRefList.forEach((ref) => {\n        this.form.addItem(ref);\n      });\n    }\n    /// #endif\n  },\n  handleRef(ref) {\n    /// #if ALIPAY\n    this.form.addItem(ref);\n    /// #endif\n\n    /// #if WECHAT\n    if (!this.formRefList) {\n      this.formRefList = [];\n    }\n    this.formRefList.push(ref.detail);\n    /// #endif\n  },\n\n  reset() {\n    this.form.reset();\n  },\n  async submit() {\n    const values = await this.form.submit();\n    console.log(values);\n    /// #if ALIPAY\n    my.alert({\n      title: '提交',\n      content: JSON.stringify(values),\n    });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/Form/FormInitialValuesAsync/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-form-input\n  label=\"用户名\"\n  name=\"account\"\n  tooltip=\"用户账户对应名称\"\n  allowClear\n  required\n  message=\"需要填写用户名\"\n  ref=\"handleRef\" />\n\n<ant-form-input\n  label=\"地址\"\n  name=\"address\"\n  allowClear\n  ref=\"handleRef\" />\n\n<ant-form-switch\n  label=\"选择\"\n  name=\"needDelivery\"\n  ref=\"handleRef\" />\n\n<ant-form-stepper\n  label=\"数量\"\n  name=\"quantity\"\n  ref=\"handleRef\" />\n\n<view class=\"buttons\">\n  <ant-button\n    type=\"primary\"\n    onTap=\"submit\"\n    style=\"margin-bottom: 12px\">\n    提交\n  </ant-button>\n  <ant-button onTap=\"reset\">重置</ant-button>\n</view>\n"
  },
  {
    "path": "demo/pages/Form/FormInitialValuesAsync/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Form\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Form\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-form-input\": \"../../../../src/Form/FormInput/index\",\n    \"ant-form-switch\": \"../../../../src/Form/FormSwitch/index\",\n    \"ant-form-stepper\": \"../../../../src/Form/FormStepper/index\",\n    \"ant-button\": \"../../../../src/Button/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Form/FormInitialValuesAsync/index.less",
    "content": ".buttons {\n  background: var(--color-card);\n  padding: 12px;\n}\n"
  },
  {
    "path": "demo/pages/Form/FormInitialValuesAsync/index.ts",
    "content": "import { Form } from '../../../../src/Form/form';\n\nPage({\n  onLoad() {\n    this.form = new Form();\n    /// #if WECHAT\n    if (this.formRefList) {\n      this.formRefList.forEach((ref) => {\n        this.form.addItem(ref);\n      });\n    }\n    /// #endif\n\n    /// #if ALIPAY\n    my.showLoading({\n      content: '表单加载中...',\n    });\n    setTimeout(() => {\n      this.form.setInitialValues({\n        account: 'lily',\n        address: 'alipay',\n        needDelivery: true,\n        quantity: 1,\n      });\n      this.form.reset();\n      my.hideLoading();\n    }, 1000);\n    /// #endif\n\n    /// #if WECHAT\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    //@ts-ignore\n    wx.showLoading({\n      title: '加载中',\n    });\n    setTimeout(() => {\n      this.form.setInitialValues({\n        account: 'lily',\n        address: 'alipay',\n        needDelivery: true,\n        quantity: 1,\n      });\n      this.form.reset();\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      //@ts-ignore\n      wx.hideLoading();\n    }, 1000);\n    /// #endif\n  },\n  handleRef(ref) {\n    /// #if ALIPAY\n    this.form.addItem(ref);\n    /// #endif\n\n    /// #if WECHAT\n    if (!this.formRefList) {\n      this.formRefList = [];\n    }\n    this.formRefList.push(ref.detail);\n    /// #endif\n  },\n\n  reset() {\n    this.form.reset();\n  },\n  async submit() {\n    const values = await this.form.submit();\n    console.log(values);\n    /// #if ALIPAY\n    my.alert({\n      title: '提交',\n      content: JSON.stringify(values),\n    });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/Form/FormJSON/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<form-json\n  config=\"{{config}}\"\n  onSuccess=\"onSuccess\"\n  ref=\"handleFormJSONRef\">\n  <view\n    slot=\"custom-input\"\n    slot-scope=\"item\">\n    <form-input\n      label=\"{{item.value.label}}\"\n      name=\"{{item.value.name}}\"\n      required=\"{{item.value.required}}\"\n      placeholder=\"{{item.value.placeholder}}\"\n      message=\"{{item.value.message}}\"\n      ref=\"handleRef\" />\n  </view>\n  <view\n    slot=\"custom-switch\"\n    slot-scope=\"item\">\n    <form-switch\n      label=\"{{item.value.label}}\"\n      name=\"{{item.value.name}}\"\n      message=\"{{item.value.message}}\"\n      ref=\"handleRef\" />\n  </view>\n</form-json>\n"
  },
  {
    "path": "demo/pages/Form/FormJSON/index.json",
    "content": "{\n  \"defaultTitle\": \"Form\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  \"usingComponents\": {\n    \"form-json\": \"../../../components/Form/form-json/index\",\n    \"form-input\": \"../../../../src/Form/FormInput/index\",\n    \"form-switch\": \"../../../../src/Form/FormSwitch/index\"\n  },\n  \"styleIsolation\": \"shared\"\n}\n"
  },
  {
    "path": "demo/pages/Form/FormJSON/index.less",
    "content": ""
  },
  {
    "path": "demo/pages/Form/FormJSON/index.ts",
    "content": "Page({\n  data: {\n    config: {},\n  },\n  onLoad() {\n    this.setData({\n      config: {\n        formItems: [\n          {\n            type: 'input',\n            label: '用户名',\n            name: 'account',\n            placeholder: '请输入用户名',\n            required: true,\n            message: '提交需要有用户名',\n          },\n          {\n            type: 'input',\n            label: '地址',\n            name: 'address',\n            placeholder: '请输入地址',\n            required: true,\n            message: '提交需要有地址',\n          },\n          {\n            type: 'custom-input',\n            label: '水果',\n            name: 'fruit',\n            placeholder: '请输入数量',\n            required: true,\n            message: '提交需要有数量',\n          },\n          {\n            type: 'stepper',\n            label: '数量',\n            name: 'quantity',\n            placeholder: '请输入数量',\n            required: true,\n            message: '提交需要有数量',\n          },\n          {\n            type: 'custom-switch',\n            label: '需要小票',\n            name: 'choose',\n            required: true,\n            message: '提交需要有数量',\n          },\n        ],\n        initialValues: {\n          account: 'lily'\n        },\n        submit: {\n          text: '提交',\n          type: 'primary',\n          style: 'margin: 12px',\n        },\n        reset: {\n          text: '重置',\n          type: 'default',\n          style: 'margin: 12px',\n        },\n      },\n    });\n  },\n  formItems: [],\n  handleFormJSONRef(ref) {\n    this.formItems.forEach(formItem => {\n      ref.form.addItem(formItem);\n    });\n  },\n  handleRef(ref) {\n    this.formItems.push(ref);\n  },\n  onSuccess(values) {\n    my.alert({\n      title: '提交',\n      content: JSON.stringify(values, null, 2),\n    });\n    console.log(values);\n  },\n});\n"
  },
  {
    "path": "demo/pages/Form/FormLayout/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-form-input\n  label=\"用户名\"\n  name=\"account\"\n  required\n  position=\"{{ position }}\"\n  ref=\"handleRef\" />\n\n<ant-form-input\n  label=\"地址\"\n  name=\"address\"\n  position=\"{{ position }}\"\n  ref=\"handleRef\" />\n\n<form-picker\n  label=\"水果\"\n  arrow\n  name=\"fruit\"\n  options=\"{{ fruitList }}\"\n  position=\"{{ position }}\"\n  ref=\"handleRef\" />\n\n<ant-form-switch\n  label=\"选择\"\n  name=\"needDelivery\"\n  position=\"{{ position }}\"\n  ref=\"handleRef\" />\n\n<ant-form-stepper\n  label=\"数量\"\n  name=\"quantity\"\n  position=\"{{ position }}\"\n  ref=\"handleRef\" />\n\n<view class=\"buttons\">\n  <ant-button\n    type=\"primary\"\n    onTap=\"submit\"\n    className=\"button\">\n    提交\n  </ant-button>\n  <ant-button\n    onTap=\"reset\"\n    className=\"button\">\n    重置\n  </ant-button>\n  <ant-button\n    onTap=\"toggle\"\n    className=\"button\">\n    切换表单布局\n  </ant-button>\n</view>\n"
  },
  {
    "path": "demo/pages/Form/FormLayout/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Form\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Form\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-form-input\": \"../../../../src/Form/FormInput/index\",\n    \"ant-form-switch\": \"../../../../src/Form/FormSwitch/index\",\n    \"ant-form-stepper\": \"../../../../src/Form/FormStepper/index\",\n    \"ant-button\": \"../../../../src/Button/index\",\n    \"form-picker\": \"../../../../src/Form/FormPicker/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Form/FormLayout/index.less",
    "content": ".buttons {\n  background: var(--color-card);\n  padding: 12px;\n}\n\n.button {\n  margin-bottom: 12px;\n}\n"
  },
  {
    "path": "demo/pages/Form/FormLayout/index.ts",
    "content": "import { Form } from '../../../../src/Form/form';\n\nPage({\n  data: {\n    position: 'horizontal',\n    fruitList: ['苹果', '香蕉', '橘子', '西瓜'],\n  },\n  onLoad() {\n    this.form = new Form();\n    /// #if WECHAT\n    if (this.formRefList) {\n      this.formRefList.forEach((ref) => {\n        this.form.addItem(ref);\n      });\n    }\n    /// #endif\n  },\n  handleRef(ref) {\n    /// #if ALIPAY\n    this.form.addItem(ref);\n    /// #endif\n\n    /// #if WECHAT\n    if (!this.formRefList) {\n      this.formRefList = [];\n    }\n    this.formRefList.push(ref.detail);\n    /// #endif\n  },\n  reset() {\n    this.form.reset();\n  },\n  toggle() {\n    this.setData({\n      position: this.data.position === 'horizontal' ? 'vertical' : 'horizontal',\n    });\n  },\n  async submit() {\n    const values = await this.form.submit();\n    console.log(values);\n\n    /// #if ALIPAY\n    my.alert({\n      title: '提交',\n      content: JSON.stringify(values),\n    });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/Form/FormMultiple/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"表单1\">\n  <ant-form-input\n    label=\"用户名\"\n    name=\"account\"\n    allowClear\n    required\n    message=\"需要填写用户名\"\n    ref=\"handleRef\" />\n\n  <ant-form-input\n    label=\"地址\"\n    name=\"address\"\n    allowClear\n    ref=\"handleRef\" />\n\n  <view class=\"buttons\">\n    <ant-button\n      type=\"primary\"\n      onTap=\"submit\"\n      style=\"margin-bottom: 12px\">\n      提交\n    </ant-button>\n    <ant-button onTap=\"reset\">重置</ant-button>\n  </view>\n</ant-container>\n\n<ant-container title=\"表单2\">\n  <ant-form-input\n    label=\"用户名\"\n    name=\"account\"\n    allowClear\n    required\n    message=\"需要填写用户名\"\n    ref=\"handleRef2\" />\n\n  <ant-form-input\n    label=\"地址\"\n    name=\"address\"\n    allowClear\n    ref=\"handleRef2\" />\n\n  <view class=\"buttons\">\n    <ant-button\n      type=\"primary\"\n      onTap=\"submit2\"\n      style=\"margin-bottom: 12px\">\n      提交\n    </ant-button>\n    <ant-button onTap=\"reset2\">重置</ant-button>\n  </view>\n</ant-container>\n"
  },
  {
    "path": "demo/pages/Form/FormMultiple/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Form\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Form\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-form-input\": \"../../../../src/Form/FormInput/index\",\n    \"ant-container\": \"../../../../src/Container/index\",\n    \"ant-button\": \"../../../../src/Button/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Form/FormMultiple/index.less",
    "content": ".buttons {\n  background: var(--color-card);\n  padding: 12px;\n}\n"
  },
  {
    "path": "demo/pages/Form/FormMultiple/index.ts",
    "content": "import { Form } from '../../../../src/Form/form';\n\nPage({\n  onLoad() {\n    this.form = new Form();\n    this.form2 = new Form();\n\n    /// #if WECHAT\n    if (this.formRefList) {\n      this.formRefList.forEach((ref) => {\n        this.form.addItem(ref);\n      });\n    }\n    if (this.form2RefList) {\n      this.form2RefList.forEach((ref) => {\n        this.form2.addItem(ref);\n      });\n    }\n    /// #endif\n  },\n  handleRef(ref) {\n    /// #if ALIPAY\n    this.form.addItem(ref);\n    /// #endif\n\n    /// #if WECHAT\n    if (!this.formRefList) {\n      this.formRefList = [];\n    }\n    this.formRefList.push(ref.detail);\n    /// #endif\n  },\n  handleRef2(ref) {\n    /// #if ALIPAY\n    this.form2.addItem(ref);\n    /// #endif\n\n    /// #if WECHAT\n    if (!this.form2RefList) {\n      this.form2RefList = [];\n    }\n    this.form2RefList.push(ref.detail);\n    /// #endif\n  },\n  reset() {\n    this.form.reset();\n  },\n  reset2() {\n    this.form2.reset();\n  },\n  async submit() {\n    const values = await this.form.submit();\n    /// #if ALIPAY\n    my.alert({\n      title: '表单1提交',\n      content: JSON.stringify(values, null, 2),\n    });\n    /// #endif\n    console.log(values);\n  },\n  async submit2() {\n    const values = await this.form2.submit();\n    /// #if ALIPAY\n    my.alert({\n      title: '表单2提交',\n      content: JSON.stringify(values, null, 2),\n    });\n    /// #endif\n    console.log(values);\n  },\n});\n"
  },
  {
    "path": "demo/pages/Form/FormReadonly/city.ts",
    "content": "export default [\n  {\n    label: '北京',\n    children: [\n      {\n        label: '北京',\n        value: '110',\n      },\n    ],\n    value: '11',\n  },\n  {\n    label: '河北',\n    children: [\n      {\n        label: '石家庄',\n        value: '188',\n      },\n      {\n        label: '唐山',\n        value: '181',\n      },\n      {\n        label: '秦皇岛',\n        value: '182',\n      },\n      {\n        label: '邯郸',\n        value: '186',\n      },\n      {\n        label: '邢台',\n        value: '185',\n      },\n      {\n        label: '保定',\n        value: '187',\n      },\n      {\n        label: '张家口',\n        value: '184',\n      },\n      {\n        label: '承德',\n        value: '189',\n      },\n      {\n        label: '廊坊',\n        value: '183',\n      },\n      {\n        label: '沧州',\n        value: '180',\n      },\n      {\n        label: '衡水',\n        value: '720',\n      },\n      {\n        label: '雄安',\n        value: '782',\n      },\n    ],\n    value: '18',\n  },\n  {\n    label: '福建',\n    children: [\n      {\n        label: '福州',\n        value: '380',\n      },\n      {\n        label: '厦门',\n        value: '390',\n      },\n      {\n        label: '泉州',\n        value: '480',\n      },\n      {\n        label: '漳州',\n        value: '395',\n      },\n      {\n        label: '宁德',\n        value: '386',\n      },\n      {\n        label: '莆田',\n        value: '385',\n      },\n      {\n        label: '南平',\n        value: '387',\n      },\n      {\n        label: '三明',\n        value: '389',\n      },\n      {\n        label: '龙岩',\n        value: '384',\n      },\n    ],\n    value: '38',\n  },\n  {\n    label: '江西',\n    children: [\n      {\n        label: '南昌',\n        value: '750',\n      },\n      {\n        label: '九江',\n        value: '755',\n      },\n      {\n        label: '上饶',\n        value: '757',\n      },\n      {\n        label: '抚州',\n        value: '759',\n      },\n      {\n        label: '宜春',\n        value: '756',\n      },\n      {\n        label: '吉安',\n        value: '751',\n      },\n      {\n        label: '赣州',\n        value: '752',\n      },\n      {\n        label: '景德镇',\n        value: '740',\n      },\n      {\n        label: '萍乡',\n        value: '758',\n      },\n      {\n        label: '新余',\n        value: '753',\n      },\n      {\n        label: '鹰潭',\n        value: '754',\n      },\n    ],\n    value: '75',\n  },\n  {\n    label: '山东',\n    children: [\n      {\n        label: '济南',\n        value: '170',\n      },\n      {\n        label: '青岛',\n        value: '166',\n      },\n      {\n        label: '淄博',\n        value: '150',\n      },\n      {\n        label: '枣庄',\n        value: '157',\n      },\n      {\n        label: '东营',\n        value: '156',\n      },\n      {\n        label: '烟台',\n        value: '161',\n      },\n      {\n        label: '潍坊',\n        value: '155',\n      },\n      {\n        label: '济宁',\n        value: '158',\n      },\n      {\n        label: '泰安',\n        value: '172',\n      },\n      {\n        label: '威海',\n        value: '152',\n      },\n      {\n        label: '日照',\n        value: '154',\n      },\n      {\n        label: '莱芜',\n        value: '160',\n      },\n      {\n        label: '临沂',\n        value: '153',\n      },\n      {\n        label: '德州',\n        value: '173',\n      },\n      {\n        label: '聊城',\n        value: '174',\n      },\n      {\n        label: '滨州',\n        value: '151',\n      },\n      {\n        label: '菏泽',\n        value: '159',\n      },\n    ],\n    value: '17',\n  },\n  {\n    label: '河南',\n    children: [\n      {\n        label: '郑州',\n        value: '760',\n      },\n      {\n        label: '洛阳',\n        value: '761',\n      },\n      {\n        label: '开封',\n        value: '762',\n      },\n      {\n        label: '焦作',\n        value: '763',\n      },\n      {\n        label: '新乡',\n        value: '764',\n      },\n      {\n        label: '许昌',\n        value: '765',\n      },\n      {\n        label: '漯河',\n        value: '766',\n      },\n      {\n        label: '安阳',\n        value: '767',\n      },\n      {\n        label: '商丘',\n        value: '768',\n      },\n      {\n        label: '平顶山',\n        value: '769',\n      },\n      {\n        label: '周口',\n        value: '770',\n      },\n      {\n        label: '驻马店',\n        value: '771',\n      },\n      {\n        label: '三门峡',\n        value: '772',\n      },\n      {\n        label: '濮阳',\n        value: '773',\n      },\n      {\n        label: '鹤壁',\n        value: '774',\n      },\n      {\n        label: '济源',\n        value: '775',\n      },\n      {\n        label: '信阳',\n        value: '776',\n      },\n      {\n        label: '南阳',\n        value: '777',\n      },\n    ],\n    value: '76',\n  },\n  {\n    label: '湖北',\n    children: [\n      {\n        label: '武汉',\n        value: '710',\n      },\n      {\n        label: '宜昌',\n        value: '711',\n      },\n      {\n        label: '荆州',\n        value: '712',\n      },\n      {\n        label: '黄冈',\n        value: '714',\n      },\n      {\n        label: '黄石',\n        value: '715',\n      },\n      {\n        label: '襄阳',\n        value: '716',\n      },\n      {\n        label: '孝感',\n        value: '717',\n      },\n      {\n        label: '鄂州',\n        value: '718',\n      },\n      {\n        label: '咸宁',\n        value: '719',\n      },\n      {\n        label: '十堰',\n        value: '721',\n      },\n      {\n        label: '随州',\n        value: '723',\n      },\n      {\n        label: '荆门',\n        value: '724',\n      },\n      {\n        label: '仙桃/潜江/天门',\n        value: '713',\n      },\n      {\n        label: '恩施',\n        value: '727',\n      },\n    ],\n    value: '71',\n  },\n  {\n    label: '湖南',\n    children: [\n      {\n        label: '长沙',\n        value: '741',\n      },\n      {\n        label: '衡阳',\n        value: '744',\n      },\n      {\n        label: '株洲',\n        value: '742',\n      },\n      {\n        label: '湘潭',\n        value: '743',\n      },\n      {\n        label: '岳阳',\n        value: '745',\n      },\n      {\n        label: '邵阳',\n        value: '792',\n      },\n      {\n        label: '郴州',\n        value: '748',\n      },\n      {\n        label: '常德',\n        value: '749',\n      },\n      {\n        label: '益阳',\n        value: '747',\n      },\n      {\n        label: '怀化',\n        value: '795',\n      },\n      {\n        label: '永州',\n        value: '796',\n      },\n      {\n        label: '娄底',\n        value: '791',\n      },\n      {\n        label: '湘西',\n        value: '793',\n      },\n      {\n        label: '张家界',\n        value: '794',\n      },\n    ],\n    value: '74',\n  },\n  {\n    label: '广东',\n    children: [\n      {\n        label: '广州',\n        value: '510',\n      },\n      {\n        label: '深圳',\n        value: '540',\n      },\n      {\n        label: '东莞',\n        value: '580',\n      },\n      {\n        label: '佛山',\n        value: '530',\n      },\n      {\n        label: '惠州',\n        value: '570',\n      },\n      {\n        label: '珠海',\n        value: '620',\n      },\n      {\n        label: '中山',\n        value: '556',\n      },\n      {\n        label: '江门',\n        value: '550',\n      },\n      {\n        label: '汕头',\n        value: '560',\n      },\n      {\n        label: '湛江',\n        value: '520',\n      },\n      {\n        label: '揭阳',\n        value: '526',\n      },\n      {\n        label: '肇庆',\n        value: '536',\n      },\n      {\n        label: '清远',\n        value: '535',\n      },\n      {\n        label: '韶关',\n        value: '558',\n      },\n      {\n        label: '潮州',\n        value: '531',\n      },\n      {\n        label: '茂名',\n        value: '568',\n      },\n      {\n        label: '河源',\n        value: '670',\n      },\n      {\n        label: '汕尾',\n        value: '525',\n      },\n      {\n        label: '阳江',\n        value: '565',\n      },\n      {\n        label: '梅州',\n        value: '528',\n      },\n      {\n        label: '云浮',\n        value: '538',\n      },\n    ],\n    value: '51',\n  },\n  {\n    label: '广西',\n    children: [\n      {\n        label: '南宁',\n        value: '591',\n      },\n      {\n        label: '柳州',\n        value: '593',\n      },\n      {\n        label: '桂林',\n        value: '592',\n      },\n      {\n        label: '梧州',\n        value: '594',\n      },\n      {\n        label: '玉林',\n        value: '595',\n      },\n      {\n        label: '百色',\n        value: '596',\n      },\n      {\n        label: '钦州',\n        value: '597',\n      },\n      {\n        label: '河池',\n        value: '598',\n      },\n      {\n        label: '北海',\n        value: '599',\n      },\n      {\n        label: '防城港',\n        value: '590',\n      },\n      {\n        label: '贵港',\n        value: '589',\n      },\n      {\n        label: '贺州',\n        value: '588',\n      },\n      {\n        label: '崇左',\n        value: '600',\n      },\n      {\n        label: '来宾',\n        value: '601',\n      },\n    ],\n    value: '59',\n  },\n  {\n    label: '天津',\n    children: [\n      {\n        label: '天津',\n        value: '130',\n      },\n    ],\n    value: '13',\n  },\n  {\n    label: '海南',\n    children: [\n      {\n        label: '海口',\n        value: '501',\n      },\n    ],\n    value: '50',\n  },\n  {\n    label: '重庆',\n    children: [\n      {\n        label: '重庆',\n        value: '831',\n      },\n    ],\n    value: '83',\n  },\n  {\n    label: '四川',\n    children: [\n      {\n        label: '成都',\n        value: '810',\n      },\n      {\n        label: '自贡',\n        value: '818',\n      },\n      {\n        label: '雅安',\n        value: '811',\n      },\n      {\n        label: '绵阳',\n        value: '824',\n      },\n      {\n        label: '乐山',\n        value: '814',\n      },\n      {\n        label: '德阳',\n        value: '825',\n      },\n      {\n        label: '攀枝花',\n        value: '813',\n      },\n      {\n        label: '宜宾',\n        value: '817',\n      },\n      {\n        label: '阿坝',\n        value: '829',\n      },\n      {\n        label: '内江',\n        value: '816',\n      },\n      {\n        label: '眉山',\n        value: '819',\n      },\n      {\n        label: '资阳',\n        value: '830',\n      },\n      {\n        label: '泸州',\n        value: '815',\n      },\n      {\n        label: '南充',\n        value: '822',\n      },\n      {\n        label: '达州',\n        value: '820',\n      },\n      {\n        label: '遂宁',\n        value: '821',\n      },\n      {\n        label: '广元',\n        value: '826',\n      },\n      {\n        label: '广安',\n        value: '823',\n      },\n      {\n        label: '巴中',\n        value: '827',\n      },\n      {\n        label: '凉山',\n        value: '812',\n      },\n      {\n        label: '甘孜',\n        value: '828',\n      },\n    ],\n    value: '81',\n  },\n  {\n    label: '山西',\n    children: [\n      {\n        label: '太原',\n        value: '190',\n      },\n      {\n        label: '大同',\n        value: '193',\n      },\n      {\n        label: '阳泉',\n        value: '192',\n      },\n      {\n        label: '长治',\n        value: '195',\n      },\n      {\n        label: '晋城',\n        value: '194',\n      },\n      {\n        label: '朔州',\n        value: '199',\n      },\n      {\n        label: '忻州',\n        value: '198',\n      },\n      {\n        label: '晋中',\n        value: '191',\n      },\n      {\n        label: '吕梁',\n        value: '200',\n      },\n      {\n        label: '临汾',\n        value: '197',\n      },\n      {\n        label: '运城',\n        value: '196',\n      },\n    ],\n    value: '19',\n  },\n  {\n    label: '贵州',\n    children: [\n      {\n        label: '贵阳',\n        value: '850',\n      },\n      {\n        label: '遵义',\n        value: '787',\n      },\n      {\n        label: '安顺',\n        value: '789',\n      },\n      {\n        label: '黔南',\n        value: '788',\n      },\n      {\n        label: '黔东南',\n        value: '786',\n      },\n      {\n        label: '铜仁',\n        value: '785',\n      },\n      {\n        label: '毕节',\n        value: '851',\n      },\n      {\n        label: '六盘水',\n        value: '853',\n      },\n      {\n        label: '黔西南',\n        value: '852',\n      },\n    ],\n    value: '85',\n  },\n  {\n    label: '云南',\n    children: [\n      {\n        label: '昆明',\n        value: '860',\n      },\n      {\n        label: '德宏',\n        value: '730',\n      },\n      {\n        label: '保山',\n        value: '731',\n      },\n      {\n        label: '文山',\n        value: '732',\n      },\n      {\n        label: '临沧',\n        value: '733',\n      },\n      {\n        label: '怒江',\n        value: '734',\n      },\n      {\n        label: '迪庆',\n        value: '735',\n      },\n      {\n        label: '西双版纳',\n        value: '736',\n      },\n      {\n        label: '红河',\n        value: '861',\n      },\n      {\n        label: '大理',\n        value: '862',\n      },\n      {\n        label: '丽江',\n        value: '863',\n      },\n      {\n        label: '楚雄',\n        value: '864',\n      },\n      {\n        label: '玉溪',\n        value: '865',\n      },\n      {\n        label: '曲靖',\n        value: '866',\n      },\n      {\n        label: '昭通',\n        value: '867',\n      },\n      {\n        label: '普洱',\n        value: '869',\n      },\n    ],\n    value: '86',\n  },\n  {\n    label: '西藏',\n    children: [\n      {\n        label: '拉萨',\n        value: '790',\n      },\n      {\n        label: '日喀则',\n        value: '797',\n      },\n      {\n        label: '山南',\n        value: '798',\n      },\n      {\n        label: '林芝',\n        value: '799',\n      },\n      {\n        label: '昌都',\n        value: '800',\n      },\n      {\n        label: '那曲',\n        value: '801',\n      },\n      {\n        label: '阿里',\n        value: '802',\n      },\n    ],\n    value: '79',\n  },\n  {\n    label: '陕西',\n    children: [\n      {\n        label: '西安',\n        value: '841',\n      },\n      {\n        label: '咸阳',\n        value: '844',\n      },\n      {\n        label: '渭南',\n        value: '843',\n      },\n      {\n        label: '宝鸡',\n        value: '840',\n      },\n      {\n        label: '汉中',\n        value: '849',\n      },\n      {\n        label: '延安',\n        value: '842',\n      },\n      {\n        label: '榆林',\n        value: '845',\n      },\n      {\n        label: '铜川',\n        value: '846',\n      },\n      {\n        label: '安康',\n        value: '848',\n      },\n      {\n        label: '商洛',\n        value: '847',\n      },\n    ],\n    value: '84',\n  },\n  {\n    label: '甘肃',\n    children: [\n      {\n        label: '兰州',\n        value: '870',\n      },\n      {\n        label: '酒泉',\n        value: '931',\n      },\n      {\n        label: '庆阳',\n        value: '873',\n      },\n      {\n        label: '天水',\n        value: '877',\n      },\n      {\n        label: '武威',\n        value: '874',\n      },\n      {\n        label: '临夏',\n        value: '878',\n      },\n      {\n        label: '白银',\n        value: '879',\n      },\n      {\n        label: '定西',\n        value: '871',\n      },\n      {\n        label: '平凉',\n        value: '872',\n      },\n      {\n        label: '陇南',\n        value: '960',\n      },\n      {\n        label: '张掖',\n        value: '875',\n      },\n      {\n        label: '嘉峪关',\n        value: '876',\n      },\n      {\n        label: '金昌',\n        value: '930',\n      },\n      {\n        label: '甘南',\n        value: '961',\n      },\n    ],\n    value: '87',\n  },\n  {\n    label: '青海',\n    children: [\n      {\n        label: '西宁',\n        value: '700',\n      },\n      {\n        label: '海东',\n        value: '701',\n      },\n      {\n        label: '格尔木',\n        value: '702',\n      },\n      {\n        label: '海西',\n        value: '704',\n      },\n      {\n        label: '海北',\n        value: '706',\n      },\n      {\n        label: '海南',\n        value: '705',\n      },\n      {\n        label: '黄南',\n        value: '707',\n      },\n      {\n        label: '果洛',\n        value: '708',\n      },\n      {\n        label: '玉树',\n        value: '709',\n      },\n    ],\n    value: '70',\n  },\n  {\n    label: '宁夏',\n    children: [\n      {\n        label: '银川',\n        value: '880',\n      },\n      {\n        label: '石嘴山',\n        value: '884',\n      },\n      {\n        label: '吴忠',\n        value: '883',\n      },\n      {\n        label: '固原',\n        value: '885',\n      },\n      {\n        label: '中卫',\n        value: '886',\n      },\n    ],\n    value: '88',\n  },\n  {\n    label: '新疆',\n    children: [\n      {\n        label: '乌鲁木齐',\n        value: '890',\n      },\n      {\n        label: '昌吉',\n        value: '891',\n      },\n      {\n        label: '石河子',\n        value: '893',\n      },\n      {\n        label: '奎屯',\n        value: '892',\n      },\n      {\n        label: '塔城',\n        value: '952',\n      },\n      {\n        label: '克拉玛依',\n        value: '899',\n      },\n      {\n        label: '伊犁',\n        value: '898',\n      },\n      {\n        label: '博乐',\n        value: '951',\n      },\n      {\n        label: '阿勒泰',\n        value: '953',\n      },\n      {\n        label: '吐鲁番',\n        value: '894',\n      },\n      {\n        label: '哈密',\n        value: '900',\n      },\n      {\n        label: '巴音郭楞',\n        value: '895',\n      },\n      {\n        label: '阿克苏',\n        value: '896',\n      },\n      {\n        label: '喀什',\n        value: '897',\n      },\n      {\n        label: '和田',\n        value: '955',\n      },\n      {\n        label: '克孜勒苏',\n        value: '954',\n      },\n    ],\n    value: '89',\n  },\n  {\n    label: '内蒙古',\n    children: [\n      {\n        label: '呼和浩特',\n        value: '101',\n      },\n      {\n        label: '包头',\n        value: '102',\n      },\n      {\n        label: '乌海',\n        value: '106',\n      },\n      {\n        label: '赤峰',\n        value: '107',\n      },\n      {\n        label: '呼伦贝尔',\n        value: '108',\n      },\n      {\n        label: '兴安盟',\n        value: '113',\n      },\n      {\n        label: '通辽',\n        value: '109',\n      },\n      {\n        label: '乌兰察布',\n        value: '103',\n      },\n      {\n        label: '巴彦淖尔',\n        value: '105',\n      },\n      {\n        label: '阿拉善盟',\n        value: '114',\n      },\n      {\n        label: '鄂尔多斯',\n        value: '104',\n      },\n      {\n        label: '锡林郭勒盟',\n        value: '111',\n      },\n    ],\n    value: '10',\n  },\n  {\n    label: '辽宁',\n    children: [\n      {\n        label: '沈阳',\n        value: '910',\n      },\n      {\n        label: '大连',\n        value: '940',\n      },\n      {\n        label: '鞍山',\n        value: '912',\n      },\n      {\n        label: '抚顺',\n        value: '913',\n      },\n      {\n        label: '本溪',\n        value: '914',\n      },\n      {\n        label: '丹东',\n        value: '915',\n      },\n      {\n        label: '锦州',\n        value: '916',\n      },\n      {\n        label: '营口',\n        value: '917',\n      },\n      {\n        label: '阜新',\n        value: '918',\n      },\n      {\n        label: '辽阳',\n        value: '919',\n      },\n      {\n        label: '铁岭',\n        value: '911',\n      },\n      {\n        label: '朝阳',\n        value: '920',\n      },\n      {\n        label: '盘锦',\n        value: '921',\n      },\n      {\n        label: '葫芦岛',\n        value: '922',\n      },\n    ],\n    value: '91',\n  },\n  {\n    label: '吉林',\n    children: [\n      {\n        label: '长春',\n        value: '901',\n      },\n      {\n        label: '吉林',\n        value: '902',\n      },\n      {\n        label: '延边',\n        value: '909',\n      },\n      {\n        label: '四平',\n        value: '903',\n      },\n      {\n        label: '通化',\n        value: '905',\n      },\n      {\n        label: '白城',\n        value: '907',\n      },\n      {\n        label: '辽源',\n        value: '906',\n      },\n      {\n        label: '松原',\n        value: '904',\n      },\n      {\n        label: '白山',\n        value: '908',\n      },\n    ],\n    value: '90',\n  },\n  {\n    label: '黑龙江',\n    children: [\n      {\n        label: '哈尔滨',\n        value: '971',\n      },\n      {\n        label: '齐齐哈尔',\n        value: '973',\n      },\n      {\n        label: '牡丹江',\n        value: '988',\n      },\n      {\n        label: '佳木斯',\n        value: '976',\n      },\n      {\n        label: '绥化',\n        value: '989',\n      },\n      {\n        label: '大庆',\n        value: '981',\n      },\n      {\n        label: '鸡西',\n        value: '991',\n      },\n      {\n        label: '黑河',\n        value: '990',\n      },\n      {\n        label: '伊春',\n        value: '996',\n      },\n      {\n        label: '双鸭山',\n        value: '994',\n      },\n      {\n        label: '鹤岗',\n        value: '993',\n      },\n      {\n        label: '七台河',\n        value: '992',\n      },\n      {\n        label: '大兴安岭',\n        value: '995',\n      },\n    ],\n    value: '97',\n  },\n  {\n    label: '上海',\n    children: [\n      {\n        label: '上海',\n        value: '310',\n      },\n    ],\n    value: '31',\n  },\n  {\n    label: '江苏',\n    children: [\n      {\n        label: '南京',\n        value: '340',\n      },\n      {\n        label: '苏州',\n        value: '450',\n      },\n      {\n        label: '无锡',\n        value: '330',\n      },\n      {\n        label: '常州',\n        value: '440',\n      },\n      {\n        label: '扬州',\n        value: '430',\n      },\n      {\n        label: '镇江',\n        value: '343',\n      },\n      {\n        label: '南通',\n        value: '358',\n      },\n      {\n        label: '徐州',\n        value: '350',\n      },\n      {\n        label: '泰州',\n        value: '445',\n      },\n      {\n        label: '盐城',\n        value: '348',\n      },\n      {\n        label: '淮安',\n        value: '354',\n      },\n      {\n        label: '连云港',\n        value: '346',\n      },\n      {\n        label: '宿迁',\n        value: '349',\n      },\n    ],\n    value: '34',\n  },\n  {\n    label: '浙江',\n    children: [\n      {\n        label: '杭州',\n        value: '360',\n      },\n      {\n        label: '宁波',\n        value: '370',\n      },\n      {\n        label: '温州',\n        value: '470',\n      },\n      {\n        label: '台州',\n        value: '476',\n      },\n      {\n        label: '金华',\n        value: '367',\n      },\n      {\n        label: '嘉兴',\n        value: '363',\n      },\n      {\n        label: '绍兴',\n        value: '365',\n      },\n      {\n        label: '湖州',\n        value: '362',\n      },\n      {\n        label: '丽水',\n        value: '469',\n      },\n      {\n        label: '衢州',\n        value: '468',\n      },\n      {\n        label: '舟山',\n        value: '364',\n      },\n    ],\n    value: '36',\n  },\n  {\n    label: '安徽',\n    children: [\n      {\n        label: '合肥',\n        value: '305',\n      },\n      {\n        label: '安庆',\n        value: '302',\n      },\n      {\n        label: '蚌埠',\n        value: '301',\n      },\n      {\n        label: '亳州',\n        value: '318',\n      },\n      {\n        label: '池州',\n        value: '317',\n      },\n      {\n        label: '滁州',\n        value: '312',\n      },\n      {\n        label: '阜阳',\n        value: '306',\n      },\n      {\n        label: '淮北',\n        value: '314',\n      },\n      {\n        label: '淮南',\n        value: '307',\n      },\n      {\n        label: '黄山',\n        value: '316',\n      },\n      {\n        label: '六安',\n        value: '304',\n      },\n      {\n        label: '马鞍山',\n        value: '300',\n      },\n      {\n        label: '宿州',\n        value: '313',\n      },\n      {\n        label: '铜陵',\n        value: '308',\n      },\n      {\n        label: '芜湖',\n        value: '303',\n      },\n      {\n        label: '宣城',\n        value: '311',\n      },\n    ],\n    value: '30',\n  },\n];\n"
  },
  {
    "path": "demo/pages/Form/FormReadonly/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<form-input\n  label=\"账号\"\n  name=\"account\"\n  placeholder=\"请输入账号\"\n  allowClear\n  readonly\n  ref=\"handleRef\">\n  <view slot=\"tooltip\">\n    <ant-icon\n      onTap=\"showToast\"\n      type=\"QuestionCircleOutline\" />\n  </view>\n</form-input>\n<form-input\n  label=\"密码\"\n  name=\"password\"\n  placeholder=\"请输入密码\"\n  tooltip=\"密码说明\"\n  allowClear\n  readonly\n  ref=\"handleRef\">\n</form-input>\n<form-input\n  label=\"数字\"\n  name=\"number\"\n  type=\"number\"\n  readonly\n  ref=\"handleRef\"\n/>\n<form-input\n  label=\"地址\"\n  name=\"address\"\n  placeholder=\"请输入地址\"\n  allowClear\n  readonly\n  ref=\"handleRef\" />\n<form-switch\n  label=\"选择\"\n  name=\"needDelivery\"\n  readonly\n  ref=\"handleRef\"\n/>\n<form-stepper\n  label=\"数量\"\n  name=\"quantity\"\n  readonly\n  ref=\"handleRef\"\n  />\n<form-picker\n  label=\"水果\"\n  arrow\n  name=\"fruit\"\n  options=\"{{ fruitList }}\"\n  readonly\n  ref=\"handleRef\" />\n<form-date-picker\n  label=\"出生日期\"\n  arrow\n  name=\"birthday\"\n  readonly\n  ref=\"handleRef\"\n  />\n<form-range-picker\n  label=\"时间范围\"\n  arrow\n  name=\"range\"\n  readonly\n  ref=\"handleRef\" />\n<form-cascader-picker\n  label=\"城市\"\n  arrow\n  options=\"{{ cityList }}\"\n  name=\"city\"\n  tooltip=\"选择城市\"\n  placeholder=\"请输入城市\"\n  readonly\n  ref=\"handleRef\" />\n<form-radio-group\n  label=\"动物单选\"\n  name=\"animalChoose\"\n  color=\"red\"\n  options=\"{{ radioGroupOptions }}\"\n  readonly\n  ref=\"handleRef\" />\n<form-checkbox-group\n  label=\"蔬菜多选\"\n  name=\"fruitChoose\"\n  options=\"{{ checkboxGroupOptions }}\"\n  readonly\n  ref=\"handleRef\" />\n<form-selector\n  label=\"喜好\"\n  name=\"likeChoose\"\n  options=\"{{ selectorOptions }}\"\n  readonly\n  ref=\"handleRef\" />\n<form-slider\n  label=\"选择分数\"\n  name=\"slider\"\n  showTooltip\n  readonly\n  ref=\"handleRef\" />\n<form-upload-image\n  label=\"图片\"\n  name=\"image\"\n  onUpload=\"{{ onUpload ? onUpload : 'onUpload' }}\"\n  readonly\n  ref=\"handleRef\" />\n<form-textarea\n  label=\"说明\"\n  name=\"description\"\n  placeholder=\"请输入说明\"\n  allowClear\n  autoHeight\n  readonly\n  ref=\"handleRef\" />\n<form-rate\n  label=\"评分\"\n  name=\"rate\"\n  readonly\n  ref=\"handleRef\" />\n<view class=\"buttons\">\n  <ant-button\n    type=\"primary\"\n    onTap=\"submit\"\n    style=\"margin-bottom: 12px\">\n    提交\n  </ant-button>\n  <ant-button\n    onTap=\"update\"\n    style=\"margin-bottom: 12px\">\n    更新\n  </ant-button>\n  <ant-button onTap=\"clear\">清空</ant-button>\n</view>\n<ant-toast\n  content=\"账号的自定义 tooltip\"\n  visible=\"{{ toastShow }}\"\n  onClose=\"handleCloseToast\" />\n"
  },
  {
    "path": "demo/pages/Form/FormReadonly/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Form\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Form\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"form-input\": \"../../../../src/Form/FormInput/index\",\n    \"form-switch\": \"../../../../src/Form/FormSwitch/index\",\n    \"form-stepper\": \"../../../../src/Form/FormStepper/index\",\n    \"form-picker\": \"../../../../src/Form/FormPicker/index\",\n    \"form-date-picker\": \"../../../../src/Form/FormDatePicker/index\",\n    \"form-range-picker\": \"../../../../src/Form/FormRangePicker/index\",\n    \"form-cascader-picker\": \"../../../../src/Form/FormCascaderPicker/index\",\n    \"form-checkbox-group\": \"../../../../src/Form/FormCheckboxGroup/index\",\n    \"form-radio-group\": \"../../../../src/Form/FormRadioGroup/index\",\n    \"form-slider\": \"../../../../src/Form/FormSlider/index\",\n    \"form-selector\": \"../../../../src/Form/FormSelector/index\",\n    \"form-upload-image\": \"../../../../src/Form/FormImageUpload/index\",\n    \"form-rate\": \"../../../../src/Form/FormRate/index\",\n    \"form-textarea\": \"../../../../src/Form/FormTextarea/index\",\n    \"ant-button\": \"../../../../src/Button/index\",\n    \"ant-icon\": \"../../../../src/Icon/index\",\n    \"ant-toast\": \"../../../../src/Toast/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Form/FormReadonly/index.less",
    "content": ".buttons {\n  background: var(--color-card);\n  padding: 12px 12px 48px 12px;\n}\n\ntextarea {\n  min-height: 100px;\n}\n"
  },
  {
    "path": "demo/pages/Form/FormReadonly/index.ts",
    "content": "import { Form } from '../../../../src/Form/form';\nimport cityList from './city';\n\nPage({\n  data: {\n    /// #if WECHAT\n    onUpload(localFile) {\n      return new Promise((resolve) => {\n        console.log('上传的图片为：', localFile);\n        setTimeout(() => {\n          resolve(\n            'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ'\n          );\n        }, 2000);\n      });\n    },\n    /// #endif\n    fruitList: ['苹果', '香蕉', '橘子', '西瓜'],\n    cityList,\n    radioGroupOptions: [\n      { value: 'cat', label: '🐱' },\n      { value: 'fox', label: '🦊' },\n    ],\n    checkboxGroupOptions: [\n      { value: 'tomato', label: '🍅' },\n      { value: 'potato', label: '🥔' },\n      { value: 'eggplant', label: '🍆' },\n    ],\n    selectorOptions: [\n      { value: 'basketball', text: '🏀' },\n      { value: 'football', text: '⚽️' },\n      { value: 'badminton', text: '🏸️' },\n    ],\n    toastShow: false,\n  },\n  onLoad() {\n    this.form = new Form({\n      initialValues: {\n        'account': 'uaisduasd',\n        'address': '北京北京市',\n        'animalChoose': 'fox',\n        'birthday': '2025-03-11T00:00:00.000Z',\n        'city': ['11', '110'],\n        'description': '这是一段很长的说明竞技即时阿斯达阿斯达',\n        'fruit': '西瓜',\n        'fruitChoose': ['potato', 'tomato'],\n        'image': [\n          {\n            'path': 'https://resource/apml3e3908342944e384a1940a8605c9ad7c.png',\n            'size': 38595,\n            'status': 'done',\n            'uid': '196-1739260033378-1',\n            'url':\n              'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ',\n          },\n          {\n            'path': 'https://resource/apml3e3908342944e384a1940a8605c9ad7c.png',\n            'size': 38595,\n            'status': 'done',\n            'uid': '196-1739260033378-1',\n            'url':\n              'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ',\n          },\n          {\n            'path': 'https://resource/apml3e3908342944e384a1940a8605c9ad7c.png',\n            'size': 38595,\n            'status': 'done',\n            'uid': '196-1739260033378-1',\n            'url':\n              'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ',\n          },\n        ],\n        'likeChoose': 'football',\n        'needDelivery': true,\n        'number': '22134',\n        'password': '123455',\n        'quantity': 2,\n        'range': ['2025-04-11T00:00:00.000Z', '2025-12-11T00:00:00.000Z'],\n        'rate': 4,\n        'slider': 65,\n      },\n      rules: {\n        account: [\n          {\n            required: true,\n            message: '请输入账号',\n          },\n          () => ({\n            // 一定需要时异步函数，返回Promise对象\n            validator: async (_, value) => {\n              if (value.length < 6) {\n                throw new Error('请输入至少6位');\n              }\n            },\n          }),\n        ],\n      },\n    });\n    this.form.onValueChange('user.account', (value, allValues) => {\n      const validates = this.form.getFieldsValidatorStatus();\n      console.log('onValueChange:', value, allValues, validates);\n    });\n    this.form.onValuesChange((value, allValues) => {\n      const validates = this.form.getFieldsValidatorStatus();\n      console.log('onValuesChange:', value, allValues, validates);\n    });\n    /// #if WECHAT\n    if (this.formRefList) {\n      this.formRefList.forEach((ref) => {\n        this.form.addItem(ref);\n      });\n    }\n    /// #endif\n  },\n  handleRef(ref) {\n    /// #if ALIPAY\n    this.form.addItem(ref);\n    /// #endif\n\n    /// #if WECHAT\n    if (!this.formRefList) {\n      this.formRefList = [];\n    }\n    this.formRefList.push(ref.detail);\n    /// #endif\n  },\n\n  update() {\n    this.form.setFieldsValue({\n      'account': 'maksusi',\n      'address': 333,\n      'animalChoose': 'fox',\n      'birthday': Date.now(),\n      city: ['36', '360'],\n      'description': '说明一下情况',\n      'fruit': '西瓜',\n      'fruitChoose': ['potato', 'eggplant'],\n      'image': [\n        {\n          path: 'https://resource/apml3bc4f816b58586ab65e1b54980a10c87.jpg',\n          size: 2352941,\n          status: 'done',\n          uid: '201-1720155950249-1',\n          url: 'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ',\n        },\n      ],\n      'likeChoose': 'badminton',\n      'needDelivery': false,\n      'number': 15937127381,\n      password: '34124124123',\n      'quantity': 20,\n      'range': [Date.now(), Date.now() + 86400000],\n      rate: 4,\n      'slider': 44,\n    });\n  },\n  clear() {\n    this.form.setFieldsValue({\n      'account': undefined,\n      'address': undefined,\n      'animalChoose': undefined,\n      'birthday': undefined,\n      city: [],\n      'description': undefined,\n      'fruit': undefined,\n      'fruitChoose': [],\n      'image': [],\n      'likeChoose': undefined,\n      'needDelivery': undefined,\n      'number': undefined,\n      password: undefined,\n      'quantity': undefined,\n      'range': [],\n      rate: undefined,\n      'slider': undefined,\n    });\n  },\n  async submit() {\n    const values = await this.form.submit();\n    /// #if ALIPAY\n    my.alert({\n      title: '提交',\n      content: JSON.stringify(values, null, 2),\n    });\n    /// #endif\n    console.log(values);\n  },\n  /// #if ALIPAY\n  onUpload(localFile) {\n    return new Promise((resolve) => {\n      console.log('上传的图片为：', localFile);\n      setTimeout(() => {\n        resolve(\n          'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ'\n        );\n      }, 2000);\n    });\n  },\n  /// #endif\n  showToast() {\n    this.setData({\n      toastShow: true,\n    });\n  },\n  handleCloseToast() {\n    this.setData({\n      toastShow: false,\n    });\n  },\n});\n"
  },
  {
    "path": "demo/pages/Form/FormRules/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-form-input\n  label=\"用户名\"\n  name=\"account\"\n  required\n  message=\"需要输入用户名\"\n  ref=\"handleRef\" />\n\n<ant-form-input\n  label=\"密码\"\n  name=\"password\"\n  password\n  ref=\"handleRef\" />\n\n<ant-form-input\n  label=\"重复密码\"\n  name=\"confirm\"\n  password\n  dependencies=\"{{ ['password'] }}\"\n  ref=\"handleRef\" />\n\n<view class=\"buttons\">\n  <ant-button\n    type=\"primary\"\n    onTap=\"submit\"\n    style=\"margin-bottom: 12px\">\n    提交\n  </ant-button>\n  <ant-button\n    onTap=\"reset\"\n    style=\"margin-bottom: 12px\">\n    重置\n  </ant-button>\n  <ant-button onTap=\"fill\">Fill表单</ant-button>\n</view>\n"
  },
  {
    "path": "demo/pages/Form/FormRules/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Form\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Form\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-form-input\": \"../../../../src/Form/FormInput/index\",\n    \"ant-button\": \"../../../../src/Button/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Form/FormRules/index.less",
    "content": ".buttons {\n  background: var(--color-card);\n  padding: 12px;\n}\n"
  },
  {
    "path": "demo/pages/Form/FormRules/index.ts",
    "content": "import { Form } from '../../../../src/Form/form';\n\nPage({\n  onLoad() {\n    this.form = new Form({\n      rules: {\n        password: [\n          {\n            required: true,\n            message: '需要输入密码',\n          },\n        ],\n        confirm: [\n          {\n            required: true,\n            message: '需要输入确认密码',\n          },\n          (form) => ({\n            async validator(_, value) {\n              if (!value || form.getFieldValue('password') === value) {\n                return;\n              }\n              throw new Error('验证密码需要跟密码相同');\n            },\n          }),\n        ],\n      },\n    });\n    /// #if WECHAT\n    if (this.formRefList) {\n      this.formRefList.forEach((ref) => {\n        this.form.addItem(ref);\n      });\n    }\n    /// #endif\n  },\n  handleRef(ref) {\n    /// #if ALIPAY\n    this.form.addItem(ref);\n    /// #endif\n\n    /// #if WECHAT\n    if (!this.formRefList) {\n      this.formRefList = [];\n    }\n    this.formRefList.push(ref.detail);\n    /// #endif\n  },\n  reset() {\n    this.form.reset();\n  },\n  fill() {\n    this.form.setFieldValue('account', 'lily');\n    this.form.setFieldValue('password', '1234');\n    this.form.setFieldValue('confirm', '1234');\n  },\n  async submit() {\n    const values = await this.form.submit();\n\n    /// #if ALIPAY\n    my.alert({\n      title: '提交',\n      content: JSON.stringify(values),\n    });\n    /// #endif\n\n    console.log(values);\n  },\n});\n"
  },
  {
    "path": "demo/pages/Form/FormValidate/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-form-input\n  label=\"用户名\"\n  name=\"account\"\n  validateStatus=\"error\"\n  help=\"需要填写用户名\"\n  ref=\"handleRef\" />\n\n<ant-form-input\n  label=\"地址\"\n  name=\"address\"\n  help=\"需要填写地址\"\n  ref=\"handleRef\" />\n\n<ant-form-input\n  label=\"水果\"\n  name=\"fruit\"\n  ref=\"handleRef\" />\n\n<view class=\"buttons\">\n  <ant-button\n    type=\"primary\"\n    onTap=\"submit\"\n    style=\"margin-bottom: 12px\">\n    提交\n  </ant-button>\n  <ant-button onTap=\"reset\">重置</ant-button>\n</view>\n"
  },
  {
    "path": "demo/pages/Form/FormValidate/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Form\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Form\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-form-input\": \"../../../../src/Form/FormInput/index\",\n    \"ant-button\": \"../../../../src/Button/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Form/FormValidate/index.less",
    "content": ".buttons {\n  background: var(--color-card);\n  padding: 12px;\n}\n"
  },
  {
    "path": "demo/pages/Form/FormValidate/index.ts",
    "content": "import { Form } from '../../../../src/Form/form';\n\nPage({\n  onLoad() {\n    this.form = new Form();\n    /// #if WECHAT\n    if (this.formRefList) {\n      this.formRefList.forEach((ref) => {\n        this.form.addItem(ref);\n      });\n    }\n    /// #endif\n  },\n  handleRef(ref) {\n    /// #if ALIPAY\n    this.form.addItem(ref);\n    /// #endif\n\n    /// #if WECHAT\n    if (!this.formRefList) {\n      this.formRefList = [];\n    }\n    this.formRefList.push(ref.detail);\n    /// #endif\n  },\n  reset() {\n    this.form.reset();\n  },\n  onReady() {\n    setTimeout(() => {\n      // 填入表单及校验\n      this.form.setFieldValue('fruit', '橘子');\n      this.form.setFieldValidatorStatus('fruit', {\n        status: 'error',\n        errors: ['后台服务返回: 橘子还在进货，请换一个'],\n      });\n    });\n  },\n  async submit() {\n    const values = await this.form.submit();\n\n    /// #if ALIPAY\n    my.alert({\n      title: '提交',\n      content: JSON.stringify(values),\n    });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/Form/FormValidateMessages/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-form-input\n  label=\"用户名\"\n  name=\"account\"\n  ref=\"handleRef\" />\n<ant-form-input\n  label=\"密码\"\n  name=\"password\"\n  password\n  ref=\"handleRef\" />\n<ant-form-input\n  label=\"IP\"\n  name=\"ip\"\n  ref=\"handleRef\" />\n<view class=\"buttons\">\n  <ant-button\n    type=\"primary\"\n    onTap=\"submit\"\n    style=\"margin-bottom: 12px\">\n    提交\n  </ant-button>\n  <ant-button\n    onTap=\"reset\"\n    style=\"margin-bottom: 12px\">\n    重置\n  </ant-button>\n</view>\n"
  },
  {
    "path": "demo/pages/Form/FormValidateMessages/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Form\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Form\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-form-input\": \"../../../../src/Form/FormInput/index\",\n    \"ant-button\": \"../../../../src/Button/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Form/FormValidateMessages/index.less",
    "content": ".buttons {\n  background: var(--color-card);\n  padding: 12px;\n}\n"
  },
  {
    "path": "demo/pages/Form/FormValidateMessages/index.ts",
    "content": "import { Form } from '../../../../src/Form/form';\n\nconst validateMessages = {\n  required: '需要输入${label}',\n  string: {\n    min: '${label}最少${min}个字符',\n  },\n  pattern: {\n    mismatch: '${label}需要满足${pattern}',\n  },\n};\n\nPage({\n  onLoad() {\n    this.form = new Form({\n      validateMessages,\n      rules: {\n        account: [\n          {\n            required: true,\n            min: 6,\n          },\n        ],\n        password: [\n          {\n            required: true,\n          },\n        ],\n        ip: [\n          {\n            required: true,\n            pattern:\n              /^((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})(\\.((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})){3}$/,\n          },\n        ],\n      },\n    });\n    /// #if WECHAT\n    if (this.formRefList) {\n      this.formRefList.forEach((ref) => {\n        this.form.addItem(ref);\n      });\n    }\n    /// #endif\n  },\n  handleRef(ref) {\n    /// #if ALIPAY\n    this.form.addItem(ref);\n    /// #endif\n\n    /// #if WECHAT\n    if (!this.formRefList) {\n      this.formRefList = [];\n    }\n    this.formRefList.push(ref.detail);\n    /// #endif\n  },\n  reset() {\n    this.form.reset();\n  },\n  async submit() {\n    const values = await this.form.submit();\n    console.log(values);\n\n    /// #if ALIPAY\n    my.alert({\n      title: '提交',\n      content: JSON.stringify(values),\n    });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/Form/FormWatch/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-form-input\n  label=\"用户名\"\n  name=\"account\"\n  placeholder=\"请输入用户名\"\n  required\n  ref=\"handleRef\" />\n\n<ant-form-input\n  label=\"地址\"\n  name=\"address\"\n  placeholder=\"请输入地址\"\n  ref=\"handleRef\" />\n\n<view style=\"margin: 12px\">\n  onValuesChange:\n  <view style=\"margin: 12px\">\n    <view>修改：{{ changedValuesText }}</view>\n\n    <view>表单：{{ allValuesText }}</view>\n  </view>\n</view>\n\n<view class=\"buttons\">\n  <ant-button\n    type=\"primary\"\n    onTap=\"submit\"\n    className=\"button\">\n    提交\n  </ant-button>\n  <ant-button\n    onTap=\"reset\"\n    className=\"button\">\n    重置\n  </ant-button>\n</view>\n"
  },
  {
    "path": "demo/pages/Form/FormWatch/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Form\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Form\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-form-input\": \"../../../../src/Form/FormInput/index\",\n    \"ant-button\": \"../../../../src/Button/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Form/FormWatch/index.less",
    "content": ".buttons {\n  background: var(--color-card);\n  padding: 12px;\n}\n\n.button {\n  margin-bottom: 12px;\n}\n"
  },
  {
    "path": "demo/pages/Form/FormWatch/index.ts",
    "content": "import { Form } from '../../../../src/Form/form';\n\nPage({\n  onLoad() {\n    this.form = new Form();\n    /// #if WECHAT\n    if (this.formRefList) {\n      this.formRefList.forEach((ref) => {\n        this.form.addItem(ref);\n      });\n    }\n    /// #endif\n  },\n  data: {\n    changedValuesText: '',\n    allValuesText: '',\n  },\n  onReady() {\n    this.form.onValuesChange((changedValues, allValues) => {\n      let changedValuesText = '';\n      let allValuesText = '';\n      Object.keys(changedValues).forEach((name) => {\n        const value = changedValues[name];\n        changedValuesText += `${name}: ${value};`;\n      });\n\n      Object.keys(allValues).forEach((name) => {\n        const value = allValues[name];\n        allValuesText += `${name}: ${value};`;\n      });\n      this.setData({\n        changedValuesText,\n        allValuesText,\n      });\n    });\n  },\n  handleRef(ref) {\n    /// #if ALIPAY\n    this.form.addItem(ref);\n    /// #endif\n\n    /// #if WECHAT\n    if (!this.formRefList) {\n      this.formRefList = [];\n    }\n    this.formRefList.push(ref.detail);\n    /// #endif\n  },\n  reset() {\n    this.form.reset();\n    this.setData({\n      changedValuesText: '',\n      allValuesText: '',\n    });\n  },\n  async submit() {\n    const values = await this.form.submit();\n    /// #if ALIPAY\n    my.alert({\n      title: '提交',\n      content: JSON.stringify(values),\n    });\n    /// #endif\n\n    console.log(values);\n  },\n});\n"
  },
  {
    "path": "demo/pages/Form/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-list>\n  <ant-list-item arrow=\"right\" data-src=\"FormBasic\" onTap=\"gotoPage\">基本使用</ant-list-item>\n  <ant-list-item arrow=\"right\" data-src=\"FormLayout\" onTap=\"gotoPage\">布局</ant-list-item>\n  <ant-list-item arrow=\"right\" data-src=\"FormInitialValues\" onTap=\"gotoPage\">初始值</ant-list-item>\n  <ant-list-item arrow=\"right\" data-src=\"FormInitialValuesAsync\" onTap=\"gotoPage\">初始值异步加载</ant-list-item>\n  <ant-list-item arrow=\"right\" data-src=\"FormWatch\" onTap=\"gotoPage\">表单侦听</ant-list-item>\n  <ant-list-item arrow=\"right\" data-src=\"FormDynamic\" onTap=\"gotoPage\">校验</ant-list-item>\n  <ant-list-item arrow=\"right\" data-src=\"FormRules\" onTap=\"gotoPage\">增加删除表单项</ant-list-item>\n  <ant-list-item arrow=\"right\" data-src=\"FormDependency\" onTap=\"gotoPage\">表单项联动</ant-list-item>\n  <ant-list-item arrow=\"right\" data-src=\"FormValidate\" onTap=\"gotoPage\">自定义表单项校验</ant-list-item>\n  <ant-list-item arrow=\"right\" data-src=\"FormValidateMessages\" onTap=\"gotoPage\">自定义表单校验消息</ant-list-item>\n  <ant-list-item arrow=\"right\" data-src=\"FormMultiple\" onTap=\"gotoPage\">多个表单</ant-list-item>\n  <ant-list-item arrow=\"right\" data-src=\"FormReadonly\" onTap=\"gotoPage\">只读状态</ant-list-item>\n  <ant-list-item arrow=\"right\" data-src=\"FormImageUploadRules\" onTap=\"gotoPage\">图片校验</ant-list-item>\n  <ant-list-item arrow=\"right\" data-src=\"FormJSON\" onTap=\"gotoPage\">JSON 生成表单</ant-list-item>\n  <ant-list-item arrow=\"right\" data-src=\"FormCustomError\" onTap=\"gotoPage\">自定义错误样式</ant-list-item>\n  <ant-list-item arrow=\"right\" data-src=\"FormCustom\" onTap=\"gotoPage\">自定义表单项</ant-list-item>\n</ant-list>\n"
  },
  {
    "path": "demo/pages/Form/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Form Demo\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Form Demo\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-list\": \"../../../src/List/index\",\n    \"ant-list-item\": \"../../../src/List/ListItem/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Form/index.less",
    "content": ".buttons {\n  background: var(--color-card);\n  padding: 12px 12px 48px 12px;\n}\n\ntextarea {\n  min-height: 100px;\n}\n"
  },
  {
    "path": "demo/pages/Form/index.ts",
    "content": "Page({\n  data: {},\n  gotoPage(event) {\n    const src = event.target.dataset.src;\n    if (typeof my === 'undefined') {\n      //@ts-ignore\n      wx.navigateTo({\n        url: `./${src}/index`,\n      });\n      return;\n    }\n    my.navigateTo({\n      url: `./${src}/index`,\n    });\n  },\n});\n"
  },
  {
    "path": "demo/pages/Grid/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"3列\">\n  <ant-grid\n    items=\"{{ items3 }}\"\n    onTap=\"handleTapItem\"\n    iconSize=\"{{ 36 }}\"\n    columns=\"{{ 3 }}\" />\n</ant-container>\n<ant-container title=\"4列\">\n  <ant-grid\n    items=\"{{ items4 }}\"\n    onTap=\"handleTapItem\"\n    columns=\"{{ 4 }}\" />\n</ant-container>\n<ant-container title=\"5列\">\n  <ant-grid\n    items=\"{{ items5 }}\"\n    onTap=\"handleTapItem\"\n    columns=\"{{ 5 }}\" />\n</ant-container>\n<ant-container title=\"换行\">\n  <ant-grid\n    items=\"{{ items5More }}\"\n    onTap=\"handleTapItem\"\n    columns=\"{{ 5 }}\" />\n</ant-container>\n<ant-container title=\"5列-展示分割线\">\n  <ant-grid\n    items=\"{{ items5 }}\"\n    onTap=\"handleTapItem\"\n    columns=\"{{ 5 }}\"\n    showDivider />\n</ant-container>\n<ant-container title=\"2列-带描述\">\n  <ant-grid\n    items=\"{{ items2withDesc }}\"\n    onTap=\"handleTapItem\"\n    iconSize=\"{{ 36 }}\"\n    columns=\"{{ 2 }}\" />\n</ant-container>\n<ant-container title=\"3列-带描述\">\n  <ant-grid\n    items=\"{{ items3withDesc }}\"\n    iconSize=\"{{ 36 }}\"\n    onTap=\"handleTapItem\"\n    columns=\"{{ 3 }}\" />\n</ant-container>\n<ant-container title=\"2列-元素横向布局\">\n  <ant-grid\n    items=\"{{ items2 }}\"\n    onTap=\"handleTapItem\"\n    columns=\"{{ 2 }}\"\n    gridItemLayout=\"horizontal\" />\n</ant-container>\n<ant-container title=\"2行-元素横向布局\">\n  <ant-grid\n    items=\"{{ items4 }}\"\n    gridItemLayout=\"horizontal\"\n    onTap=\"handleTapItem\"\n    columns=\"{{ 2 }}\" />\n</ant-container>\n<ant-container title=\"3列-元素横向布局\">\n  <ant-grid\n    items=\"{{ items3 }}\"\n    onTap=\"handleTapItem\"\n    columns=\"{{ 3 }}\"\n    gridItemLayout=\"horizontal\" />\n</ant-container>\n<ant-container title=\"2列-带描述\">\n  <ant-grid\n    items=\"{{ items2withDesc }}\"\n    onTap=\"handleTapItem\"\n    iconSize=\"{{ 36 }}\"\n    gridItemLayout=\"horizontal\"\n    columns=\"{{ 2 }}\" />\n</ant-container>\n<ant-container title=\"可滑动\">\n  <ant-grid\n    items=\"{{ scrollItems }}\"\n    onTap=\"handleTapItem\"\n    mode=\"scroll\" />\n</ant-container>\n<ant-container title=\"滑块可滑动\">\n  <swiper\n    indicator-dots=\"{{ true }}\"\n    autoplay=\"{{ true }}\"\n    vertical=\"{{ false }}\"\n    interval=\"{{ 1000 }}\"\n    circular=\"{{ false }}\"\n    duration=\"{{ 1500 }}\"\n>\n  <swiper-item key=\"swiper-item-{{index}}\" a:for=\"{{[1,2,3,4]}}\">\n    <ant-grid\n      items=\"{{ items5More }}\"\n      onTap=\"handleTapItem\"\n      columns=\"{{ 5 }}\"\n     />\n    </swiper-item>\n</swiper>\n</ant-container>\n<ant-container title=\"自定义图标大小\">\n  <ant-grid\n    items=\"{{ itemsCustom }}\"\n    onTap=\"handleTapItem\"\n    columns=\"{{ 5 }}\"\n    iconSize=\"{{ 44 }}\" />\n</ant-container>\n<!-- #if ALIPAY -->\n<ant-container title=\"自定义\">\n  <ant-grid\n    items=\"{{ itemsCustom }}\"\n    onTap=\"handleTapItem\"\n    columns=\"{{ 5 }}\">\n    <view\n      slot=\"icon\"\n      slot-scope=\"props\">\n      <ant-badge\n        a:if=\"{{ props.value.tag }}\"\n        offsetX=\"-10px\"\n        type=\"text\"\n        text=\"{{ props.value.tag }}\">\n        <image\n          src=\"{{ props.value.icon }}\"\n          style=\"width: 44px; height: 44px\" />\n      </ant-badge>\n      <image\n        a:else\n        src=\"{{ props.value.icon }}\"\n        style=\"width: 44px; height: 44px\" />\n    </view>\n    <view\n      slot=\"title\"\n      slot-scope=\"props\">\n      第{{ props.index + 1 }}项\n    </view>\n    <view\n      slot=\"description\"\n      slot-scope=\"props\">\n      描述{{ props.index + 1 }}\n    </view>\n  </ant-grid>\n</ant-container>\n<!-- #endif -->\n"
  },
  {
    "path": "demo/pages/Grid/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Grid\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Grid\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-container\": \"../../../src/Container/index\",\n    \"ant-grid\": \"../../../src/Grid/index\",\n    \"ant-badge\": \"../../../src/Badge/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Grid/index.less",
    "content": "/// #if ALIPAY\n.a-swiper {\n  padding-bottom: 20rpx;\n}\n.a-swiper-indicator {\n  bottom: -20rpx !important;\n}\n/// #endif\n\n/// #if WECHAT\nswiper {\n  height: 360rpx;\n}\n/// #endif\n"
  },
  {
    "path": "demo/pages/Grid/index.ts",
    "content": "Page({\n  data: {\n    items2: [\n      {\n        title: '生活缴费',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*MwsuTZI4qA8AAAAAAAAAAAAAARQnAQ',\n      },\n      {\n        title: '市民中心',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*xXRcRohQFc0AAAAAAAAAAAAAARQnAQ',\n      },\n    ],\n    items3: [\n      {\n        title: '生活缴费',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*MwsuTZI4qA8AAAAAAAAAAAAAARQnAQ',\n      },\n      {\n        title: '市民中心',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*xXRcRohQFc0AAAAAAAAAAAAAARQnAQ',\n      },\n      {\n        title: '公积金',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*UJf2QLxdoa8AAAAAAAAAAAAAARQnAQ',\n      },\n    ],\n    items4: [\n      {\n        title: '生活缴费',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*MwsuTZI4qA8AAAAAAAAAAAAAARQnAQ',\n      },\n      {\n        title: '市民中心',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*xXRcRohQFc0AAAAAAAAAAAAAARQnAQ',\n      },\n      {\n        title: '公积金',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*UJf2QLxdoa8AAAAAAAAAAAAAARQnAQ',\n      },\n      {\n        title: '出行',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*now3Q4h5DH8AAAAAAAAAAAAAARQnAQ',\n      },\n    ],\n    items5: [\n      {\n        title: '生活缴费',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*MwsuTZI4qA8AAAAAAAAAAAAAARQnAQ',\n      },\n      {\n        title: '市民中心',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*xXRcRohQFc0AAAAAAAAAAAAAARQnAQ',\n      },\n      {\n        title: '公积金',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*UJf2QLxdoa8AAAAAAAAAAAAAARQnAQ',\n      },\n      {\n        title: '出行',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*now3Q4h5DH8AAAAAAAAAAAAAARQnAQ',\n      },\n      {\n        title: '医疗健康',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*I27zQbOu8ScAAAAAAAAAAAAAARQnAQ',\n      },\n    ],\n    items3withDesc: [\n      {\n        title: '生活缴费',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*MwsuTZI4qA8AAAAAAAAAAAAAARQnAQ',\n      },\n      {\n        title: '市民中心',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*xXRcRohQFc0AAAAAAAAAAAAAARQnAQ',\n      },\n      {\n        title: '公积金',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*UJf2QLxdoa8AAAAAAAAAAAAAARQnAQ',\n      },\n    ],\n    items2withDesc: [\n      {\n        title: '生活缴费',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*MwsuTZI4qA8AAAAAAAAAAAAAARQnAQ',\n      },\n      {\n        title: '市民中心',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*xXRcRohQFc0AAAAAAAAAAAAAARQnAQ',\n      },\n    ],\n    itemsCustom: [\n      {\n        title: '生活缴费',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*MwsuTZI4qA8AAAAAAAAAAAAAARQnAQ',\n        tag: '1',\n      },\n      {\n        title: '市民中心',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*xXRcRohQFc0AAAAAAAAAAAAAARQnAQ',\n      },\n      {\n        title: '公积金',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*UJf2QLxdoa8AAAAAAAAAAAAAARQnAQ',\n        tag: '新',\n      },\n      {\n        title: '出行',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*now3Q4h5DH8AAAAAAAAAAAAAARQnAQ',\n      },\n      {\n        title: '医疗健康',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*I27zQbOu8ScAAAAAAAAAAAAAARQnAQ',\n      },\n    ],\n    items5More: [],\n  },\n  onLoad() {\n    const { items5 } = this.data;\n    this.setData({\n      scrollItems: this.data.items4.concat(this.data.items4),\n      items5More: [...items5, ...items5],\n    });\n  },\n  handleTapItem(item) {\n    /// #if ALIPAY\n    my.alert({ title: '点击了', content: JSON.stringify(item) });\n    /// #endif\n\n    /// #if WECHAT\n    console.log(item)\n    //@ts-ignore\n    wx.showToast({\n      title: '点击',\n    });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/GuideTour/index.axml",
    "content": "\n<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-guide-tour\n  items=\"{{ [list[0]] }}\"\n  visible=\"{{ baseVisible }}\"\n  onCancel=\"closeTour\"\n  onChange=\"onChange\" />\n<ant-guide-tour\n  items=\"{{ list }}\"\n  visible=\"{{ moreVisible }}\"\n  onCancel=\"closeTour\"\n  onChange=\"onChange\" />\n<ant-guide-tour\n  items=\"{{ list }}\"\n  visible=\"{{ swiperVisible }}\"\n  onCancel=\"closeTour\"\n  onChange=\"onChange\"\n  swiperable=\"{{ true }}\" />\n<ant-guide-tour\n  items=\"{{ list }}\"\n  current=\"{{ current }}\"\n  visible=\"{{ controlledVisible }}\"\n  onCancel=\"closeTour\"\n  onChange=\"onChangeControlled\" />\n<!-- #if ALIPAY -->\n<ant-guide-tour\n  items=\"{{ list }}\"\n  visible=\"{{ slotVisible }}\"\n  onCancel=\"closeTour\"\n  onChange=\"onChange\">\n  <view\n    class=\"step-box\"\n    slot=\"step\"\n    slot-scope=\"props\">\n    step-{{ props.index }}\n  </view>\n</ant-guide-tour>\n<!-- #endif -->\n\n<ant-container\n  title=\"基础用法\"\n  className=\"list\">\n  <ant-button\n    onTap=\"openTour\"\n    data-field=\"baseVisible\">\n    单图模式\n  </ant-button>\n  <ant-button\n    onTap=\"openTour\"\n    data-field=\"moreVisible\">\n    多图模式\n  </ant-button>\n  <ant-button\n    onTap=\"openTour\"\n    data-field=\"swiperVisible\">\n    滑动模式\n  </ant-button>\n  <ant-button\n    onTap=\"openTour\"\n    data-field=\"controlledVisible\">\n    受控模式\n  </ant-button>\n</ant-container>\n\n<!-- #if ALIPAY -->\n<ant-container\n  title=\"插槽用法\"\n  className=\"list\">\n  <ant-button\n    onTap=\"openTour\"\n    data-field=\"slotVisible\">\n    开始\n  </ant-button>\n</ant-container>\n<!-- #endif -->\n"
  },
  {
    "path": "demo/pages/GuideTour/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"GuideTour\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"GuideTour\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-button\": \"../../../src/Button/index\",\n    \"ant-container\": \"../../../src/Container/index\",\n    \"ant-guide-tour\": \"../../../src/GuideTour/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/GuideTour/index.less",
    "content": ".step-box {\n  background-color: #fff;\n  width: 200px;\n  height: 200px;\n  line-height: 200px;\n  text-align: center;\n}\n\n.list .ant-button {\n  margin-bottom: 8px;\n}\n"
  },
  {
    "path": "demo/pages/GuideTour/index.ts",
    "content": "Page({\n  data: {\n    baseVisible: false,\n    moreVisible: false,\n    swiperVisible: false,\n    slotVisible: false,\n    controlledVisible: false,\n    current: 0,\n    list: [\n      {\n        left: 20,\n        top: 80,\n        imageUrl:\n          'https://gw.alipayobjects.com/zos/antfincdn/IV3MGP1qL/bianzu%25252013.png',\n        imageMode: 'widthFix',\n      },\n      {\n        left: 20,\n        top: 160,\n        imageUrl:\n          'https://gw.alipayobjects.com/zos/antfincdn/%26B6d3lBJn/bianzu%25252020.png',\n      },\n      {\n        left: 20,\n        top: 220,\n        imageUrl:\n          'https://gw.alipayobjects.com/zos/antfincdn/lwVOkCcwb/bianzu%25252021.png',\n      },\n    ],\n  },\n  onChange(index) {\n    console.log('index', index);\n  },\n  onChangeControlled(value) {\n    /// #if ALIPAY\n    this.setData({ current: value });\n    /// #endif\n    /// #if WECHAT\n    this.setData({ current: value.detail });\n    /// #endif\n  },\n  openTour(e) {\n    this.setData({\n      [e.target.dataset.field]: true,\n      current: 0,\n    });\n  },\n  closeTour() {\n    this.setData({\n      baseVisible: false,\n      moreVisible: false,\n      swiperVisible: false,\n      slotVisible: false,\n      controlledVisible: false,\n    });\n  },\n});\n"
  },
  {
    "path": "demo/pages/Icon/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基本使用\">\n  <ant-icon type=\"SmileOutline\" />\n  <ant-icon type=\"PayCircleOutline\" />\n  <ant-icon type=\"LocationFill\" />\n</ant-container>\n\n<ant-container title=\"自定义大小\">\n  <ant-icon\n    type=\"SmileOutline\"\n    style=\"font-size: 20px\" />\n  <ant-icon\n    type=\"SmileOutline\"\n    style=\"font-size: 30px\" />\n  <ant-icon\n    type=\"SmileOutline\"\n    className=\"custom-size\" />\n</ant-container>\n\n<ant-container title=\"自定义颜色\">\n  <ant-icon\n    type=\"SmileOutline\"\n    style=\"color: red\" />\n  <ant-icon\n    type=\"SmileOutline\"\n    className=\"custom-color\" />\n</ant-container>\n\n<ant-container title=\"更多自定义\">\n  <view class=\"custom\">\n    <ant-icon type=\"SmileOutline\" />\n  </view>\n</ant-container>\n\n<ant-container title=\"点击事件\">\n  <view style=\"display: flex\">\n    <ant-icon\n      onTap=\"handleTap\"\n      data-id=\"icon\"\n      type=\"SmileOutline\"\n      style=\"font-size: 50px\" />\n  </view>\n</ant-container>\n"
  },
  {
    "path": "demo/pages/Icon/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Icon\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Icon\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-icon\": \"../../../src/Icon/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Icon/index.less",
    "content": ".custom-color {\n  color: var(--color-brand1);\n}\n\n.custom-size {\n  /// #if ALIPAY\n  font-size: 40px;\n  /// #endif\n\n  /// #if WECHAT\n  font-size: 40px !important;\n  /// #endif\n}\n\n.custom {\n  /// #if ALIPAY\n  font-size: 40px;\n  /// #endif\n\n  color: red;\n  margin: 10px;\n}\n\n/// #if WECHAT\n.custom text {\n  font-size: 40px;\n}\n\n/// #endif\n"
  },
  {
    "path": "demo/pages/Icon/index.ts",
    "content": "Page({\n  handleTap(e) {\n    console.log(e);\n    console.log('detail', e.detail);\n    console.log('e.currentTarget.dataset', e.currentTarget.dataset);\n    console.log('e.target.dataset', e.target.dataset);\n    console.log('e.target.targetDataset', e.target.targetDataset);\n  },\n});\n"
  },
  {
    "path": "demo/pages/ImageUpload/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基本用法\">\n  <ant-uploader\n    onChange=\"onChange\"\n    onUpload=\"{{ onUpload ? onUpload : 'onUpload' }}\"\n    uploadingText=\"上传中……\"\n    uploadfailedText=\"上传失败\" />\n</ant-container>\n<ant-container title=\"初始值\">\n  <ant-uploader\n    defaultFileList=\"{{ defaultFileList }}\"\n    onChange=\"onChange\"\n    onUpload=\"{{ onUpload ? onUpload : 'onUpload' }}\"\n    onPreview=\"onPreview\" />\n</ant-container>\n<ant-container title=\"上传最大限制\">\n  限制只能上传1个\n  <ant-uploader\n    maxCount=\"{{ 1 }}\"\n    onChange=\"onChange\"\n    onUpload=\"{{ onUpload ? onUpload : 'onUpload' }}\" />\n</ant-container>\n<ant-container title=\"自定义移除\">\n  <ant-uploader\n    defaultFileList=\"{{ defaultFileList }}\"\n    onRemove=\"{{ onRemove ? onRemove : 'onRemove' }}\"\n    onChange=\"onChange\"\n    onUpload=\"{{ onUpload ? onUpload : 'onUpload' }}\" />\n</ant-container>\n<ant-container title=\"自定义上传前\">\n  <ant-uploader\n    defaultFileList=\"{{ defaultFileList }}\"\n    onBeforeUpload=\"{{ onBeforeUpload ? onBeforeUpload : 'onBeforeUpload' }}\"\n    onChange=\"onChange\"\n    onUpload=\"{{ onUpload ? onUpload : 'onUpload' }}\" />\n</ant-container>\n\n<ant-container title=\"受控模式\">\n  <ant-uploader\n    fileList=\"{{ fileList }}\"\n    onChange=\"handleControlledChange\"\n    onUpload=\"{{ onUpload ? onUpload : 'onUpload' }}\" />\n</ant-container>\n<ant-container title=\"手动触发上传\">\n  <ant-uploader\n    ref=\"handleUploaderRef\"\n    fileList=\"{{ fileList }}\"\n    onChange=\"handleControlledChange\"\n    onUpload=\"{{ onUpload ? onUpload : 'onUpload' }}\" />\n  <ant-button\n    size=\"medium\"\n    onTap=\"upload\"\n    type=\"primary\">\n    上传\n  </ant-button>\n</ant-container>\n"
  },
  {
    "path": "demo/pages/ImageUpload/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"ImageUpload\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"ImageUpload\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-uploader\": \"../../../src/ImageUpload/index\",\n    \"ant-button\": \"../../../src/Button/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/ImageUpload/index.less",
    "content": ""
  },
  {
    "path": "demo/pages/ImageUpload/index.ts",
    "content": "function onRemove(file) {\n  return new Promise((resolve) => {\n    console.log('即将移除的图片为：', file);\n\n    /// #if WECHAT\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    //@ts-ignore\n    wx.showModal({\n      title: '是否确认移除图片',\n      success: function (e) {\n        resolve(e.confirm);\n      },\n    });\n    /// #endif\n\n    /// #if ALIPAY\n    my.confirm({\n      title: '是否确认移除图片',\n      confirmButtonText: '确定',\n      cancelButtonText: '取消',\n      success: (e) => {\n        resolve(e.confirm);\n      },\n    });\n    /// #endif\n  });\n}\n\nPage({\n  data: {\n    defaultFileList: [\n      {\n        url: 'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*znK_ToIL8rQAAAAAAAAAAAAAARQnAQ',\n        status: 'done',\n      },\n      {\n        url: 'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*kStORbDQxwMAAAAAAAAAAAAAARQnAQ',\n        status: 'done',\n      },\n      {\n        url: 'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*K4Z-RLHuliYAAAAAAAAAAAAAARQnAQ',\n        status: 'done',\n      },\n    ],\n    fileList: [\n      {\n        url: 'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*znK_ToIL8rQAAAAAAAAAAAAAARQnAQ',\n        status: 'done',\n      },\n      {\n        url: 'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*kStORbDQxwMAAAAAAAAAAAAAARQnAQ',\n        status: 'pending',\n      },\n      {\n        url: 'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*K4Z-RLHuliYAAAAAAAAAAAAAARQnAQ',\n        status: 'error',\n      },\n    ],\n    /// #if WECHAT\n    onRemove,\n    onUpload(file) {\n      return new Promise((resolve) => {\n        console.log('上传的图片为：', file);\n        setTimeout(() => {\n          resolve(\n            'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ'\n          );\n        }, 2000);\n      });\n    },\n    onBeforeUpload(localFileList) {\n      console.log('即将上传的图片列表为：', localFileList);\n      localFileList = localFileList.filter((item) => item.size < 10000);\n      console.log('修改上传的图片列表为：', localFileList);\n      return localFileList;\n    },\n    /// #endif\n  },\n  onChange(fileList) {\n    // 这里的数据包括上传失败和成功的图片列表，如果需要筛选出上传成功的图片需要在此处理\n    console.log('图片列表：', fileList);\n  },\n  onPreview(file) {\n    console.log('preview', file);\n  },\n  /// #if ALIPAY\n  onRemove,\n  onUpload(file) {\n    return new Promise((resolve) => {\n      console.log('上传的图片为：', file);\n      setTimeout(() => {\n        resolve(\n          'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ'\n        );\n      }, 2000);\n    });\n  },\n  onBeforeUpload(localFileList) {\n    console.log('即将上传的图片列表为：', localFileList);\n    localFileList = localFileList.filter((item) => item.size < 10000);\n    console.log('修改上传的图片列表为：', localFileList);\n    return localFileList;\n  },\n  /// #endif\n\n  handleControlledChange(fileList) {\n    /// #if WECHAT\n    this.setData({\n      fileList: fileList.detail,\n    });\n    /// #endif\n    /// #if ALIPAY\n    this.setData({\n      fileList,\n    });\n    /// #endif\n  },\n\n  handleUploaderRef(ref) {\n    console.log('handleUploaderRef', ref);\n    /// #if WECHAT\n    this.handleUploaderRef = ref.detail;\n    /// #endif\n    /// #if ALIPAY\n    this.handleUploaderRef = ref;\n    /// #endif\n  },\n  upload() {\n    this.handleUploaderRef.chooseImage();\n  },\n});\n"
  },
  {
    "path": "demo/pages/IndexBar/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<view class=\"base\">\n  <ant-index-bar\n    className=\"indexbar\"\n    items=\"{{items}}\"\n    current=\"{{current}}\"\n    onChange=\"onChange\">\n    <!-- #if ALIPAY -->\n    <view slot-scope=\"props\">\n      <ant-list header=\"{{props.value.label}}\">\n        <ant-list-item\n          a:for=\"{{nameMap[props.value.label]}}\"\n          a:for-item=\"itemX\">\n          {{itemX}}\n        </ant-list-item>\n      </ant-list>\n    </view>\n    <!-- #endif -->\n  </ant-index-bar>\n</view>\n"
  },
  {
    "path": "demo/pages/IndexBar/index.json5",
    "content": "{\n  \"defaultTitle\": \"IndexBar\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  \"pullRefresh\": \"NO\",\n  \"showProgress\": \"NO\",\n  \"allowsBounceVertical\": \"NO\",\n  \"usingComponents\": {\n    \"ant-index-bar\": \"../../../src/IndexBar/index\",\n    \"ant-list\": \"../../../src/List/index\",\n    \"ant-list-item\": \"../../../src/List/ListItem/index\"\n  },\n  \"styleIsolation\": \"shared\"\n}"
  },
  {
    "path": "demo/pages/IndexBar/index.less",
    "content": ".base {\n  width: 100%;\n  height: 80vh;\n}\n.indexbar {\n  position: fixed;\n  right: 10px;\n  top: 20vh;\n}\n"
  },
  {
    "path": "demo/pages/IndexBar/index.ts",
    "content": "/// #if ALIPAY\nconst nameMap = {\n  'A': ['Alice', 'Andy', 'Amanda'],\n  'B': ['Bob', 'Brian', 'Bella'],\n  'C': ['Cathy', 'Carl', 'Chris'],\n  'D': ['David', 'Diana', 'Derek'],\n  'E': ['Eva', 'Evan', 'Eddie'],\n  'F': ['Fiona', 'Frank', 'Fred'],\n  'G': ['George', 'Grace', 'Gavin'],\n  'H': ['Helen', 'Hank', 'Harry'],\n  'I': ['Ivy', 'Ian', 'Isaac'],\n  'J': ['Jack', 'Jill', 'James'],\n  'K': ['Karen', 'Kyle', 'Kurt'],\n  'L': ['Laura', 'Liam', 'Leo'],\n  'M': ['Megan', 'Mike', 'Mona'],\n  'N': ['Nina', 'Nick', 'Nancy'],\n  'O': ['Olivia', 'Oscar', 'Owen'],\n  'P': ['Paul', 'Pam', 'Pete'],\n  'Q': ['Quincy', 'Quinn', 'Queen'],\n  'R': ['Rachel', 'Ryan', 'Rita'],\n  'S': ['Sam', 'Sara', 'Steve'],\n  'T': ['Tom', 'Tina', 'Tim'],\n  'U': ['Uma', 'Ulysses', 'Ursula'],\n  'V': ['Violet', 'Victor', 'Vince'],\n  'W': ['Wendy', 'Will', 'Wanda'],\n  'X': ['Xander', 'Xenia', 'Xavier'],\n  'Y': ['Yara', 'Yuri', 'Yvonne'],\n  'Z': ['Zoe', 'Zach', 'Zane'],\n};\n/// #endif\nPage({\n  data: {\n    /// #if ALIPAY\n    nameMap,\n    /// #endif\n    items: [],\n    current: '',\n  },\n  onLoad() {\n    // 异步获取数据\n    setTimeout(() => {\n      this.setData({\n        /// #if ALIPAY\n        nameMap,\n        /// #endif\n        items: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('').map((u) => {\n          return { label: u, disablePreview: true };\n        }),\n        current: 'S',\n      });\n    }, 1000);\n  },\n  onChange(...args) {\n    /// #if ALIPAY\n    const [item, index] = args;\n    console.log(item, index);\n    this.setData({ current: item.label });\n    /// #endif\n    /// #if WECHAT\n    console.log(...args[0].detail);\n    this.setData({ current: args[0].detail[0].label });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/Input/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基础用法\">\n  <ant-input placeholder=\"请输入内容\" onChange=\"onChange\" />\n</ant-container>\n\n<ant-container title=\"初始值\">\n  <ant-input placeholder=\"请输入内容\" defaultValue=\"这是antd mini小程序组件\" onChange=\"onChange\" />\n</ant-container>\n\n<ant-container title=\"带清除按钮\">\n  <ant-input placeholder=\"请输入内容\" allowClear />\n</ant-container>\n\n<ant-container title=\"带有前缀后缀\">\n  <ant-input placeholder=\"请输入内容\" onChange=\"onChange\" allowClear>\n    <view slot=\"prefix\">￥</view>\n    <view slot=\"suffix\">RMB</view>\n  </ant-input>\n</ant-container>\n\n<ant-container title=\"禁用状态\">\n  <ant-input placeholder=\"被禁用的输入框\" disabled=\"{{ true }}\" />\n</ant-container>\n\n<ant-container title=\"受控模式\">\n  <ant-input\n    controlled=\"{{ true }}\"\n    value=\"{{ value }}\"\n    placeholder=\"请输入内容\"\n    allowClear\n    onChange=\"handleChange\"\n  />\n  <ant-button onTap=\"clear\" inline size=\"small\">\n    clear\n  </ant-button>\n</ant-container>\n\n<ant-container title=\"受控模式-输入金额\">\n  <ant-input\n    placeholder=\"请输入金额\"\n    value=\"{{ money }}\"\n    onChange=\"handleMoney\"\n    type=\"digit\"\n    className=\"input money\"\n    focusClassName=\"border\"\n    allowClear\n  >\n    <view slot=\"prefix\">￥</view>\n    <view slot=\"suffix\">RMB</view>\n  </ant-input>\n</ant-container>\n\n<ant-container title=\"非受控模式通过ref修改input\">\n  <ant-input placeholder=\"请输入内容\" onChange=\"onChange\" ref=\"handleRefInput\" />\n\n  <view>\n    <ant-button inline onTap=\"clearByInputRef\">\n      clear\n    </ant-button>\n  </view>\n</ant-container>\n<ant-container title=\"搜索框\">\n  <view class=\"search-line\">\n    <ant-input\n      placeholder=\"请输入内容\"\n      onChange=\"onChange\"\n      className=\"search-bar\"\n      focusClassName=\"search-bar-focus\"\n      confirm-type=\"search\"\n      allowClear\n      focus\n      onConfirm=\"onConfirm\"\n    >\n      <ant-icon slot=\"prefix\" type=\"SearchOutline\" />\n      <ant-icon slot=\"suffix\" type=\"AudioOutline\" />\n    </ant-input>\n    <view class=\"cancel\">取消</view>\n  </view>\n</ant-container>\n\n<ant-container title=\"Textarea基础用法\">\n  <ant-textarea\n    placeholder=\"请输入内容\"\n    autoHeight\n    onChange=\"onChange\" />\n</ant-container>\n\n<ant-container title=\"初始值\">\n  <ant-textarea\n    placeholder=\"请输入内容\"\n    defaultValue=\"这是antd mini小程序组件\"\n    autoHeight\n    onChange=\"onChange\" />\n</ant-container>\n\n<ant-container title=\"带清除按钮\">\n  <ant-textarea\n    placeholder=\"请输入内容\"\n    autoHeight\n    allowClear />\n</ant-container>\n\n<ant-container title=\"禁用状态\">\n  <ant-textarea\n    placeholder=\"被禁用的输入框\"\n    disabled />\n</ant-container>\n\n<ant-container title=\"受控模式\">\n  <ant-textarea\n    value=\"{{ value }}\"\n    placeholder=\"请输入内容\"\n    allowClear\n    onChange=\"handleChange\" />\n  <ant-button\n    onTap=\"clear\"\n    inline\n    size=\"small\">\n    clear\n  </ant-button>\n</ant-container>\n\n<ant-container title=\"非受控模式通过ref修改input\">\n  <ant-textarea\n    placeholder=\"请输入内容\"\n    allowClear\n    onChange=\"onChange\"\n    ref=\"handleRefTextArea\" />\n  <view>\n    <ant-button\n      inline\n      onTap=\"clearByTextAreaRef\">\n      clear\n    </ant-button>\n  </view>\n</ant-container>\n\n<ant-container title=\"带有border\">\n  <ant-input\n    className=\"custom\"\n    placeholder=\"请输入内容\"\n    onChange=\"onChange\" />\n\n  <ant-input\n    className=\"custom\"\n    placeholder=\"请输入内容\"\n    onChange=\"onChange\">\n    <ant-icon\n      type=\"SearchOutline\"\n      slot=\"prefix\" />\n    <ant-icon\n      type=\"AudioOutline\"\n      slot=\"suffix\" />\n  </ant-input>\n\n  <ant-textarea\n    className=\"custom\"\n    placeholder=\"请输入内容\"\n    onChange=\"onChange\" />\n</ant-container>\n\n<ant-container title=\"自定义背景颜色\">\n  <ant-input\n    className=\"custom-color\"\n    placeholder=\"请输入内容\"\n    onChange=\"onChange\" />\n\n  <ant-textarea\n    className=\"custom-color\"\n    placeholder=\"请输入内容\"\n    onChange=\"onChange\" />\n</ant-container>\n<!-- #if ALIPAY -->\n<!-- 微信不支持  placeholderClassName -->\n<ant-container title=\"自定义 placeholderClassName\">\n  <ant-input\n    placeholderClassName=\"placeholder\"\n    placeholder=\"请输入内容\"\n    onChange=\"onChange\" />\n</ant-container>\n<!-- #endif -->\n\n<ant-container title=\"自定义 placeholderStyle\">\n  <ant-input\n    placeholderStyle=\"color: red;\"\n    placeholder=\"请输入内容\"\n    onChange=\"onChange\" />\n</ant-container>\n\n<ant-container title=\"数字输入框限制\">\n  <ant-input\n    placeholder=\"请输入数字\"\n    type=\"digitpad\"\n    onChange=\"onChange\"\n    max=\"{{100}}\"\n    min=\"{{-10}}\"\n    precision=\"{{2}}\"\n  />\n</ant-container>\n"
  },
  {
    "path": "demo/pages/Input/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Input\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Input\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-input\": \"../../../src/Input/index\",\n    \"ant-button\": \"../../../src/Button/index\",\n    \"ant-container\": \"../../../src/Container/index\",\n    \"ant-icon\": \"../../../src/Icon/index\",\n    \"ant-textarea\": \"../../../src/Input/Textarea/index\",\n  }\n}\n"
  },
  {
    "path": "demo/pages/Input/index.less",
    "content": ".input {\n  padding: 4px 0 4px 0;\n  border-radius: 4px;\n  border: 1px solid transparent;\n  transition: all 1s;\n}\n\n.money {\n  width: 180px;\n}\n\n.border {\n  border-color: var(--color-border);\n}\n\n.ant-button {\n  margin-top: 8px;\n}\n.search-line {\n  display: flex;\n  align-items: center;\n  padding: 16px;\n}\n\n.search-bar {\n  padding: 4px 0 4px 0;\n  border-radius: 4px;\n  border: 1px solid transparent;\n  transition: all 0.4s;\n  flex: 1;\n\n  &-focus {\n    border-color: var(--color-brand1);\n  }\n}\n\n.cancel {\n  color: var(--color-text-primary);\n  margin-left: 8px;\n}\n\n.custom {\n  border: 1px solid var(--color-border-greycard);\n  padding: 4px;\n  border-radius: 4px;\n  margin-bottom: 12px;\n}\n\n.placeholder {\n  color: var(--color-text-primary);\n  opacity: 0.7;\n  font-size: 16px;\n}\n\n.custom-color {\n  margin-bottom: 12px;\n\n  input,\n  textarea {\n    padding: 4px;\n    background: var(--color-background);\n    border-radius: 4px;\n  }\n}\n"
  },
  {
    "path": "demo/pages/Input/index.ts",
    "content": "Page({\n  data: {\n    value: '',\n    money: '',\n  },\n  onChange(value, e) {\n    console.log(value, e);\n  },\n  handleChange(value) {\n    /// #if ALIPAY\n    this.setData({\n      value,\n    });\n    /// #endif\n\n    /// #if WECHAT\n    this.setData({\n      value: value.detail,\n    });\n    /// #endif\n  },\n\n  handleMoney(value) {\n    console.log(value);\n\n    /// #if ALIPAY\n    if (isNaN(Number(value))) {\n      return;\n    }\n    this.setData({\n      money: value,\n    });\n    /// #endif\n\n    /// #if WECHAT\n    if (isNaN(Number(value.detail))) {\n      return;\n    }\n    this.setData({\n      money: value.detail,\n    });\n    /// #endif\n  },\n  clear() {\n    this.setData({\n      value: '',\n    });\n  },\n  handleRefInput(input) {\n    /// #if WECHAT\n    this.input = input.detail;\n    /// #endif\n\n    /// #if ALIPAY\n    this.input = input;\n    /// #endif\n  },\n  handleRefTextArea(textArea) {\n    /// #if WECHAT\n    this.textArea = textArea.detail;\n    /// #endif\n\n    /// #if ALIPAY\n    this.textArea = textArea;\n    /// #endif\n  },\n  clearByInputRef() {\n    this.input.update('');\n  },\n  clearByTextAreaRef() {\n    this.textArea.update('');\n  },\n});\n"
  },
  {
    "path": "demo/pages/InputCustom/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"带有border\">\n  <ant-input\n    className=\"custom\"\n    placeholder=\"请输入内容\"\n    onChange=\"onChange\" />\n\n  <ant-input\n    className=\"custom\"\n    placeholder=\"请输入内容\"\n    onChange=\"onChange\">\n    <ant-icon\n      type=\"SearchOutline\"\n      slot=\"prefix\" />\n    <ant-icon\n      type=\"AudioOutline\"\n      slot=\"suffix\" />\n  </ant-input>\n\n  <ant-textarea\n    className=\"custom\"\n    placeholder=\"请输入内容\"\n    onChange=\"onChange\" />\n</ant-container>\n\n<ant-container title=\"自定义背景颜色\">\n  <ant-input\n    className=\"custom-color\"\n    placeholder=\"请输入内容\"\n    onChange=\"onChange\" />\n\n  <ant-textarea\n    className=\"custom-color\"\n    placeholder=\"请输入内容\"\n    onChange=\"onChange\" />\n</ant-container>\n<!-- #if ALIPAY -->\n<!-- 微信不支持  placeholderClassName -->\n<ant-container title=\"自定义 placeholderClassName\">\n  <ant-input\n    placeholderClassName=\"placeholder\"\n    placeholder=\"请输入内容\"\n    onChange=\"onChange\" />\n</ant-container>\n<!-- #endif -->\n\n<ant-container title=\"自定义 placeholderStyle\">\n  <ant-input\n    placeholderStyle=\"color: red;\"\n    placeholder=\"请输入内容\"\n    onChange=\"onChange\" />\n</ant-container>\n"
  },
  {
    "path": "demo/pages/InputCustom/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Input\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Input\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-input\": \"../../../src/Input/index\",\n    \"ant-textarea\": \"../../../src/Input/Textarea/index\",\n    \"ant-icon\": \"../../../src/Icon/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/InputCustom/index.less",
    "content": "@import \"../../../src/style/themes/color.less\";\n\n.custom {\n  border: 1px solid @COLOR_BORDER;\n  padding: 4px;\n  border-radius: 4px;\n  margin-bottom: 12px;\n}\n\n\n.placeholder {\n  color: @COLOR_TEXT_PRIMARY;\n  opacity: 0.7;\n  font-size: 16px;\n}\n\n.custom-color {\n  margin-bottom: 12px;\n\n  input, textarea {\n    padding: 4px;\n    background: @COLOR_GREY_CARD;\n    border-radius: 4px;\n  }\n  \n}\n\ntextarea {\n  min-height: 100px;\n}"
  },
  {
    "path": "demo/pages/InputCustom/index.ts",
    "content": "Page({\n  data: {\n    value: '',\n    money: '',\n  },\n  onChange(value, e) {\n    console.log(value, e);\n  },\n  handleChange(value) {\n    this.setData({\n      value,\n    });\n  },\n  handleMoney(value) {\n    console.log(value);\n    if (isNaN(Number(value))) {\n      return;\n    }\n    this.setData({\n      money: value,\n    })\n  },\n  clear() {\n    this.setData({\n      value: '',\n    });\n  },\n  handleRef(input) {\n    this.input = input;\n  },\n  clearByInputRef() {\n    this.input.update('');\n  }\n});\n"
  },
  {
    "path": "demo/pages/InputSearchBar/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<view class=\"container\">\n  <ant-input\n    placeholder=\"请输入内容\"\n    onChange=\"onChange\"\n    className=\"search-bar\"\n    focusClassName=\"search-bar-focus\"\n    confirm-type=\"search\"\n    allowClear\n    focus\n    onConfirm=\"onConfirm\">\n    <ant-icon\n      slot=\"prefix\"\n      type=\"SearchOutline\" />\n\n    <ant-icon\n      slot=\"suffix\"\n      type=\"AudioOutline\" />\n  </ant-input>\n  <view class=\"cancel\">取消</view>\n</view>\n"
  },
  {
    "path": "demo/pages/InputSearchBar/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Input\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Input\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-input\": \"../../../src/Input/index\",\n    \"ant-icon\": \"../../../src/Icon/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/InputSearchBar/index.less",
    "content": "@import \"../../../src/style/themes/color.less\";\n\n.container {\n  display: flex;\n  align-items: center;\n  padding: 16px;\n}\n\n.search-bar {\n  padding: 4px 0 4px 0;\n  border-radius: 4px;\n  border: 1px solid transparent;\n  transition: all 0.4s;\n  flex: 1;\n\n  &-focus {\n    border-color: @COLOR_BRAND1;\n  }\n}\n\n.cancel {\n  color: @COLOR_TEXT_PRIMARY;\n  margin-left: 8px;\n}\n\n"
  },
  {
    "path": "demo/pages/InputSearchBar/index.ts",
    "content": "Page({\n  onChange(value, e) {\n    console.log(value, e);\n  },\n  onConfirm(value) {\n    my.alert({\n      content: value,\n    });\n  }\n});\n"
  },
  {
    "path": "demo/pages/InputTextarea/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基础用法\">\n  <ant-textarea\n    placeholder=\"请输入内容\"\n    autoHeight\n    onChange=\"onChange\" />\n</ant-container>\n\n<ant-container title=\"初始值\">\n  <ant-textarea\n    placeholder=\"请输入内容\"\n    defaultValue=\"这是antd mini小程序组件\"\n    autoHeight\n    onChange=\"onChange\" />\n</ant-container>\n\n<ant-container title=\"带清除按钮\">\n  <ant-textarea\n    placeholder=\"请输入内容\"\n    autoHeight\n    allowClear />\n</ant-container>\n\n<ant-container title=\"禁用状态\">\n  <ant-textarea\n    placeholder=\"被禁用的输入框\"\n    disabled />\n</ant-container>\n\n<ant-container title=\"受控模式\">\n  <ant-textarea\n    value=\"{{ value }}\"\n    placeholder=\"请输入内容\"\n    allowClear\n    onChange=\"handleChange\" />\n  <ant-button\n    onTap=\"clear\"\n    inline\n    size=\"small\">\n    clear\n  </ant-button>\n</ant-container>\n\n<ant-container title=\"非受控模式通过ref修改input\">\n  <ant-textarea\n    placeholder=\"请输入内容\"\n    allowClear\n    onChange=\"onChange\"\n    ref=\"handleRef\" />\n  <view>\n    <ant-button\n      inline\n      onTap=\"clearByInputRef\">\n      clear\n    </ant-button>\n  </view>\n</ant-container>\n"
  },
  {
    "path": "demo/pages/InputTextarea/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Input\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Input\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-textarea\": \"../../../src/Input/Textarea/index\",\n    \"ant-button\": \"../../../src/Button/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/InputTextarea/index.less",
    "content": "@import \"../../../src/style/themes/color.less\";\n\ntextarea {\n  min-height: 100px;\n}\n\n.ant-button {\n  margin-top: 8px;\n}\n"
  },
  {
    "path": "demo/pages/InputTextarea/index.ts",
    "content": "import { resolveEventValue } from './utils';\n\nPage({\n  data: {\n    value: '',\n    money: '',\n  },\n  onChange(value, e) {\n    console.log(value, e);\n  },\n  handleChange(value) {\n    this.setData({\n      value: resolveEventValue(value),\n    });\n  },\n  handleMoney(value) {\n    console.log(value);\n    if (isNaN(Number(resolveEventValue(value)))) {\n      return;\n    }\n    this.setData({\n      money: resolveEventValue(value),\n    });\n  },\n  clear() {\n    this.setData({\n      value: '',\n    });\n  },\n  handleRef(input) {\n    this.input = resolveEventValue(input);\n  },\n  clearByInputRef() {\n    this.input.update('');\n  },\n});\n"
  },
  {
    "path": "demo/pages/InputTextarea/utils.ts",
    "content": "export function resolveEventValue(event) {\n  if (typeof event.detail !== 'undefined') {\n    return event.detail;\n  }\n  return event;\n}\n"
  },
  {
    "path": "demo/pages/List/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<view style=\"padding-bottom: 100rpx;\">\n  <ant-list\n    header=\"基础用法\"\n    radius=\"{{ radius }}\">\n    <ant-list-item>1</ant-list-item>\n    <ant-list-item>2</ant-list-item>\n    <ant-list-item>3</ant-list-item>\n  </ant-list>\n  <ant-list\n    header=\"可点击列表\"\n    radius=\"{{ radius }}\">\n    <ant-list-item\n      image=\"PayCircleOutline\"\n      onTap=\"handleTap\"\n      brief=\"总资产数量\"\n      extra=\"详细信息\"\n      data-info=\"总资产\">\n      总资产\n    </ant-list-item>\n    <ant-list-item\n      image=\"SetOutline\"\n      arrow=\"right\"\n      extraBrief=\"详细信息\"\n      catchTap=\"catchTap\"\n      data-info=\"设置\">\n      设置\n    </ant-list-item>\n    <ant-list-item\n      image=\"https://gw.alipayobjects.com/mdn/rms_ce4c6f/afts/img/A*XMCgSYx3f50AAAAAAAAAAABkARQnAQ\"\n      onTap=\"handleTap\"\n      brief=\"图片描述\"\n      data-info=\"图片\">\n      图片\n      <ant-button slot=\"extra\" size=\"small\" inline>胶囊按钮</ant-button>\n    </ant-list-item>\n  </ant-list>\n  <ant-list\n    radius=\"{{ radius }}\"\n    header=\"复杂布局\">\n    <!-- #if ALIPAY -->\n    <ant-list-item>\n      圆角\n      <ant-switch\n        slot=\"extra\"\n        checked=\"{{ radius }}\"\n        onChange=\"handleSetRadius\" />\n    </ant-list-item>\n    <!-- #endif -->\n    <ant-list-item\n      extraBrief=\"未开启\"\n      arrow=\"right\">\n      大字号模式\n    </ant-list-item>\n    <ant-list-item\n      brief=\"管理已授权的产品和设备\"\n      arrow=\"{{ item.arrow }}\">\n      授权管理\n    </ant-list-item>\n    <!-- #if ALIPAY -->\n    <ant-list-item\n      title=\"标题\"\n      brief=\"描述信息\"\n      extra=\"次要信息\"\n      extraBrief=\"次要辅助信息\"\n      onTap=\"handleTap\"\n      data-info=\"三行列表\"\n      arrow=\"right\">\n      三行列表\n      <ant-icon\n        slot=\"image\"\n        type=\"AlipaySquareFill\"\n        style=\"font-size: 80rpx;\" />\n    </ant-list-item>\n    <!-- #endif -->\n  </ant-list>\n  <ant-list\n    radius=\"{{ radius }}\"\n    header=\"禁用状态\">\n    <ant-list-item\n      disabled\n      image=\"UnorderedListOutline\"\n      arrow=\"right\"\n      data-info=\"账单\">\n      账单\n    </ant-list-item>\n    <ant-list-item\n      disabled\n      image=\"PayCircleOutline\"\n      arrow=\"right\"\n      data-info=\"总资产\">\n      总资产\n    </ant-list-item>\n  </ant-list>\n</view>\n"
  },
  {
    "path": "demo/pages/List/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"List\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"List\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-list\": \"../../../src/List/index\",\n    \"ant-list-item\": \"../../../src/List/ListItem/index\",\n    \"ant-icon\": \"../../../src/Icon/index\",\n    \"ant-button\": \"../../../src/Button/index\",\n    \"ant-switch\": \"../../../src/Switch/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/List/index.less",
    "content": ""
  },
  {
    "path": "demo/pages/List/index.ts",
    "content": "Page({\n  data: {\n    radius: false,\n  },\n  handleTap(e) {\n    /// #if ALIPAY\n    my.alert({\n      title: 'onTap',\n      content: e.currentTarget.dataset.info,\n    });\n    /// #endif\n\n    console.log(e);\n  },\n  catchTap(e) {\n    /// #if ALIPAY\n    my.alert({\n      title: 'catchTap',\n      content: e.currentTarget.dataset.info,\n    });\n    /// #endif\n\n    console.log(e);\n  },\n  handleSetRadius(checked) {\n    this.setData({\n      radius: checked,\n    });\n  },\n});\n"
  },
  {
    "path": "demo/pages/Loading/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<view class=\"page\">\n  <ant-container\n    title=\"基础用法-spin\"\n    className=\"container\">\n    <view class=\"list\">\n      <ant-loading type=\"spin\" />\n    </view>\n  </ant-container>\n\n  <ant-container\n    title=\"基础用法-mini\"\n    className=\"container\">\n    <view class=\"list\">\n      <ant-loading type=\"mini\" />\n    </view>\n  </ant-container>\n\n  <ant-container\n    title=\"spin大小\"\n    className=\"container\">\n    <view class=\"list\">\n      <ant-loading\n        type=\"spin\"\n        size=\"x-large\" />\n      <ant-loading\n        type=\"spin\"\n        size=\"large\" />\n      <ant-loading\n        type=\"spin\"\n        size=\"medium\" />\n      <ant-loading\n        type=\"spin\"\n        size=\"small\" />\n    </view>\n  </ant-container>\n\n  <ant-container\n    title=\"自定义颜色\"\n    className=\"container\">\n    <view class=\"list\">\n      <ant-loading\n        type=\"mini\"\n        color=\"#1677ff\" />\n      <ant-loading color=\"#1677ff\" />\n      <ant-loading color=\"#34B368\" />\n      <ant-loading color=\"#ff8f1f\" />\n      <ant-loading color=\"#ff0000\" />\n    </view>\n  </ant-container>\n\n  <ant-container\n    title=\"自定义大小\"\n    className=\"container\">\n    <view class=\"list\">\n      <ant-loading style=\"width: 40px; height: 40px\" />\n      <ant-loading style=\"width: 30px; height: 30px\" />\n      <ant-loading className=\"custom-size\" />\n    </view>\n  </ant-container>\n</view>\n"
  },
  {
    "path": "demo/pages/Loading/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Loading\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Loading\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  usingComponents: {\n    \"ant-loading\": \"../../../src/Loading/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Loading/index.less",
    "content": ".page {\n  padding: 24rpx 24rpx 500rpx 24rpx;\n\n  /// #if WECHAT\n  box-sizing: border-box;\n  /// #endif\n}\n\n.container {\n  padding-bottom: 24px;\n}\n\n.list {\n  display: flex;\n  align-items: center;\n  background: #000;\n}\n\n.custom-size {\n  width: 20px;\n  height: 20px;\n}\n"
  },
  {
    "path": "demo/pages/Loading/index.ts",
    "content": "Page({\n\n});\n"
  },
  {
    "path": "demo/pages/Modal/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-modal\n  content=\"人在天边月上明\"\n  visible=\"{{ basicVisible }}\"\n  onClose=\"handleClose\"\n  primaryButtonText=\"我知道了\"\n  onPrimaryButtonTap=\"handlePrimaryButtonTap\" />\n<ant-modal\n  title=\"带标题的弹窗\"\n  content=\"人在天边月上明\"\n  visible=\"{{ withTitleVisible }}\"\n  onClose=\"handleClose\"\n  primaryButtonText=\"我知道了\"\n  onPrimaryButtonTap=\"handlePrimaryButtonTap\" />\n<ant-modal\n  title=\"确定删除吗？\"\n  content=\"删除后无法恢复\"\n  visible=\"{{ basicTwoVisible }}\"\n  onClose=\"handleClose\"\n  primaryButtonText=\"确定\"\n  secondaryButtonText=\"取消\"\n  onPrimaryButtonTap=\"handlePrimaryButtonTap\"\n  onSecondaryButtonTap=\"handleSecondaryButtonTap\" />\n<ant-modal\n  title=\"标题\"\n  content=\"人在天边月上明\"\n  visible=\"{{ basicThreeVisible }}\"\n  onClose=\"handleClose\"\n  primaryButtonText=\"主按钮\"\n  secondaryButtonText=\"更多\"\n  cancelButtonText=\"取消\"\n  onPrimaryButtonTap=\"handlePrimaryButtonTap\"\n  onSecondaryButtonTap=\"handleSecondaryButtonTap\"\n  onCancelButtonTap=\"handleCancelButtonTap\" />\n<ant-modal\n  title=\"强调模式\"\n  content=\"主操作按钮是Button，右上角可有关闭按钮，是用来强调让用户去注意到主操作\"\n  type=\"focus\"\n  visible=\"{{ focusOneVisible }}\"\n  onClose=\"handleClose\"\n  primaryButtonText=\"我知道了\"\n  onPrimaryButtonTap=\"handlePrimaryButtonTap\" />\n<ant-modal\n  title=\"强调模式\"\n  content=\"主操作按钮是Button，右上角可有关闭按钮，是用来强调让用户去注意到主操作\"\n  type=\"focus\"\n  visible=\"{{ focusTwoVisible }}\"\n  onClose=\"handleClose\"\n  primaryButtonText=\"我知道了\"\n  secondaryButtonText=\"辅助操作\"\n  onPrimaryButtonTap=\"handlePrimaryButtonTap\"\n  onSecondaryButtonTap=\"handleSecondaryButtonTap\" />\n<ant-modal\n  title=\"强调模式\"\n  content=\"主操作按钮是Button，右上角可有关闭按钮，是用来强调让用户去注意到主操作\"\n  type=\"focus\"\n  visible=\"{{ focusThreeVisible }}\"\n  onClose=\"handleClose\"\n  primaryButtonText=\"我知道了\"\n  secondaryButtonText=\"辅助操作\"\n  cancelButtonText=\"取消\"\n  onPrimaryButtonTap=\"handlePrimaryButtonTap\"\n  onSecondaryButtonTap=\"handleSecondaryButtonTap\"\n  onCancelButtonTap=\"handleCancelButtonTap\" />\n<ant-modal\n  title=\"确定删除吗？\"\n  content=\"删除后无法恢复\"\n  visible=\"{{ customVisible }}\"\n  onClose=\"handleClose\"\n  primaryButtonText=\"删除\"\n  primaryButtonStyle=\"color:red;\"\n  secondaryButtonText=\"取消\"\n  onPrimaryButtonTap=\"handlePrimaryButtonTap\"\n  onSecondaryButtonTap=\"handleSecondaryButtonTap\" />\n<!-- #if ALIPAY -->\n<ant-modal\n  visible=\"{{ customBodyVisible }}\"\n  onClose=\"handleClose\">\n  <view class=\"body\">\n    <image\n      mode=\"scaleToFill\"\n      src=\"https://mdn.alipayobjects.com/huamei_yujk1o/afts/img/A*xYjqRJiKsvoAAAAAAAAAAAAADuaJAQ/original\"\n      class=\"bodyImg\" />\n    <view class=\"bodyAction\">\n      <ant-icon\n        type=\"CloseCircleOutline\"\n        onTap=\"handleClose\" />\n    </view>\n  </view>\n</ant-modal>\n<!-- #endif -->\n\n<ant-container\n  title=\"基础用法\"\n  className=\"list\">\n  <ant-button\n    data-field=\"basicVisible\"\n    onTap=\"handleOpen\">\n    最简单的弹框\n  </ant-button>\n  <ant-button\n    data-field=\"withTitleVisible\"\n    onTap=\"handleOpen\">\n    带有标题\n  </ant-button>\n  <ant-button\n    data-field=\"basicTwoVisible\"\n    onTap=\"handleOpen\">\n    带辅助按钮\n  </ant-button>\n  <ant-button\n    data-field=\"basicThreeVisible\"\n    onTap=\"handleOpen\">\n    带辅助和取消按钮\n  </ant-button>\n</ant-container>\n<ant-container\n  title=\"强调模式\"\n  className=\"list\">\n  <ant-button\n    data-field=\"focusOneVisible\"\n    onTap=\"handleOpen\">\n    只有主按钮\n  </ant-button>\n  <ant-button\n    data-field=\"focusTwoVisible\"\n    onTap=\"handleOpen\">\n    带辅助按钮\n  </ant-button>\n  <ant-button\n    data-field=\"focusThreeVisible\"\n    onTap=\"handleOpen\">\n    带辅助和取消按钮\n  </ant-button>\n</ant-container>\n<ant-container\n  title=\"自定义\"\n  className=\"list\">\n  <ant-button\n    data-field=\"customVisible\"\n    onTap=\"handleOpen\">\n    自定义按钮样式\n  </ant-button>\n  <!-- #if ALIPAY -->\n  <ant-button\n    data-field=\"customBodyVisible\"\n    onTap=\"handleOpen\">\n    完全自定义内容区\n  </ant-button>\n  <!-- #endif -->\n</ant-container>\n"
  },
  {
    "path": "demo/pages/Modal/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Modal\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Modal\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-modal\": \"../../../src/Modal/index\",\n    \"ant-button\": \"../../../src/Button/index\",\n    \"ant-icon\": \"../../../src/Icon/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Modal/index.less",
    "content": ".bodyImg {\n  width: 424rpx;\n  height: 528rpx;\n  border-radius: 8rpx;\n}\n.bodyAction {\n  padding-top: 32rpx;\n  font-size: 48rpx;\n  text-align: center;\n  color: #fff;\n}\n\n.list .ant-button {\n  margin-bottom: 8px;\n}\n"
  },
  {
    "path": "demo/pages/Modal/index.ts",
    "content": "Page({\n  data: {\n    basicVisible: false,\n    withTitleVisible: false,\n    basicTwoVisible: false,\n    basicThreeVisible: false,\n    focusOneVisible: false,\n    focusTwoVisible: false,\n    focusThreeVisible: false,\n    customVisible: false,\n    customBodyVisible: false,\n  },\n  handleOpen(e) {\n    const { field } = e.target.dataset;\n    this.setData({ [field]: true });\n  },\n  handleClose() {\n    this.setData({\n      basicVisible: false,\n      withTitleVisible: false,\n      basicTwoVisible: false,\n      basicThreeVisible: false,\n      focusOneVisible: false,\n      focusTwoVisible: false,\n      focusThreeVisible: false,\n      customVisible: false,\n      customBodyVisible: false,\n    });\n  },\n  handlePrimaryButtonTap() {\n    this.handleClose();\n    this.showToast('点击主要按钮');\n  },\n  handleSecondaryButtonTap() {\n    this.handleClose();\n    this.showToast('点击辅助按钮');\n  },\n  handleCancelButtonTap() {\n    this.handleClose();\n    this.showToast('点击取消按钮');\n  },\n\n  showToast(content: string) {\n    /// #if ALIPAY\n    my.showToast({ content, duration: 1000 });\n    /// #endif\n\n    /// #if WECHAT\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    //@ts-ignore\n    wx.showToast({\n      title: content,\n    });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/NoticeBar/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基础用法\">\n  <block\n    a:for=\"{{ typeList }}\"\n    a:for-index=\"index\"\n    a:for-item=\"item\">\n    <ant-notice\n      style=\"margin-bottom: 8px\"\n      type=\"{{ item }}\">\n      {{ item }}\n    </ant-notice>\n  </block>\n</ant-container>\n\n<ant-container title=\"可关闭通告栏\">\n  <ant-notice\n    onTap=\"handleClose\"\n    mode=\"closeable\">\n    这条通知可以关闭\n  </ant-notice>\n</ant-container>\n\n<ant-container title=\"多行展示\">\n  <block\n    a:for=\"{{ typeList }}\"\n    a:for-index=\"index\"\n    a:for-item=\"item\">\n    <ant-notice\n      type=\"{{ item }}\"\n      style=\"margin-bottom: 8px\"\n      onTap=\"handleTapLink\"\n      ellipsisRow=\"{{index + 1}}\"\n      >\n      文本溢出时，开启换行。文字不够继续添加文字凑数。文字不够继续添加文字凑数.文字不够继续添加文字凑数.文字不够继续添加文字凑数\n    </ant-notice>\n  </block>\n</ant-container>\n\n<ant-container title=\"可滚动通告栏\">\n  <block\n    a:for=\"{{ typeList }}\"\n    a:for-index=\"index\"\n    a:for-item=\"item\">\n    <ant-notice\n      type=\"{{ item }}\"\n      style=\"margin-bottom: 8px\"\n      enableMarquee=\"{{ true }}\"\n      loop=\"{{ true }}\"\n      onTap=\"handleTapLink\"\n      mode=\"link\">\n      文本溢出时，开启循环滚动。文字不够继续添加文字凑数。\n    </ant-notice>\n  </block>\n</ant-container>\n\n<ant-container title=\"可滚动通告栏(不循环)\">\n  <block\n    a:for=\"{{ typeList }}\"\n    a:for-index=\"index\"\n    a:for-item=\"item\">\n    <ant-notice\n      type=\"{{ item }}\"\n      style=\"margin-bottom: 8px\"\n      enableMarquee=\"{{ true }}\"\n      onTap=\"handleTapLink\"\n      mode=\"link\">\n      文本溢出时，开启循环滚动。文字不够继续添加文字凑数。\n    </ant-notice>\n  </block>\n</ant-container>\n\n<ant-container title=\"自定义通告栏\">\n  <!-- #if ALIPAY -->\n  <ant-notice style=\"margin-bottom: 8px\">\n    不展示图标\n    <view slot=\"icon\" />\n  </ant-notice>\n  <!-- #endif -->\n\n  <!-- #if WECHAT -->\n  <ant-notice style=\"margin-bottom: 8px\" slotIcon>\n    不展示图标\n    <view slot=\"icon\"/>\n  </ant-notice>\n  <!-- #endif -->\n\n  <ant-notice\n    type=\"primary\"\n    icon=\"GlobalOutline\"\n    style=\"margin-bottom: 8px\"\n    mode=\"link\">\n    自定义左侧图标\n  </ant-notice>\n\n  <ant-notice\n    type=\"primary\"\n    icon=\"https://gw.alipayobjects.com/mdn/rms_ce4c6f/afts/img/A*XMCgSYx3f50AAAAAAAAAAABkARQnAQ\"\n    style=\"margin-bottom: 8px\"\n    mode=\"link\">\n    自定义左侧图标图片\n  </ant-notice>\n\n  <ant-notice\n    mode=\"link\"\n    style=\"margin-bottom: 8px\"\n    onTap=\"handleTapLink\">\n    自定义右侧按钮\n    <view\n      slot=\"extra\"\n      class=\"extra\">\n      <view onTap=\"handleTapAction\">不再提示</view>\n      <view onTap=\"handleTapAction\">查看详情</view>\n    </view>\n  </ant-notice>\n</ant-container>\n"
  },
  {
    "path": "demo/pages/NoticeBar/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Notice\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Notice\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-notice\": \"../../../src/NoticeBar/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/NoticeBar/index.less",
    "content": ".extra {\n  display: flex;\n}\n.extra > view {\n  white-space: nowrap;\n  margin-left: 8rpx;\n}\n"
  },
  {
    "path": "demo/pages/NoticeBar/index.ts",
    "content": "Page({\n  data: {\n    typeList: ['default', 'error', 'info', 'primary'],\n  },\n  handleTapAction() {\n    this.showToast('点击按钮');\n  },\n  handleTapLink() {\n    this.showToast('link 类型被点击了');\n  },\n  handleClose() {\n    this.showToast('点击关闭');\n  },\n  showToast(content: string) {\n    /// #if ALIPAY\n    my.showToast({\n      content: content,\n      duration: 1000,\n    });\n    /// #endif\n\n    /// #if WECHAT\n    //@ts-ignore\n    wx.showToast({\n      title: content,\n    });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/NumberInput/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基础用法\">\n  <ant-number-input\n    title=\"输入金额\"\n    value=\"{{value1}}\"\n    onChange=\"handleChange1\"\n  />\n</ant-container>\n\n<ant-container title=\"快捷输入\">\n  <ant-number-input\n    title=\"提现金额\"\n    linkText=\"交易明细\"\n    value=\"{{value2}}\"\n    quickAmounts=\"{{quickAmounts}}\"\n    onChange=\"handleChange2\"\n    onLinkTap=\"handleLinkTap\"\n  />\n</ant-container>\n\n<ant-container title=\"自定义slot\">\n  <ant-number-input\n    title=\"提现金额\"\n    value=\"{{value3}}\"\n    maxValue=\"{{maxValue}}\"\n    onChange=\"handleChange3\"\n    ref=\"handleRef\"\n  >\n    <view slot=\"footer\">剩余额度：{{maxValue}} <text class=\"link-text\" onTap=\"handleAllWithdraw\">全部提现</text></view>\n  </ant-number-input>\n</ant-container>\n"
  },
  {
    "path": "demo/pages/NumberInput/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"NumberInput\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"NumberInput\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-number-input\": \"../../../src/NumberInput/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/NumberInput/index.less",
    "content": ".link-text {\n  padding-left: 10rpx;\n  color: #165dff;\n  text-decoration: underline;\n}\n"
  },
  {
    "path": "demo/pages/NumberInput/index.ts",
    "content": "Page({\n  data: {\n    value1: '',\n    value2: '',\n    value3: '',\n    maxValue: 5800,\n    quickAmounts: ['500', '1000', '2000'],\n  },\n\n  handleChange1(val) {\n    let value = val;\n    /// #if WECHAT\n    value = val.detail;\n    /// #endif\n    console.log(value);\n    this.setData({\n      value1: value,\n    });\n  },\n  handleChange2(val) {\n    let value = val;\n    /// #if WECHAT\n    value = val.detail;\n    /// #endif\n    console.log(value);\n    this.setData({\n      value2: value,\n    });\n  },\n  handleChange3(val) {\n    let value = val;\n    /// #if WECHAT\n    value = val.detail;\n    /// #endif\n    console.log(value);\n    if (Number(value) > this.data.maxValue) {\n      my.alert({\n        title: '提示',\n        content: `提现金额不能大于${this.data.maxValue}`,\n      });\n      return;\n    }\n    this.setData({\n      value3: value,\n    });\n  },\n  handleLinkTap() {\n    /// #if ALIPAY\n    my.alert({\n      content: '交易明细',\n    });\n    /// #endif\n    /// #if WECHAT\n    // @ts-ignore\n    wx.showToast({\n      title: '交易明细',\n    });\n    /// #endif\n  },\n  handleAllWithdraw() {\n    this.input.update(this.data.maxValue);\n  },\n  handleRef(input) {\n    /// #if WECHAT\n    this.input = input.detail;\n    /// #endif\n\n    /// #if ALIPAY\n    this.input = input;\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/NumberKeyboard/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-list header=\"基础使用\">\n  <ant-list-item onTap=\"onTap\">默认键盘</ant-list-item>\n  <ant-number-keyboard\n    visible=\"{{ visible }}\"\n    onClose=\"onTap\" />\n\n  <ant-list-item onTap=\"onTap1\">没有小数点</ant-list-item>\n  <ant-number-keyboard\n    point=\"{{ false }}\"\n    visible=\"{{ visible1 }}\"\n    onClose=\"onTap1\" />\n\n  <ant-list-item onTap=\"onTap2\">带确认按钮</ant-list-item>\n  <ant-number-keyboard\n    confirmText=\"确认\"\n    visible=\"{{ visible2 }}\"\n    onClose=\"onTap2\" />\n\n  <ant-list-item onTap=\"onTap3\">带关闭箭头</ant-list-item>\n  <ant-number-keyboard\n    closeable=\"{{ true }}\"\n    visible=\"{{ visible3 }}\"\n    onClose=\"onTap3\" />\n\n  <ant-list-item onTap=\"onTap4\">乱序键盘</ant-list-item>\n  <ant-number-keyboard\n    random=\"{{ true }}\"\n    visible=\"{{ visible4 }}\"\n    onClose=\"onTap4\" />\n</ant-list>\n<!-- #if ALIPAY -->\n<ant-list header=\"自定义按钮\">\n  <ant-list-item onTap=\"onTap6\">自定义标题</ant-list-item>\n  <ant-number-keyboard\n    visible=\"{{ visible6 }}\"\n    onClose=\"onTap6\">\n    <view\n      slot=\"header\"\n      class=\"number-keyboard-header\">\n      支付宝安全键盘\n    </view>\n  </ant-number-keyboard>\n  <ant-list-item onTap=\"onTap7\">自定义确认按钮</ant-list-item>\n  <ant-number-keyboard\n    confirmText=\"确认\"\n    visible=\"{{ visible7 }}\"\n    onClose=\"onTap7\">\n    <view\n      slot=\"confirm\"\n      class=\"number-keyboard-confirm\">\n      <ant-icon type=\"DownOutline\" />\n    </view>\n  </ant-number-keyboard>\n</ant-list>\n<!-- #endif -->\n\n<ant-list header=\"数字输入框示例\" className=\"number-input\">\n  <ant-list-item >\n    <view\n      class=\"number-content {{ value8 ? '' : 'number-placeholder' }}\"\n      catchTap=\"onNumberFocus\">\n      <!-- display: inline -->\n      <text a:if=\"{{ value8 }}\">{{ value8 }}</text>\n      <!-- display: inline -->\n      <text\n        a:else\n        class=\"number-content-tip\"\n        >0.00</text\n      >\n      <view\n        a:if=\"{{ visible8 }}\"\n        class=\"number-light\"\n        style=\"{{ value8 ? 'position: static;' : 'position: absolute;' }}\" />\n    </view>\n  </ant-list-item>\n  <ant-number-keyboard\n    visible=\"{{ visible8 }}\"\n    point=\"{{ false }}\"\n    closeable=\"{{ true }}\"\n    value=\"{{ value8 }}\"\n    onChange=\"onChange8\"\n    onClose=\"onClose8\" />\n</ant-list>\n\n<ant-list header=\"数字键盘示例：验证码\" className=\"verify-code\">\n  <ant-list-item>\n    <view\n      class=\"number-code\"\n      catchTap=\"onCodeFocus9\">\n      <block\n        a:for=\"{{ 4 }}\"\n        a:for-index=\"index\"\n        a:for-item=\"item\">\n        <view\n          class=\"number-code-view {{ visible9 && value9.length === index ? 'number-code-border' : '' }}\">\n          {{ value9[index] || '' }}\n          <view\n            a:if=\"{{ visible9 && value9.length === index }}\"\n            class=\"number-code-tip\" />\n        </view>\n      </block>\n    </view>\n  </ant-list-item>\n  <ant-number-keyboard\n    visible=\"{{ visible9 }}\"\n    point=\"{{ false }}\"\n    closeable=\"{{ true }}\"\n    value=\"{{ value9 }}\"\n    onChange=\"onChange9\"\n    onClose=\"onClose9\" />\n</ant-list>\n"
  },
  {
    "path": "demo/pages/NumberKeyboard/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"NumberKeyboard\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"NumberKeyboard\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-number-keyboard\": \"../../../src/NumberKeyboard/index\",\n    \"ant-list\": \"../../../src/List/index\",\n    \"ant-list-item\": \"../../../src/List/ListItem/index\",\n    \"ant-icon\": \"../../../src/Icon/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/NumberKeyboard/index.less",
    "content": "@import '../../../src/style/themes/theme-mode.less';\npage {\n  padding-bottom: 500px;\n}\n.number-keyboard-header {\n  border-top: 1px solid var(--color-background);\n  border-bottom: 1px solid var(--color-background);\n  line-height: 40px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background-color: var(--color-card);\n}\n\n.number-keyboard-confirm {\n  width: 100%;\n  height: 100%;\n  background-color: var(--color-card);\n  color: #333;\n  font-size: 26px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.number-input {\n  @keyframes number-input-cursor {\n    0% {\n      opacity: 0;\n    }\n\n    50% {\n      opacity: 1;\n    }\n\n    100% {\n      opacity: 0;\n    }\n  }\n\n  .number-content {\n    height: 24px;\n    display: flex;\n    align-items: center;\n    justify-content: flex-start;\n    width: calc(100% - 24px);\n    position: relative;\n  }\n\n  .number-content-tip {\n    position: absolute;\n    left: 2px;\n  }\n\n  .number-placeholder {\n    color: #e5e5e5;\n  }\n\n  .number-light {\n    margin-left: 2px;\n    height: calc(100% - 4px);\n    width: 2px;\n    border-radius: 2px;\n    display: inline-block;\n    vertical-align: middle;\n    background: #1677ff;\n    animation: number-input-cursor 1s step-start infinite;\n  }\n}\n\n.verify-code {\n  @keyframes number-input-cursor {\n    0% {\n      opacity: 0;\n    }\n    50% {\n      opacity: 1;\n    }\n    100% {\n      opacity: 0;\n    }\n  }\n\n  .number-code {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    justify-content: center;\n    width: 100%;\n    height: 24px;\n  }\n\n  .number-code-view {\n    width: 40px;\n    height: 40px;\n    line-height: 40px;\n    font-size: 24px;\n    text-align: center;\n    border: 1px solid #e5e5e5;\n    border-radius: 4px;\n    margin-right: 12px;\n  }\n\n  .number-code-view:last-child {\n    margin-right: 0;\n  }\n\n  .number-code-tip {\n    height: calc(100% - 20px);\n    width: 2px;\n    border-radius: 2px;\n    display: inline-block;\n    background: #1677ff;\n    vertical-align: middle;\n    animation: number-input-cursor 1s step-start infinite;\n  }\n\n  .number-code-border {\n    border: 1px solid #1677ff;\n    box-shadow: 0 0 2px 0 #1677ff;\n  }\n}\n"
  },
  {
    "path": "demo/pages/NumberKeyboard/index.ts",
    "content": "Page({\n  data: {\n    visible: false,\n    visible1: false,\n    visible2: false,\n    visible3: false,\n    visible4: false,\n    visible5: false,\n    visible6: false,\n    visible7: false,\n    value8: '',\n  },\n  // 默认键盘\n  onTap() {\n    this.setData({ visible: !this.data.visible });\n  },\n  // 没有小数点\n  onTap1() {\n    this.setData({ visible1: !this.data.visible1 });\n  },\n  // 带确认按钮\n  onTap2() {\n    this.setData({ visible2: !this.data.visible2 });\n  },\n  // 带向下箭头\n  onTap3() {\n    this.setData({ visible3: !this.data.visible3 });\n  },\n  // 乱序键盘\n  onTap4() {\n    this.setData({ visible4: !this.data.visible4 });\n  },\n  // 带标题\n  onTap5() {\n    this.setData({ visible5: !this.data.visible5 });\n  },\n  // 自定义标题\n  onTap6() {\n    this.setData({ visible6: !this.data.visible6 });\n  },\n  // 自定义确认按钮\n  onTap7() {\n    this.setData({ visible7: !this.data.visible7 });\n  },\n  onNumberFocus() {\n    this.setData({ visible8: true });\n  },\n  onChange8(e) {\n    /// #if WECHAT\n    e = e.detail;\n    /// #endif\n    \n    this.setData({ value8: e ? parseFloat(e) : '' });\n  },\n  onClose8() {\n    this.setData({ visible8: false });\n  },\n\n  onCodeFocus9() {\n    this.setData({ visible9: true });\n  },\n  onChange9(e) {\n    /// #if WECHAT\n    e = e.detail;\n    /// #endif\n    this.setData({ value9: e });\n    e.length === 4 && this.onClose9();\n  },\n  onClose9() {\n    this.setData({ visible9: false });\n  },\n});\n"
  },
  {
    "path": "demo/pages/NumberKeyboardAmount/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-list header=\"数字键盘示例: 金额输入\">\n  <ant-list-item>\n    <view\n      class=\"number-content {{ value ? '' : 'number-placeholder' }}\"\n      catchTap=\"onAmountFocus\">\n      <!-- display: inline -->\n      <text a:if=\"{{ value }}\">{{ value }}</text>\n      <!-- display: inline -->\n      <text\n        a:else\n        class=\"number-content-tip\"\n        >0.00</text\n      >\n      <view\n        a:if=\"{{ visible }}\"\n        class=\"number-light\"\n        style=\"position: {{ value ? 'static' : 'absolute' }}\" />\n    </view>\n  </ant-list-item>\n  <ant-number-keyboard\n    visible=\"{{ visible }}\"\n    closeable=\"{{ true }}\"\n    value=\"{{ value }}\"\n    onChange=\"onChange\"\n    onClose=\"onClose\" />\n</ant-list>\n"
  },
  {
    "path": "demo/pages/NumberKeyboardAmount/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"NumberKeyboard\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"NumberKeyboard\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-number-keyboard\": \"../../../src/NumberKeyboard/index\",\n    \"ant-list-item\": \"../../../src/List/ListItem/index\",\n    \"ant-list\": \"../../../src/List/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/NumberKeyboardAmount/index.less",
    "content": "@keyframes number-input-cursor {\n  0% {\n    opacity: 0;\n  }\n  50% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n\n.number-content {\n  height: 24px;\n  display: flex;\n  align-items: center;\n  justify-content: flex-start;\n  width: calc(100% - 24px);\n  position: relative;\n}\n\n.number-content-tip {\n  position: absolute;\n  left: 2px;\n}\n\n.number-placeholder {\n  color: #e5e5e5;\n}\n\n.number-light {\n  margin-left: 2px;\n  height: calc(100% - 4px);\n  width: 2px;\n  border-radius: 2px;\n  display: inline-block;\n  vertical-align: middle;\n  background: #1677ff;\n  animation: number-input-cursor 1s step-start infinite;\n}\n"
  },
  {
    "path": "demo/pages/NumberKeyboardAmount/index.ts",
    "content": "Page({\n  data: {\n    value: '',\n    visible: false,\n  },\n  onAmountFocus() {\n    this.setData({ visible: true });\n  },\n  onChange(e) {\n    /// #if WECHAT\n    e = e.detail;\n    /// #endif\n    // 第一位输入0，第二位输入1，直接展示1\n    if (e[0] === '0' && e[1] && e[1] !== '.') {\n      this.setData({ value: e.slice(1, e.length) });\n      return;\n    }\n    // 小数点补齐0.\n    if (e === '.') {\n      this.setData({ value: '0.' });\n      return;\n    }\n    // 不允许多个小数点\n    const onePoint =\n      e && e[e.length - 1] === '.' && e.length - 1 !== e.indexOf('.');\n    // 限制小数点后2位\n    const precision2 =\n      e && e.split('.').length > 1 && e.split('.')[1].length === 3;\n    if (onePoint || precision2) {\n      this.setData({ value: e.slice(0, e.length - 1) });\n      return;\n    }\n    this.setData({ value: e });\n  },\n  onClose() {\n    // 失去焦点时如果末尾是小数点，自动去掉\n    if (this.data.value[this.data.value.length - 1] === '.') {\n      this.setData({\n        value: this.data.value.slice(0, this.data.value.length - 1),\n      });\n    }\n    this.setData({ visible: false });\n  },\n});\n"
  },
  {
    "path": "demo/pages/NumberKeyboardCode/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-list header=\"数字键盘示例：验证码\">\n  <ant-list-item>\n    <view\n      class=\"number-code\"\n      catchTap=\"onCodeFocus\">\n      <block\n        a:for=\"{{ 4 }}\"\n        a:for-index=\"index\"\n        a:for-item=\"item\">\n        <view\n          class=\"number-code-view {{ visible && value.length === index ? 'number-code-border' : '' }}\">\n          {{ value[index] || '' }}\n          <view\n            a:if=\"{{ visible && value.length === index }}\"\n            class=\"number-code-tip\" />\n        </view>\n      </block>\n    </view>\n  </ant-list-item>\n  <ant-number-keyboard\n    visible=\"{{ visible }}\"\n    point=\"{{ false }}\"\n    closeable=\"{{ true }}\"\n    value=\"{{ value }}\"\n    onChange=\"onChange\"\n    onClose=\"onClose\" />\n</ant-list>\n"
  },
  {
    "path": "demo/pages/NumberKeyboardCode/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"NumberKeyboard\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"NumberKeyboard\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-number-keyboard\": \"../../../src/NumberKeyboard/index\",\n    \"ant-list-item\": \"../../../src/List/ListItem/index\",\n    \"ant-list\": \"../../../src/List/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/NumberKeyboardCode/index.less",
    "content": "@keyframes number-input-cursor {\n  0% {\n    opacity: 0;\n  }\n  50% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n\n.number-code {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  justify-content: center;\n  width: 100%;\n  height: 24px;\n}\n\n.number-code-view {\n  width: 40px;\n  height: 40px;\n  line-height: 40px;\n  font-size: 24px;\n  text-align: center;\n  border: 1px solid #e5e5e5;\n  border-radius: 4px;\n  margin-right: 12px;\n}\n\n.number-code-view:last-child {\n  margin-right: 0;\n}\n\n.number-code-tip {\n  height: calc(100% - 20px);\n  width: 2px;\n  border-radius: 2px;\n  display: inline-block;\n  background: #1677ff;\n  vertical-align: middle;\n  animation: number-input-cursor 1s step-start infinite;\n}\n\n.number-code-border {\n  border: 1px solid #1677ff;\n  box-shadow: 0 0 2px 0 #1677ff;\n}\n"
  },
  {
    "path": "demo/pages/NumberKeyboardCode/index.ts",
    "content": "Page({\n  data: {\n    value: '',\n    visible: false,\n  },\n  onCodeFocus() {\n    this.setData({ visible: true });\n  },\n  onChange(e) {\n    /// #if WECHAT\n    e = e.detail;\n    /// #endif\n    this.setData({ value: e });\n    e.length === 4 && this.onClose();\n  },\n  onClose() {\n    this.setData({ visible: false });\n  },\n});\n"
  },
  {
    "path": "demo/pages/NumberKeyboardNumber/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-list header=\"数字输入框示例\">\n  <ant-list-item>\n    <view\n      class=\"number-content {{ value ? '' : 'number-placeholder' }}\"\n      catchTap=\"onNumberFocus\">\n      <!-- display: inline -->\n      <text a:if=\"{{ value }}\">{{ value }}</text>\n      <!-- display: inline -->\n      <text\n        a:else\n        class=\"number-content-tip\"\n        >0.00</text\n      >\n      <view\n        a:if=\"{{ visible }}\"\n        class=\"number-light\"\n        style=\"{{ value ? 'position: static;' : 'position: absolute;' }}\" />\n    </view>\n  </ant-list-item>\n  <ant-number-keyboard\n    visible=\"{{ visible }}\"\n    point=\"{{ false }}\"\n    closeable=\"{{ true }}\"\n    value=\"{{ value }}\"\n    onChange=\"onChange\"\n    onClose=\"onClose\" />\n</ant-list>\n"
  },
  {
    "path": "demo/pages/NumberKeyboardNumber/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"NumberKeyboard\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"NumberKeyboard\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-number-keyboard\": \"../../../src/NumberKeyboard/index\",\n    \"ant-list-item\": \"../../../src/List/ListItem/index\",\n    \"ant-list\": \"../../../src/List/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/NumberKeyboardNumber/index.less",
    "content": "@keyframes number-input-cursor {\n  0% {\n    opacity: 0;\n  }\n  50% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n\n.number-content {\n  height: 24px;\n  display: flex;\n  align-items: center;\n  justify-content: flex-start;\n  width: calc(100% - 24px);\n  position: relative;\n}\n\n.number-content-tip {\n  position: absolute;\n  left: 2px;\n}\n\n.number-placeholder {\n  color: #e5e5e5;\n}\n\n.number-light {\n  margin-left: 2px;\n  height: calc(100% - 4px);\n  width: 2px;\n  border-radius: 2px;\n  display: inline-block;\n  vertical-align: middle;\n  background: #1677ff;\n  animation: number-input-cursor 1s step-start infinite;\n}\n"
  },
  {
    "path": "demo/pages/NumberKeyboardNumber/index.ts",
    "content": "Page({\n  data: {\n    value: '',\n    visible: false,\n  },\n  onNumberFocus() {\n    this.setData({ visible: true });\n  },\n  onChange(e) {\n    /// #if WECHAT\n    e = e.detail;\n    /// #endif\n    this.setData({ value: e ? parseFloat(e) : '' });\n  },\n  onClose() {\n    this.setData({ visible: false });\n  },\n});\n"
  },
  {
    "path": "demo/pages/PageContainer/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-page-container\n  loading=\"{{loading}}\"\n  status=\"{{status}}\"\n  title=\"{{title}}\"\n  message=\"{{message}}\"\n  image=\"{{image}}\"\n  safeArea=\"{{safeArea}}\"\n  loadingColor=\"#ccc\"\n  loadingSize=\"medium\"\n  loadingType=\"spin\"\n  actionText=\"刷新\"\n  secondaryActionText=\"网络异常\"\n  onActionTap=\"handleRefresh\"\n  onSecondaryActionTap=\"handleSwitchToDisconnected\"\n>\n  <view class=\"content\">\n    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna\n    aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n    Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur\n    sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n    <view style=\"margin-top: 12px; text-align: center;\">\n      <ant-button slot=\"extra\" inline size=\"small\" type=\"primary\" onTap=\"handleSwitchToBusy\">\n        后台繁忙\n      </ant-button>\n      <ant-button\n        slot=\"extra\"\n        inline\n        size=\"small\"\n        data-position=\"top\"\n        onTap=\"handleToggleSafeArea\"\n        style=\"margin-left: 12px;\"\n      >\n        顶部安全区\n      </ant-button>\n      <ant-button\n        slot=\"extra\"\n        inline\n        size=\"small\"\n        data-position=\"bottom\"\n        onTap=\"handleToggleSafeArea\"\n        style=\"margin-left: 12px;\"\n      >\n        底部安全区\n      </ant-button>\n      <ant-button\n        slot=\"extra\"\n        inline\n        size=\"small\"\n        data-position=\"both\"\n        onTap=\"handleToggleSafeArea\"\n        style=\"margin-left: 12px;\"\n      >\n        全局安全区\n      </ant-button>\n    </view>\n    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna\n    aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n    Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur\n    sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna\n    aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n    Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur\n    sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna\n    aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n    Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur\n    sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n  </view>\n  <ant-button slot=\"extra\" inline size=\"small\" style=\"margin-left: 12px;\" onTap=\"handleSwitchToEmpty\">\n    空内容\n  </ant-button>\n  <ant-button slot=\"extra\" inline size=\"small\" style=\"margin-left: 12px;\" onTap=\"handleSwitchToBusy\">\n    后台繁忙\n  </ant-button>\n  <ant-button slot=\"extra\" inline size=\"small\" style=\"margin-left: 12px;\" onTap=\"handleSwitchToCustom\">\n    自定义\n  </ant-button>\n  <ant-button slot=\"extra\" inline size=\"small\" style=\"margin-left: 12px;\" onTap=\"handleSwitchToNormal\">\n    正常\n  </ant-button>\n  <ant-loading slot=\"loading\" color=\"#999\" />\n</ant-page-container>\n"
  },
  {
    "path": "demo/pages/PageContainer/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"titleBarColor\": \"#ffffff\",\n  \"transparentTitle\": \"auto\",\n  \"usingComponents\": {\n    \"ant-button\": \"../../../src/Button/index\",\n    \"ant-page-container\": \"../../../src/PageContainer/index\",\n    \"ant-loading\": \"../../../src/Loading/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/PageContainer/index.less",
    "content": ".content {\n  padding: 24rpx;\n}\n"
  },
  {
    "path": "demo/pages/PageContainer/index.ts",
    "content": "Page({\n  data: {\n    loading: true,\n    status: 'failed',\n    safeArea: 'both',\n  },\n  onLoad() {\n    setTimeout(() => {\n      this.setData({\n        loading: false,\n      });\n    }, 1000);\n  },\n  handleRefresh() {\n    /// #if ALIPAY\n    my.reLaunch({\n      url: 'index',\n      fail(e) {\n        console.log(e);\n      },\n    });\n    /// #endif\n    /// #if WECHAT\n    // @ts-ignore\n    wx.reLaunch({\n      url: 'index',\n      fail(e) {\n        console.log(e);\n      },\n    });\n    /// #endif\n  },\n  handleSwitchToDisconnected() {\n    this.setData({\n      status: 'disconnected',\n      title: '',\n      message: '',\n      image: '',\n    });\n  },\n  handleSwitchToEmpty() {\n    this.setData({\n      status: 'empty',\n      title: '',\n      message: '',\n      image: '',\n    });\n  },\n  handleSwitchToBusy() {\n    this.setData({\n      status: 'busy',\n      title: '',\n      message: '',\n      image: '',\n    });\n  },\n  handleSwitchToCustom() {\n    this.setData({\n      loading: false,\n      status: '',\n      title: '自定义标题',\n      message: '自定义详情',\n      image: 'https://gw.alipayobjects.com/zos/antfincdn/ZHrcdLPrvN/empty.svg',\n    });\n  },\n  handleSwitchToNormal() {\n    this.setData({\n      status: '',\n      title: '',\n      message: '',\n      image: '',\n    });\n  },\n  handleToggleSafeArea(e) {\n    const { position = '' } = e.target.dataset;\n\n    this.setData({\n      safeArea: position,\n    });\n  },\n});\n"
  },
  {
    "path": "demo/pages/Picker/city.ts",
    "content": "export default [\n  {\n    label: '北京',\n    children: [\n      {\n        label: '北京',\n        value: '110',\n      },\n    ],\n    value: '11',\n  },\n  {\n    label: '河北',\n    children: [\n      {\n        label: '石家庄',\n        value: '188',\n      },\n      {\n        label: '唐山',\n        value: '181',\n      },\n      {\n        label: '秦皇岛',\n        value: '182',\n      },\n      {\n        label: '邯郸',\n        value: '186',\n      },\n      {\n        label: '邢台',\n        value: '185',\n      },\n      {\n        label: '保定',\n        value: '187',\n      },\n      {\n        label: '张家口',\n        value: '184',\n      },\n      {\n        label: '承德',\n        value: '189',\n      },\n      {\n        label: '廊坊',\n        value: '183',\n      },\n      {\n        label: '沧州',\n        value: '180',\n      },\n      {\n        label: '衡水',\n        value: '720',\n      },\n      {\n        label: '雄安',\n        value: '782',\n      },\n    ],\n    value: '18',\n  },\n  {\n    label: '福建',\n    children: [\n      {\n        label: '福州',\n        value: '380',\n      },\n      {\n        label: '厦门',\n        value: '390',\n      },\n      {\n        label: '泉州',\n        value: '480',\n      },\n      {\n        label: '漳州',\n        value: '395',\n      },\n      {\n        label: '宁德',\n        value: '386',\n      },\n      {\n        label: '莆田',\n        value: '385',\n      },\n      {\n        label: '南平',\n        value: '387',\n      },\n      {\n        label: '三明',\n        value: '389',\n      },\n      {\n        label: '龙岩',\n        value: '384',\n      },\n    ],\n    value: '38',\n  },\n  {\n    label: '江西',\n    children: [\n      {\n        label: '南昌',\n        value: '750',\n      },\n      {\n        label: '九江',\n        value: '755',\n      },\n      {\n        label: '上饶',\n        value: '757',\n      },\n      {\n        label: '抚州',\n        value: '759',\n      },\n      {\n        label: '宜春',\n        value: '756',\n      },\n      {\n        label: '吉安',\n        value: '751',\n      },\n      {\n        label: '赣州',\n        value: '752',\n      },\n      {\n        label: '景德镇',\n        value: '740',\n      },\n      {\n        label: '萍乡',\n        value: '758',\n      },\n      {\n        label: '新余',\n        value: '753',\n      },\n      {\n        label: '鹰潭',\n        value: '754',\n      },\n    ],\n    value: '75',\n  },\n  {\n    label: '山东',\n    children: [\n      {\n        label: '济南',\n        value: '170',\n      },\n      {\n        label: '青岛',\n        value: '166',\n      },\n      {\n        label: '淄博',\n        value: '150',\n      },\n      {\n        label: '枣庄',\n        value: '157',\n      },\n      {\n        label: '东营',\n        value: '156',\n      },\n      {\n        label: '烟台',\n        value: '161',\n      },\n      {\n        label: '潍坊',\n        value: '155',\n      },\n      {\n        label: '济宁',\n        value: '158',\n      },\n      {\n        label: '泰安',\n        value: '172',\n      },\n      {\n        label: '威海',\n        value: '152',\n      },\n      {\n        label: '日照',\n        value: '154',\n      },\n      {\n        label: '莱芜',\n        value: '160',\n      },\n      {\n        label: '临沂',\n        value: '153',\n      },\n      {\n        label: '德州',\n        value: '173',\n      },\n      {\n        label: '聊城',\n        value: '174',\n      },\n      {\n        label: '滨州',\n        value: '151',\n      },\n      {\n        label: '菏泽',\n        value: '159',\n      },\n    ],\n    value: '17',\n  },\n  {\n    label: '河南',\n    children: [\n      {\n        label: '郑州',\n        value: '760',\n      },\n      {\n        label: '洛阳',\n        value: '761',\n      },\n      {\n        label: '开封',\n        value: '762',\n      },\n      {\n        label: '焦作',\n        value: '763',\n      },\n      {\n        label: '新乡',\n        value: '764',\n      },\n      {\n        label: '许昌',\n        value: '765',\n      },\n      {\n        label: '漯河',\n        value: '766',\n      },\n      {\n        label: '安阳',\n        value: '767',\n      },\n      {\n        label: '商丘',\n        value: '768',\n      },\n      {\n        label: '平顶山',\n        value: '769',\n      },\n      {\n        label: '周口',\n        value: '770',\n      },\n      {\n        label: '驻马店',\n        value: '771',\n      },\n      {\n        label: '三门峡',\n        value: '772',\n      },\n      {\n        label: '濮阳',\n        value: '773',\n      },\n      {\n        label: '鹤壁',\n        value: '774',\n      },\n      {\n        label: '济源',\n        value: '775',\n      },\n      {\n        label: '信阳',\n        value: '776',\n      },\n      {\n        label: '南阳',\n        value: '777',\n      },\n    ],\n    value: '76',\n  },\n  {\n    label: '湖北',\n    children: [\n      {\n        label: '武汉',\n        value: '710',\n      },\n      {\n        label: '宜昌',\n        value: '711',\n      },\n      {\n        label: '荆州',\n        value: '712',\n      },\n      {\n        label: '黄冈',\n        value: '714',\n      },\n      {\n        label: '黄石',\n        value: '715',\n      },\n      {\n        label: '襄阳',\n        value: '716',\n      },\n      {\n        label: '孝感',\n        value: '717',\n      },\n      {\n        label: '鄂州',\n        value: '718',\n      },\n      {\n        label: '咸宁',\n        value: '719',\n      },\n      {\n        label: '十堰',\n        value: '721',\n      },\n      {\n        label: '随州',\n        value: '723',\n      },\n      {\n        label: '荆门',\n        value: '724',\n      },\n      {\n        label: '仙桃/潜江/天门',\n        value: '713',\n      },\n      {\n        label: '恩施',\n        value: '727',\n      },\n    ],\n    value: '71',\n  },\n  {\n    label: '湖南',\n    children: [\n      {\n        label: '长沙',\n        value: '741',\n      },\n      {\n        label: '衡阳',\n        value: '744',\n      },\n      {\n        label: '株洲',\n        value: '742',\n      },\n      {\n        label: '湘潭',\n        value: '743',\n      },\n      {\n        label: '岳阳',\n        value: '745',\n      },\n      {\n        label: '邵阳',\n        value: '792',\n      },\n      {\n        label: '郴州',\n        value: '748',\n      },\n      {\n        label: '常德',\n        value: '749',\n      },\n      {\n        label: '益阳',\n        value: '747',\n      },\n      {\n        label: '怀化',\n        value: '795',\n      },\n      {\n        label: '永州',\n        value: '796',\n      },\n      {\n        label: '娄底',\n        value: '791',\n      },\n      {\n        label: '湘西',\n        value: '793',\n      },\n      {\n        label: '张家界',\n        value: '794',\n      },\n    ],\n    value: '74',\n  },\n  {\n    label: '广东',\n    children: [\n      {\n        label: '广州',\n        value: '510',\n      },\n      {\n        label: '深圳',\n        value: '540',\n      },\n      {\n        label: '东莞',\n        value: '580',\n      },\n      {\n        label: '佛山',\n        value: '530',\n      },\n      {\n        label: '惠州',\n        value: '570',\n      },\n      {\n        label: '珠海',\n        value: '620',\n      },\n      {\n        label: '中山',\n        value: '556',\n      },\n      {\n        label: '江门',\n        value: '550',\n      },\n      {\n        label: '汕头',\n        value: '560',\n      },\n      {\n        label: '湛江',\n        value: '520',\n      },\n      {\n        label: '揭阳',\n        value: '526',\n      },\n      {\n        label: '肇庆',\n        value: '536',\n      },\n      {\n        label: '清远',\n        value: '535',\n      },\n      {\n        label: '韶关',\n        value: '558',\n      },\n      {\n        label: '潮州',\n        value: '531',\n      },\n      {\n        label: '茂名',\n        value: '568',\n      },\n      {\n        label: '河源',\n        value: '670',\n      },\n      {\n        label: '汕尾',\n        value: '525',\n      },\n      {\n        label: '阳江',\n        value: '565',\n      },\n      {\n        label: '梅州',\n        value: '528',\n      },\n      {\n        label: '云浮',\n        value: '538',\n      },\n    ],\n    value: '51',\n  },\n  {\n    label: '广西',\n    children: [\n      {\n        label: '南宁',\n        value: '591',\n      },\n      {\n        label: '柳州',\n        value: '593',\n      },\n      {\n        label: '桂林',\n        value: '592',\n      },\n      {\n        label: '梧州',\n        value: '594',\n      },\n      {\n        label: '玉林',\n        value: '595',\n      },\n      {\n        label: '百色',\n        value: '596',\n      },\n      {\n        label: '钦州',\n        value: '597',\n      },\n      {\n        label: '河池',\n        value: '598',\n      },\n      {\n        label: '北海',\n        value: '599',\n      },\n      {\n        label: '防城港',\n        value: '590',\n      },\n      {\n        label: '贵港',\n        value: '589',\n      },\n      {\n        label: '贺州',\n        value: '588',\n      },\n      {\n        label: '崇左',\n        value: '600',\n      },\n      {\n        label: '来宾',\n        value: '601',\n      },\n    ],\n    value: '59',\n  },\n  {\n    label: '天津',\n    children: [\n      {\n        label: '天津',\n        value: '130',\n      },\n    ],\n    value: '13',\n  },\n  {\n    label: '海南',\n    children: [\n      {\n        label: '海口',\n        value: '501',\n      },\n    ],\n    value: '50',\n  },\n  {\n    label: '重庆',\n    children: [\n      {\n        label: '重庆',\n        value: '831',\n      },\n    ],\n    value: '83',\n  },\n  {\n    label: '四川',\n    children: [\n      {\n        label: '成都',\n        value: '810',\n      },\n      {\n        label: '自贡',\n        value: '818',\n      },\n      {\n        label: '雅安',\n        value: '811',\n      },\n      {\n        label: '绵阳',\n        value: '824',\n      },\n      {\n        label: '乐山',\n        value: '814',\n      },\n      {\n        label: '德阳',\n        value: '825',\n      },\n      {\n        label: '攀枝花',\n        value: '813',\n      },\n      {\n        label: '宜宾',\n        value: '817',\n      },\n      {\n        label: '阿坝',\n        value: '829',\n      },\n      {\n        label: '内江',\n        value: '816',\n      },\n      {\n        label: '眉山',\n        value: '819',\n      },\n      {\n        label: '资阳',\n        value: '830',\n      },\n      {\n        label: '泸州',\n        value: '815',\n      },\n      {\n        label: '南充',\n        value: '822',\n      },\n      {\n        label: '达州',\n        value: '820',\n      },\n      {\n        label: '遂宁',\n        value: '821',\n      },\n      {\n        label: '广元',\n        value: '826',\n      },\n      {\n        label: '广安',\n        value: '823',\n      },\n      {\n        label: '巴中',\n        value: '827',\n      },\n      {\n        label: '凉山',\n        value: '812',\n      },\n      {\n        label: '甘孜',\n        value: '828',\n      },\n    ],\n    value: '81',\n  },\n  {\n    label: '山西',\n    children: [\n      {\n        label: '太原',\n        value: '190',\n      },\n      {\n        label: '大同',\n        value: '193',\n      },\n      {\n        label: '阳泉',\n        value: '192',\n      },\n      {\n        label: '长治',\n        value: '195',\n      },\n      {\n        label: '晋城',\n        value: '194',\n      },\n      {\n        label: '朔州',\n        value: '199',\n      },\n      {\n        label: '忻州',\n        value: '198',\n      },\n      {\n        label: '晋中',\n        value: '191',\n      },\n      {\n        label: '吕梁',\n        value: '200',\n      },\n      {\n        label: '临汾',\n        value: '197',\n      },\n      {\n        label: '运城',\n        value: '196',\n      },\n    ],\n    value: '19',\n  },\n  {\n    label: '贵州',\n    children: [\n      {\n        label: '贵阳',\n        value: '850',\n      },\n      {\n        label: '遵义',\n        value: '787',\n      },\n      {\n        label: '安顺',\n        value: '789',\n      },\n      {\n        label: '黔南',\n        value: '788',\n      },\n      {\n        label: '黔东南',\n        value: '786',\n      },\n      {\n        label: '铜仁',\n        value: '785',\n      },\n      {\n        label: '毕节',\n        value: '851',\n      },\n      {\n        label: '六盘水',\n        value: '853',\n      },\n      {\n        label: '黔西南',\n        value: '852',\n      },\n    ],\n    value: '85',\n  },\n  {\n    label: '云南',\n    children: [\n      {\n        label: '昆明',\n        value: '860',\n      },\n      {\n        label: '德宏',\n        value: '730',\n      },\n      {\n        label: '保山',\n        value: '731',\n      },\n      {\n        label: '文山',\n        value: '732',\n      },\n      {\n        label: '临沧',\n        value: '733',\n      },\n      {\n        label: '怒江',\n        value: '734',\n      },\n      {\n        label: '迪庆',\n        value: '735',\n      },\n      {\n        label: '西双版纳',\n        value: '736',\n      },\n      {\n        label: '红河',\n        value: '861',\n      },\n      {\n        label: '大理',\n        value: '862',\n      },\n      {\n        label: '丽江',\n        value: '863',\n      },\n      {\n        label: '楚雄',\n        value: '864',\n      },\n      {\n        label: '玉溪',\n        value: '865',\n      },\n      {\n        label: '曲靖',\n        value: '866',\n      },\n      {\n        label: '昭通',\n        value: '867',\n      },\n      {\n        label: '普洱',\n        value: '869',\n      },\n    ],\n    value: '86',\n  },\n  {\n    label: '西藏',\n    children: [\n      {\n        label: '拉萨',\n        value: '790',\n      },\n      {\n        label: '日喀则',\n        value: '797',\n      },\n      {\n        label: '山南',\n        value: '798',\n      },\n      {\n        label: '林芝',\n        value: '799',\n      },\n      {\n        label: '昌都',\n        value: '800',\n      },\n      {\n        label: '那曲',\n        value: '801',\n      },\n      {\n        label: '阿里',\n        value: '802',\n      },\n    ],\n    value: '79',\n  },\n  {\n    label: '陕西',\n    children: [\n      {\n        label: '西安',\n        value: '841',\n      },\n      {\n        label: '咸阳',\n        value: '844',\n      },\n      {\n        label: '渭南',\n        value: '843',\n      },\n      {\n        label: '宝鸡',\n        value: '840',\n      },\n      {\n        label: '汉中',\n        value: '849',\n      },\n      {\n        label: '延安',\n        value: '842',\n      },\n      {\n        label: '榆林',\n        value: '845',\n      },\n      {\n        label: '铜川',\n        value: '846',\n      },\n      {\n        label: '安康',\n        value: '848',\n      },\n      {\n        label: '商洛',\n        value: '847',\n      },\n    ],\n    value: '84',\n  },\n  {\n    label: '甘肃',\n    children: [\n      {\n        label: '兰州',\n        value: '870',\n      },\n      {\n        label: '酒泉',\n        value: '931',\n      },\n      {\n        label: '庆阳',\n        value: '873',\n      },\n      {\n        label: '天水',\n        value: '877',\n      },\n      {\n        label: '武威',\n        value: '874',\n      },\n      {\n        label: '临夏',\n        value: '878',\n      },\n      {\n        label: '白银',\n        value: '879',\n      },\n      {\n        label: '定西',\n        value: '871',\n      },\n      {\n        label: '平凉',\n        value: '872',\n      },\n      {\n        label: '陇南',\n        value: '960',\n      },\n      {\n        label: '张掖',\n        value: '875',\n      },\n      {\n        label: '嘉峪关',\n        value: '876',\n      },\n      {\n        label: '金昌',\n        value: '930',\n      },\n      {\n        label: '甘南',\n        value: '961',\n      },\n    ],\n    value: '87',\n  },\n  {\n    label: '青海',\n    children: [\n      {\n        label: '西宁',\n        value: '700',\n      },\n      {\n        label: '海东',\n        value: '701',\n      },\n      {\n        label: '格尔木',\n        value: '702',\n      },\n      {\n        label: '海西',\n        value: '704',\n      },\n      {\n        label: '海北',\n        value: '706',\n      },\n      {\n        label: '海南',\n        value: '705',\n      },\n      {\n        label: '黄南',\n        value: '707',\n      },\n      {\n        label: '果洛',\n        value: '708',\n      },\n      {\n        label: '玉树',\n        value: '709',\n      },\n    ],\n    value: '70',\n  },\n  {\n    label: '宁夏',\n    children: [\n      {\n        label: '银川',\n        value: '880',\n      },\n      {\n        label: '石嘴山',\n        value: '884',\n      },\n      {\n        label: '吴忠',\n        value: '883',\n      },\n      {\n        label: '固原',\n        value: '885',\n      },\n      {\n        label: '中卫',\n        value: '886',\n      },\n    ],\n    value: '88',\n  },\n  {\n    label: '新疆',\n    children: [\n      {\n        label: '乌鲁木齐',\n        value: '890',\n      },\n      {\n        label: '昌吉',\n        value: '891',\n      },\n      {\n        label: '石河子',\n        value: '893',\n      },\n      {\n        label: '奎屯',\n        value: '892',\n      },\n      {\n        label: '塔城',\n        value: '952',\n      },\n      {\n        label: '克拉玛依',\n        value: '899',\n      },\n      {\n        label: '伊犁',\n        value: '898',\n      },\n      {\n        label: '博乐',\n        value: '951',\n      },\n      {\n        label: '阿勒泰',\n        value: '953',\n      },\n      {\n        label: '吐鲁番',\n        value: '894',\n      },\n      {\n        label: '哈密',\n        value: '900',\n      },\n      {\n        label: '巴音郭楞',\n        value: '895',\n      },\n      {\n        label: '阿克苏',\n        value: '896',\n      },\n      {\n        label: '喀什',\n        value: '897',\n      },\n      {\n        label: '和田',\n        value: '955',\n      },\n      {\n        label: '克孜勒苏',\n        value: '954',\n      },\n    ],\n    value: '89',\n  },\n  {\n    label: '内蒙古',\n    children: [\n      {\n        label: '呼和浩特',\n        value: '101',\n      },\n      {\n        label: '包头',\n        value: '102',\n      },\n      {\n        label: '乌海',\n        value: '106',\n      },\n      {\n        label: '赤峰',\n        value: '107',\n      },\n      {\n        label: '呼伦贝尔',\n        value: '108',\n      },\n      {\n        label: '兴安盟',\n        value: '113',\n      },\n      {\n        label: '通辽',\n        value: '109',\n      },\n      {\n        label: '乌兰察布',\n        value: '103',\n      },\n      {\n        label: '巴彦淖尔',\n        value: '105',\n      },\n      {\n        label: '阿拉善盟',\n        value: '114',\n      },\n      {\n        label: '鄂尔多斯',\n        value: '104',\n      },\n      {\n        label: '锡林郭勒盟',\n        value: '111',\n      },\n    ],\n    value: '10',\n  },\n  {\n    label: '辽宁',\n    children: [\n      {\n        label: '沈阳',\n        value: '910',\n      },\n      {\n        label: '大连',\n        value: '940',\n      },\n      {\n        label: '鞍山',\n        value: '912',\n      },\n      {\n        label: '抚顺',\n        value: '913',\n      },\n      {\n        label: '本溪',\n        value: '914',\n      },\n      {\n        label: '丹东',\n        value: '915',\n      },\n      {\n        label: '锦州',\n        value: '916',\n      },\n      {\n        label: '营口',\n        value: '917',\n      },\n      {\n        label: '阜新',\n        value: '918',\n      },\n      {\n        label: '辽阳',\n        value: '919',\n      },\n      {\n        label: '铁岭',\n        value: '911',\n      },\n      {\n        label: '朝阳',\n        value: '920',\n      },\n      {\n        label: '盘锦',\n        value: '921',\n      },\n      {\n        label: '葫芦岛',\n        value: '922',\n      },\n    ],\n    value: '91',\n  },\n  {\n    label: '吉林',\n    children: [\n      {\n        label: '长春',\n        value: '901',\n      },\n      {\n        label: '吉林',\n        value: '902',\n      },\n      {\n        label: '延边',\n        value: '909',\n      },\n      {\n        label: '四平',\n        value: '903',\n      },\n      {\n        label: '通化',\n        value: '905',\n      },\n      {\n        label: '白城',\n        value: '907',\n      },\n      {\n        label: '辽源',\n        value: '906',\n      },\n      {\n        label: '松原',\n        value: '904',\n      },\n      {\n        label: '白山',\n        value: '908',\n      },\n    ],\n    value: '90',\n  },\n  {\n    label: '黑龙江',\n    children: [\n      {\n        label: '哈尔滨',\n        value: '971',\n      },\n      {\n        label: '齐齐哈尔',\n        value: '973',\n      },\n      {\n        label: '牡丹江',\n        value: '988',\n      },\n      {\n        label: '佳木斯',\n        value: '976',\n      },\n      {\n        label: '绥化',\n        value: '989',\n      },\n      {\n        label: '大庆',\n        value: '981',\n      },\n      {\n        label: '鸡西',\n        value: '991',\n      },\n      {\n        label: '黑河',\n        value: '990',\n      },\n      {\n        label: '伊春',\n        value: '996',\n      },\n      {\n        label: '双鸭山',\n        value: '994',\n      },\n      {\n        label: '鹤岗',\n        value: '993',\n      },\n      {\n        label: '七台河',\n        value: '992',\n      },\n      {\n        label: '大兴安岭',\n        value: '995',\n      },\n    ],\n    value: '97',\n  },\n  {\n    label: '上海',\n    children: [\n      {\n        label: '上海',\n        value: '310',\n      },\n    ],\n    value: '31',\n  },\n  {\n    label: '江苏',\n    children: [\n      {\n        label: '南京',\n        value: '340',\n      },\n      {\n        label: '苏州',\n        value: '450',\n      },\n      {\n        label: '无锡',\n        value: '330',\n      },\n      {\n        label: '常州',\n        value: '440',\n      },\n      {\n        label: '扬州',\n        value: '430',\n      },\n      {\n        label: '镇江',\n        value: '343',\n      },\n      {\n        label: '南通',\n        value: '358',\n      },\n      {\n        label: '徐州',\n        value: '350',\n      },\n      {\n        label: '泰州',\n        value: '445',\n      },\n      {\n        label: '盐城',\n        value: '348',\n      },\n      {\n        label: '淮安',\n        value: '354',\n      },\n      {\n        label: '连云港',\n        value: '346',\n      },\n      {\n        label: '宿迁',\n        value: '349',\n      },\n    ],\n    value: '34',\n  },\n  {\n    label: '浙江',\n    children: [\n      {\n        label: '杭州',\n        value: '360',\n      },\n      {\n        label: '宁波',\n        value: '370',\n      },\n      {\n        label: '温州',\n        value: '470',\n      },\n      {\n        label: '台州',\n        value: '476',\n      },\n      {\n        label: '金华',\n        value: '367',\n      },\n      {\n        label: '嘉兴',\n        value: '363',\n      },\n      {\n        label: '绍兴',\n        value: '365',\n      },\n      {\n        label: '湖州',\n        value: '362',\n      },\n      {\n        label: '丽水',\n        value: '469',\n      },\n      {\n        label: '衢州',\n        value: '468',\n      },\n      {\n        label: '舟山',\n        value: '364',\n      },\n    ],\n    value: '36',\n  },\n  {\n    label: '安徽',\n    children: [\n      {\n        label: '合肥',\n        value: '305',\n      },\n      {\n        label: '安庆',\n        value: '302',\n      },\n      {\n        label: '蚌埠',\n        value: '301',\n      },\n      {\n        label: '亳州',\n        value: '318',\n      },\n      {\n        label: '池州',\n        value: '317',\n      },\n      {\n        label: '滁州',\n        value: '312',\n      },\n      {\n        label: '阜阳',\n        value: '306',\n      },\n      {\n        label: '淮北',\n        value: '314',\n      },\n      {\n        label: '淮南',\n        value: '307',\n      },\n      {\n        label: '黄山',\n        value: '316',\n      },\n      {\n        label: '六安',\n        value: '304',\n      },\n      {\n        label: '马鞍山',\n        value: '300',\n      },\n      {\n        label: '宿州',\n        value: '313',\n      },\n      {\n        label: '铜陵',\n        value: '308',\n      },\n      {\n        label: '芜湖',\n        value: '303',\n      },\n      {\n        label: '宣城',\n        value: '311',\n      },\n    ],\n    value: '30',\n  },\n];\n"
  },
  {
    "path": "demo/pages/Picker/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基础选择器\">\n  <ant-list header=\"基础用法\">\n    <ant-list-item>\n      选择城市\n      <ant-picker\n        slot=\"extra\"\n        onCancel=\"handleDismiss\"\n        onVisibleChange=\"handleTriggerPicker\"\n        onOk=\"handleOk\"\n        defaultValue=\"{{ defaultValue }}\"\n        placeholder=\"请选择\"\n        title=\"请选择\"\n        onChange=\"handleChange\"\n        options=\"{{ list }}\"\n        emptyText=\"暂无数据\"\n      />\n    </ant-list-item>\n    <ant-list-item>\n      选择城市（点击蒙层不关闭）\n      <ant-picker\n        slot=\"extra\"\n        onCancel=\"handleDismiss\"\n        onVisibleChange=\"handleTriggerPicker\"\n        onOk=\"handleOk\"\n        defaultValue=\"{{ defaultValue }}\"\n        placeholder=\"请选择\"\n        title=\"请选择\"\n        onChange=\"handleChange\"\n        maskClosable=\"{{ false }}\"\n        options=\"{{ list }}\"\n      />\n    </ant-list-item>\n  </ant-list>\n  <ant-list header=\"受控模式\">\n    <ant-list-item>\n      选择城市\n      <ant-picker\n        slot=\"extra\"\n        onOk=\"handleControlledOk\"\n        value=\"{{ value }}\"\n        placeholder=\"请选择\"\n        title=\"请选择\"\n        options=\"{{ list }}\"\n      >\n        <view slot=\"content\" slot-scope=\"prop\">已选择：{{prop.value}}</view>\n      </ant-picker>\n    </ant-list-item>\n    <view class=\"btn-wrapper\">\n      <ant-button inline onTap=\"handleChangeControlled\" style=\"margin-right: 8px\">\n        选择深圳\n      </ant-button>\n      <ant-button inline onTap=\"handleClearControlled\">\n        清空\n      </ant-button>\n    </view>\n  </ant-list>\n  <ant-list header=\"对象用法\">\n    <ant-list-item>\n      选择日期\n      <ant-picker\n        slot=\"extra\"\n        onCancel=\"handleDismiss\"\n        onVisibleChange=\"handleTriggerPicker\"\n        onOk=\"handleOk\"\n        placeholder=\"请选择\"\n        title=\"请选择\"\n        onChange=\"handleChange\"\n        options=\"{{ weekList }}\"\n      />\n    </ant-list-item>\n  </ant-list>\n\n  <ant-list header=\"多列复杂类型数据\">\n    <ant-list-item>\n      请选择时间\n      <ant-picker\n        slot=\"extra\"\n        placeholder=\"请选择\"\n        onVisibleChange=\"handleTriggerPicker\"\n        defaultValue=\"{{['Tues', 'pm']}}\"\n        title=\"请选择\"\n        onOk=\"handleOk\"\n        onFormat=\"{{ formatTime ? formatTime : 'formatTime' }}\"\n        options=\"{{ columns }}\"\n      />\n    </ant-list-item>\n  </ant-list>\n\n  <ant-container style=\"margin-top: 20rpx\">\n    <ant-list header=\"多列复杂类型数据\">\n      <ant-list-item>\n        请选择时间\n        <ant-picker\n          slot=\"extra\"\n          visible=\"{{ pickerVisible }}\"\n          placeholder=\"请选择\"\n          onVisibleChange=\"handleTriggerControlledPicker\"\n          defaultValue=\"{{['Tues', 'pm']}}\"\n          title=\"请选择\"\n          onOk=\"handleOk\"\n          onFormat=\"{{ formatTime ? formatTime : 'formatTime' }}\"\n          options=\"{{ columns }}\"\n        />\n      </ant-list-item>\n    </ant-list>\n\n    <ant-button size=\"medium\" type=\"primary\" onTap=\"handleOpenPicker\">\n      打开 Picker\n    </ant-button>\n  </ant-container>\n</ant-container>\n\n\n<ant-container title=\"级联选择器\">\n  <ant-list header=\"基础用法\">\n    <ant-list-item>\n      请选择省市\n      <ant-cascader-picker\n        slot=\"extra\"\n        placeholder=\"请选择归属地\"\n        options=\"{{ cityList }}\"\n        onChange=\"handleCascaderPickerChange\"\n        onOk=\"handleCascaderOnOk\"\n        onCancel=\"handleDismiss\" />\n    </ant-list-item>\n  </ant-list>\n\n  <ant-list header=\"默认值\">\n    <ant-list-item>\n      请选择城市\n      <ant-cascader-picker\n        slot=\"extra\"\n        defaultValue=\"{{ ['34', '330'] }}\"\n        placeholder=\"请选择城市\"\n        options=\"{{ cityList }}\"\n        onChange=\"handleCascaderPickerChange\"\n        onOk=\"handleCascaderOnOk\" />\n    </ant-list-item>\n  </ant-list>\n\n  <ant-list header=\"受控模式\">\n    <ant-list-item>\n      请选择城市\n      <ant-cascader-picker\n        slot=\"extra\"\n        value=\"{{ cascaderValue }}\"\n        placeholder=\"请选择城市\"\n        options=\"{{ cityList }}\"\n        onChange=\"handleCascaderPickerChange\"\n        onOk=\"handleCascaderControlledOk\" />\n    </ant-list-item>\n    <view class=\"btn-wrapper\">\n      <ant-button\n        inline\n        onTap=\"handleCascaderChangeControlled\"\n        style=\"margin-right: 8px\">\n        选择上海\n      </ant-button>\n      <ant-button\n        inline\n        onTap=\"handleCascaderClearControlled\">\n        清空\n      </ant-button>\n    </view>\n  </ant-list>\n\n  <ant-container style=\"margin-top: 20rpx\">\n    <ant-list header=\"外部控制选择器是否显示\">\n      <ant-list-item>\n        请选择省市\n        <ant-cascader-picker\n          slot=\"extra\"\n          visible=\"{{ cascaderVisible }}\"\n          placeholder=\"请选择归属地\"\n          options=\"{{ cityList }}\"\n          onChange=\"handleCascaderPickerChange\"\n          onVisibleChange=\"handleCascaderTriggerControlledPicker\"\n          onOk=\"handleCascaderOnOk\"\n          onCancel=\"handleDismiss\" />\n      </ant-list-item>\n    </ant-list>\n\n    <ant-button\n      size=\"medium\"\n      type=\"primary\"\n      onTap=\"handleCascaderOpenPicker\">\n      打开 CascaderPicker\n    </ant-button>\n  </ant-container>\n</ant-container>\n"
  },
  {
    "path": "demo/pages/Picker/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Picker\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Picker\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-button\": \"../../../src/Button/index\",\n    \"ant-picker\": \"../../../src/Picker/index\",\n    \"ant-cascader-picker\": \"../../../src/Picker/CascaderPicker/index\",\n    \"ant-list-item\": \"../../../src/List/ListItem/index\",\n    \"ant-list\": \"../../../src/List/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Picker/index.less",
    "content": ".btn-wrapper {\n  text-align: center;\n  padding: 24rpx;\n}\n\n"
  },
  {
    "path": "demo/pages/Picker/index.ts",
    "content": "import cityList from './city';\n\nPage({\n  data: {\n    pickerVisible: false,\n    defaultValue: '上海',\n    value: '上海',\n    list: ['北京', '上海', '深圳', '广州', '南京', '武汉', '无锡', '苏州'],\n    /// #if WECHAT\n    formatTime: (value, column) => {\n      return column.map((c) => c && c.label).join('');\n    },\n    /// #endif\n    weekList: [\n      {\n        label: '周一',\n        value: 'Mon',\n      },\n      {\n        label: '周二',\n        value: 'Tues',\n      },\n      {\n        label: '周三',\n        value: 'Wed',\n      },\n      {\n        label: '周四',\n        value: 'Thur',\n      },\n      {\n        label: '周五',\n        value: 'Fri',\n      },\n    ],\n    columns: [\n      [\n        {\n          label: '周一',\n          value: 'Mon',\n        },\n        {\n          label: '周二',\n          value: 'Tues',\n        },\n        {\n          label: '周三',\n          value: 'Wed',\n        },\n        {\n          label: '周四',\n          value: 'Thur',\n        },\n        {\n          label: '周五',\n          value: 'Fri',\n        },\n      ],\n      [\n        {\n          label: '上午',\n          value: 'am',\n        },\n        {\n          label: '下午',\n          value: 'pm',\n        },\n      ],\n    ],\n    cityList,\n    cascaderValue: ['34', '330'],\n    cascaderVisible: false,\n  },\n  handleDismiss(e) {\n    /// #if ALIPAY\n    my.showToast({\n      content: '取消操作，关闭 picker',\n    });\n    console.log(e);\n    /// #endif\n  },\n  handleClearControlled() {\n    this.setData({\n      value: '',\n    });\n  },\n  handleChangeControlled() {\n    this.setData({\n      value: '深圳',\n    });\n  },\n  handleControlledOk(value) {\n    /// #if ALIPAY\n    this.setData({\n      value,\n    });\n    /// #endif\n    /// #if WECHAT\n    this.setData({\n      value: value.detail[0],\n    });\n    /// #endif\n  },\n  handleOk(value, column, e) {\n    console.log('onOk value', value, 'onOk  column', column, e);\n  },\n\n  handleChange(value, column, e) {\n    console.log('onChange value', value, 'onChange  column', column, e);\n  },\n  /// #if ALIPAY\n  formatTime(value, column) {\n    return column.map((c) => c && c.label).join('');\n  },\n  /// #endif\n  handleOnOk(value, column) {\n    console.log('value', value, 'column', column);\n  },\n  handleTriggerPicker(visible, e) {\n    console.log('onVisibleChange', visible, e);\n  },\n  handleTriggerControlledPicker(visible, e) {\n    /// #if WECHAT\n    console.log('handleTriggerControlledPicker', visible);\n    this.setData({\n      pickerVisible: visible.detail,\n    });\n    /// #endif\n\n    /// #if ALIPAY\n    console.log('handleTriggerControlledPicker', visible, e);\n    this.setData({\n      pickerVisible: visible,\n    });\n    /// #endif\n  },\n\n  handleOpenPicker() {\n    this.setData({\n      pickerVisible: true,\n    });\n  },\n\n  // 以下是级联选择的方法\n\n  handleCascaderPickerChange(cascaderValue, selectedOption, e) {\n    console.log('cityChange', cascaderValue, selectedOption, e);\n  },\n  handleCascaderOnOk(cascaderValue, selectedOption, e) {\n    console.log('cityOk', cascaderValue, selectedOption, e);\n  },\n  handleCascaderControlledOk(cascaderValue, selectedOption, e) {\n    /// #if ALIPAY\n    this.setData({ cascaderValue: cascaderValue });\n    /// #endif\n\n    /// #if WECHAT\n    this.setData({ cascaderValue: cascaderValue.detail[0] });\n    /// #endif\n    console.log('cityOk', cascaderValue, selectedOption, e);\n  },\n  handleCascaderChangeControlled() {\n    this.setData({ cascaderValue: ['31', '310'] });\n  },\n  handleCascaderClearControlled() {\n    this.setData({ cascaderValue: [] });\n  },\n  handleCascaderTriggerControlledPicker(visible, e) {\n    /// #if WECHAT\n    console.log('handleTriggerControlledPicker', visible);\n    this.setData({\n      cascaderVisible: visible.detail,\n    });\n    /// #endif\n\n    /// #if ALIPAY\n    console.log('handleTriggerControlledPicker', visible, e);\n    this.setData({\n      cascaderVisible: visible,\n    });\n    /// #endif\n  },\n  handleCascaderOpenPicker() {\n    this.setData({\n      cascaderVisible: true,\n    });\n  },\n});\n"
  },
  {
    "path": "demo/pages/Popover/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基础用法\">\n  <ant-popover\n    content=\"简单的tips\"\n    placement=\"top-left\"\n    showCloseIcon=\"{{ true }}\"\n    style=\"display: inline-block\">\n    <ant-button\n      size=\"small\"\n      inline>\n      点我\n    </ant-button>\n  </ant-popover>\n</ant-container>\n\n<ant-container title=\"基础用法-回调函数\">\n  <ant-popover\n    content=\"这里是一个提示文案很长的Tips，酌情使用文案。单一Tips最多可容纳2行文案这里是一个提示文案很长的Tips，酌情使用文案。单一Tips最多可容纳2行文案…\"\n    placement=\"top\"\n    showCloseIcon=\"{{ true }}\"\n    onVisibleChange=\"onVisibleChange\">\n    <ant-button>点我</ant-button>\n  </ant-popover>\n</ant-container>\n\n<ant-container title=\"基础用法-图片和行动点按钮\">\n  <ant-popover\n    content=\"这里是一个提示文案很长的Tips，酌情使用文案。单一Tips最多可容纳2行文案这里是一个提示文案很长的Tips，酌情使用文案。单一Tips最多可容纳2行文案…\"\n    placement=\"top\"\n    actionText=\"操作按钮\"\n    onTapAction=\"onTapAction\"\n    imageUrl=\"https://mdn.alipayobjects.com/huamei_mnxlps/afts/img/A*tLCBTqxataIAAAAAAAAAAAAADkqGAQ/original\"\n    onVisibleChange=\"onVisibleChange\">\n    <ant-button>点我</ant-button>\n  </ant-popover>\n</ant-container>\n\n<ant-container title=\"自定义\">\n  <view class=\"custom\">\n    <ant-popover\n      content=\"红色\"\n      color=\"red\">\n      <!-- display: inline -->\n      <ant-button style=\"margin-right: 24rpx;\" inline type=\"primary\">自定义颜色</ant-button>\n    </ant-popover>\n\n    <ant-popover\n      content=\"左侧插槽\">\n      <!-- display: inline -->\n      <ant-button inline style=\"margin-right: 24rpx;\">左侧插槽</ant-button>\n      <ant-icon slot=\"leftContent\" className=\"left-icon\" type=\"FaceRecognitionOutline\" />\n    </ant-popover>\n\n    <ant-popover\n      content=\"右侧插槽\">\n      <!-- display: inline -->\n      <ant-button inline style=\"margin-right: 24rpx;\">右侧插槽</ant-button>\n      <ant-icon slot=\"rightContent\" className=\"right-icon\" type=\"FaceRecognitionOutline\" />\n    </ant-popover>\n\n    <ant-popover\n      className=\"ant-popover-white\"\n      color=\"white\"\n      content=\"白色背景\">\n      <!-- display: inline -->\n      <ant-button inline style=\"margin-right: 24rpx;\">白色背景</ant-button>\n      <ant-icon slot=\"rightContent\" className=\"right-icon\" type=\"FaceRecognitionOutline\" />\n    </ant-popover>\n  </view>\n</ant-container>\n\n<ant-container title=\"点击icon查看\">\n  查看说明\n  <ant-popover\n    content=\"说明\"\n    style=\"display: inline-block\">\n    <ant-icon type=\"QuestionCircleOutline\" />\n  </ant-popover>\n</ant-container>\n\n<ant-container title=\"自定义位置\">\n  <view class=\"custom\">\n    <block\n      a:for=\"{{ placements }}\"\n      a:for-index=\"index\"\n      a:for-item=\"item\">\n      <ant-popover placement=\"{{ item }}\">\n        <ant-button\n          size=\"small\"\n          inline\n          className=\"custom-child\">\n          <view>点我</view>\n          {{ item }}\n        </ant-button>\n\n        <view\n          slot=\"content\"\n          class=\"content\">\n          {{ item }}\n        </view>\n      </ant-popover>\n    </block>\n  </view>\n</ant-container>\n\n<ant-container title=\"自定义mask\">\n  <ant-popover\n    content=\"prompt\"\n    maskStyle=\"background: rgba(0, 0, 0, 0.6);\"\n    style=\"display: inline-block\">\n    <ant-button\n      size=\"small\"\n      inline>\n      点我\n    </ant-button>\n  </ant-popover>\n</ant-container>\n\n<ant-container title=\"受控\">\n  <view>\n    <ant-popover\n      content=\"prompt\"\n      placement=\"right\"\n      showMask=\"{{ false }}\"\n      visible=\"{{ visible }}\"\n      onVisibleChange=\"onControlledVisibleChange\"\n      style=\"display: inline-block\">\n      <!-- display: inline -->\n      <text>点击按钮修改visible</text>\n    </ant-popover>\n  </view>\n  <ant-button\n    size=\"small\"\n    inline\n    onTap=\"handleVisibleChange\"\n    style=\"margin-top: 8px\">\n    change visible\n  </ant-button>\n</ant-container>\n"
  },
  {
    "path": "demo/pages/Popover/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Popover\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Popover\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-popover\": \"../../../src/Popover/index\",\n    \"ant-container\": \"../../../src/Container/index\",\n    \"ant-icon\": \"../../../src/Icon/index\",\n    \"ant-button\": \"../../../src/Button/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Popover/index.less",
    "content": ".custom {\n  display: flex;\n  flex-wrap: wrap;\n}\n\n.content {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  min-width: 30px;\n}\n\n.custom-child {\n  margin: 8px;\n}\n\n.ant-popover-white {\n  .ant-popover-inner {\n    color: #000000;\n  }\n  .ant-icon {\n    color: #000000;\n  }\n}\n\n.right-icon.ant-icon {\n  font-size: 48rpx;\n  margin-left: 24rpx;\n}\n\n.left-icon.ant-icon {\n  font-size: 48rpx;\n  margin-right: 24rpx;\n}\n"
  },
  {
    "path": "demo/pages/Popover/index.ts",
    "content": "Page({\n  data: {\n    visible: true,\n    placements: [\n      'top',\n      'bottom',\n      'left',\n      'right',\n      'top-left',\n      'top-right',\n      'bottom-left',\n      'bottom-right',\n      'left-top',\n      'left-bottom',\n      'right-top',\n      'right-bottom',\n    ],\n  },\n  onVisibleChange(visible, e) {\n    console.log('onVisibleChange', visible, e);\n  },\n  onControlledVisibleChange(visible) {\n    this.setData({\n      visible,\n    });\n  },\n  handleVisibleChange() {\n    this.setData({\n      visible: !this.data.visible,\n    });\n  },\n  onTapAction() {\n    /// #if ALIPAY\n    my.showToast({ content: '点击了行动点按钮' });\n    /// #endif\n    /// #if WECHAT\n    // @ts-ignore\n    wx.showToast({ title: '点击了行动点按钮' });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/PopoverList/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-popover-list\n  placement=\"bottom-right\"\n  visible=\"{{ visible }}\"\n  list=\"{{ list }}\"\n  onTapItem=\"handleTapItem\"\n  style=\"padding-top: 20px;margin: 0 20px;\"\n  onVisibleChange=\"handleVisibleChange\"\n>\n  <ant-button>点我</ant-button>\n</ant-popover-list>\n\n<ant-popover-list\n  visible=\"{{ visible2 }}\"\n  list=\"{{ list }}\"\n  onTapItem=\"handleTapItem\"\n  autoAdjustOverflow=\"{{ true }}\"\n  style=\"margin: 20px\"\n  onVisibleChange=\"handleVisibleChange2\"\n>\n  <ant-button style=\"margin-top: 500px;\">气泡位置自适应</ant-button>\n</ant-popover-list>\n"
  },
  {
    "path": "demo/pages/PopoverList/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"PopoverList\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"PopoverList\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-popover-list\": \"../../../src/PopoverList/index\",\n    \"ant-button\": \"../../../src/Button/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/PopoverList/index.less",
    "content": ".popover {\n  color: #000;\n}\n"
  },
  {
    "path": "demo/pages/PopoverList/index.ts",
    "content": "Page({\n  data: {\n    visible: true,\n    visible2: false,\n    list: [\n      {\n        text: '扫一扫',\n        icon: 'ScanningOutline',\n        showBadge: true,\n        id: 'scan',\n      },\n      {\n        text: '付钱/收钱',\n        icon: 'ReceivePaymentOutline',\n        showBadge: false,\n        id: 'pay',\n      },\n      {\n        text: '乘车码',\n        icon: 'TransportQRcodeOutline',\n        showBadge: false,\n        id: 'code',\n      },\n      {\n        text: '图片',\n        iconImage:\n          'https://gw.alipayobjects.com/mdn/rms_ce4c6f/afts/img/A*XMCgSYx3f50AAAAAAAAAAABkARQnAQ',\n        showBadge: false,\n        id: 'image',\n      },\n    ],\n  },\n  handleVisibleChange(visible, e) {\n    console.log(visible, e);\n    /// #if ALIPAY\n    this.setData({ visible });\n    /// #endif\n    /// #if WECHAT\n    this.setData({ visible: visible.detail });\n    /// #endif\n  },\n  handleVisibleChange2(visible, e) {\n    console.log(visible, e);\n    /// #if ALIPAY\n    this.setData({ visible2: visible });\n    /// #endif\n    /// #if WECHAT\n    this.setData({ visible2: visible.detail });\n    /// #endif\n  },\n  handleTapItem(e, item) {\n    console.log(e, item);\n    this.setData({ visible: false });\n\n    /// #if ALIPAY\n    my.showToast({ content: '点击列表', duration: 1000 });\n    /// #endif\n    /// #if WECHAT\n    // @ts-ignore\n    wx.showToast({ title: '点击列表' });\n    /// #endif\n  },\n  handleTapItem2(e, item) {\n    console.log(e, item);\n    this.setData({ visible2: false });\n\n    /// #if ALIPAY\n    my.showToast({ content: '点击列表', duration: 1000 });\n    /// #endif\n    /// #if WECHAT\n    // @ts-ignore\n    wx.showToast({ title: '点击列表' });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/Popup/index.axml",
    "content": "\n<ant-popup\n  visible=\"{{ basicVisible }}\"\n  showClose=\"{{ true }}\"\n  showBack=\"{{ true }}\"\n  title=\"标题\"\n  height=\"{{ 250 }}\"\n  width=\"{{ 250 }}\"\n  position=\"{{ position }}\"\n  animation=\"{{ animation }}\"\n  onClickBack=\"onClickBack\"\n  onClose=\"handlePopupClose\">\n  <view style=\"padding: 12px\">\n    从屏幕滑出或弹出一块自定义内容区，用于展示弹窗、信息提示、选择输入、切换等内容。\n  </view>\n</ant-popup>\n<ant-popup\n  visible=\"{{ customizeVisible }}\"\n  backgroundImage=\"https://mdn.alipayobjects.com/huamei_ahikbw/afts/img/A*1zlbRZpwRXYAAAAAAAAAAAAADiWwAQ/original\"\n  position=\"bottom\"\n  showClose=\"{{ true }}\"\n  animation=\"{{ animation }}\"\n  onClickBack=\"onClickBack\"\n  onClose=\"handlePopupClose\">\n  <view class=\"customize-content\">\n    <image mode=\"widthFix\" class=\"customize-content-image\" src=\"https://mdn.alipayobjects.com/huamei_ahikbw/afts/img/A*SD-BTaA-k_wAAAAAAAAAAAAADiWwAQ/original\" />\n    <ant-button onTap=\"handlePopupClose\" style=\"margin-top: 60rpx;width:100%;\" type=\"primary\">去开通</ant-button>\n    <ant-button onTap=\"handlePopupClose\" style=\"margin-top: 24rpx;width:100%\">暂不开通</ant-button>\n  </view>\n</ant-popup>\n<ant-popup\n  visible=\"{{ topImageVisible }}\"\n  className=\"customize-top-image-popup\"\n  backgroundImage=\"https://mdn.alipayobjects.com/huamei_ahikbw/afts/img/A*jVxmQq4bhoUAAAAAAAAAAAAADiWwAQ/original\"\n  position=\"bottom\"\n  showClose=\"{{ false }}\"\n  animation=\"{{ animation }}\"\n  onClickBack=\"onClickBack\"\n  onClose=\"handlePopupClose\">\n  <view class=\"customize-content\">\n    <image mode=\"widthFix\" class=\"customize-content-image1\" src=\"https://mdn.alipayobjects.com/huamei_ahikbw/afts/img/A*Jly2R5hYEm8AAAAAAAAAAAAADiWwAQ/original\" />\n    <ant-button onTap=\"handlePopupClose\" style=\"margin-top: 60rpx;width:100%;\" type=\"primary\">去开通</ant-button>\n    <ant-button onTap=\"handlePopupClose\" style=\"margin-top: 24rpx;width:100%;\">暂不开通</ant-button>\n    <view  class=\"customize-content-text\">可在其他地方查看</view>\n  </view>\n</ant-popup>\n<ant-popup\n  visible=\"{{ scrollVisible }}\"\n  position=\"bottom\"\n  title=\"超长内容滚动\"\n  showClose=\"{{ true }}\"\n  animation=\"{{ animation }}\"\n  onClickBack=\"onClickBack\"\n  onClose=\"handlePopupClose\">\n  <scroll-view\n    scroll-y\n    style=\"padding: 12px; height: 300px\"\n    disable-lower-scroll=\"out-of-bounds\"\n    disable-upper-scroll=\"out-of-bounds\">\n    Ea consectetur ipsum consequat exercitation laboris excepteur pariatur\n    excepteur labore dolor cillum tempor esse. Ad adipisicing nostrud fugiat eu\n    mollit. Proident nisi voluptate sunt ea laboris Lorem ullamco deserunt aute\n    incididunt cillum tempor duis est. Elit voluptate laboris laborum anim\n    exercitation consequat laboris ad. Quis ad enim fugiat. Aliqua reprehenderit\n    irure non esse consequat laborum ea ut minim ex ea cillum. Dolore dolore\n    proident laboris occaecat pariatur eu ad. Velit mollit aliqua do. Sunt enim\n    tempor deserunt nostrud ut et. Sunt ad sit eiusmod ipsum ad non in sit\n    veniam. Consectetur do id excepteur et aute. Commodo duis ea sit occaecat\n    nisi dolore aliquip laborum esse minim. Officia veniam deserunt id cupidatat\n    consectetur nisi cillum pariatur qui dolor veniam sit. Nostrud elit irure\n    cupidatat esse ad ipsum. Consectetur culpa et et enim mollit officia in elit\n    ipsum. Dolor et veniam labore excepteur magna magna in. Dolore voluptate\n    eiusmod et. Esse fugiat irure excepteur duis tempor minim. Officia enim\n    incididunt magna dolore exercitation occaecat et do et in duis deserunt\n    excepteur. Cupidatat magna officia commodo reprehenderit anim qui laborum\n    duis reprehenderit voluptate quis veniam. Consequat pariatur in magna Lorem\n    eiusmod cupidatat qui est Lorem tempor qui anim aliquip duis. Laborum\n    occaecat est laborum qui deserunt incididunt laborum cillum eu nostrud in\n    deserunt culpa mollit. Nisi reprehenderit non duis qui elit eu dolore\n    pariatur duis laboris exercitation minim nulla adipisicing et. Fugiat ad\n    commodo enim eiusmod sint aliquip Lorem. Reprehenderit cillum dolor deserunt\n    adipisicing commodo qui magna consectetur est ut Lorem sint. Cillum dolor\n    enim incididunt excepteur cupidatat mollit deserunt deserunt ullamco cillum\n    nostrud duis excepteur non. Excepteur sit consectetur ut laborum consequat\n    culpa aute id aute et. Eiusmod Lorem esse pariatur culpa officia minim eu\n    magna irure. Minim adipisicing quis excepteur irure est exercitation dolore\n    exercitation id tempor fugiat pariatur eu Lorem. Nostrud incididunt laboris\n    irure et aliqua reprehenderit anim enim occaecat aliqua. Nostrud adipisicing\n    nisi enim aliqua enim sint sunt ad qui irure amet aute. Quis esse cillum\n    commodo laboris adipisicing mollit cillum est amet velit cupidatat proident.\n    Voluptate adipisicing dolore consequat officia culpa in fugiat consectetur\n    velit. Minim ex aliqua proident irure. Aliquip magna reprehenderit laborum\n    elit proident culpa sint occaecat sunt sint adipisicing adipisicing anim. Eu\n    nisi anim in laboris voluptate. Sit ullamco adipisicing fugiat ad\n    adipisicing excepteur esse exercitation nostrud ipsum nostrud. Deserunt sunt\n    irure id mollit anim aliquip ullamco amet laborum nisi. Sit consequat\n    consequat ullamco voluptate do sit nisi quis laboris tempor amet mollit\n    sint. Incididunt mollit eu anim eiusmod ea cupidatat veniam aliquip. Tempor\n    ea elit amet ea. Et proident occaecat id. Sunt sunt cillum ut sunt ea\n    voluptate ea sit amet minim deserunt pariatur ullamco. Commodo nostrud\n    excepteur non id dolore minim anim anim tempor qui duis. Quis occaecat\n    pariatur reprehenderit anim reprehenderit cillum mollit aliqua sit anim\n    cillum ut. Enim eiusmod quis sit consequat consectetur. Reprehenderit ex\n    elit sit adipisicing dolor eiusmod occaecat duis culpa. Ex laboris\n    exercitation occaecat exercitation commodo proident esse. Tempor voluptate\n    mollit amet ex ea occaecat adipisicing. Minim quis voluptate labore\n    reprehenderit commodo. Pariatur ex sit aliquip minim ea sunt. Lorem et velit\n    veniam ut sunt deserunt mollit eu in nostrud tempor. Aliqua nisi duis duis\n    excepteur et quis quis proident do cillum dolor. Labore cupidatat eiusmod\n    voluptate cupidatat anim ad do pariatur sunt quis. Occaecat cillum eu non\n    enim dolor nulla aliqua minim amet tempor irure reprehenderit reprehenderit\n    laboris quis. Laboris ullamco excepteur ut fugiat sunt. Labore ex culpa\n    incididunt sint minim velit sunt non et laborum consectetur eu. Ullamco\n    magna dolore reprehenderit amet do. Nisi exercitation esse deserunt\n    exercitation deserunt ex eu ea cillum magna adipisicing. Incididunt\n    adipisicing aute voluptate deserunt fugiat nostrud nostrud. Id nostrud do\n    cupidatat quis ea sint anim duis labore proident minim excepteur dolor\n    proident elit.\n  </scroll-view>\n</ant-popup>\n<!-- #if ALIPAY -->\n<ant-popup\n  visible=\"{{ slotVisible }}\"\n  position=\"bottom\"\n  showClose=\"{{ true }}\"\n  showBack=\"{{ true }}\"\n  animation=\"{{ animation }}\"\n  onClickBack=\"onClickBack\"\n  onClose=\"handlePopupClose\">\n    <view slot=\"header-close\" class=\"header-close\">\n      x\n    </view>\n    <view slot=\"header-back\" class=\"header-back\">\n      返回\n    </view>\n    <view slot=\"header-title\" class=\"header-title\">\n      标题\n    </view>\n    <view class=\"customize-content\">\n      从屏幕滑出或弹出一块自定义内容区，用于展示弹窗、信息提示、选择输入、切换等内容。\n    </view>\n</ant-popup>\n<!-- #endif -->\n<container\n  title=\"弹出位置\"\n  className=\"list\">\n  <ant-button\n    data-position=\"top\"\n    onTap=\"handleShowBasic\">\n    顶部弹出\n  </ant-button>\n  <ant-button\n    data-position=\"bottom\"\n    onTap=\"handleShowBasic\">\n    底部弹出\n  </ant-button>\n  <ant-button\n    data-position=\"left\"\n    onTap=\"handleShowBasic\">\n    左侧弹出\n  </ant-button>\n  <ant-button\n    data-position=\"right\"\n    onTap=\"handleShowBasic\">\n    右侧弹出\n  </ant-button>\n  <ant-button onTap=\"handleShowCustomize\">自定义弹框内容 并支持背景图</ant-button>\n  <ant-button onTap=\"handleShowTopImage\">顶部图片</ant-button>\n  <ant-button onTap=\"handleShowScroll\">超长内容滚动</ant-button>\n  <!-- #if ALIPAY -->\n  <ant-button onTap=\"handleShowSlot\">插槽定制Header</ant-button>\n  <!-- #endif -->\n</container>\n<list>\n  <list-item>\n    开启过渡动画\n    <switch\n      slot=\"extra\"\n      checked=\"{{ animation }}\"\n      onChange=\"handleChangeAnimation\" />\n  </list-item>\n</list>\n"
  },
  {
    "path": "demo/pages/Popup/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Popup\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Popup\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-popup\": \"../../../src/Popup/index\",\n    \"container\": \"../../../src/Container/index\",\n    \"ant-button\": \"../../../src/Button/index\",\n    \"list\": \"../../../src/List/index\",\n    \"list-item\": \"../../../src/List/ListItem/index\",\n    \"switch\": \"../../../src/Switch/index\",\n    \"ant-icon\": \"../../../src//Icon/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Popup/index.less",
    "content": ".list .ant-button {\n  margin-bottom: 8px;\n}\n.customize-top-image-popup {\n  .ant-popup-content {\n    background: none;\n  }\n  .ant-popup-transform-bottom {\n    padding-bottom: 0;\n  }\n}\n.customize-content {\n  display: flex;\n  flex-direction: column;\n  justify-content: flex-start;\n  align-items: center;\n  padding: 140rpx 24rpx 0rpx 24rpx;\n  padding-bottom: constant(safe-area-inset-bottom);\n  padding-bottom: env(safe-area-inset-bottom);\n  &-image {\n    width: 666rpx;\n  }\n  &-image1 {\n    width: 702rpx;\n    margin-top: 100rpx;\n  }\n  &-text {\n    font-weight: 400;\n    font-size: 24rpx;\n    color: #999999;\n    text-align: center;\n    padding-top: 30rpx;\n  }\n}\n\n.header-back {\n  font-size: 24rpx;\n  color: #999999;\n}\n\n.header-close {\n  font-size: 48rpx;\n  color: #999999;\n}\n"
  },
  {
    "path": "demo/pages/Popup/index.ts",
    "content": "Page({\n  data: {\n    position: '',\n    basicVisible: false,\n    animation: true,\n    scrollVisible: false,\n    customizeVisible: false,\n    topImageVisible: false,\n  },\n  onClickBack() {\n    this.showToast('点击了返回icon');\n  },\n  handlePopupClose() {\n    this.setData({\n      basicVisible: false,\n      scrollVisible: false,\n      customizeVisible: false,\n      topImageVisible: false,\n      slotVisible: false,\n    });\n  },\n  handleShowBasic(e) {\n    const { position } = e.target.dataset;\n    this.setData({\n      position,\n      basicVisible: true,\n    });\n  },\n  handleShowScroll() {\n    this.setData({ scrollVisible: true });\n  },\n  handleShowSlot() {\n    this.setData({ slotVisible: true });\n  },\n  handleChangeAnimation(checked) {\n    /// #if ALIPAY\n    this.setData({ animation: checked });\n    /// #endif\n\n    /// #if WECHAT\n    this.setData({ animation: checked.detail });\n    /// #endif\n  },\n  handleShowCustomize() {\n    this.setData({ customizeVisible: true });\n  },\n  handleShowTopImage() {\n    this.setData({ topImageVisible: true });\n  },\n  showToast(content) {\n    /// #if ALIPAY\n    my.showToast({ content, duration: 1000 });\n    /// #endif\n\n    /// #if WECHAT\n    // @ts-ignore\n    wx.showToast({ content, duration: 1000 });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/Postscript/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基础用法\">\n  <ant-postscript\n    title=\"转账备注\"\n    quickInputs=\"{{quickInputs}}\"\n    onChange=\"handleChange\"\n  />\n</ant-container>\n\n<ant-container title=\"连接快速输入\">\n  <ant-postscript\n    title=\"拼接快速输入\"\n    placeholder=\"点击快速输入试试\"\n    quickInputs=\"{{quickInputs}}\"\n    combineSymbol=\"+\"\n    onChange=\"handleChange\"\n  />\n</ant-container>\n\n<ant-container title=\"无标题\">\n  <ant-postscript\n    quickInputs=\"{{quickInputs2}}\"\n    combineSymbol=\" \"\n    onChange=\"handleChange\"\n  />\n</ant-container>\n\n<ant-container title=\"最长输入限制\">\n  <ant-postscript\n    maxLength=\"10\"\n    title=\"转账备注\"\n    placeholder=\"最长输入10个字\"\n    onChange=\"handleChange\"\n  />\n</ant-container>\n\n<ant-container title=\"自定义样式\">\n  <ant-postscript\n    className=\"custom-postscript\"\n    title=\"转账备注\"\n    quickInputs=\"{{quickInputs}}\"\n    onChange=\"handleChange\"\n  />\n</ant-container>\n"
  },
  {
    "path": "demo/pages/Postscript/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Postscript\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Postscript\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-postscript\": \"../../../src/Postscript/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Postscript/index.less",
    "content": "@import \"../../../src/style/themes/color.less\";\n\n.custom-postscript {\n  .ant-postscript-quick-item {\n    background: rgba(0, 102, 204, 0.1);\n    color: #0066cc;\n  }\n}\n"
  },
  {
    "path": "demo/pages/Postscript/index.ts",
    "content": "Page({\n  data: {\n    quickInputs: ['工资', '班费', '还款', '借款', '代购', '奖金', '生活费'],\n    quickInputs2: [\n      '❤️ 钱转你了',\n      '🧽 注意身体',\n      '🍰 生日快乐',\n      '🎁 礼物',\n      '💰 红包',\n      '💐 鲜花',\n      '🎉 恭喜',\n    ],\n  },\n\n  handleChange(val) {\n    let value = val;\n    /// #if WECHAT\n    value = val.detail;\n    /// #endif\n    console.log('handleChange', value);\n  },\n});\n"
  },
  {
    "path": "demo/pages/Progress/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基础使用 (有/无动效)\">\n  <view class=\"line\">\n    <ant-progress type=\"circle\" percent=\"{{ percent1 }}\" />\n    <ant-progress type=\"circle\" percent=\"{{ percent1 }}\" animation=\"{{ false }}\" />\n  </view>\n  <ant-progress percent=\"{{ percent1 }}\" style=\"margin-top: 40rpx;\"/>\n  <ant-progress percent=\"{{ percent1 }}\" animation=\"{{ false }}\" style=\"margin-top: 40rpx;\"/>\n  <view class=\"buttonwrapper\">\n    <ant-button\n      inline\n      style=\"margin-right: 16rpx\"\n      onTap=\"handleReduce\">\n      Reduce\n    </ant-button>\n    <ant-button\n      inline\n      onTap=\"handleIncrease\">\n      Increase\n    </ant-button>\n  </view>\n</ant-container>\n\n<ant-container title=\"自定义宽度\">\n  <view class=\"line\">\n    <ant-progress\n      type=\"circle\"\n      percent=\"{{ percent2 }}\"\n      strokeWidth=\"{{ 12 }}\" />\n    <ant-progress\n      type=\"circle\"\n      percent=\"{{ percent2 }}\"\n      strokeWidth=\"{{ 2 }}\" />\n  </view>\n  <ant-progress\n    percent=\"{{ percent2 }}\"\n    strokeWidth=\"15\"\n    style=\"margin-top: 40rpx;\" />\n</ant-container>\n\n<ant-container title=\"语义化进度条\">\n  <ant-progress\n    status=\"success\"\n    percent=\"100\" />\n  <ant-progress\n    status=\"exception\"\n    percent=\"50\" />\n</ant-container>\n\n<ant-container title=\"自定义颜色\">\n  <view class=\"line\">\n    <ant-progress\n      type=\"circle\"\n      percent=\"{{ percent3 }}\"\n      strokeColor=\"#00B578\" />\n    <ant-progress\n      type=\"circle\"\n      percent=\"{{ percent3 }}\"\n      strokeColor=\"#FF8F1F\" />\n  </view>\n\n  <ant-progress\n    percent=\"{{ percent3 }}\"\n    trailColor=\"#FFCF9F\"\n    style=\"margin-top: 40rpx;\" />\n  <ant-progress\n    percent=\"{{ percent3 }}\"\n    strokeColor=\"#FFCF9F\"\n    style=\"margin-top: 40rpx;\" />\n  <ant-progress\n    percent=\"{{ percent3 }}\"\n    style=\"margin-top: 40rpx;\" />\n</ant-container>\n\n<ant-container title=\"各种自定义\">\n  <view class=\"line\">\n    <ant-progress\n      type=\"circle\"\n      percent=\"{{ percent5 }}\">\n      <view slot=\"indicator\">{{ percent5 }}GB</view>\n    </ant-progress>\n    <ant-progress\n      type=\"circle\"\n      percent=\"{{ percent5 }}\">\n      <view slot=\"indicator\">{{ percent5 }}步</view>\n    </ant-progress>\n  </view>\n\n   <view class=\"line\">\n    <ant-progress\n      type=\"circle\"\n      percent=\"{{ percent5 }}\"\n      width=\"{{ 80 }}\" />\n    <ant-progress\n      type=\"circle\"\n      percent=\"{{ percent5 }}\"\n      width=\"{{ 100 }}\" />\n    <ant-progress\n      type=\"circle\"\n      percent=\"{{ percent5 }}\"\n      width=\"{{ 120 }}\" />\n  </view>\n\n  <ant-progress\n    percent=\"{{ percent5 }}\"\n    style=\"width: 100%;margin-top: 40rpx;\" />\n  <ant-progress\n    percent=\"{{ percent5 }}\"\n    style=\"width: 70%;margin-top: 40rpx;\" />\n  <ant-progress\n    percent=\"{{ percent5 }}\"\n    style=\"width: 50%;margin-top: 40rpx;\" />\n\n  <ant-progress percent=\"{{ percent2 }}\" style=\"margin-top: 40rpx;\">\n    <text slot=\"indicator\">{{ (percent2 / 100) * 200 }}步</text>\n  </ant-progress>\n</ant-container>\n\n"
  },
  {
    "path": "demo/pages/Progress/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"ProgressCircle\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"ProgressCircle\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-button\": \"../../../src/Button/index\",\n    \"ant-progress\": \"../../../src/Progress/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Progress/index.less",
    "content": ".buttonwrapper {\n  display: flex;\n  justify-content: center;\n  padding-top: 20rpx;\n}\n\n.line {\n  margin-top: 40rpx;\n  display: flex;\n  flex-direction: row;\n  width: 100%;\n  justify-content: space-evenly;\n  align-items: center;\n}\n"
  },
  {
    "path": "demo/pages/Progress/index.ts",
    "content": "Page({\n  data: {\n    percent1: 10,\n    percent2: 60,\n    percent3: 60,\n    percent4: 60,\n    percent5: 60,\n  },\n  handleIncrease() {\n    const newPercent = this.data.percent1 + 20;\n    this.setData({\n      percent1: Math.max(Math.min(100, newPercent), 0),\n    });\n  },\n  handleReduce() {\n    const newPercent = this.data.percent1 - 20;\n    this.setData({\n      percent1: Math.max(Math.min(100, newPercent), 0),\n    });\n  },\n});\n"
  },
  {
    "path": "demo/pages/Radio/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"Radio 用法\">\n  <view>\n    <ant-radio onChange=\"onChange\">基础用法</ant-radio>\n  </view>\n\n  <view class=\"line\">\n    <ant-radio defaultChecked=\"{{ true }}\">初始值</ant-radio>\n  </view>\n\n  <view class=\"line\">\n    <ant-radio disabled>禁用按钮1</ant-radio>\n    <ant-radio\n      defaultChecked\n      disabled>\n      禁用按钮2\n    </ant-radio>\n  </view>\n\n  <view class=\"line\">\n    <ant-radio\n      color=\"red\"\n      defaultChecked>\n      自定义颜色\n    </ant-radio>\n  </view>\n\n  <view class=\"line\">\n    <ant-radio\n      checked=\"{{ checked }}\"\n      onChange=\"handleChange\">\n      受控模式\n    </ant-radio>\n  </view>\n</ant-container>\n\n\n<ant-container title=\"RadioGroup 用法\">\n  <view>\n    <view class=\"title\">基础用法</view>\n    <ant-radio-group\n      options=\"{{ options }}\"\n      onChange=\"onRadioGroupChange\" />\n  </view>\n\n  <view class=\"line\">\n    <view class=\"title\">初始值</view>\n    <ant-radio-group\n      defaultValue=\"banana\"\n      options=\"{{ options }}\"\n      onChange=\"onRadioGroupChange\" />\n  </view>\n\n  <view class=\"line\">\n    <view class=\"title\">横向布局</view>\n    <ant-radio-group\n      options=\"{{ options }}\"\n      position=\"horizontal\" />\n  </view>\n\n  <view class=\"line\">\n    <view class=\"title\">禁用模式-所有禁用</view>\n    <ant-radio-group\n      options=\"{{ options }}\"\n      disabled />\n  </view>\n\n  <view class=\"line\">\n    <view class=\"title\">禁用模式-其中有的禁用</view>\n    <ant-radio-group options=\"{{ optionsWithDisabled }}\" />\n  </view>\n\n  <view class=\"line\">\n    <view class=\"title\">受控模式</view>\n    <ant-radio-group\n      value=\"{{ value }}\"\n      options=\"{{ options }}\"\n      onChange=\"handleRadioGroupChange\" />\n  </view>\n  <!-- #if ALIPAY -->\n  <view class=\"line\">\n    <view class=\"title\">自定义</view>\n    <ant-radio-group\n      options=\"{{ options }}\"\n      color=\"red\"\n      defaultValue=\"banana\">\n      <view\n        slot=\"label\"\n        slot-scope=\"item\">\n        {{ item.index + 1 }} {{ item.value.label }}\n      </view>\n    </ant-radio-group>\n  </view>\n  <!-- #endif -->\n</ant-container>\n"
  },
  {
    "path": "demo/pages/Radio/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Radio\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Radio\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-radio\": \"../../../src/Radio/index\",\n    \"ant-radio-group\": \"../../../src/Radio/RadioGroup/index\",\n    \"ant-container\": \"../../../src/Container/index\",\n    \"ant-icon\": \"../../../src/Icon/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Radio/index.less",
    "content": ".icon {\n  border: 1px solid #CCCCCC;\n  border-radius: 50vh;\n  width: 100%;\n  height: 100%;\n  box-sizing: border-box;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.checked {\n  background-color: red;\n  color: #fff;\n  font-size: 14px;\n}\n\n.disabled {\n  opacity: 0.4;\n}\n\n.line {\n  margin-top: 40rpx;\n}\n.title {\n  color: #999;\n}\n\n"
  },
  {
    "path": "demo/pages/Radio/index.ts",
    "content": "Page({\n  data: {\n    checked: false,\n    value: 'banana',\n    options: [\n      { value: 'apple', label: '苹果' },\n      { value: 'orange', label: '橘子' },\n      { value: 'banana', label: '香蕉' },\n    ],\n    optionsWithDisabled: [\n      { value: 'apple', label: '苹果' },\n      { value: 'orange', label: '橘子' },\n      { value: 'watermelon', label: '西瓜', disabled: true },\n      { value: 'banana', label: '香蕉' },\n    ],\n  },\n  onChange(value, e) {\n    console.log(value, e);\n  },\n  handleChange(checked) {\n    /// #if WECHAT\n    this.setData({\n      checked: checked.detail,\n    });\n    /// #endif\n    /// #if ALIPAY\n    this.setData({\n      checked,\n    });\n    /// #endif\n  },\n\n  onRadioGroupChange(value, e) {\n    console.log(value, e);\n  },\n  handleRadioGroupChange(value) {\n    /// #if WECHAT\n    this.setData({\n      value: value.detail,\n    });\n    /// #endif\n    /// #if ALIPAY\n    this.setData({\n      value,\n    });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/RareWordsKeyboard/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-list header=\"基础使用\">\n  <ant-container title=\"姓名\">\n    <ant-input\n      placeholder=\"请输入姓名\"\n      value=\"{{ value }}\"\n      onChange=\"onInputChange\">\n      <view\n        slot=\"suffix\"\n        class=\"tips\"\n        onTap=\"onTap\">\n        生僻字？\n      </view>\n    </ant-input>\n  </ant-container>\n\n  <ant-list-item onTap=\"onTap\">默认键盘</ant-list-item>\n\n  <ant-rare-words-keyboard\n    visible=\"{{ visible }}\"\n    onClose=\"onClose\"\n    onChange=\"onChange\" />\n\n  <ant-list-item onTap=\"onTap2\">不带蒙层</ant-list-item>\n\n  <ant-rare-words-keyboard\n    visible=\"{{ visible2 }}\"\n    showMask=\"{{ false }}\"\n    onClose=\"onClose2\"\n    onChange=\"onChange\" />\n\n  <ant-list-item onTap=\"onTap3\">监听输入完成、出错的回调</ant-list-item>\n\n  <ant-rare-words-keyboard\n    visible=\"{{ visible3 }}\"\n    onClose=\"onClose3\"\n    onChange=\"onChange\"\n    onError=\"onKeyBoardError\" />\n</ant-list>\n"
  },
  {
    "path": "demo/pages/RareWordsKeyboard/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"RareWordsKeyboard\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"RareWordsKeyboard\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-rare-words-keyboard\": \"../../../src/RareWordsKeyboard/index\",\n    \"ant-list\": \"../../../src/List/index\",\n    \"ant-list-item\": \"../../../src/List/ListItem/index\",\n    \"ant-input\": \"../../../src/Input/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/RareWordsKeyboard/index.less",
    "content": "page {\n  font-family: PingFang SC, Helvetica Neue, rare-words-font;\n}\n\n.tips {\n  color: #1677ff;\n  font-size: 13px;\n\n  &:active {\n    color: #3086ff;\n  }\n}\n"
  },
  {
    "path": "demo/pages/RareWordsKeyboard/index.ts",
    "content": "Page({\n  data: {\n    value: '',\n    visible: false,\n    visible2: false,\n    visible3: false,\n  },\n  onInputChange(value) {\n    /// #if WECHAT\n    value = value.detail;\n    /// #endif\n    this.setData({ value });\n  },\n  // 默认键盘\n  onTap() {\n    this.setData({ visible: true });\n  },\n  // 关闭键盘\n  onClose() {\n    this.setData({ visible: false });\n  },\n  // 不带蒙层\n  onTap2() {\n    this.setData({ visible2: true });\n  },\n  onClose2() {\n    this.setData({ visible2: false });\n  },\n  // 监听各种事件\n  onTap3() {\n    this.setData({ visible3: true });\n  },\n  onClose3() {\n    this.setData({ visible3: false });\n  },\n  onChange(value) {\n    /// #if WECHAT\n    value = value.detail;\n    /// #endif\n    const curValue = this.data.value;\n    this.setData({ value: curValue + value });\n  },\n  onKeyBoardError(err) {\n    /// #if WECHAT\n    err = err.detail;\n    /// #endif\n    my.showToast({ content: 'onError ' + err.toString() });\n  },\n});\n"
  },
  {
    "path": "demo/pages/Rate/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基础用法\">\n  <ant-rate\n    defaultValue=\"{{ 3 }}\"\n    onChange=\"onChange\" />\n</ant-container>\n\n<ant-container title=\"半星\">\n  <ant-rate\n    defaultValue=\"{{ 3.5 }}\"\n    allowHalf\n    onChange=\"onChange\" />\n</ant-container>\n\n<ant-container title=\"清除\">\n  <ant-rate\n    defaultValue=\"{{ 4 }}\"\n    onChange=\"onChange\" />\n  <view class=\"description\">allowClear: true</view>\n  <ant-rate\n    defaultValue=\"{{ 4 }}\"\n    allowClear=\"{{ false }}\"\n    onChange=\"onChange\" />\n  <view class=\"description\">allowClear: false</view>\n</ant-container>\n\n<ant-container title=\"只读\">\n  <ant-rate\n    defaultValue=\"{{ 3.5 }}\"\n    readonly />\n</ant-container>\n\n<ant-container title=\"多个count\">\n  <ant-rate\n    defaultValue=\"{{ 5 }}\"\n    count=\"{{ 8 }}\" />\n</ant-container>\n\n<!-- #if ALIPAY || WECHAT -->\n<ant-container title=\"受控模式\">\n  <view style=\"display: flex; justify-content: space-around\">\n    <view>\n      <ant-rate\n        value=\"{{ value }}\"\n        onChange=\"handleChange\" />\n\n      <view style=\"margin-top: 8px\">\n        <ant-stepper\n          value=\"{{ value }}\"\n          min=\"{{ 0 }}\"\n          max=\"{{ 5 }}\"\n          onChange=\"handleChange\" />\n      </view>\n    </view>\n    <view>\n      <ant-rate value=\"{{ value }}\" />\n      <view class=\"description\">无 onChange 函数</view>\n    </view>\n  </view>\n</ant-container>\n<!-- #endif -->\n<ant-container title=\"自定义间距\">\n  <ant-rate\n    defaultValue=\"{{ 3 }}\"\n    gutter=\"{{ 8 }}\" />\n  <view class=\"description\">8px</view>\n\n  <ant-rate\n    defaultValue=\"{{ 4 }}\"\n    gutter=\"{{ 16 }}\" />\n  <view class=\"description\">16px</view>\n</ant-container>\n\n<ant-container title=\"自定义大小\">\n  <ant-rate\n    defaultValue=\"{{ 3 }}\"\n    className=\"rate\" />\n  <view class=\"description\">30px</view>\n\n  <ant-rate\n    defaultValue=\"{{ 3 }}\"\n    style=\"font-size: 40px\" />\n  <view class=\"description\">40px</view>\n</ant-container>\n\n<ant-container title=\"自定义颜色\">\n  <ant-rate\n    defaultValue=\"{{ 3 }}\"\n    characterClassName=\"star\"\n    characterActiveClassName=\"star-active\" />\n  <view class=\"description\">基础</view>\n\n  <ant-rate\n    defaultValue=\"{{ 3 }}\"\n    characterClassName=\"star-gradient\"\n    characterActiveClassName=\"star-active-gradient\" />\n  <view class=\"description\">渐变</view>\n</ant-container>\n<!-- #if ALIPAY -->\n<ant-container title=\"自定义图标\">\n  <ant-rate defaultValue=\"{{ 3 }}\">\n    <ant-icon\n      slot=\"character\"\n      type=\"HeartFill\" />\n  </ant-rate>\n  <view class=\"description\">自定义为HeartFill</view>\n\n  <ant-rate\n    defaultValue=\"{{ 3.5 }}\"\n    allowHalf>\n    <ant-icon\n      slot=\"character\"\n      type=\"StarOutline\" />\n  </ant-rate>\n  <view class=\"description\">自定义为StarOutline</view>\n\n  <ant-rate\n    defaultValue=\"{{ 3.5 }}\"\n    allowHalf\n    characterClassName=\"character\">\n    <view slot=\"character\">正</view>\n  </ant-rate>\n  <view class=\"description\">自定义为正</view>\n\n  <ant-rate\n    defaultValue=\"{{ 2.5 }}\"\n    allowHalf\n    characterClassName=\"character\">\n    <view slot=\"character\">A</view>\n  </ant-rate>\n  <view class=\"description\">自定义为A</view>\n\n  <ant-rate\n    defaultValue=\"{{ 2.5 }}\"\n    allowHalf\n    gutter=\"{{ 20 }}\"\n    characterClassName=\"character\">\n    <view\n      slot=\"character\"\n      slot-scope=\"rate\">\n      {{ rate.index }}\n    </view>\n  </ant-rate>\n  <view class=\"description\">自定义为索引</view>\n</ant-container>\n<!-- #endif -->\n"
  },
  {
    "path": "demo/pages/Rate/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Rate\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Rate\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-rate\": \"../../../src/Rate/index\",\n    /// #if ALIPAY || WECHAT\n    \"ant-stepper\": \"../../../src/Stepper/index\",\n    /// #endif\n    \"ant-container\": \"../../../src/Container/index\",\n    \"ant-icon\": \"../../../src/Icon/index\"\n  },\n  \"allowsBounceVertical\": \"NO\"\n}\n"
  },
  {
    "path": "demo/pages/Rate/index.less",
    "content": ".description {\n  margin: 4px 0 8px 0;\n  color: var(--color-text-primary);\n}\n\n.star {\n  color: rgb(118, 118, 118);\n}\n\n.star-active {\n  /// #if ALIPAY\n  color: red;\n  /// #endif\n\n  /// #if WECHAT\n  color: red !important;\n  /// #endif\n}\n\n.star-gradient {\n  background-image: linear-gradient(\n    to right,\n    rgb(151, 151, 151),\n    rgb(255, 255, 255)\n  );\n  -webkit-background-clip: text;\n\n  /// #if WECHAT\n  color: transparent !important;\n  /// #endif\n\n  /// #if ALIPAY\n  color: transparent;\n  /// #endif\n}\n\n.star-active-gradient {\n  background-image: linear-gradient(to right, orange, yellow);\n  -webkit-background-clip: text;\n\n  /// #if WECHAT\n  color: transparent !important;\n  /// #endif\n\n  /// #if ALIPAY\n  color: transparent;\n  /// #endif\n}\n\n.character {\n  font-size: 40px;\n}\n"
  },
  {
    "path": "demo/pages/Rate/index.ts",
    "content": "Page({\n  data: {\n    value: 3,\n  },\n  onChange(value) {\n    console.log(value);\n  },\n  handleChange(value) {\n    console.log(value);\n    /// #if WECHAT\n    this.setData({\n      value: value.detail,\n    });\n    /// #endif\n    /// #if ALIPAY\n    this.setData({\n      value,\n    });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/Result/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"成功状态\">\n  <ant-result\n    title=\"操作成功\"\n    message=\"内容详情可折行，建议不超过两行建议不超过两行建议不超过两行\"\n    type=\"success\" />\n</ant-container>\n\n<ant-container title=\"等待状态\">\n  <ant-result\n    title=\"等待处理\"\n    message=\"内容详情可折行，建议不超过两行建议不超过两行建议不超过两行\"\n    type=\"wait\" />\n</ant-container>\n\n<ant-container title=\"提示状态\">\n  <ant-result\n    title=\"信息提示\"\n    message=\"内容详情可折行，建议不超过两行建议不超过两行建议不超过两行\"\n    type=\"info\" />\n</ant-container>\n\n<ant-container title=\"警告状态\">\n  <ant-result\n    title=\"警告提示\"\n    message=\"内容详情可折行，建议不超过两行建议不超过两行建议不超过两行\"\n    type=\"warning\" />\n</ant-container>\n\n<ant-container title=\"失败状态\">\n  <ant-result\n    title=\"无法完成操作\"\n    message=\"内容详情可折行，建议不超过两行\\n建议不超过两行建议不超过两行\"\n    type=\"error\" />\n</ant-container>\n<!-- #if ALIPAY -->\n<ant-container title=\"自定义-按钮\">\n  <ant-result\n    image=\"https://gw.alipayobjects.com/mdn/miniProgram_mendian/afts/img/A*wiFYTo5I0m8AAAAAAAAAAABjAQAAAQ/original\">\n    <view slot=\"title\">标题插槽</view>\n    <view slot=\"message\">描述插槽</view>\n    <view slot=\"extra\" style=\"padding-top: 48rpx;\">\n      <ant-button type=\"primary\">主要操作</ant-button>\n      <ant-button aide> 辅助操作 </ant-button>\n    </view>\n  </ant-result>\n</ant-container>\n\n<ant-container title=\"自定义-模块\">\n  <ant-result\n    image=\"https://gw.alipayobjects.com/mdn/miniProgram_mendian/afts/img/A*wiFYTo5I0m8AAAAAAAAAAABjAQAAAQ/original\">\n    <view slot=\"title\">标题插槽</view>\n    <view slot=\"message\">描述插槽</view>\n    <view slot=\"extra\" class=\"extra\">\n      其他模块\n    </view>\n  </ant-result>\n</ant-container>\n<!-- #endif -->\n"
  },
  {
    "path": "demo/pages/Result/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Result\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Result\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-result\": \"../../../src/Result/index\",\n    \"ant-button\": \"../../../src/Button/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Result/index.less",
    "content": ".ant-button {\n  margin-bottom: 12px;\n}\n\n.extra {\n  background: #F0F3F7;\n  border-radius: 24rpx;\n  padding-top: 24rpx;\n\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  height: 375rpx;\n}\n"
  },
  {
    "path": "demo/pages/Result/index.ts",
    "content": "Page({\n  data: {\n    buttons: [\n      {\n        text: '主要操作',\n        type: 'primary',\n      },\n      {\n        text: '辅助操作',\n        type: 'default',\n      },\n    ],\n  },\n  handleTabBtn(e) {\n    my.alert({\n      content: `当前点击的是第 ${e + 1} 个按钮：${this.data.buttons[e].text}`,\n    });\n  },\n});\n"
  },
  {
    "path": "demo/pages/SafeArea/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container\n  title=\"基础用法\"\n  className=\"list\"\n>\n  <ant-safe-area position=\"top\" />\n\n  <block a:for=\"{{arr}}\">\n    <view>内容_{{index}}</view>\n  </block>\n\n  <ant-safe-area position=\"bottom\" />\n</ant-container>\n"
  },
  {
    "path": "demo/pages/SafeArea/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"SafeArea\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"SafeArea\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-safe-area\": \"../../../src/SafeArea/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/SafeArea/index.less",
    "content": ""
  },
  {
    "path": "demo/pages/SafeArea/index.ts",
    "content": "Page({\n  data: {\n    arr: Array.from({ length: 100 }),\n  },\n});\n"
  },
  {
    "path": "demo/pages/SelectContact/contact.ts",
    "content": "// 推荐联系人\nexport const recommendUserInfos = [\n  {\n    'avatar': 'https://tfs.alipayobjects.com/images/partner/T1ZmlwXkhdXXXXXXXX',\n    'loginId': '138******28',\n    'recommendTypeDesc': '转过账',\n    'userId': '2088522664435537',\n    'displayName': '**兵s',\n    'archiveId': '12239c8131423831947419933e26ed198',\n  },\n  {\n    'avatar': 'https://tfs.alipayobjects.com/images/partner/T1KLXBXdFXXXXXXXXX',\n    'loginId': '180******74',\n    'recommendTypeDesc': '好友',\n    'userId': '2088422553945892',\n    'displayName': '消散(**威)',\n    'archiveId': '12239c8131423831947419973e26ed191',\n  },\n  {\n    'avatar': '',\n    'loginId': '152******87',\n    'recommendTypeDesc': '好友',\n    'userId': '2088422747013123',\n    'displayName': '**恒',\n    'archiveId': '12239c8131423831247419973e26ed198',\n  },\n  {\n    'avatar': '',\n    'displayName': 'kwxyjh(k*)',\n    'hasPwd': false,\n    'nick': '',\n    'realName': 'k*',\n    'certified': false,\n    'recommendType': 'my_home#FORWARD',\n    'userId': '2088402857154680',\n    'archiveId': '12239c8131423831947419973e26ed198',\n    'loginId': '132******37',\n    'recommendTypeDesc': '我的家',\n  },\n];\n\n// 全部联系人\nexport const contacts = [\n  {\n    'avatar': 'https://tfs.alipayobjects.com/images/partner/T1hvVeXclrXXXXXXXX',\n    'loginId': 'lyt***@163.com',\n    'userId': '2088812025630308',\n    'displayName': 'lytmac(*杨)',\n  },\n  {\n    'avatar': 'https://tfs.alipayobjects.com/images/partner/T18AxfXodfXXXXXXXX',\n    'loginId': 'pan***@alipay.tech',\n    'displayName': '浴粼(**麟)',\n    'userId': '2088102589482931',\n  },\n  {\n    'avatar': 'https://tfs.alipayobjects.com/images/partner/T18AxfXodfXXXXXXXX',\n    'loginId': 'pan***@alipay.tech',\n    'displayName': '啊皮(皮*恒)',\n    'userId': '2088102589482931',\n  },\n  {\n    'avatar': 'https://tfs.alipayobjects.com/images/partner/T18AxfXodfXXXXXXXX',\n    'loginId': 'pan***@alipay.tech',\n    'displayName': '？？？？？？(枚*)',\n    'userId': '2088102589482931',\n  },\n  {\n    'avatar': 'https://tfs.alipayobjects.com/images/partner/T18AxfXodfXXXXXXXX',\n    'loginId': 'pan***@alipay.tech',\n    'displayName': '!!!!!!(*世恒)',\n    'userId': '2088102589482931',\n  },\n  {\n    'avatar': 'https://tfs.alipayobjects.com/images/partner/T18AxfXodfXXXXXXXX',\n    'loginId': 'pan***@alipay.tech',\n    'displayName': '消散(**威)',\n    'userId': '2088102589482931',\n  },\n  {\n    'avatar': 'https://tfs.alipayobjects.com/images/partner/T18AxfXodfXXXXXXXX',\n    'loginId': 'pan***@alipay.tech',\n    'displayName': '**兵',\n    'userId': '2088102589482931',\n  },\n  {\n    'avatar': 'https://tfs.alipayobjects.com/images/partner/T18AxfXodfXXXXXXXX',\n    'loginId': 'pan***@alipay.tech',\n    'displayName': '**兵',\n    'userId': '2088102589482931',\n  },\n];\n"
  },
  {
    "path": "demo/pages/SelectContact/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基础用法\">\n  <ant-select-contact\n    height=\"1280rpx\"\n    onSelect=\"onSelect\"\n    recommendContactsList=\"{{recommendContactsList}}\"\n    allContactsList=\"{{allContactsList}}\"\n    onError=\"{{onError ? onError : 'onError'}}\"\n  >\n    <view slot=\"contactListEmpty\">列表为空</view>\n  </ant-select-contact>\n</ant-container>\n"
  },
  {
    "path": "demo/pages/SelectContact/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"SelectContact\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"SelectContact\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-select-contact\": \"../../../src/SelectContact/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  },\n  \"allowsBounceVertical\": \"NO\"\n}\n"
  },
  {
    "path": "demo/pages/SelectContact/index.less",
    "content": "@import '../../../src/style/themes/color.less';\n"
  },
  {
    "path": "demo/pages/SelectContact/index.ts",
    "content": "import { contacts, recommendUserInfos } from './contact';\n\nPage({\n  data: {\n    recommendContactsList: recommendUserInfos,\n    allContactsList: contacts,\n    onError() {},\n  },\n  onLoad() {\n    /// #if ALIPAY\n    // Android 必须设置 canPullDown 为 false，否则滚动会有问题\n    my.setCanPullDown({\n      canPullDown: false,\n    });\n    /// #endif\n    /// #if WECHAT\n    this.setData({ onError: this.onError.bind(this) });\n    /// #endif\n  },\n  onSelect(user) {\n    console.log('user', user);\n    /// #if ALIPAY\n    my.confirm({\n      content: JSON.stringify(user),\n    });\n    /// #endif\n    /// #if WECHAT\n    // @ts-ignore\n    wx.showToast({\n      title: JSON.stringify(user.detail),\n    });\n    /// #endif\n  },\n  onError(error) {\n    console.log(error);\n  },\n});\n"
  },
  {
    "path": "demo/pages/Selector/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"单选\">\n  <ant-selector options=\"{{ items1 }}\" />\n</ant-container>\n\n<ant-container title=\"单选-选项带有副标题\">\n  <ant-selector\n    defaultValue=\"2\"\n    options=\"{{ items2 }}\" />\n</ant-container>\n\n<ant-container title=\"多选\">\n  <ant-selector\n    defaultValue=\"{{ ['1', '2'] }}\"\n    options=\"{{ items1 }}\"\n    multiple />\n</ant-container>\n\n<ant-container title=\"多选 (最少选 2 个 最多选 4 个)\">\n  <ant-selector\n    defaultValue=\"{{ ['1'] }}\"\n    options=\"{{ items1 }}\"\n    multiple\n    maxSelectedCount=\"{{ 4 }}\"\n    minSelectedCount=\"{{ 2 }}\"\n    onSelectMax=\"onSelectMax\" />\n</ant-container>\n\n<ant-container title=\"全禁用\">\n  <ant-selector\n    value=\"{{ ['1', '2'] }}\"\n    options=\"{{ items1 }}\"\n    disabled\n    multiple />\n</ant-container>\n\n<ant-container title=\"部分禁用\">\n  <ant-selector\n    defaultValue=\"{{ ['1', '2'] }}\"\n    options=\"{{ items3 }}\"\n    multiple />\n</ant-container>\n\n<ant-container title=\"受控模式\">\n  <ant-selector\n    value=\"{{ value }}\"\n    options=\"{{ items1 }}\"\n    onChange=\"handleChange\" />\n  <ant-button\n    size=\"large\"\n    onTap=\"handleChangeValue\">\n    改变选中值为选项三\n  </ant-button>\n</ant-container>\n\n<ant-container title=\"单选-不允许清空\">\n  <ant-selector\n    defaultValue=\"1\"\n    minSelectedCount=\"{{ 1 }}\"\n    onSelectMin=\"onSelectMin\"\n    options=\"{{ items1 }}\" />\n</ant-container>\n\n\n<ant-container title=\"SelectorFilter\">\n  <view class=\"filterDemo\">\n    <view class=\"filterDemo-bar\">\n      <block\n        a:for=\"{{ items }}\"\n        a:for-index=\"index\"\n        a:for-item=\"item\">\n        <view\n          class=\"filterDemo-bar-item {{ currentOpen === index ? 'filterDemo-bar-item-active' : '' }}\"\n          onTap=\"onTapItem\"\n          data-index=\"{{ index }}\">\n          {{ item.title }}\n          <ant-icon\n            type=\"DownFill\"\n            className=\"filterDemo-bar-item-icon  {{ currentOpen === index ? 'filterDemo-bar-item-icon-up' : '' }}\" />\n        </view>\n      </block>\n    </view>\n    <view class=\"filterDemo-items\">\n      <block\n        a:for=\"{{ items }}\"\n        a:for-index=\"index\"\n        a:for-item=\"item\">\n        <view\n          class=\"filterDemo-items-content {{ currentOpen === index ? 'filterDemo-items-content-active' : '' }} {{ contentClassName || '' }}\"\n          style=\"{{ contentStyle || '' }}\">\n          <ant-selector\n            options=\"{{ item.options }}\"\n            onChange=\"handleSelectorFilterChange\"\n            data-index=\"{{ index }}\" />\n        </view>\n      </block>\n    </view>\n  </view>\n</ant-container>\n"
  },
  {
    "path": "demo/pages/Selector/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Selector\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Selector\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-selector\": \"../../../src/Selector/index\",\n    \"ant-button\": \"../../../src/Button/index\",\n    \"ant-container\": \"../../../src/Container/index\",\n    \"ant-icon\": \"../../../src/Icon/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Selector/index.less",
    "content": "@import (reference) '../../../src/style/themes/index.less';\n\npage {\n  height: 250vh;\n}\n\n.filterDemo {\n  position: relative;\n  &-bar {\n    height: 88 * @rpx;\n    position: relative;\n    display: flex;\n    justify-content: space-between;\n    background-color: var(--color-card);\n    box-sizing: border-box;\n    &-item {\n      flex: 1;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      color: var(--color-text-primary);\n      font-size: 26 * @rpx;\n      &-active {\n        color: var(--color-brand1);\n      }\n      &-icon {\n        margin-left: @size-1;\n        font-size: 18 * @rpx;\n        transition: transform 200ms linear;\n        color: var(--color-text-weak);\n        &-up {\n          transform: rotate(180deg);\n        }\n      }\n    }\n  }\n  &-items {\n    position: relative;\n    overflow: visible;\n    z-index: 9999;\n    &-content {\n      background: var(--color-card);\n      position: absolute;\n      left: 0;\n      top: 0;\n      width: 100%;\n      transform-origin: top center;\n      transition: transform 100ms linear;\n      transform: scaleY(0);\n      &-active {\n        transform: scaleY(1);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "demo/pages/Selector/index.ts",
    "content": "Page({\n  data: {\n    items1: [\n      { text: '选项一', value: '1' },\n      { text: '选项二', value: '2' },\n      { text: '选项三', value: '3' },\n      { text: '选项四', value: '4' },\n      { text: '选项五', value: '5' },\n      { text: '选项六', value: '6' },\n    ],\n    items2: [\n      { text: '选项一', subText: '描述文案一', value: '1' },\n      { text: '选项二', subText: '描述文案二', value: '2' },\n      { text: '选项三', subText: '描述文案三', value: '3' },\n    ],\n    items3: [\n      { text: '选项一', subText: '描述文案一', value: '1' },\n      { text: '选项二', subText: '描述文案二', value: '2', disabled: true },\n      { text: '选项三', subText: '描述文案三', value: '3' },\n    ],\n    value: '1',\n    currentOpen: -1,\n    items: [\n      {\n        title: '筛选项一',\n        options: [\n          {\n            text: '选项一',\n            value: '1',\n          },\n          {\n            text: '选项二',\n            value: '2',\n          },\n          {\n            text: '选项三',\n            value: '3',\n          },\n          {\n            text: '选项四',\n            value: '4',\n          },\n          {\n            text: '选项五',\n            value: '5',\n          },\n        ],\n      },\n      {\n        title: '筛选项二',\n        options: [\n          {\n            text: '选项一',\n            value: '1',\n          },\n          {\n            text: '选项二',\n            value: '2',\n          },\n          {\n            text: '选项三',\n            value: '3',\n          },\n        ],\n      },\n    ],\n  },\n  handleChangeValue() {\n    this.setData({\n      value: '3',\n    });\n  },\n  handleChange(value, items, e) {\n    /// #if WECHAT\n    this.setData({\n      value: value.detail[0],\n    });\n    /// #endif\n    /// #if ALIPAY\n    this.setData({\n      value,\n    });\n    /// #endif\n    console.log(value, items, e);\n  },\n  onSelectMin(value, item) {\n    console.log(value, item);\n\n    /// #if WECHAT\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    //@ts-ignore\n    wx.showModal({\n      content: '不允许清空',\n    });\n    /// #endif\n\n    /// #if ALIPAY\n    my.alert({ content: '不允许清空' });\n    /// #endif\n  },\n  onSelectMax() {\n    /// #if WECHAT\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    //@ts-ignore\n    wx.showModal({\n      content: '选择已达上限',\n    });\n    /// #endif\n\n    /// #if ALIPAY\n    my.alert({ content: '选择已达上限' });\n    /// #endif\n  },\n  handleSelectorFilterChange(value, items, e) {\n    console.log(value, items, e);\n  },\n  onTapItem(e) {\n    console.log(e);\n    const { index } = e.currentTarget.dataset;\n    const { currentOpen } = this.data;\n    let value = index;\n    if (currentOpen === index) {\n      value = -1;\n    }\n    this.setData({ currentOpen: value });\n  },\n});\n"
  },
  {
    "path": "demo/pages/Skeleton/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<view class=\"page\">\n  <ant-container title=\"基础用法\">\n    <ant-skeleton />\n  </ant-container>\n\n  <ant-container title=\"有动画的骨架屏\">\n    <ant-skeleton animate=\"{{ true }}\" />\n  </ant-container>\n\n  <ant-container title=\"带avatar\">\n    <ant-skeleton avatar=\"{{ true }}\" />\n  </ant-container>\n\n  <ant-container title=\"自定义组合\">\n    <view class=\"list\">\n      <ant-skeleton-avatar className=\"custom\" />\n      <ant-skeleton-paragraph\n        className=\"custom\"\n        rows=\"{{ 1 }}\" />\n      <ant-skeleton-input className=\"custom\" />\n      <ant-skeleton-input className=\"custom\" />\n      <ant-skeleton-input className=\"custom\" />\n      <ant-skeleton-button\n        className=\"custom\"\n        size=\"small\" />\n    </view>\n  </ant-container>\n\n  <ant-container title=\"复杂组合\">\n    <ant-skeleton\n      loading=\"{{ showLoading }}\"\n      title=\"{{ false }}\"\n      avatar=\"{{ true }}\"\n      paragraph=\"{{ paragraph }}\">\n      <view class=\"ant-container\">\n        <ant-avatar\n          src=\"https://images.unsplash.com/photo-1546967191-fdfb13ed6b1e?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&fit=crop&h=200&w=200&ixid=eyJhcHBfaWQiOjE3Nzg0fQ\" />\n        <view class=\"content\">\n          We supply a series of design principles, practical patterns and high\n          quality design resources, to help people create their product prototypes\n          beautifully and efficiently.\n        </view>\n      </view>\n    </ant-skeleton>\n    <view slot=\"headerRight\">\n      显示骨架\n      <ant-switch\n        style=\"margin-left: 8px\"\n        checked=\"{{ showLoading }}\"\n        onChange=\"handleToggleShowLoading\" />\n    </view>\n  </ant-container>\n</view>\n"
  },
  {
    "path": "demo/pages/Skeleton/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Skeleton\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Skeleton\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-avatar\": \"../../../src/Avatar/index\",\n    \"ant-skeleton\": \"../../../src/Skeleton/index\",\n    \"ant-switch\": \"../../../src/Switch/index\",\n    \"ant-skeleton-avatar\": \"../../../src/Skeleton/Avatar/index\",\n    \"ant-skeleton-title\": \"../../../src/Skeleton/Title/index\",\n    \"ant-skeleton-button\": \"../../../src/Skeleton/Button/index\",\n    \"ant-skeleton-paragraph\": \"../../../src/Skeleton/Paragraph/index\",\n    \"ant-skeleton-input\": \"../../../src/Skeleton/Input/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Skeleton/index.less",
    "content": "@import '../../../src/style/themes/color.less';\n\n.page {\n  padding: 24rpx;\n  /// #if WECHAT\n  box-sizing: border-box;\n  /// #endif\n}\n\n.list {\n  display: flex;\n  flex-direction: column;\n}\n\n.custom {\n  margin-bottom: 16px;\n}\n\n.container {\n  display: flex;\n  color: @COLOR_TEXT_PRIMARY;\n  align-items: flex-start;\n}\n\n.content {\n  padding: 12px 16px 0 16px;\n}\n"
  },
  {
    "path": "demo/pages/Skeleton/index.ts",
    "content": "Page({\n  data: {\n    showLoading: true,\n    paragraph: {\n      rows: 4,\n    },\n  },\n  handleToggleShowLoading() {\n    this.setData({ showLoading: !this.data.showLoading });\n  },\n});\n"
  },
  {
    "path": "demo/pages/Slider/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基本使用\">\n  <ant-slider\n    defaultValue=\"{{ 80 }}\"\n    onChange=\"onChange\"\n    onAfterChange=\"onAfterChange\" />\n</ant-container>\n\n<ant-container title=\"禁用状态\">\n  <ant-slider\n    defaultValue=\"{{ 80 }}\"\n    disabled\n    onChange=\"onChange\" />\n</ant-container>\n\n<ant-container title=\"无节点双滑块\">\n  <ant-slider\n    defaultValue=\"{{ [20, 60] }}\"\n    range\n    onChange=\"onChange\"\n    onAfterChange=\"onAfterChange\" />\n</ant-container>\n\n<ant-container title=\"节点单滑块\">\n  <ant-slider\n    defaultValue=\"{{ 60 }}\"\n    step=\"{{ 20 }}\"\n    showTicks\n    onChange=\"onChange\"\n    onAfterChange=\"onAfterChange\" />\n</ant-container>\n\n<ant-container title=\"有数字节点单滑块\">\n  <ant-slider\n    defaultValue=\"{{ 80 }}\"\n    step=\"{{ 20 }}\"\n    showTicks\n    showNumber\n    onChange=\"onChange\"\n    onAfterChange=\"onAfterChange\" />\n</ant-container>\n\n<ant-container title=\"节点双滑块\">\n  <ant-slider\n    defaultValue=\"{{ [10, 50] }}\"\n    step=\"{{ 10 }}\"\n    showTicks\n    range\n    onChange=\"onChange\"\n    onAfterChange=\"onAfterChange\" />\n</ant-container>\n\n<ant-container title=\"有数字节点双滑块\">\n  <ant-slider\n    defaultValue=\"{{ [10, 50] }}\"\n    step=\"{{ 10 }}\"\n    showTicks\n    showNumber\n    range\n    onChange=\"onChange\"\n    onAfterChange=\"onAfterChange\" />\n</ant-container>\n\n<ant-container title=\"在拖动时显示悬浮提示\">\n  <ant-slider\n    defaultValue=\"{{ 80 }}\"\n    showTooltip\n    onChange=\"onChange\"\n    onAfterChange=\"onAfterChange\" />\n</ant-container>\n\n<!-- #if ALIPAY || WECHAT -->\n<ant-container title=\"受控模式\">\n  <ant-slider\n    min=\"{{ 0 }}\"\n    max=\"{{ 100 }}\"\n    value=\"{{ value }}\"\n    onChange=\"handleChange\" />\n  <ant-stepper\n    min=\"{{ 0 }}\"\n    max=\"{{ 100 }}\"\n    value=\"{{ value }}\"\n    onChange=\"handleChange\" />\n</ant-container>\n<!-- #endif -->\n<ant-container title=\"自定义\">\n  <ant-slider\n    defaultValue=\"{{ 80 }}\"\n    step=\"{{ 20 }}\"\n    showTooltip\n    showTicks\n    showNumber\n    activeLineStyle=\"background-color: #ff8f1f\"\n    activeDotStyle=\"background-color: red\"\n    onChange=\"onChange\"\n    onAfterChange=\"onAfterChange\">\n    <!-- #if ALIPAY -->\n    <!-- 微信暂时不支持 slot -->\n    <!-- display: inline -->\n    <text\n      slot=\"tick\"\n      slot-scope=\"props\"\n      >{{ props.value }}°C</text\n    >\n    <!-- display: inline -->\n    <text\n      slot=\"tooltip\"\n      slot-scope=\"props\"\n      >{{ props.value }}°C</text\n    >\n\n    <view slot=\"slider\">\n      <view class=\"custom-slider-handler\">\n        <ant-icon\n          type=\"SmileOutline\"\n          style=\"color: #ff8f1f\" />\n      </view>\n    </view>\n    <!-- #endif -->\n  </ant-slider>\n</ant-container>\n"
  },
  {
    "path": "demo/pages/Slider/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Slider\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Slider\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-slider\": \"../../../src/Slider/index\",\n    \"ant-icon\": \"../../../src/Icon/index\",\n    /// #if ALIPAY || WECHAT\n    \"ant-stepper\": \"../../../src/Stepper/index\",\n    /// #endif\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Slider/index.less",
    "content": ".custom-slider-handler {\n  width: 56rpx;\n  height: 56rpx;\n  background: #FFFFFF;\n  box-shadow: 0 4rpx 10rpx 0 rgba(0, 0, 0, 0.12);\n  border-radius: 56rpx;\n  text-align: center;\n  line-height: 56rpx;\n}\n"
  },
  {
    "path": "demo/pages/Slider/index.ts",
    "content": "Page({\n  data: {\n    value: 80,\n  },\n  onChange(value, e) {\n    console.log('slider changed:', value, e);\n  },\n  onAfterChange(value, e) {\n    console.log('当前值:', value, e);\n    /// #if ALIPAY\n    my.showToast({\n      content: 'value: ' + value,\n    });\n    /// #endif\n\n    /// #if WECHAT\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    //@ts-ignore\n    wx.showToast({\n      title: `value: ${value.detail}`,\n    });\n    /// #endif\n  },\n  handleChange(value, e) {\n    console.log('slider changed:', value, e);\n\n    /// #if WECHAT\n    this.setData({\n      value: value.detail,\n    });\n    /// #endif\n\n    /// #if ALIPAY\n    this.setData({\n      value,\n    });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/Space/index.axml",
    "content": "<view class=\"navigation-bar\"/>\n\n<ant-container title=\"基础用法\">\n  <ant-space>\n    <ant-button type=\"primary\">按钮1</ant-button>\n    <ant-button>按钮2</ant-button>\n    <ant-button>按钮3</ant-button>\n  </ant-space>\n</ant-container>\n\n<ant-container title=\"垂直间距\">\n  <ant-space direction=\"vertical\">\n    <ant-button type=\"primary\">按钮1</ant-button>\n    <ant-button>按钮2</ant-button>\n    <ant-button>按钮3</ant-button>\n  </ant-space>\n</ant-container>\n\n<ant-container title=\"间距大小\">\n  <view class=\"sub-title\">Small Size</view>\n  <ant-space size=\"small\">\n    <ant-button type=\"primary\">按钮1</ant-button>\n    <ant-button>按钮2</ant-button>\n    <ant-button>按钮3</ant-button>\n  </ant-space>\n\n  <view class=\"sub-title\">Middle Size</view>\n  <ant-space size=\"middle\">\n    <ant-button type=\"primary\">按钮1</ant-button>\n    <ant-button>按钮2</ant-button>\n    <ant-button>按钮3</ant-button>\n  </ant-space>\n\n  <view class=\"sub-title\">Large Size</view>\n  <ant-space size=\"large\">\n    <ant-button type=\"primary\">按钮1</ant-button>\n    <ant-button>按钮2</ant-button>\n    <ant-button>按钮3</ant-button>\n  </ant-space>\n\n  <view class=\"sub-title\">Custom Size (64rpx)</view>\n  <ant-space size=\"{{64}}\">\n    <ant-button type=\"primary\">按钮1</ant-button>\n    <ant-button>按钮2</ant-button>\n    <ant-button>按钮3</ant-button>\n  </ant-space>\n</ant-container>\n\n<ant-container title=\"对齐方式\">\n  <view class=\"sub-title\">Align Start</view>\n  <ant-space align=\"start\">\n    <ant-button type=\"primary\">按钮1</ant-button>\n    <view class=\"custom-box\">高度不同的内容</view>\n    <ant-button>按钮3</ant-button>\n  </ant-space>\n\n  <view class=\"sub-title\">Align Center</view>\n  <ant-space align=\"center\">\n    <ant-button type=\"primary\">按钮1</ant-button>\n    <view class=\"custom-box\">高度不同的内容</view>\n    <ant-button>按钮3</ant-button>\n  </ant-space>\n\n  <view class=\"sub-title\">Align End</view>\n  <ant-space align=\"end\">\n    <ant-button type=\"primary\">按钮1</ant-button>\n    <view class=\"custom-box\">高度不同的内容</view>\n    <ant-button>按钮3</ant-button>\n  </ant-space>\n\n  <view class=\"sub-title\">Space Between</view>\n  <ant-space justify=\"ant-space-between\">\n    <ant-button type=\"primary\">按钮1</ant-button>\n    <ant-button>按钮2</ant-button>\n    <ant-button>按钮3</ant-button>\n  </ant-space>\n</ant-container>\n\n<ant-container title=\"自动换行\">\n  <ant-space wrap>\n    <ant-button type=\"primary\">按钮1</ant-button>\n    <ant-button>按钮2</ant-button>\n    <ant-button>按钮3</ant-button>\n    <ant-button>按钮4</ant-button>\n    <ant-button>按钮5</ant-button>\n    <ant-button>按钮6</ant-button>\n    <ant-button>按钮7</ant-button>\n    <ant-button>按钮8</ant-button>\n  </ant-space>\n</ant-container>\n"
  },
  {
    "path": "demo/pages/Space/index.json5",
    "content": "{\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Space\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Space\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-space\": \"../../../src/Space/index\",\n    \"ant-button\": \"../../../src/Button/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Space/index.less",
    "content": ".sub-title {\n  color: #666;\n  font-size: 14px;\n  margin: 16px 0 8px;\n}\n\n.custom-box {\n  padding: 16px 8px;\n  background: #eee;\n  border-radius: 4px;\n}\n"
  },
  {
    "path": "demo/pages/Space/index.ts",
    "content": "Page({\n  data: {},\n});\n"
  },
  {
    "path": "demo/pages/Stepper/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基础用法\">\n  <ant-stepper\n    onChange=\"onChange\"\n    onBlur=\"onBlur\"\n    onConfirm=\"onConfirm\"\n    onFocus=\"onFocus\" />\n</ant-container>\n<ant-container title=\"初始值\">\n  <ant-stepper defaultValue=\"{{ 0 }}\" />\n</ant-container>\n<ant-container title=\"step 0.01\">\n  <ant-stepper\n    defaultValue=\"{{ 0 }}\"\n    step=\"{{ 0.01 }}\"\n    inputStyle=\"width: 60px\" />\n</ant-container>\n<ant-container title=\"precision 1\">\n  <ant-stepper\n    defaultValue=\"{{ 0 }}\"\n    precision=\"{{ 1 }}\"\n    inputStyle=\"width: 60px\" />\n</ant-container>\n<ant-container title=\"限制输入范围 [0, 10]\">\n  <ant-stepper\n    defaultValue=\"{{ 0 }}\"\n    min=\"{{ 0 }}\"\n    max=\"{{ 10 }}\"\n    step=\"{{ 1 }}\"\n    onDisabledTap=\"handleDisabledTap\" />\n</ant-container>\n<ant-container title=\"禁用状态\">\n  <ant-stepper\n    defaultValue=\"{{ 0 }}\"\n    disabled\n    onDisabledTap=\"handleDisabledTap\" />\n</ant-container>\n<ant-container title=\"输入框只读\">\n  <ant-stepper\n    defaultValue=\"{{ 0 }}\"\n    inputReadOnly />\n</ant-container>\n<ant-container title=\"受控组件\">\n  <ant-stepper\n    value=\"{{ value }}\"\n    onChange=\"handleChange\"\n    style=\"margin: 8px 0\"\n    onBlur=\"onBlur\"\n    onConfirm=\"onConfirm\"\n    onFocus=\"onFocus\" />\n  value: {{ value }}\n  <view class=\"list\">\n    <ant-button\n      inline\n      onTap=\"add\">\n      add\n    </ant-button>\n    <ant-button\n      inline\n      onTap=\"minus\">\n      minus\n    </ant-button>\n    <ant-button\n      inline\n      onTap=\"clear\">\n      clear\n    </ant-button>\n  </view>\n</ant-container>\n"
  },
  {
    "path": "demo/pages/Stepper/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Stepper\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Stepper\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-stepper\": \"../../../src/Stepper/index\",\n    \"ant-container\": \"../../../src/Container/index\",\n    \"ant-button\": \"../../../src/Button/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Stepper/index.less",
    "content": ".list button{\n  margin-right: 8px;\n}\n"
  },
  {
    "path": "demo/pages/Stepper/index.ts",
    "content": "Page({\n  data: {},\n  onChange(value) {\n    console.log('onChange', value);\n  },\n  onFocus(value) {\n    console.log('onFocus', value);\n  },\n  onConfirm(value) {\n    console.log('onConfirm', value);\n  },\n  onBlur(value) {\n    console.log('onBlur', value);\n  },\n  handleChange(value) {\n    console.log('onChange', value);\n\n    /// #if ALIPAY\n    this.setData({\n      value: value,\n    });\n    /// #endif\n\n    /// #if WECHAT\n    this.setData({\n      value: value.detail,\n    });\n    /// #endif\n  },\n  add() {\n    this.setData({\n      value: (this.data.value || 0) + 1,\n    });\n  },\n  minus() {\n    this.setData({\n      value: (this.data.value || 0) - 1,\n    });\n  },\n  clear() {\n    this.setData({\n      value: null,\n    });\n  },\n  handleAddValue() {\n    this.setData({ value: this.data.value + 1 });\n  },\n  handleMinusValue() {\n    this.setData({ value: this.data.value - 1 });\n  },\n  handleDisabledTap(e) {\n    console.log('禁用点击：', e.target.dataset);\n    my.showToast({ content: '禁用点击' });\n  },\n});\n"
  },
  {
    "path": "demo/pages/Steps/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"横向步骤条\">\n  <ant-steps items=\"{{ items }}\" />\n</ant-container>\n\n<ant-container title=\"横向步骤条失败\">\n  <ant-steps\n    items=\"{{ items }}\"\n    status=\"error\"\n    current=\"{{ 1 }}\" />\n</ant-container>\n\n<ant-container title=\"纵向步骤条\">\n  <ant-steps\n    items=\"{{ items2 }}\"\n    direction=\"vertical\" />\n</ant-container>\n\n<ant-container title=\"纵向步骤条失败\">\n  <ant-steps\n    items=\"{{ items2 }}\"\n    status=\"error\"\n    current=\"{{ 1 }}\"\n    direction=\"vertical\" />\n</ant-container>\n<!-- #if ALIPAY -->\n<ant-container title=\"自定义图标\">\n  <ant-steps\n    items=\"{{ items }}\"\n    status=\"error\"\n    current=\"{{ 1 }}\">\n    <block\n      slot=\"icon\"\n      slot-scope=\"item\">\n      <ant-icon\n        slot=\"icon\"\n        a:if=\"{{ item.status == 'error' && item.current === item.index }}\"\n        type=\"CloseCircleFill\" />\n      <ant-icon\n        slot=\"icon\"\n        a:else\n        type=\"SmileFill\" />\n    </block>\n  </ant-steps>\n</ant-container>\n\n<ant-container title=\"更多自定义\">\n  <ant-steps\n    items=\"{{ items }}\"\n    current=\"{{ 2 }}\">\n    <block\n      slot=\"icon\"\n      slot-scope=\"item\">\n      <ant-icon\n        a:if=\"{{ iconList[item.index] }}\"\n        type=\"{{ iconList[item.index] }}\" />\n    </block>\n\n    <view\n      slot=\"title\"\n      slot-scope=\"item\">\n      {{ item.index + 1 }}\n    </view>\n\n    <view\n      slot=\"description\"\n      slot-scope=\"item\">\n      <view>{{ item.value.title }}</view>\n      <view>{{ item.value.description }}</view>\n    </view>\n  </ant-steps>\n</ant-container>\n<!-- #endif -->\n\n<ant-container title=\"步骤条控制\">\n  <ant-steps\n    items=\"{{ items }}\"\n    current=\"{{ current }}\" />\n  <ant-button\n    onTap=\"onNextTap\"\n    type=\"primary\">\n    <view a:if=\"{{ current < items.length - 1 }}\">下一步</view>\n    <view a:else>完成</view>\n  </ant-button>\n  <ant-button\n    a:if=\"{{ current > 0 }}\"\n    onTap=\"onPrevTap\">\n    上一步\n  </ant-button>\n</ant-container>\n"
  },
  {
    "path": "demo/pages/Steps/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Steps\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Steps\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-steps\": \"../../../src/Steps/index\",\n    \"ant-icon\": \"../../../src/Icon/index\",\n    \"ant-container\": \"../../../src/Container/index\",\n    \"ant-button\": \"../../../src/Button/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Steps/index.less",
    "content": ".ant-button {\n  margin: 8px;\n}\n"
  },
  {
    "path": "demo/pages/Steps/index.ts",
    "content": "Page({\n  data: {\n    current: 0,\n    items: [\n      {\n        title: '步骤一',\n        description: '描述信息',\n      },\n      {\n        title: '步骤二',\n        description: '描述信息',\n      },\n      {\n        title: '步骤三',\n        description: '描述信息',\n      },\n    ],\n    iconList: ['SmileFill', '', 'StarFill'],\n    items2: [\n      {\n        title: '步骤一',\n        description: '内容详情，根据实际文案安排根据实际文案安排',\n      },\n      {\n        title: '步骤二',\n        description: '描述信息',\n      },\n      {\n        title: '步骤三',\n        description: '',\n      },\n      {\n        title: '步骤四',\n        description: '内容详情，根据实际文案安排',\n      },\n    ],\n  },\n  onNextTap() {\n    if (this.data.current === this.data.items.length - 1) {\n      /// #if ALIPAY\n      my.showToast({ content: '完成', duration: 1000 });\n      /// #endif\n      /// #if WECHAT\n      // @ts-ignore\n      wx.showToast({ title: '完成' });\n      /// #endif\n      return;\n    }\n    this.setData({\n      current: this.data.current + 1,\n    });\n  },\n  onPrevTap() {\n    if (this.data.current === 0) {\n      return;\n    }\n    this.setData({\n      current: this.data.current - 1,\n    });\n  },\n});\n"
  },
  {
    "path": "demo/pages/Sticky/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基础用法\">\n  <ant-sticky\n    transparentTitle\n  >\n    <view>\n      我会吸顶\n    </view>\n  </ant-sticky>\n</ant-container>\n\n<ant-container title=\"指定吸顶高度\">\n  <ant-sticky\n    top=\"200px\"\n  >\n    <view>\n      我会吸顶在距离顶部 200px 的地方\n    </view>\n  </ant-sticky>\n</ant-container>\n\n<view style=\"height: 200px;\"></view>\n\n<ant-container title=\"感知是否吸顶\">\n  <ant-sticky\n    top=\"300px\"\n    check\n    onStickyChange=\"handleStickyChange\"\n  >\n    <view>\n      <view>我会吸顶在距离顶部 300px 的地方</view>\n      <view>是否吸上了 {{ stickyStatus }}</view>\n    </view>\n  </ant-sticky>\n</ant-container>\n\n<ant-container title=\"透明头模式\">\n  <ant-sticky\n    transparentTitle\n    check\n    onStickyChange=\"handleStickyChange1\"\n  >\n    <view>\n      <view>我会吸顶</view>\n      <view>是否吸上了 {{ stickyStatus1 }}</view>\n    </view>\n  </ant-sticky>\n</ant-container>\n\n<view style=\"height: 1400px\"></view>\n"
  },
  {
    "path": "demo/pages/Sticky/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Sticky\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Sticky\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-sticky\": \"../../../src/Sticky/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Sticky/index.less",
    "content": "#__react-content {\n  overflow: unset !important;\n}\n\n.ant-container-content {\n  min-height: 200px;\n}\n"
  },
  {
    "path": "demo/pages/Sticky/index.ts",
    "content": "Page({\n  data: {\n    stickyStatus: false,\n    stickyStatus1: false,\n  },\n  handleStickyChange(status) {\n    /// #if ALIPAY\n    this.setData({ stickyStatus: status });\n    /// #endif\n    /// #if WECHAT\n    this.setData({ stickyStatus: status.detail });\n    /// #endif\n  },\n  handleStickyChange1(status) {\n    /// #if ALIPAY\n    this.setData({ stickyStatus1: status });\n    /// #endif\n    /// #if WECHAT\n    this.setData({ stickyStatus1: status.detail });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/SwipeAction/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<import-sjs\n  from=\"./slice.sjs\"\n  name=\"utils\" />\n<view class=\"t-swipe\">\n  <view class=\"t-swipe-item\">\n    <view class=\"t-swipe-item-title\">基础用法</view>\n    <block\n      a:for=\"{{ 2 }}\"\n      a:for-index=\"index\"\n      a:for-item=\"_\"\n      a:key=\"{{ index }}\">\n      <view class=\"t-swipe-item-con\">\n        <ant-swipe-action\n          data-item=\"{{ index }}\"\n          rightButtons=\"{{ rightBtns }}\"\n          elasticity=\"{{ true }}\"\n          swiped=\"{{ swipeIndex === index }}\"\n          onSwipeEnd=\"onSwipeEnd\"\n          onSwipeStart=\"onSwipeStart\"\n          onButtonTap=\"onButtonTap\">\n          <view class=\"t-swipe-item-con-view\">右侧-三个按钮</view>\n        </ant-swipe-action>\n      </view>\n    </block>\n  </view>\n</view>\n<view class=\"t-swipe\">\n  <view class=\"t-swipe-item\">\n    <view class=\"t-swipe-item-title\">按钮在左侧</view>\n    <block\n      a:for=\"{{ 2 }}\"\n      a:for-index=\"index\"\n      a:for-item=\"_\"\n      a:key=\"{{ index }}\">\n      <view class=\"t-swipe-item-con\">\n        <ant-swipe-action\n          data-item=\"{{ index }}\"\n          leftButtons=\"{{ leftBtns }}\"\n          elasticity=\"{{ true }}\"\n          swiped=\"{{ swipeIndex === index }}\"\n          onSwipeEnd=\"onSwipeEnd\"\n          onSwipeStart=\"onSwipeStart\"\n          onButtonTap=\"onButtonTap\">\n          <view class=\"t-swipe-item-con-view\">左侧-三个按钮</view>\n        </ant-swipe-action>\n      </view>\n    </block>\n  </view>\n</view>\n\n<view class=\"t-swipe\">\n  <view class=\"t-swipe-item\">\n    <view class=\"t-swipe-item-title\">调整按钮数量，最多为3个</view>\n\n    <block\n      a:for=\"{{ 3 }}\"\n      a:for-index=\"index\"\n      a:for-item=\"_\"\n      a:key=\"{{ index }}\">\n      <view class=\"t-swipe-item-con\">\n        <ant-swipe-action\n          data-item=\"{{ index }}\"\n          rightButtons=\"{{ utils.sliceButton(rightBtns, index) }}\"\n          elasticity=\"{{ index !== 0 }}\"\n          swiped=\"{{ swipeIndex === index }}\"\n          onSwipeEnd=\"onSwipeEnd\"\n          onSwipeStart=\"onSwipeStart\"\n          onButtonTap=\"onButtonTap\">\n          <view class=\"t-swipe-item-con-view\">\n            右侧-{{ index + 1 > 3 ? 3 : index + 1 }}个按钮\n          </view>\n        </ant-swipe-action>\n      </view>\n    </block>\n  </view>\n</view>\n\n<view class=\"t-swipe\">\n  <view class=\"t-swipe-item\">\n    <view class=\"t-swipe-item-title\">去除松开手之后的滑动回弹效果</view>\n    <block\n      a:for=\"{{2}}\"\n      a:for-index=\"index\"\n      a:for-item=\"_\"\n    >\n      <view class=\"t-swipe-item-con\">\n        <ant-swipe-action\n          data-item=\"{{index}}\"\n          rightButtons=\"{{rightBtns}}\"\n          elasticity=\"{{false}}\"\n          swiped=\"{{swipeIndex === index}}\"\n          onSwipeEnd=\"onSwipeEnd\"\n          onSwipeStart=\"onSwipeStart\"\n          onButtonTap=\"onButtonTap\"\n        >\n          <view class=\"t-swipe-item-con-view\">右侧-三个按钮</view>\n        </ant-swipe-action>\n      </view>\n    </block>\n  </view>\n</view>\n\n<view class=\"t-swipe\">\n  <view class=\"t-swipe-item\">\n    <view class=\"t-swipe-item-title\">滑动速度变慢</view>\n    <block\n      a:for=\"{{2}}\"\n      a:for-index=\"index\"\n      a:for-item=\"_\"\n    >\n      <view class=\"t-swipe-item-con\">\n        <ant-swipe-action\n          data-item=\"{{index}}\"\n          rightButtons=\"{{rightBtns}}\"\n          elasticity=\"{{false}}\"\n          damping=\"25\"\n          swiped=\"{{swipeIndex === index}}\"\n          onSwipeEnd=\"onSwipeEnd\"\n          onSwipeStart=\"onSwipeStart\"\n          onButtonTap=\"onButtonTap\"\n        >\n          <view class=\"t-swipe-item-con-view\">右侧-三个按钮</view>\n        </ant-swipe-action>\n      </view>\n    </block>\n  </view>\n</view>\n\n<view class=\"t-swipe\">\n  <view class=\"t-swipe-item\">\n    <view class=\"t-swipe-item-title\">删除按钮点击二次确认</view>\n    <block\n      a:for=\"{{2}}\"\n      a:for-index=\"index\"\n      a:for-item=\"_\"\n    >\n      <view class=\"t-swipe-item-con\">\n        <ant-swipe-action\n          data-item=\"{{index}}\"\n          rightButtons=\"{{rightBtnsWithConfirm}}\"\n          elasticity=\"{{true}}\"\n          swiped=\"{{swipeIndex === index}}\"\n          onSwipeEnd=\"onSwipeEnd\"\n          onSwipeStart=\"onSwipeStart\"\n          onButtonTap=\"onButtonTap\"\n        >\n          <view class=\"t-swipe-item-con-view\">右侧-三个按钮</view>\n        </ant-swipe-action>\n      </view>\n    </block>\n  </view>\n</view>\n\n<view class=\"t-swipe\">\n  <view class=\"t-swipe-item\">\n    <view class=\"t-swipe-item-title\">删除按钮滑动到最大距离触发二次确认</view>\n    <block\n      a:for=\"{{2}}\"\n      a:for-index=\"index\"\n      a:for-item=\"_\"\n    >\n      <view class=\"t-swipe-item-con\">\n        <ant-swipe-action\n          data-item=\"{{index}}\"\n          rightButtons=\"{{rightBtnsWithMove}}\"\n          elasticity=\"{{true}}\"\n          swiped=\"{{swipeIndex === index}}\"\n          onSwipeEnd=\"onSwipeEnd\"\n          onSwipeStart=\"onSwipeStart\"\n          onButtonTap=\"onButtonTap\"\n        >\n          <view class=\"t-swipe-item-con-view\">右侧-三个按钮</view>\n        </ant-swipe-action>\n      </view>\n    </block>\n  </view>\n</view>\n\n<view class=\"t-swipe\">\n  <view class=\"t-swipe-item\">\n    <view class=\"t-swipe-item-title\">左右两侧都有按钮</view>\n    <block\n      a:for=\"{{2}}\"\n      a:for-index=\"index\"\n      a:for-item=\"_\"\n    >\n      <view class=\"t-swipe-item-con\">\n        <ant-swipe-action\n          data-item=\"{{index}}\"\n          leftButtons=\"{{rightBtns}}\"\n          rightButtons=\"{{rightBtns}}\"\n          elasticity=\"{{true}}\"\n          swiped=\"{{swipeIndex === index}}\"\n          onSwipeEnd=\"onSwipeEnd\"\n          onSwipeStart=\"onSwipeStart\"\n          onButtonTap=\"onButtonTap\"\n        >\n          <view class=\"t-swipe-item-con-view\">三个按钮</view>\n        </ant-swipe-action>\n      </view>\n    </block>\n  </view>\n</view>\n\n<view class=\"t-swipe\">\n  <view class=\"t-swipe-item\">\n    <view class=\"t-swipe-item-title\">自定义按钮</view>\n    <block\n      a:for=\"{{2}}\"\n      a:for-index=\"index\"\n      a:for-item=\"_\"\n    >\n      <view class=\"t-swipe-item-con\">\n        <ant-swipe-action\n          data-item=\"{{index}}\"\n          rightButtons=\"{{[\n            {\n                text: 'No Slot',\n                bgColor: '#1677FF',\n                color: '#fff',\n            },\n            {\n                text: '重命名',\n                bgColor: '#FFA91B',\n                color: '#fff',\n                slotName: 'reName',\n                confirmType: 'tap',\n                confirmText: '确认修改吗？',\n            },\n            {\n                text: '删除',\n                bgColor: '#FF2B00',\n                color: '#fff',\n                slotName: 'delete',\n                confirmType: 'tap',\n                confirmText: '确认删除吗？',\n            },\n        ]}}\"\n          leftButtons=\"{{[\n            {\n                text: 'No Slot',\n                bgColor: '#1677FF',\n                color: '#fff',\n            },\n            {\n                text: '重命名',\n                bgColor: '#FFA91B',\n                color: '#fff',\n                width: 300,\n                slotName: 'reName-left',\n                confirmType: 'tap',\n                confirmText: '确认修改吗？',\n            },\n        ]}}\"\n          elasticity=\"{{true}}\"\n          swiped=\"{{swipeIndex === index}}\"\n          onSwipeEnd=\"onSwipeEnd\"\n          onSwipeStart=\"onSwipeStart\"\n          onButtonTap=\"onButtonTap\"\n        >\n          <view class=\"t-swipe-item-con-view\">左右自定义按钮</view>\n          <view\n            slot=\"delete\"\n            class=\"t-swipe-item-con-btn\"\n          >\n            <ant-icon\n              type=\"DeleteOutline\"\n              className=\"t-swipe-item-con-btn-icon\"\n            ></ant-icon>\n            <!--display: inline-->\n            <text class=\"t-swipe-item-con-btn-del\">删除</text>\n          </view>\n          <view\n            slot=\"delete-confirm\"\n            class=\"t-swipe-item-con-btn\"\n          >\n            <ant-icon\n              type=\"DeleteOutline\"\n              className=\"t-swipe-item-con-btn-icon\"\n            ></ant-icon>\n            <view class=\"t-swipe-item-con-btn-del\">确认删除吗？</view>\n          </view>\n          <view\n            slot=\"reName\"\n            class=\"t-swipe-item-con-btn\"\n          >\n            <ant-icon\n              type=\"EditFill\"\n              className=\"t-swipe-item-con-btn-icon\"\n            ></ant-icon>\n            <view class=\"t-swipe-item-con-btn-del\">重命名</view>\n          </view>\n          <view\n            slot=\"reName-confirm\"\n            class=\"t-swipe-item-con-btn\"\n          >\n            <ant-icon\n              type=\"EditFill\"\n              className=\"t-swipe-item-con-btn-icon\"\n            ></ant-icon>\n            <view class=\"t-swipe-item-con-btn-del\">确认修改吗?</view>\n          </view>\n          <view\n            slot=\"reName-left\"\n            class=\"t-swipe-item-con-btn left-slot\"\n          >\n            <ant-icon\n              type=\"EditFill\"\n              className=\"t-swipe-item-con-btn-icon\"\n            ></ant-icon>\n            <view class=\"t-swipe-item-con-btn-del\">重命名</view>\n          </view>\n          <view\n            slot=\"reName-left-confirm\"\n            class=\"t-swipe-item-con-btn left-slot\"\n          >\n            <ant-icon\n              type=\"EditFill\"\n              className=\"t-swipe-item-con-btn-icon\"\n            ></ant-icon>\n            <view class=\"t-swipe-item-con-btn-del\">确认修改吗?</view>\n          </view>\n        </ant-swipe-action>\n      </view>\n    </block>\n  </view>\n</view>\n"
  },
  {
    "path": "demo/pages/SwipeAction/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Swipe-Action\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Swipe-Action\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"pullRefresh\": \"NO\",\n  \"showProgress\": \"NO\",\n  \"allowsBounceVertical\": \"NO\",\n  \"usingComponents\": {\n    \"ant-swipe-action\": \"../../../src/SwipeAction/index\",\n    \"ant-icon\": \"../../../src/Icon/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/SwipeAction/index.less",
    "content": "@import '../../../src/style/themes/color.less';\n@import '../../../src/style/themes/index.less';\n\n.t-swipe {\n  width: 100%;\n  margin: 0 auto;\n  background-color: var(--color-background);\n  &-item {\n    font-size: 32 * @rpx;\n    color: @COLOR_TEXT_PRIMARY;\n    &-title {\n      width: 100%;\n      height: 90 * @rpx;\n      line-height: 100 * @rpx;\n      font-size: 28 * @rpx;\n      color: var(--color-text-assist);\n      text-indent: 1em;\n    }\n    &-con {\n      height: 130 * @rpx;\n      line-height: 130 * @rpx;\n      width: 100%;\n      &-view {\n        background-color: var(--color-card);\n        text-indent: 1em;\n        position: relative;\n        height: 100%;\n        color: var(--color-text-primary);\n        &::after {\n          content: '';\n          position: absolute;\n          bottom: 0;\n          left: 0;\n          width: 100%;\n          height: 1px;\n          max-height: 1px;\n          min-height: 1px;\n          transform: scaleY(0.5);\n          background-color: var(--color-border);\n        }\n      }\n    }\n  }\n}\n\n.t-swipe-item-con-btn {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n}\n.t-swipe-item-con-btn-icon {\n  font-size: 32px;\n}\n\n.left-slot {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 100%;\n}\n"
  },
  {
    "path": "demo/pages/SwipeAction/index.ts",
    "content": "Page({\n  data: {\n    rightBtns: [\n      {\n        text: '取消关注',\n        bgColor: '#CCCCCC',\n        color: '#fff',\n        width: 200,\n      },\n      {\n        text: '免打扰',\n        bgColor: '#1677FF',\n        color: '#fff',\n        width: 170,\n      },\n      {\n        text: '删除',\n        bgColor: '#FF2B00',\n        color: '#fff',\n        width: 140,\n      },\n    ],\n    leftBtns: [\n      {\n        text: '往来记录',\n        bgColor: '#1677FF',\n        color: '#fff',\n      },\n      {\n        text: '设为常用',\n        bgColor: '#FFA91B',\n        color: '#fff',\n      },\n      {\n        text: '删除',\n        bgColor: '#FF2B00',\n        color: '#fff',\n      },\n    ],\n    rightBtnsWithConfirm: [\n      {\n        text: '设为常用',\n        bgColor: '#1677FF',\n        color: '#fff',\n      },\n      {\n        text: '往来记录',\n        bgColor: '#FFA91B',\n        color: '#fff',\n      },\n      {\n        text: '删除',\n        bgColor: '#FF2B00',\n        color: '#fff',\n        confirmType: 'tap',\n        confirmText: '确认删除吗?',\n      },\n    ],\n    rightBtnsWithMove: [\n      {\n        text: '设为常用',\n        bgColor: '#1677FF',\n        color: '#fff',\n      },\n      {\n        text: '往来记录',\n        bgColor: '#FFA91B',\n        color: '#fff',\n      },\n      {\n        text: '删除',\n        bgColor: '#FF2B00',\n        color: '#fff',\n        confirmType: 'move',\n        confirmText: '确认删除吗?',\n      },\n    ],\n    swipeIndex: -1,\n  },\n\n  onSwipeStart() {\n    this.setData({ swipeIndex: '' });\n  },\n  onSwipeEnd(args1, args2) {\n    let e, data;\n    /// #if WECHAT\n    e = args1;\n    data = args1.detail;\n    /// #endif\n\n    /// #if ALIPAY\n    e = args2;\n    data = args1;\n    /// #endif\n\n    const { index } = e.target.dataset.item;\n    data.swiped && this.setData({ swipeIndex: index });\n  },\n  onButtonTap(data, e) {\n    console.log(data, e);\n  },\n});\n"
  },
  {
    "path": "demo/pages/SwipeAction/slice.sjs.ts",
    "content": "function sliceButton(rightBtns, index) {\n  return rightBtns.slice(0, index + 1);\n}\n\nexport default {\n  sliceButton,\n};\n"
  },
  {
    "path": "demo/pages/SwipeActionAnimation/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<view class=\"t-swipe\">\n  <view class=\"t-swipe-item\">\n    <view class=\"t-swipe-item-title\">去除松开手之后的滑动回弹效果</view>\n    <block\n      a:for=\"{{ 10 }}\"\n      a:for-index=\"index\"\n      a:for-item=\"_\"\n      a:key=\"{{ index }}\">\n      <view class=\"t-swipe-item-con\">\n        <ant-swipe-action\n          data-item=\"{{ index }}\"\n          rightButtons=\"{{ rightBtns }}\"\n          elasticity=\"{{ false }}\"\n          swiped=\"{{ swipeIndex === index }}\"\n          onSwipeEnd=\"onSwipeEnd\"\n          onSwipeStart=\"onSwipeStart\"\n          onButtonTap=\"onButtonTap\">\n          <view class=\"t-swipe-item-con-view\">右侧-三个按钮</view>\n        </ant-swipe-action>\n      </view>\n    </block>\n  </view>\n</view>\n"
  },
  {
    "path": "demo/pages/SwipeActionAnimation/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Swipe-Action\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Swipe-Action\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"pullRefresh\": \"NO\",\n  \"showProgress\": \"NO\",\n  \"allowsBounceVertical\": \"NO\",\n  \"usingComponents\": {\n    \"ant-swipe-action\": \"../../../src/SwipeAction/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/SwipeActionAnimation/index.less",
    "content": "@import \"../../../src/style/themes/index.less\";\n\n.t-swipe {\n  width: 100%;\n  margin: 0 auto;\n  background-color: @COLOR_BACKGROUND;\n  &-item {\n    font-size: 32 * @rpx;\n    color: @COLOR_TEXT_PRIMARY;\n    &-title {\n      width: 100%;\n      height: 90 * @rpx;\n      line-height: 100 * @rpx;\n      font-size: 28 * @rpx;\n      color: @COLOR_TEXT_ASSIST_DEFAULT;\n      text-indent: 1em;\n    }\n    &-con {\n      height: 130 * @rpx;\n      line-height: 130 * @rpx;\n      width: 100%;\n      &-view {\n        background-color: @COLOR_CARD;\n        text-indent: 1em;\n        position: relative;\n        height: 100%;\n        color: @COLOR_TEXT_PRIMARY;\n        &::after {\n          content: \"\";\n          position: absolute;\n          bottom: 0;\n          left: 0;\n          width: 100%;\n          height: 1px;\n          max-height: 1px;\n          min-height: 1px;\n          transform: scaleY(0.5);\n          background-color: @COLOR_BORDER;\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "demo/pages/SwipeActionAnimation/index.ts",
    "content": "Page({\n  data: {\n    rightBtns: [\n      {\n        text: '设为常用',\n        bgColor: '#1677FF',\n        color: '#fff',\n      },\n      {\n        text: '往来记录',\n        bgColor: '#FFA91B',\n        color: '#fff',\n      },\n      {\n        text: '删除',\n        bgColor: '#FF2B00',\n        color: '#fff',\n      },\n    ],\n    swipeIndex: -1,\n  },\n  onSwipeStart() {\n    this.setData({ swipeIndex: '' });\n  },\n  onSwipeEnd(args1, args2) {\n    let e, data;\n    /// #if WECHAT\n    e = args1;\n    data = args1.detail;\n    /// #endif\n\n    /// #if ALIPAY\n    e = args2;\n    data = args1;\n    /// #endif\n\n    const { index } = e.target.dataset.item;\n    data.swiped && this.setData({ swipeIndex: index });\n  },\n  onButtonTap(data, e) {\n    console.log(data, e);\n  },\n});\n"
  },
  {
    "path": "demo/pages/SwipeActionLeft/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<view class=\"t-swipe\">\n  <view class=\"t-swipe-item\">\n    <view class=\"t-swipe-item-title\">按钮在左侧</view>\n    <block\n      a:for=\"{{ 10 }}\"\n      a:for-index=\"index\"\n      a:for-item=\"_\"\n      a:key=\"{{ index }}\">\n      <view class=\"t-swipe-item-con\">\n        <ant-swipe-action\n          data-item=\"{{ index }}\"\n          leftButtons=\"{{ leftBtns }}\"\n          elasticity=\"{{ true }}\"\n          swiped=\"{{ swipeIndex === index }}\"\n          onSwipeEnd=\"onSwipeEnd\"\n          onSwipeStart=\"onSwipeStart\"\n          onButtonTap=\"onButtonTap\">\n          <view class=\"t-swipe-item-con-view\">左侧-三个按钮</view>\n        </ant-swipe-action>\n      </view>\n    </block>\n  </view>\n</view>\n"
  },
  {
    "path": "demo/pages/SwipeActionLeft/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Swipe-Action\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Swipe-Action\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"pullRefresh\": \"NO\",\n  \"showProgress\": \"NO\",\n  \"allowsBounceVertical\": \"NO\",\n  \"usingComponents\": {\n    \"ant-swipe-action\": \"../../../src/SwipeAction/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/SwipeActionLeft/index.less",
    "content": "@import \"../../../src/style/themes/index.less\";\n\n.t-swipe {\n  width: 100%;\n  margin: 0 auto;\n  background-color: @COLOR_BACKGROUND;\n  &-item {\n    font-size: 32 * @rpx;\n    color: @COLOR_TEXT_PRIMARY;\n    &-title {\n      width: 100%;\n      height: 90 * @rpx;\n      line-height: 100 * @rpx;\n      font-size: 28 * @rpx;\n      color: @COLOR_TEXT_ASSIST_DEFAULT;\n      text-indent: 1em;\n    }\n    &-con {\n      height: 130 * @rpx;\n      line-height: 130 * @rpx;\n      width: 100%;\n      &-view {\n        background-color: @COLOR_CARD;\n        text-indent: 1em;\n        position: relative;\n        height: 100%;\n        color: @COLOR_TEXT_PRIMARY;\n        &::after {\n          content: \"\";\n          position: absolute;\n          bottom: 0;\n          left: 0;\n          width: 100%;\n          height: 1px;\n          max-height: 1px;\n          min-height: 1px;\n          transform: scaleY(0.5);\n          background-color: @COLOR_BORDER;\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "demo/pages/SwipeActionLeft/index.ts",
    "content": "Page({\n  data: {\n    leftBtns: [\n      {\n        text: '往来记录',\n        bgColor: '#1677FF',\n        color: '#fff',\n      },\n      {\n        text: '设为常用',\n        bgColor: '#FFA91B',\n        color: '#fff',\n      },\n      {\n        text: '删除',\n        bgColor: '#FF2B00',\n        color: '#fff',\n      },\n    ],\n    swipeIndex: -1,\n  },\n  onSwipeStart() {\n    this.setData({ swipeIndex: '' });\n  },\n  onSwipeEnd(args1, args2) {\n    let e, data;\n    /// #if WECHAT\n    e = args1;\n    data = args1.detail;\n    /// #endif\n\n    /// #if ALIPAY\n    e = args2;\n    data = args1;\n    /// #endif\n\n    const { index } = e.target.dataset.item;\n    data.swiped && this.setData({ swipeIndex: index });\n  },\n  onButtonTap(data, e) {\n    console.log(data, e);\n  },\n});\n"
  },
  {
    "path": "demo/pages/SwipeActionLeftRight/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<view class=\"t-swipe\">\n  <view class=\"t-swipe-item\">\n    <view class=\"t-swipe-item-title\">左右两侧都有按钮</view>\n    <block\n      a:for=\"{{ 10 }}\"\n      a:for-index=\"index\"\n      a:for-item=\"_\"\n      a:key=\"{{ index }}\">\n      <view class=\"t-swipe-item-con\">\n        <ant-swipe-action\n          data-item=\"{{ index }}\"\n          leftButtons=\"{{ rightBtns }}\"\n          rightButtons=\"{{ rightBtns }}\"\n          elasticity=\"{{ true }}\"\n          swiped=\"{{ swipeIndex === index }}\"\n          onSwipeEnd=\"onSwipeEnd\"\n          onSwipeStart=\"onSwipeStart\"\n          onButtonTap=\"onButtonTap\">\n          <view class=\"t-swipe-item-con-view\">三个按钮</view>\n        </ant-swipe-action>\n      </view>\n    </block>\n  </view>\n</view>\n"
  },
  {
    "path": "demo/pages/SwipeActionLeftRight/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Swipe-Action\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Swipe-Action\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"pullRefresh\": \"NO\",\n  \"showProgress\": \"NO\",\n  \"allowsBounceVertical\": \"NO\",\n  \"usingComponents\": {\n    \"ant-swipe-action\": \"../../../src/SwipeAction/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/SwipeActionLeftRight/index.less",
    "content": "@import \"../../../src/style/themes/index.less\";\n\n.t-swipe {\n  width: 100%;\n  margin: 0 auto;\n  background-color: @COLOR_BACKGROUND;\n  &-item {\n    font-size: 32 * @rpx;\n    color: @COLOR_TEXT_PRIMARY;\n    &-title {\n      width: 100%;\n      height: 90 * @rpx;\n      line-height: 100 * @rpx;\n      font-size: 28 * @rpx;\n      color: @COLOR_TEXT_ASSIST_DEFAULT;\n      text-indent: 1em;\n    }\n    &-con {\n      height: 130 * @rpx;\n      line-height: 130 * @rpx;\n      width: 100%;\n      &-view {\n        background-color: @COLOR_CARD;\n        text-indent: 1em;\n        position: relative;\n        height: 100%;\n        color: @COLOR_TEXT_PRIMARY;\n        &::after {\n          content: \"\";\n          position: absolute;\n          bottom: 0;\n          left: 0;\n          width: 100%;\n          height: 1px;\n          max-height: 1px;\n          min-height: 1px;\n          transform: scaleY(0.5);\n          background-color: @COLOR_BORDER;\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "demo/pages/SwipeActionLeftRight/index.ts",
    "content": "Page({\n  data: {\n    rightBtns: [\n      {\n        text: '往来记录',\n        bgColor: '#1677FF',\n        color: '#fff',\n      },\n      {\n        text: '设为常用',\n        bgColor: '#FFA91B',\n        color: '#fff',\n      },\n      {\n        text: '删除',\n        bgColor: '#FF2B00',\n        color: '#fff',\n      },\n    ],\n    swipeIndex: -1,\n  },\n  onSwipeStart() {\n    this.setData({ swipeIndex: '' });\n  },\n  onSwipeEnd(args1, args2) {\n    let e, data;\n    /// #if WECHAT\n    e = args1;\n    data = args1.detail;\n    /// #endif\n\n    /// #if ALIPAY\n    e = args2;\n    data = args1;\n    /// #endif\n\n    const { index } = e.target.dataset.item;\n    data.swiped && this.setData({ swipeIndex: index });\n  },\n  onButtonTap(data, e) {\n    console.log(data, e);\n  },\n});\n"
  },
  {
    "path": "demo/pages/SwipeActionMove/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<view class=\"t-swipe\">\n  <view class=\"t-swipe-item\">\n    <view class=\"t-swipe-item-title\">删除按钮滑动到最大距离触发二次确认</view>\n    <block\n      a:for=\"{{ 10 }}\"\n      a:for-index=\"index\"\n      a:for-item=\"_\"\n      a:key=\"{{ index }}\">\n      <view class=\"t-swipe-item-con\">\n        <ant-swipe-action\n          data-item=\"{{ index }}\"\n          rightButtons=\"{{ rightBtns }}\"\n          elasticity=\"{{ true }}\"\n          swiped=\"{{ swipeIndex === index }}\"\n          onSwipeEnd=\"onSwipeEnd\"\n          onSwipeStart=\"onSwipeStart\"\n          onButtonTap=\"onButtonTap\">\n          <view class=\"t-swipe-item-con-view\">右侧-三个按钮</view>\n        </ant-swipe-action>\n      </view>\n    </block>\n  </view>\n</view>\n"
  },
  {
    "path": "demo/pages/SwipeActionMove/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Swipe-Action\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Swipe-Action\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"pullRefresh\": \"NO\",\n  \"showProgress\": \"NO\",\n  \"allowsBounceVertical\": \"NO\",\n  \"usingComponents\": {\n    \"ant-swipe-action\": \"../../../src/SwipeAction/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/SwipeActionMove/index.less",
    "content": "@import \"../../../src/style/themes/index.less\";\n\n.t-swipe {\n  width: 100%;\n  margin: 0 auto;\n  background-color: @COLOR_BACKGROUND;\n  &-item {\n    font-size: 32 * @rpx;\n    color: @COLOR_TEXT_PRIMARY;\n    &-title {\n      width: 100%;\n      height: 90 * @rpx;\n      line-height: 100 * @rpx;\n      font-size: 28 * @rpx;\n      color: @COLOR_TEXT_ASSIST_DEFAULT;\n      text-indent: 1em;\n    }\n    &-con {\n      height: 130 * @rpx;\n      line-height: 130 * @rpx;\n      width: 100%;\n      &-view {\n        background-color: @COLOR_CARD;\n        text-indent: 1em;\n        position: relative;\n        height: 100%;\n        color: @COLOR_TEXT_PRIMARY;\n        &::after {\n          content: \"\";\n          position: absolute;\n          bottom: 0;\n          left: 0;\n          width: 100%;\n          height: 1px;\n          max-height: 1px;\n          min-height: 1px;\n          transform: scaleY(0.5);\n          background-color: @COLOR_BORDER;\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "demo/pages/SwipeActionMove/index.ts",
    "content": "Page({\n  data: {\n    rightBtns: [\n      {\n        text: '设为常用',\n        bgColor: '#1677FF',\n        color: '#fff',\n      },\n      {\n        text: '往来记录',\n        bgColor: '#FFA91B',\n        color: '#fff',\n      },\n      {\n        text: '删除',\n        bgColor: '#FF2B00',\n        color: '#fff',\n        confirmType: 'move',\n        confirmText: '确认删除吗?',\n      },\n    ],\n    swipeIndex: -1,\n  },\n  onSwipeStart() {\n    this.setData({ swipeIndex: '' });\n  },\n  onSwipeEnd(args1, args2) {\n    let e, data;\n    /// #if WECHAT\n    e = args1;\n    data = args1.detail;\n    /// #endif\n\n    /// #if ALIPAY\n    e = args2;\n    data = args1;\n    /// #endif\n\n    const { index } = e.target.dataset.item;\n    data.swiped && this.setData({ swipeIndex: index });\n  },\n  onButtonTap(data, e) {\n    console.log(data, e);\n  },\n});\n"
  },
  {
    "path": "demo/pages/SwipeActionNumber/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<import-sjs\n  from=\"./slice.sjs\"\n  name=\"utils\" />\n\n<view class=\"t-swipe\">\n  <view class=\"t-swipe-item\">\n    <view class=\"t-swipe-item-title\">调整按钮数量，最多为3个</view>\n\n    <block\n      a:for=\"{{ 5 }}\"\n      a:for-index=\"index\"\n      a:for-item=\"_\"\n      a:key=\"{{ index }}\">\n      <view class=\"t-swipe-item-con\">\n        <ant-swipe-action\n          data-item=\"{{ index }}\"\n          rightButtons=\"{{ utils.sliceButton(rightBtns, index) }}\"\n          elasticity=\"{{ index !== 0 }}\"\n          swiped=\"{{ swipeIndex === index }}\"\n          onSwipeEnd=\"onSwipeEnd\"\n          onSwipeStart=\"onSwipeStart\"\n          onButtonTap=\"onButtonTap\">\n          <view class=\"t-swipe-item-con-view\">\n            右侧-{{ index + 1 > 3 ? 3 : index + 1 }}个按钮\n          </view>\n        </ant-swipe-action>\n      </view>\n    </block>\n  </view>\n</view>\n"
  },
  {
    "path": "demo/pages/SwipeActionNumber/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Swipe-Action\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Swipe-Action\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"pullRefresh\": \"NO\",\n  \"showProgress\": \"NO\",\n  \"allowsBounceVertical\": \"NO\",\n  \"usingComponents\": {\n    \"ant-swipe-action\": \"../../../src/SwipeAction/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/SwipeActionNumber/index.less",
    "content": "@import \"../../../src/style/themes/index.less\";\n\n.t-swipe {\n  width: 100%;\n  margin: 0 auto;\n  background-color: @COLOR_BACKGROUND;\n  &-item {\n    font-size: 32 * @rpx;\n    color: @COLOR_TEXT_PRIMARY;\n    &-title {\n      width: 100%;\n      height: 90 * @rpx;\n      line-height: 100 * @rpx;\n      font-size: 28 * @rpx;\n      color: @COLOR_TEXT_ASSIST_DEFAULT;\n      text-indent: 1em;\n    }\n    &-con {\n      height: 130 * @rpx;\n      line-height: 130 * @rpx;\n      width: 100%;\n      &-view {\n        background-color: @COLOR_CARD;\n        text-indent: 1em;\n        position: relative;\n        height: 100%;\n        color: @COLOR_TEXT_PRIMARY;\n        &::after {\n          content: \"\";\n          position: absolute;\n          bottom: 0;\n          left: 0;\n          width: 100%;\n          height: 1px;\n          max-height: 1px;\n          min-height: 1px;\n          transform: scaleY(0.5);\n          background-color: @COLOR_BORDER;\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "demo/pages/SwipeActionNumber/index.ts",
    "content": "Page({\n  data: {\n    rightBtns: [\n      {\n        text: '设为常用',\n        bgColor: '#1677FF',\n        color: '#fff',\n      },\n      {\n        text: '往来记录',\n        bgColor: '#FFA91B',\n        color: '#fff',\n      },\n      {\n        text: '删除',\n        bgColor: '#FF2B00',\n        color: '#fff',\n      },\n    ],\n    swipeIndex: -1,\n  },\n  onSwipeStart() {\n    this.setData({ swipeIndex: '' });\n  },\n  onSwipeEnd(args1, args2) {\n    let e, data;\n    /// #if WECHAT\n    e = args1;\n    data = args1.detail;\n    /// #endif\n\n    /// #if ALIPAY\n    e = args2;\n    data = args1;\n    /// #endif\n\n    const { index } = e.target.dataset.item;\n    data.swiped && this.setData({ swipeIndex: index });\n  },\n  onButtonTap(data, e) {\n    console.log(data, e);\n  },\n});\n"
  },
  {
    "path": "demo/pages/SwipeActionNumber/slice.sjs.ts",
    "content": "function sliceButton(rightBtns, index) {\n  return rightBtns.slice(0, index + 1);\n}\n\nexport default {\n  sliceButton,\n};\n"
  },
  {
    "path": "demo/pages/SwipeActionSlot/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<view class=\"t-swipe\">\n  <view class=\"t-swipe-item\">\n    <view class=\"t-swipe-item-title\">自定义按钮</view>\n    <block\n      a:for=\"{{ 10 }}\"\n      a:for-index=\"index\"\n      a:for-item=\"_\"\n      a:key=\"{{ index }}\">\n      <view class=\"t-swipe-item-con\">\n        <ant-swipe-action\n          data-item=\"{{ index }}\"\n          rightButtons=\"{{ rightBtns }}\"\n          leftButtons=\"{{ leftBtns }}\"\n          elasticity=\"{{ true }}\"\n          swiped=\"{{ swipeIndex === index }}\"\n          onSwipeEnd=\"onSwipeEnd\"\n          onSwipeStart=\"onSwipeStart\"\n          onButtonTap=\"onButtonTap\">\n          <view class=\"t-swipe-item-con-view\">左右自定义按钮</view>\n          <view\n            slot=\"delete\"\n            class=\"t-swipe-item-con-btn\">\n            <ant-icon\n              type=\"DeleteOutline\"\n              className=\"t-swipe-item-con-btn-icon\" />\n            <!-- display: inline -->\n            <text class=\"t-swipe-item-con-btn-del\">删除</text>\n          </view>\n          <view\n            slot=\"delete-confirm\"\n            class=\"t-swipe-item-con-btn\">\n            <ant-icon\n              type=\"DeleteOutline\"\n              className=\"t-swipe-item-con-btn-icon\" />\n            <view class=\"t-swipe-item-con-btn-del\">确认删除吗？</view>\n          </view>\n          <view\n            slot=\"reName\"\n            class=\"t-swipe-item-con-btn\">\n            <ant-icon\n              type=\"EditFill\"\n              className=\"t-swipe-item-con-btn-icon\" />\n            <view class=\"t-swipe-item-con-btn-del\">重命名</view>\n          </view>\n          <view\n            slot=\"reName-confirm\"\n            class=\"t-swipe-item-con-btn\">\n            <ant-icon\n              type=\"EditFill\"\n              className=\"t-swipe-item-con-btn-icon\" />\n            <view class=\"t-swipe-item-con-btn-del\">确认修改吗?</view>\n          </view>\n          <view\n            slot=\"reName-left\"\n            class=\"t-swipe-item-con-btn left-slot\">\n            <ant-icon\n              type=\"EditFill\"\n              className=\"t-swipe-item-con-btn-icon\" />\n            <view class=\"t-swipe-item-con-btn-del\">重命名</view>\n          </view>\n          <view\n            slot=\"reName-left-confirm\"\n            class=\"t-swipe-item-con-btn left-slot\">\n            <ant-icon\n              type=\"EditFill\"\n              className=\"t-swipe-item-con-btn-icon\" />\n            <view class=\"t-swipe-item-con-btn-del\">确认修改吗?</view>\n          </view>\n        </ant-swipe-action>\n      </view>\n    </block>\n  </view>\n</view>\n"
  },
  {
    "path": "demo/pages/SwipeActionSlot/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Swipe-Action-Slot\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Swipe-Action-Slot\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"pullRefresh\": \"NO\",\n  \"showProgress\": \"NO\",\n  \"allowsBounceVertical\": \"NO\",\n  \"usingComponents\": {\n    \"ant-swipe-action\": \"../../../src/SwipeAction/index\",\n    \"ant-icon\": \"../../../src/Icon/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/SwipeActionSlot/index.less",
    "content": "@import '../../../src/style/themes/index.less';\n\n.t-swipe {\n  width: 100%;\n  margin: 0 auto;\n  background-color: @COLOR_BACKGROUND;\n\n  &-item {\n    font-size: 32 * @rpx;\n    color: @COLOR_TEXT_PRIMARY;\n\n    &-title {\n      width: 100%;\n      height: 90 * @rpx;\n      line-height: 100 * @rpx;\n      font-size: 28 * @rpx;\n      color: @COLOR_TEXT_ASSIST_DEFAULT;\n      text-indent: 1em;\n    }\n\n    &-con {\n      height: 130 * @rpx;\n      line-height: 130 * @rpx;\n      width: 100%;\n\n      &-view {\n        background-color: @COLOR_CARD;\n        text-indent: 1em;\n        position: relative;\n        height: 100%;\n        color: @COLOR_TEXT_PRIMARY;\n\n        &::after {\n          content: '';\n          position: absolute;\n          bottom: 0;\n          left: 0;\n          width: 100%;\n          height: 1px;\n          max-height: 1px;\n          min-height: 1px;\n          transform: scaleY(0.5);\n          background-color: @COLOR_BORDER;\n        }\n      }\n\n      &-btn {\n        display: flex;\n        justify-content: center;\n        align-items: center;\n\n        &-icon {\n          font-size: 32px;\n        }\n      }\n    }\n  }\n}\n\n.left-slot {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 100%;\n}\n"
  },
  {
    "path": "demo/pages/SwipeActionSlot/index.ts",
    "content": "Page({\n  data: {\n    rightBtns: [\n      {\n        text: 'No Slot',\n        bgColor: '#1677FF',\n        color: '#fff',\n      },\n      {\n        text: '重命名',\n        bgColor: '#FFA91B',\n        color: '#fff',\n        slotName: 'reName',\n        confirmType: 'tap',\n        confirmText: '确认修改吗？',\n      },\n      {\n        text: '删除',\n        bgColor: '#FF2B00',\n        color: '#fff',\n        slotName: 'delete',\n        confirmType: 'tap',\n        confirmText: '确认删除吗？',\n      },\n    ],\n    leftBtns: [\n      {\n        text: 'No Slot',\n        bgColor: '#1677FF',\n        color: '#fff',\n      },\n      {\n        text: '重命名',\n        bgColor: '#FFA91B',\n        color: '#fff',\n        width: 300,\n        slotName: 'reName-left',\n        confirmType: 'tap',\n        confirmText: '确认修改吗？',\n      },\n    ],\n    swipeIndex: -1,\n  },\n  onSwipeStart() {\n    this.setData({ swipeIndex: '' });\n  },\n  onSwipeEnd(args1, args2) {\n    let e, data;\n    /// #if WECHAT\n    e = args1;\n    data = args1.detail;\n    /// #endif\n\n    /// #if ALIPAY\n    e = args2;\n    data = args1;\n    /// #endif\n    const { index } = e.target.dataset.item;\n    data.swiped && this.setData({ swipeIndex: index });\n  },\n  onButtonTap(data, e) {\n    console.log(data, e);\n  },\n});\n"
  },
  {
    "path": "demo/pages/SwipeActionSpeed/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<view class=\"t-swipe\">\n  <view class=\"t-swipe-item\">\n    <view class=\"t-swipe-item-title\">滑动速度变慢</view>\n\n    <block\n      a:for=\"{{ 10 }}\"\n      a:for-index=\"index\"\n      a:for-item=\"_\"\n      a:key=\"{{ index }}\">\n      <view class=\"t-swipe-item-con\">\n        <ant-swipe-action\n          data-item=\"{{ index }}\"\n          rightButtons=\"{{ rightBtns }}\"\n          elasticity=\"{{ false }}\"\n          damping=\"25\"\n          swiped=\"{{ swipeIndex === index }}\"\n          onSwipeEnd=\"onSwipeEnd\"\n          onSwipeStart=\"onSwipeStart\"\n          onButtonTap=\"onButtonTap\">\n          <view class=\"t-swipe-item-con-view\">右侧-三个按钮</view>\n        </ant-swipe-action>\n      </view>\n    </block>\n  </view>\n</view>\n"
  },
  {
    "path": "demo/pages/SwipeActionSpeed/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Swipe-Action\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Swipe-Action\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"pullRefresh\": \"NO\",\n  \"showProgress\": \"NO\",\n  \"allowsBounceVertical\": \"NO\",\n  \"usingComponents\": {\n    \"ant-swipe-action\": \"../../../src/SwipeAction/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/SwipeActionSpeed/index.less",
    "content": "@import \"../../../src/style/themes/index.less\";\n\n.t-swipe {\n  width: 100%;\n  margin: 0 auto;\n  background-color: @COLOR_BACKGROUND;\n  &-item {\n    font-size: 32 * @rpx;\n    color: @COLOR_TEXT_PRIMARY;\n    &-title {\n      width: 100%;\n      height: 90 * @rpx;\n      line-height: 100 * @rpx;\n      font-size: 28 * @rpx;\n      color: @COLOR_TEXT_ASSIST_DEFAULT;\n      text-indent: 1em;\n    }\n    &-con {\n      height: 130 * @rpx;\n      line-height: 130 * @rpx;\n      width: 100%;\n      &-view {\n        background-color: @COLOR_CARD;\n        text-indent: 1em;\n        position: relative;\n        height: 100%;\n        color: @COLOR_TEXT_PRIMARY;\n        &::after {\n          content: \"\";\n          position: absolute;\n          bottom: 0;\n          left: 0;\n          width: 100%;\n          height: 1px;\n          max-height: 1px;\n          min-height: 1px;\n          transform: scaleY(0.5);\n          background-color: @COLOR_BORDER;\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "demo/pages/SwipeActionSpeed/index.ts",
    "content": "Page({\n  data: {\n    rightBtns: [\n      {\n        text: '设为常用',\n        bgColor: '#1677FF',\n        color: '#fff',\n      },\n      {\n        text: '往来记录',\n        bgColor: '#FFA91B',\n        color: '#fff',\n      },\n      {\n        text: '删除',\n        bgColor: '#FF2B00',\n        color: '#fff',\n      },\n    ],\n    swipeIndex: -1,\n  },\n  onSwipeStart() {\n    this.setData({ swipeIndex: '' });\n  },\n  onSwipeEnd(args1, args2) {\n    let e, data;\n    /// #if WECHAT\n    e = args1;\n    data = args1.detail;\n    /// #endif\n\n    /// #if ALIPAY\n    e = args2;\n    data = args1;\n    /// #endif\n\n    const { index } = e.target.dataset.item;\n    data.swiped && this.setData({ swipeIndex: index });\n  },\n  onButtonTap(data, e) {\n    console.log(data, e);\n  },\n});\n"
  },
  {
    "path": "demo/pages/SwipeActionTap/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<view class=\"t-swipe\">\n  <view class=\"t-swipe-item\">\n    <view class=\"t-swipe-item-title\">删除按钮点击二次确认</view>\n\n    <block\n      a:for=\"{{ 10 }}\"\n      a:for-index=\"index\"\n      a:for-item=\"_\"\n      a:key=\"{{ index }}\">\n      <view class=\"t-swipe-item-con\">\n        <ant-swipe-action\n          data-item=\"{{ index }}\"\n          rightButtons=\"{{ rightBtns }}\"\n          elasticity=\"{{ true }}\"\n          swiped=\"{{ swipeIndex === index }}\"\n          onSwipeEnd=\"onSwipeEnd\"\n          onSwipeStart=\"onSwipeStart\"\n          onButtonTap=\"onButtonTap\">\n          <view class=\"t-swipe-item-con-view\">右侧-三个按钮</view>\n        </ant-swipe-action>\n      </view>\n    </block>\n  </view>\n</view>\n"
  },
  {
    "path": "demo/pages/SwipeActionTap/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Swipe-Action\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Swipe-Action\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"pullRefresh\": \"NO\",\n  \"showProgress\": \"NO\",\n  \"allowsBounceVertical\": \"NO\",\n  \"usingComponents\": {\n    \"ant-swipe-action\": \"../../../src/SwipeAction/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/SwipeActionTap/index.less",
    "content": "@import \"../../../src/style/themes/index.less\";\n\n.t-swipe {\n  width: 100%;\n  margin: 0 auto;\n  background-color: @COLOR_BACKGROUND;\n  &-item {\n    height: 130 * @rpx;\n    line-height: 130 * @rpx;\n    font-size: 32 * @rpx;\n    color: @COLOR_TEXT_PRIMARY;\n    &-title {\n      width: 100%;\n      height: 90 * @rpx;\n      line-height: 100 * @rpx;\n      font-size: 28 * @rpx;\n      color: @COLOR_TEXT_ASSIST_DEFAULT;\n      text-indent: 1em;\n    }\n    &-con {\n      height: 130 * @rpx;\n      line-height: 130 * @rpx;\n      width: 100%;\n      &-view {\n        background-color: @COLOR_CARD;\n        text-indent: 1em;\n        position: relative;\n        height: 100%;\n        color: @COLOR_TEXT_PRIMARY;\n        &::after {\n          content: \"\";\n          position: absolute;\n          bottom: 0;\n          left: 0;\n          width: 100%;\n          height: 1px;\n          max-height: 1px;\n          min-height: 1px;\n          transform: scaleY(0.5);\n          background-color: @COLOR_BORDER;\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "demo/pages/SwipeActionTap/index.ts",
    "content": "Page({\n  data: {\n    rightBtns: [\n      {\n        text: '设为常用',\n        bgColor: '#1677FF',\n        color: '#fff',\n      },\n      {\n        text: '往来记录',\n        bgColor: '#FFA91B',\n        color: '#fff',\n      },\n      {\n        text: '删除',\n        bgColor: '#FF2B00',\n        color: '#fff',\n        confirmType: 'tap',\n        confirmText: '确认删除吗?',\n      },\n    ],\n    swipeIndex: -1,\n  },\n  onSwipeStart() {\n    this.setData({ swipeIndex: '' });\n  },\n  onSwipeEnd(args1, args2) {\n    let e, data;\n    /// #if WECHAT\n    e = args1;\n    data = args1.detail;\n    /// #endif\n\n    /// #if ALIPAY\n    e = args2;\n    data = args1;\n    /// #endif\n\n    const { index } = e.target.dataset.item;\n    data.swiped && this.setData({ swipeIndex: index });\n  },\n  onButtonTap(data, e) {\n    console.log(data, e);\n  },\n});\n"
  },
  {
    "path": "demo/pages/SwipeActionWidth/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<view class=\"t-swipe\">\n  <view class=\"t-swipe-item\">\n    <view class=\"t-swipe-item-title\">自定义按钮宽度</view>\n\n    <block\n      a:for=\"{{ 10 }}\"\n      a:for-index=\"index\"\n      a:for-item=\"_\"\n      a:key=\"{{ index }}\">\n      <view class=\"t-swipe-item-con\">\n        <ant-swipe-action\n          data-item=\"{{ index }}\"\n          rightButtons=\"{{ rightBtns }}\"\n          elasticity=\"{{ true }}\"\n          swiped=\"{{ swipeIndex === index }}\"\n          onSwipeEnd=\"onSwipeEnd\"\n          onSwipeStart=\"onSwipeStart\"\n          onButtonTap=\"onButtonTap\">\n          <view class=\"t-swipe-item-con-view\">右侧-三个按钮</view>\n        </ant-swipe-action>\n      </view>\n    </block>\n  </view>\n</view>\n"
  },
  {
    "path": "demo/pages/SwipeActionWidth/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Swipe-Action\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Swipe-Action\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"pullRefresh\": \"NO\",\n  \"showProgress\": \"NO\",\n  \"allowsBounceVertical\": \"NO\",\n  \"usingComponents\": {\n    \"ant-swipe-action\": \"../../../src/SwipeAction/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/SwipeActionWidth/index.less",
    "content": "@import \"../../../src/style/themes/index.less\";\n\n.t-swipe {\n  width: 100%;\n  margin: 0 auto;\n  background-color: @COLOR_BACKGROUND;\n  &-item {\n    height: 130 * @rpx;\n    line-height: 130 * @rpx;\n    font-size: 32 * @rpx;\n    color: @COLOR_TEXT_PRIMARY;\n    &-title {\n      width: 100%;\n      height: 90 * @rpx;\n      line-height: 100 * @rpx;\n      font-size: 28 * @rpx;\n      color: @COLOR_TEXT_ASSIST_DEFAULT;\n      text-indent: 1em;\n    }\n    &-con {\n      height: 130 * @rpx;\n      line-height: 130 * @rpx;\n      width: 100%;\n      &-view {\n        background-color: @COLOR_CARD;\n        text-indent: 1em;\n        position: relative;\n        height: 100%;\n        color: @COLOR_TEXT_PRIMARY;\n        &::after {\n          content: \"\";\n          position: absolute;\n          bottom: 0;\n          left: 0;\n          width: 100%;\n          height: 1px;\n          max-height: 1px;\n          min-height: 1px;\n          transform: scaleY(0.5);\n          background-color: @COLOR_BORDER;\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "demo/pages/SwipeActionWidth/index.ts",
    "content": "Page({\n  data: {\n    rightBtns: [\n      {\n        text: '设为常用',\n        bgColor: '#1677FF',\n        color: '#fff',\n        width: 170,\n      },\n      {\n        text: '往来记录',\n        bgColor: '#FFA91B',\n        color: '#fff',\n        width: 170,\n      },\n      {\n        text: '删除',\n        bgColor: '#FF2B00',\n        color: '#fff',\n      },\n    ],\n    swipeIndex: -1,\n  },\n  onSwipeStart() {\n    this.setData({ swipeIndex: '' });\n  },\n  onSwipeEnd(args1, args2) {\n    let e, data;\n    /// #if WECHAT\n    e = args1;\n    data = args1.detail;\n    /// #endif\n\n    /// #if ALIPAY\n    e = args2;\n    data = args1;\n    /// #endif\n\n    const { index } = e.target.dataset.item;\n    data.swiped && this.setData({ swipeIndex: index });\n  },\n  onButtonTap(data, e) {\n    console.log(data, e);\n  },\n});\n"
  },
  {
    "path": "demo/pages/Switch/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<view>\n  <ant-container title=\"基础用法\">\n    <ant-switch />\n  </ant-container>\n  <ant-container title=\"有默认值\">\n    <ant-switch\n      defaultChecked=\"{{ true }}\"\n      onChange=\"onChange\" />\n  </ant-container>\n  <ant-container title=\"文字和图标\">\n    <ant-switch\n      checkedText=\"开\"\n      uncheckedText=\"关\"\n      onChange=\"onChange\" />\n    <!-- #if ALIPAY -->\n    <ant-switch>\n      <ant-icon\n        type=\"CheckOutline\"\n        slot=\"checkedText\" />\n      <ant-icon\n        type=\"CloseOutline\"\n        slot=\"uncheckedText\" />\n    </ant-switch>\n    <!-- #endif -->\n  </ant-container>\n  <ant-container title=\"自定义颜色\">\n    <ant-switch\n      defaultChecked=\"{{ true }}\"\n      color=\"#00b578\" />\n  </ant-container>\n  <ant-container title=\"禁用状态\">\n    <ant-switch\n      defaultChecked=\"{{ true }}\"\n      disabled=\"{{ true }}\" />\n    <ant-switch disabled=\"{{ true }}\" />\n  </ant-container>\n  <ant-container title=\"加载状态\">\n    <ant-switch loading />\n  </ant-container>\n  <ant-container title=\"不同尺寸\">\n    <view class=\"line\">\n      <view>medium：</view>\n      <ant-switch size=\"medium\" />\n    </view>\n    <view class=\"line\">\n      <view>small：</view>\n      <ant-switch size=\"small\" />\n    </view>\n    <view class=\"line\">\n      <view>x-small：</view>\n      <ant-switch size=\"x-small\" />\n    </view>\n  </ant-container>\n  <ant-container title=\"受控模式\">\n    <ant-switch\n      checked=\"{{ checked }}\"\n      onChange=\"handleChange\"\n      defaultChecked=\"{{ true }}\" />\n    <ant-button\n      style=\"margin-top: 10px\"\n      onTap=\"handleChangeByButton\">\n      切换\n    </ant-button>\n  </ant-container>\n</view>\n"
  },
  {
    "path": "demo/pages/Switch/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Switch\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Switch\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-switch\": \"../../../src/Switch/index\",\n    \"ant-container\": \"../../../src/Container/index\",\n    \"ant-icon\": \"../../../src/Icon/index\",\n    \"ant-button\": \"../../../src/Button/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Switch/index.less",
    "content": "@import \"../../../src/style/themes/color.less\";\n.line {\n  display: flex;\n  align-items: center;\n  padding: 12rpx 0;\n}\n.line > view:nth-of-type(1) {\n  flex-basis: 80px;\n  color: @COLOR_TEXT_PRIMARY;\n}\n"
  },
  {
    "path": "demo/pages/Switch/index.ts",
    "content": "Page({\n  data: {\n    checked: true,\n  },\n  onChange(checked, e) {\n    console.log(checked);\n  },\n  handleChange(checked, e) {\n    /// #if WECHAT\n    this.setData({\n      checked: checked.detail,\n    });\n    /// #endif\n    /// #if ALIPAY\n    this.setData({\n      checked,\n    });\n    /// #endif\n  },\n  handleChangeByButton() {\n    console.log(this.data.checked);\n    this.setData({\n      checked: !this.data.checked,\n    });\n  },\n});\n"
  },
  {
    "path": "demo/pages/TabBar/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基础用法\">\n  <ant-tab-bar items=\"{{ tabs }}\" />\n</ant-container>\n<ant-container title=\"受控模式\">\n  <ant-tab-bar\n    items=\"{{ tabs }}\"\n    current=\"{{ current }}\"\n    onChange=\"handleChange\" />\n</ant-container>\n<ant-container title=\"红点用法\">\n  <ant-tab-bar items=\"{{ tabsBadge }}\" />\n</ant-container>\n\n<ant-container title=\"自定义高亮颜色\">\n  <ant-tab-bar\n    items=\"{{ tabs }}\"\n    activeStyle=\"color:red;\" />\n</ant-container>\n"
  },
  {
    "path": "demo/pages/TabBar/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"TabBar\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"TabBar\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-container\": \"../../../src/Container/index\",\n    \"ant-tab-bar\": \"../../../src/TabBar/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/TabBar/index.less",
    "content": ""
  },
  {
    "path": "demo/pages/TabBar/index.ts",
    "content": "Page({\n  data: {\n    tabs: [\n      {\n        icon: 'AlipayCircleFill',\n        activeIcon: 'AlipayCircleFill',\n        text: '首页',\n      },\n      {\n        icon: 'StarOutline',\n        activeIcon: 'StarFill',\n        text: '收藏',\n      },\n      {\n        icon: 'HeartOutline',\n        activeIcon: 'HeartFill',\n        text: '喜欢',\n      },\n    ],\n\n    tabsBadge: [\n      {\n        icon: 'AlipayCircleFill',\n        activeIcon: 'AlipayCircleFill',\n        text: '首页',\n        badge: {},\n      },\n      {\n        icon: 'StarOutline',\n        activeIcon: 'StarFill',\n        text: '收藏',\n        badge: { type: 'number', text: 9999 },\n      },\n      {\n        icon: 'HeartOutline',\n        activeIcon: 'HeartFill',\n        text: '喜欢',\n      },\n    ],\n\n    tabsCount6: [\n      {\n        icon: 'AlipayCircleFill',\n        activeIcon: 'AlipayCircleFill',\n        text: '首页',\n      },\n      {\n        icon: 'StarOutline',\n        activeIcon: 'StarFill',\n        text: '收藏',\n      },\n      {\n        icon: 'HeartOutline',\n        activeIcon: 'HeartFill',\n        text: '喜欢',\n      },\n      {\n        icon: 'AlipayCircleFill',\n        activeIcon: 'AlipayCircleFill',\n        text: '首页',\n      },\n      {\n        icon: 'StarOutline',\n        activeIcon: 'StarFill',\n        text: '收藏',\n      },\n      {\n        icon: 'HeartOutline',\n        activeIcon: 'HeartFill',\n        text: '喜欢',\n      },\n    ],\n\n    current: 0,\n  },\n  handleChange(index) {\n    /// #if WECHAT\n    this.setData({ current: index.detail });\n    /// #endif\n\n    /// #if ALIPAY\n    this.setData({ current: index });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/Table/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container\n  title=\"基础用法\"\n  className=\"list\"\n>\n  <ant-table dataSource=\"{{dataSource}}\" columns=\"{{columns}}\" />\n</ant-container>\n\n<ant-container\n  title=\"局部滚动\"\n  className=\"list\"\n>\n  <ant-table dataSource=\"{{dataSource}}\" columns=\"{{columns}}\" scrollHeight=\"300rpx\" />\n</ant-container>\n\n<!-- #if ALIPAY -->\n<ant-container\n  title=\"插槽\"\n  className=\"list\"\n>\n  <ant-table dataSource=\"{{dataSource}}\" columns=\"{{columns}}\">\n    <view slot=\"item\" slot-scope=\"props\">\n      <view a:if=\"{{props.item.dataIndex === 'order'}}\">\n      {{columns.length - props.row.index}}\n      </view>\n      <view a:elif=\"{{props.item.dataIndex === 'name'}}\">\n        {{props.item.value}}{{props.item.rowsData.key}}\n      </view>\n      <view a:elif=\"{{ props.item.dataIndex === 'age' }}\">\n        <view>\n          <view>{{ props.item.value }}</view>\n          <view a:if=\"{{ props.item.rowsData.extra }}\">{{ props.item.rowsData.extra }}</view>\n        </view>\n      </view>\n      <view a:else>\n        {{props.item.value}}\n      </view>\n    </view>\n  </ant-table>\n</ant-container>\n<!-- #endif -->\n\n<ant-container\n  title=\"插槽-无数据\"\n  className=\"list\"\n>\n  <ant-table dataSource=\"{{[]}}\" columns=\"{{columns}}\" className='empty-table-table'>\n    <image class=\"table-empty-img\" src=\"https://mdn.alipayobjects.com/huamei_9iifqq/afts/img/A*AWeXQYuIODwAAAAAAAAAAAAADjWYAQ/original\" />\n  </ant-table>\n</ant-container>\n\n<ant-container\n  title=\"设置一行铺满展示\"\n  className=\"list\"\n>\n  <ant-table dataSource=\"{{dataSource}}\" columns=\"{{fullColumns}}\" displayType=\"FULL\" className='full-table-table' />\n</ant-container>\n\n<ant-container\n  title=\"超出行数省略展示\"\n  className=\"list\"\n>\n  <ant-table dataSource=\"{{[{key: '0', name: '这是一行很长的数据，需要换行展示blablablabla', age: 18, sex: '男', address: '成都'}]}}\" columns=\"{{fullColumns}}\" className='full-table-table' />\n</ant-container>"
  },
  {
    "path": "demo/pages/Table/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Table\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Table\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-table\": \"../../../src/Table/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Table/index.less",
    "content": "@import '../../../src/style/themes/index.less';\n\n// 设置第一列的样式\n.full-table-table {\n  .mui-table-list-item-value-first {\n    border-bottom: 2 * @rpx solid #1677ff !important;\n  }\n\n  //  将所有的都去掉了\n  .g-hairline--top::after {\n    border: none;\n  }\n\n  .mui-table-list-item-rows {\n    border-bottom: 2 * @rpx solid #D3D3D3;\n  }\n}\n\n.table-empty-img {\n  position: sticky;\n  left: 50%;\n  transform: translate(-50%, 0);\n  width: 200 * @rpx;\n  height: 200 * @rpx;\n}\n"
  },
  {
    "path": "demo/pages/Table/index.ts",
    "content": "const nameArr = [\n  '小红',\n  '小何',\n  '小花',\n  '小美',\n  '小白',\n  '小黑',\n  '小帅',\n  '阿伟',\n];\nconst sexArr = ['男', '女'];\nconst ageArr = ['40', '18', '32', '20', '33', '48', '28', '38'];\nconst favoriteArr = ['羽毛球', '乒乓球', '篮球', '桌球'];\nconst addressArr = ['北京', '上海', '浙江', '广州'];\n\nfunction getRandomNumber(n) {\n  return Math.floor(Math.random() * n);\n}\n\nPage({\n  data: {\n    dataSource: Array.from({ length: 7 }).map((v, i) => ({\n      key: i,\n      name: nameArr[i],\n      sex: sexArr[getRandomNumber(sexArr.length)],\n      age: ageArr[i],\n      extra: '测试',\n      favorite: favoriteArr[getRandomNumber(favoriteArr.length)],\n      address: addressArr[getRandomNumber(addressArr.length)],\n      order: i,\n    })),\n    columns: [\n      {\n        title: '序号',\n        dataIndex: 'order',\n        key: 'order',\n        width: 150,\n        fixed: true,\n      },\n      {\n        title: '姓名',\n        dataIndex: 'name',\n        key: 'name',\n        width: 150,\n        fixed: true,\n        ellipsisRow: 2,\n      },\n      {\n        title: '年龄',\n        dataIndex: 'age',\n        key: 'age',\n        textAlignRight: true,\n        width: 150,\n        sorter: true,\n        // 自定义排序\n        // onSort: async (sorterStatus) => {\n        //   console.info('onSort', sorterStatus);\n        //   const data = Array.from({ length: 3 }).map((v, i) => ({\n        //     key: i,\n        //     name: randomName[getRandomNumber(randomName.length)],\n        //     favorite: randomFavorite[getRandomNumber(randomFavorite.length)],\n        //   }));\n        //   return await Promise.resolve(data);\n        // }\n      },\n      {\n        title: '性别',\n        dataIndex: 'sex',\n        key: 'sex',\n        width: 150,\n        // fixed: true,\n      },\n      {\n        title: '爱好',\n        dataIndex: 'favorite',\n        key: 'favorite',\n        width: 250,\n      },\n      {\n        title: '地址',\n        dataIndex: 'address',\n        key: 'address',\n        width: 250,\n      },\n    ],\n    fullColumns: [\n      {\n        title: '这是一段很长的表头这是一段很长的表头这是一段很长的表头',\n        dataIndex: 'name',\n        key: 'name',\n        ellipsisRow: 2,\n        width: 400,\n      },\n      {\n        title: '年龄',\n        dataIndex: 'age',\n        key: 'age',\n        textAlignRight: true,\n        sorter: true,\n        // 自定义排序\n        // onSort: async (sorterStatus) => {\n        //   console.info('onSort', sorterStatus);\n        //   const data = Array.from({ length: 3 }).map((v, i) => ({\n        //     key: i,\n        //     name: randomName[getRandomNumber(randomName.length)],\n        //     favorite: randomFavorite[getRandomNumber(randomFavorite.length)],\n        //   }));\n        //   return await Promise.resolve(data);\n        // }\n      },\n      {\n        title: '性别',\n        dataIndex: 'sex',\n        key: 'sex',\n      },\n      {\n        title: '地址',\n        dataIndex: 'address',\n        key: 'address',\n        textAlignRight: true,\n      },\n    ],\n  },\n});\n"
  },
  {
    "path": "demo/pages/Tabs/TabsElevator/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-tabs\n  items=\"{{ items }}\"\n  current=\"{{ current }}\"\n  onChange=\"onChange\"\n  className=\"tabs\">\n  <view\n    slot=\"title\"\n    onTap=\"onTap\"\n    slot-scope=\"item\">\n    {{ item.value.title }}\n  </view>\n\n  <scroll-view\n    enhanced\n    id=\"scroll-view\"\n    onScroll=\"onScroll\"\n    onTouchStart=\"onTouchStart\"\n    scroll-top=\"{{ scrollTop }}\"\n    scroll-y=\"{{ true }}\"\n    scroll-with-animation=\"{{ true }}\"\n    scroll-animation-duration=\"{{ 300 }}\"\n    class=\"content\">\n    <block\n      a:for=\"{{ items }}\"\n      a:for-index=\"index\"\n      a:for-item=\"item\"\n      a:key=\"{{ index }}\">\n      <view class=\"item\">\n        <view\n          class=\"title\"\n          id=\"tab-item-{{ index }}\">\n          {{ item.title }}\n        </view>\n        {{ item.content }}\n      </view>\n    </block>\n  </scroll-view>\n</ant-tabs>\n"
  },
  {
    "path": "demo/pages/Tabs/TabsElevator/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Tabs\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Tabs\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-tabs\": \"../../../../src/Tabs/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Tabs/TabsElevator/index.less",
    "content": "\n.content {\n  padding: 12px;\n  height: 400px;\n  background-color: #ffffff;\n}\n\n.item {\n  margin-bottom: 40px;\n}\n\n.title {\n  font-weight: bold;\n  margin-bottom: 8px;\n}\n"
  },
  {
    "path": "demo/pages/Tabs/TabsElevator/index.ts",
    "content": "Page({\n  data: {\n    current: 0,\n    items: [\n      {\n        title: '第一项',\n        content:\n          'Est voluptate sunt consequat laboris proident eu ut qui incididunt sint sint pariatur qui. Ut labore in duis labore cupidatat in ad quis duis aliquip irure occaecat officia reprehenderit consectetur. Enim consequat veniam nulla. Enim do nisi cillum aute pariatur ex dolor mollit ut nisi. Irure non pariatur anim Lorem ad do in elit irure minim exercitation. Dolor aliquip nisi adipisicing sunt adipisicing sunt nisi ad in non laboris in magna dolore. Fugiat aliqua labore elit occaecat consequat. Ipsum officia excepteur anim sint ipsum exercitation laborum. Excepteur exercitation ea occaecat cupidatat et consectetur exercitation non. Incididunt aliqua esse velit nisi ullamco. Do dolore ad ut. Esse ad tempor aliqua cillum consequat occaecat enim dolore enim aliquip aliquip irure. Id aliquip qui nulla dolor dolore et est. Non adipisicing mollit consequat magna sit laborum mollit nulla est consequat. Veniam in eu nisi ex sint deserunt ad sit consequat excepteur qui. Ea est sint adipisicing ea aliqua eiusmod amet pariatur officia ex voluptate. Consectetur in ipsum cillum nulla minim quis aute consequat. Et adipisicing officia nostrud id reprehenderit tempor. Laborum anim aliqua ut enim et pariatur elit tempor tempor incididunt deserunt nulla deserunt enim. Esse deserunt pariatur veniam sunt fugiat irure ullamco excepteur et Lorem. Sit adipisicing nisi consectetur nulla qui sint culpa. In aute cupidatat ad consequat proident est non sint ullamco dolor nisi irure fugiat amet deserunt. Laboris nostrud tempor aute non cillum magna labore ipsum duis ut dolor velit. Qui proident dolor occaecat consequat qui laboris sit est culpa excepteur aliqua pariatur veniam irure voluptate. Cillum adipisicing deserunt nisi quis anim fugiat ipsum incididunt veniam laboris et eiusmod minim. Tempor esse ex reprehenderit occaecat velit non do magna consequat consequat exercitation tempor elit. Ea pariatur irure laborum ipsum reprehenderit sunt sit minim excepteur pariatur magna deserunt aliqua velit non. Culpa irure dolore commodo quis do. Nulla ea consectetur ullamco deserunt laborum consectetur. Amet sunt in esse cupidatat excepteur veniam do. Est quis commodo consequat reprehenderit reprehenderit. Magna laboris dolor dolor laborum. Culpa officia dolor labore aute commodo ex nisi incididunt officia in aute incididunt voluptate. Do nisi dolore ea veniam adipisicing voluptate reprehenderit ea proident aliquip. Labore enim in minim. Aliquip cillum do consequat labore Lorem exercitation. Laborum anim aute in nisi aliqua nulla commodo nostrud laborum. Lorem cillum ut cillum laborum occaecat consequat elit duis. Dolore dolor deserunt nisi dolore laborum sit ea deserunt ipsum dolor ut sit minim. Reprehenderit esse consectetur dolore esse nostrud. Commodo laborum tempor magna cillum Lorem ad qui nisi consequat sit in amet veniam. Ex pariatur eiusmod labore aute id dolor et sunt cupidatat id et non proident enim sint. Duis duis id in et in incididunt Lorem veniam aliquip. Culpa duis deserunt eiusmod laborum labore ea non sit eu ipsum eu.',\n      },\n      {\n        title: '第二项',\n        content:\n          'Excepteur esse nisi excepteur exercitation. Aliquip elit ut officia cillum nisi id. Aute in esse cillum. Enim occaecat cupidatat consequat dolor ex nulla esse non. Non ipsum ullamco veniam proident labore et exercitation dolore esse tempor culpa amet in anim mollit. Do officia proident ullamco ea ipsum reprehenderit irure occaecat proident id culpa dolore Lorem deserunt. Aliquip ut ex dolor ut eiusmod elit et velit sunt ipsum aliquip dolore. Ullamco sit excepteur dolore anim irure duis aute labore ex elit. Lorem pariatur esse in cupidatat nostrud reprehenderit tempor aute quis. Minim eiusmod aute do. Lorem aliquip ea consequat occaecat aliqua duis dolore Lorem elit in anim dolore magna veniam adipisicing. Proident consequat Lorem et. Occaecat nisi id mollit do labore eu consequat aliquip aute nulla fugiat. Irure nisi reprehenderit sint proident commodo dolore. Cillum laboris aliquip labore quis ad. Excepteur labore commodo consectetur quis sunt. Dolor voluptate laboris id et do irure exercitation ex elit consequat dolore exercitation. Id nulla ad sint excepteur occaecat sunt nostrud anim consectetur labore consequat dolor ex in sunt. Laborum elit ad enim do aute ullamco minim culpa mollit fugiat laborum adipisicing. Nostrud velit esse consequat et ea. Et deserunt minim ipsum. Anim dolore velit ex cillum occaecat magna irure culpa aliquip ex laboris duis consequat ipsum incididunt. Anim laborum aliqua tempor excepteur mollit in consequat voluptate veniam dolore. Magna commodo officia officia in anim officia ex. Adipisicing mollit eu aliqua ex elit ipsum dolor incididunt adipisicing minim proident excepteur. Veniam veniam ex occaecat culpa eu consequat quis pariatur quis duis duis. Consectetur commodo eu voluptate pariatur sit sit reprehenderit duis esse veniam ullamco ullamco est. Laboris laborum exercitation anim tempor commodo fugiat. Sit ipsum consectetur pariatur in. Officia irure ipsum culpa irure veniam commodo laborum consequat sit laboris incididunt esse. Est in eiusmod ad ad deserunt consequat adipisicing commodo sit non culpa. Officia ut ex laborum fugiat. Magna sit do ullamco ex aute elit reprehenderit. Voluptate commodo Lorem est incididunt ullamco tempor cupidatat sint magna amet occaecat qui magna. Aliquip consequat pariatur tempor voluptate est pariatur excepteur. Nulla mollit adipisicing do magna proident velit consectetur magna nisi aliquip adipisicing et velit quis ad. Mollit minim elit fugiat tempor non in exercitation cillum quis qui pariatur laborum excepteur in cillum. Enim nostrud nisi consequat deserunt deserunt consequat velit laboris amet magna et eu ipsum. Aliqua cillum elit minim do id exercitation magna. Cupidatat incididunt reprehenderit culpa occaecat ullamco anim dolore. Anim occaecat occaecat esse non occaecat duis et fugiat. Pariatur velit dolor Lorem ullamco laborum deserunt deserunt consectetur consequat deserunt mollit esse. Irure nostrud velit nostrud aliqua ad ea voluptate. Culpa ex officia consectetur eiusmod cupidatat. Nulla Lorem ut ea eu deserunt eiusmod aliqua Lorem quis aute elit. Eiusmod cillum nisi veniam veniam fugiat deserunt adipisicing exercitation amet Lorem. Mollit sit dolore tempor et magna non proident cupidatat anim veniam. Nisi velit est occaecat amet dolor ut reprehenderit mollit culpa dolore ad pariatur. Pariatur qui ex qui excepteur reprehenderit. Mollit consectetur esse incididunt adipisicing dolore.',\n      },\n      {\n        title: '第三项',\n        content:\n          'Aute cillum et eu. Est ut magna sint ex ex adipisicing qui occaecat sint excepteur eiusmod adipisicing id eiusmod. Proident culpa tempor ullamco ad non ex incididunt ullamco tempor quis fugiat commodo consectetur. Id aliquip in labore occaecat ut exercitation mollit ipsum nisi pariatur occaecat ut minim duis enim. Magna cupidatat id do. Voluptate id tempor cillum aliqua mollit quis veniam sit fugiat culpa qui veniam deserunt reprehenderit. Reprehenderit qui est est consequat commodo occaecat id. Do consequat ut incididunt ea ipsum fugiat aliqua dolore velit incididunt. Dolor quis amet mollit fugiat quis ullamco culpa occaecat. Voluptate do ullamco excepteur duis dolor sit enim officia. Nostrud id aute nisi voluptate cupidatat pariatur duis et cillum. Excepteur nisi exercitation labore elit consequat officia non fugiat. Tempor deserunt eu do culpa quis fugiat proident amet qui deserunt eiusmod velit culpa. Nisi officia aliquip culpa pariatur sunt non quis eiusmod aliqua commodo et Lorem duis minim amet. Voluptate enim laborum ex dolore in anim cillum dolore ut officia Lorem ipsum exercitation irure anim. Pariatur quis consequat tempor eu quis tempor aute esse commodo ipsum non enim sunt. Sit laboris amet consequat. Aute sunt qui eiusmod enim amet ut in elit ea pariatur est et consequat. Occaecat adipisicing id ex nostrud labore anim. Ullamco eiusmod dolor et minim fugiat culpa nulla tempor cupidatat reprehenderit sit fugiat duis quis. Sunt est ipsum adipisicing. Do enim ullamco minim tempor dolore consequat. Consequat non nulla proident aute nulla magna et. Labore quis veniam adipisicing irure reprehenderit ipsum ex eu. Labore sint dolore voluptate laborum id ad eu minim aute consectetur adipisicing aliquip exercitation culpa. Ullamco exercitation dolore elit cupidatat elit ex aliqua pariatur duis cillum. Cillum consectetur ipsum cillum dolore. Et commodo id aliquip do sunt ea pariatur ut aliqua proident occaecat aute esse. Deserunt incididunt sit tempor culpa laboris ea minim laboris magna et consequat. Labore do duis cillum. Eiusmod nostrud enim sunt eiusmod consectetur. Irure ex consectetur officia nisi enim consectetur Lorem exercitation adipisicing sit consequat excepteur. Minim velit in ea nulla tempor ad irure laborum est tempor laboris enim ea non laboris. Velit magna fugiat aute laboris. Commodo sunt voluptate laborum labore tempor ullamco voluptate nostrud ea. Reprehenderit fugiat minim nulla fugiat enim sit Lorem. Est aute magna sunt magna labore do Lorem proident. Laboris et anim non aliqua eu laboris fugiat nostrud tempor deserunt ex officia quis dolore ipsum. Aliquip ea sint qui duis culpa non aliquip voluptate consectetur labore velit. Anim do est enim cupidatat ex et ad reprehenderit officia ullamco exercitation dolore. Non esse sint fugiat laborum eu enim aliqua enim nostrud. Lorem occaecat labore amet voluptate Lorem tempor do fugiat fugiat eu pariatur ea excepteur duis. Officia amet ipsum esse sunt anim deserunt. Esse eu officia mollit. Officia ut labore dolore et duis excepteur sunt cillum qui qui enim magna adipisicing. Dolor ipsum est nisi duis minim laboris magna anim ea labore eiusmod anim sunt deserunt. Est Lorem cupidatat officia laborum Lorem incididunt ex et est culpa occaecat et eiusmod exercitation. Qui do nostrud adipisicing dolore incididunt. Ex nostrud velit deserunt dolore cillum anim et exercitation magna qui pariatur consectetur laboris deserunt.',\n      },\n      {\n        title: '第四项',\n        content:\n          'Nisi aliquip nulla et aliquip anim elit reprehenderit veniam. Aute incididunt cupidatat sint enim fugiat est labore. Minim ea do occaecat anim ipsum in deserunt proident magna voluptate mollit. Nisi et fugiat cillum consequat deserunt do magna. Sunt irure laboris ea cupidatat esse tempor irure occaecat cupidatat. Officia adipisicing commodo non minim culpa magna est ullamco eu consequat quis magna nisi tempor. Aute ad anim et et sint nulla proident et magna. Veniam veniam velit culpa non. Enim minim adipisicing amet velit do ea voluptate do cillum ex et excepteur. Reprehenderit dolore nulla nisi aute consectetur qui ut fugiat laboris aliquip velit nisi. Eiusmod nulla exercitation irure esse voluptate est. Consectetur est minim occaecat anim amet. Laboris exercitation id laborum ullamco ut aute irure laboris. Culpa ad irure in mollit deserunt et officia amet pariatur esse ad mollit minim sint officia. Reprehenderit commodo dolore occaecat sint reprehenderit irure esse. Cupidatat ex quis est. Fugiat quis sint deserunt quis culpa reprehenderit reprehenderit dolor ipsum tempor exercitation. Culpa occaecat minim elit incididunt do incididunt fugiat commodo excepteur anim mollit. Ad cillum et tempor do Lorem ut et aliquip ea ut do laborum ex ullamco. Sint dolor Lorem enim incididunt velit ullamco. Eiusmod et nostrud laboris culpa enim laboris. Nulla sunt veniam exercitation ea ut consectetur velit. Enim irure magna et laborum occaecat irure quis labore deserunt. Consectetur amet mollit pariatur ad nisi. Sint excepteur sunt adipisicing eiusmod duis ut. Cillum esse eu ut anim tempor Lorem dolor cillum. Veniam occaecat duis ex commodo excepteur ut consequat nulla ullamco sint fugiat ullamco. Excepteur excepteur nostrud elit. Consectetur dolor dolore reprehenderit ex sint sunt aliqua amet et. Consequat sunt cillum labore irure adipisicing nulla velit. Aliquip deserunt in id amet quis. Ut duis Lorem exercitation ad adipisicing consectetur nostrud sint dolor consequat enim aliquip id. Amet et ullamco exercitation duis eiusmod nisi Lorem. Veniam consectetur incididunt quis aliqua deserunt. Sint in deserunt in laboris labore pariatur laborum minim magna adipisicing mollit non. Dolor dolore in labore labore exercitation laboris laborum elit ex ea nostrud veniam. Est anim duis velit nostrud reprehenderit laborum nisi. Sit consequat aute aliqua consequat anim. Enim et ex reprehenderit et. Quis minim pariatur fugiat voluptate est occaecat commodo cupidatat do nostrud ad dolore pariatur cillum. Dolor eiusmod quis fugiat ullamco et reprehenderit in qui officia aliquip fugiat qui adipisicing. Anim ex proident consequat labore incididunt cillum enim eu exercitation cupidatat dolor commodo sit duis. Deserunt et fugiat dolor laboris. Anim esse voluptate esse excepteur non et culpa labore do quis ad consectetur do cupidatat sint. Ex ea amet id duis adipisicing dolore esse fugiat quis labore commodo minim nisi anim elit. Excepteur reprehenderit labore cillum commodo nisi culpa consectetur ut elit id ex excepteur eu ex. Quis aute et excepteur sit irure duis laborum velit do aliquip sit aliqua consequat duis adipisicing. Occaecat consectetur sint mollit ipsum esse laborum elit ad. Dolore Lorem do excepteur labore laboris duis esse fugiat amet. Voluptate est magna proident proident nisi est duis pariatur ut anim irure nulla anim. Labore adipisicing officia est sunt laborum Lorem occaecat anim. Do voluptate anim cillum ipsum tempor minim nostrud esse. Aliquip aliqua magna ipsum dolore non laborum mollit sint labore. Aliquip est laborum tempor sint laborum incididunt consequat dolor do occaecat commodo in mollit amet.',\n      },\n      {\n        title: '第五项',\n        content:\n          'Sit occaecat reprehenderit quis incididunt elit. Voluptate amet exercitation minim mollit excepteur aliqua ut. Duis duis mollit eiusmod consectetur irure est mollit amet dolor nostrud dolore duis laborum magna. Est anim ipsum velit cillum veniam velit. Commodo eiusmod Lorem quis nisi nostrud deserunt eiusmod sit occaecat eiusmod.',\n      },\n      {\n        title: '第六项',\n        content:\n          'Do nisi tempor incididunt cupidatat magna id. Ullamco consectetur consequat laboris officia occaecat laboris consequat velit irure laboris exercitation aliqua. Laborum elit sit irure eiusmod anim fugiat magna ipsum aliqua esse tempor in. Commodo occaecat Lorem voluptate pariatur commodo proident et et exercitation ex exercitation culpa tempor id. Fugiat dolore aliquip voluptate in. Velit voluptate excepteur incididunt sint sit aliqua et aliquip. Aliqua nisi consequat excepteur eiusmod dolore culpa Lorem.',\n      },\n    ],\n    scrollTop: 0,\n  },\n  async updateRect() {\n    this.itemRectList = await Promise.all(\n      this.data.items.map((item, index) =>\n        this.getBoundingClientRect(`#tab-item-${index}`)\n      )\n    );\n    this.scrollViewRect = await this.getBoundingClientRect('#scroll-view');\n  },\n  async onReady() {\n    await this.updateRect();\n  },\n  onTap() {\n    this.tap = true;\n    const scrollTop =\n      this.itemRectList[this.data.current].top - this.scrollViewRect.top;\n    this.setData({\n      scrollTop: scrollTop + Math.random(),\n    });\n  },\n  onChange(current) {\n    /// #if WECHAT\n    current = current.detail;\n    /// #endif\n    this.tap = true;\n    this.setData({\n      scrollTop:\n        this.itemRectList[current].top -\n        this.scrollViewRect.top +\n        Math.random(),\n      current,\n    });\n  },\n  onTouchStart() {\n    this.tap = false;\n  },\n  onScroll(e) {\n    if (this.tap) {\n      return;\n    }\n    this.scrollTop = e.detail.scrollTop;\n    const scrollTop = this.scrollTop + this.itemRectList[0].top;\n    for (let i = 0; i < this.itemRectList.length - 1; i++) {\n      const item = this.itemRectList[i];\n      if (\n        scrollTop > item.top &&\n        scrollTop < this.itemRectList[i + 1].top &&\n        i !== this.data.current\n      ) {\n        this.setData({\n          current: i,\n        });\n        return;\n      }\n    }\n  },\n  getBoundingClientRect(id) {\n    if (typeof my === 'undefined') {\n      return this.getInstanceBoundingClientRect(this, id);\n    }\n    return this.getInstanceBoundingClientRect(my, id);\n  },\n  getInstanceBoundingClientRect(instance, selector) {\n    return new Promise((resolve) => {\n      instance\n        .createSelectorQuery()\n        .select(selector)\n        .boundingClientRect()\n        .exec((ret) => {\n          if (ret && ret[0]) {\n            resolve(ret[0]);\n          }\n        });\n    });\n  },\n});\n"
  },
  {
    "path": "demo/pages/Tabs/TabsVerticalElevator/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-tabs\n  items=\"{{ items }}\"\n  current=\"{{ current }}\"\n  onChange=\"onChange\"\n  direction=\"vertical\"\n  className=\"tabs\"\n  tabsBarClassName=\"tabs-bar\"\n  tabActiveClassName=\"tab-active\">\n  <scroll-view\n    enhanced\n    id=\"scroll-view\"\n    onScroll=\"onScroll\"\n    onTouchStart=\"onTouchStart\"\n    scroll-top=\"{{ scrollTop }}\"\n    scroll-y=\"{{ true }}\"\n    scroll-with-animation=\"{{ true }}\"\n    scroll-animation-duration=\"{{ 300 }}\"\n    class=\"content\">\n    <block\n      a:for=\"{{ items }}\"\n      a:for-index=\"index\"\n      a:for-item=\"item\"\n      a:key=\"{{ index }}\">\n      <view class=\"item\">\n        <view\n          class=\"title\"\n          id=\"tab-item-{{ index }}\">\n          {{ item.title }}\n        </view>\n        <view>{{ item.content }}</view>\n      </view>\n    </block>\n  </scroll-view>\n</ant-tabs>\n\n<view class=\"footer\" />\n"
  },
  {
    "path": "demo/pages/Tabs/TabsVerticalElevator/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Tabs\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Tabs\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-tabs\": \"../../../../src/Tabs/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Tabs/TabsVerticalElevator/index.less",
    "content": ".tabs {\n  height: 80vh;\n}\n\n.content {\n  padding: 12px;\n  height: 100%;\n}\n\n.item {\n  margin-bottom: 40px;\n}\n\n.title {\n  font-weight: bold;\n  margin-bottom: 8px;\n}\n\n.tabs-bar {\n  width: 80px;\n}\n\n.footer {\n  background-color: #fff;\n  height: 20vh;\n}"
  },
  {
    "path": "demo/pages/Tabs/TabsVerticalElevator/index.ts",
    "content": "Page({\n  data: {\n    current: 0,\n    items: new Array(20).fill(0).map((_, i) => {\n      return {\n        title: `第${i + 1}项`,\n        content:\n          'Est voluptate sunt consequat laboris proident eu ut qui incididunt sint sint pariatur qui. Ut labore in duis labore cupidatat in ad quis duis aliquip irure occaecat officia reprehenderit consectetur. Enim consequat veniam nulla. Enim do nisi cillum aute pariatur ex dolor mollit ut nisi. Irure non pariatur anim Lorem ad do in elit irure minim exercitation. Dolor aliquip nisi adipisicing sunt adipisicing sunt nisi ad in non laboris in magna dolore. Fugiat aliqua labore elit occaecat consequat. Ipsum officia excepteur anim sint ipsum exercitation laborum. Excepteur exercitation ea occaecat cupidatat et consectetur exercitation non. Incididunt aliqua esse velit nisi ullamco. Do dolore ad ut. Esse ad tempor aliqua cillum consequat occaecat enim dolore enim aliquip aliquip irure. Id aliquip qui nulla dolor dolore et est. Non adipisicing mollit consequat magna sit laborum mollit nulla est consequat. Veniam in eu nisi ex sint deserunt ad sit consequat excepteur qui. Ea est sint adipisicing ea aliqua eiusmod amet pariatur officia ex voluptate. Consectetur in ipsum cillum nulla minim quis aute consequat. Et adipisicing officia nostrud id reprehenderit tempor. Laborum anim aliqua ut enim et pariatur elit tempor tempor incididunt deserunt nulla deserunt enim. Esse deserunt pariatur veniam sunt fugiat irure ullamco excepteur et Lorem. Sit adipisicing nisi consectetur nulla qui sint culpa. In aute cupidatat ad consequat proident est non sint ullamco dolor nisi irure fugiat amet deserunt. Laboris nostrud tempor aute non cillum magna labore ipsum duis ut dolor velit. Qui proident dolor occaecat consequat qui laboris sit est culpa excepteur aliqua pariatur veniam irure voluptate. Cillum adipisicing deserunt nisi quis anim fugiat ipsum incididunt veniam laboris et eiusmod minim. Tempor esse ex reprehenderit occaecat velit non do magna consequat consequat exercitation tempor elit. Ea pariatur irure laborum ipsum reprehenderit sunt sit minim excepteur pariatur magna deserunt aliqua velit non. Culpa irure dolore commodo quis do. Nulla ea consectetur ullamco deserunt laborum consectetur. Amet sunt in esse cupidatat excepteur veniam do. Est quis commodo consequat reprehenderit reprehenderit. Magna laboris dolor dolor laborum. Culpa officia dolor labore aute commodo ex nisi incididunt officia in aute incididunt voluptate. Do nisi dolore ea veniam adipisicing voluptate reprehenderit ea proident aliquip. Labore enim in minim. Aliquip cillum do consequat labore Lorem exercitation. Laborum anim aute in nisi aliqua nulla commodo nostrud laborum. Lorem cillum ut cillum laborum occaecat consequat elit duis. Dolore dolor deserunt nisi dolore laborum sit ea deserunt ipsum dolor ut sit minim. Reprehenderit esse consectetur dolore esse nostrud. Commodo laborum tempor magna cillum Lorem ad qui nisi consequat sit in amet veniam. Ex pariatur eiusmod labore aute id dolor et sunt cupidatat id et non proident enim sint. Duis duis id in et in incididunt Lorem veniam aliquip. Culpa duis deserunt eiusmod laborum labore ea non sit eu ipsum eu.',\n      };\n    }),\n    scrollTop: 0,\n  },\n  async updateRect() {\n    this.itemRectList = await Promise.all(\n      this.data.items.map((item, index) =>\n        this.getBoundingClientRect(`#tab-item-${index}`)\n      )\n    );\n    this.scrollViewRect = await this.getBoundingClientRect('#scroll-view');\n  },\n  async onReady() {\n    await this.updateRect();\n  },\n  onChange(current) {\n    /// #if WECHAT\n    current = current.detail;\n    /// #endif\n    this.tap = true;\n    this.setData({\n      scrollTop:\n        this.itemRectList[current].top -\n        this.scrollViewRect.top +\n        Math.random(),\n      current,\n    });\n  },\n  onTouchStart() {\n    this.tap = false;\n  },\n  onScroll(e) {\n    if (this.tap) {\n      return;\n    }\n    this.scrollTop = e.detail.scrollTop;\n    const scrollTop = this.scrollTop + this.itemRectList[0].top;\n    for (let i = 0; i < this.itemRectList.length; i++) {\n      const item = this.itemRectList[i];\n      if (\n        scrollTop > item.top &&\n        (!this.itemRectList[i + 1] ||\n          scrollTop < this.itemRectList[i + 1].top) &&\n        i !== this.data.current\n      ) {\n        this.setData({\n          current: i,\n        });\n        return;\n      }\n    }\n  },\n  getBoundingClientRect(id) {\n    if (typeof my === 'undefined') {\n      return this.getInstanceBoundingClientRect(this, id);\n    }\n    return this.getInstanceBoundingClientRect(my, id);\n  },\n  getInstanceBoundingClientRect(instance, selector) {\n    return new Promise((resolve) => {\n      instance\n        .createSelectorQuery()\n        .select(selector)\n        .boundingClientRect()\n        .exec((ret) => {\n          if (ret && ret[0]) {\n            resolve(ret[0]);\n          }\n        });\n    });\n  },\n});\n"
  },
  {
    "path": "demo/pages/Tabs/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基础用法\">\n  <ant-tabs items=\"{{ items }}\" />\n</ant-container>\n<!-- #if ALIPAY -->\n<ant-container title=\"带有content\">\n  <ant-tabs items=\"{{ items }}\">\n    <view class=\"content\" slot-scope=\"item\">\n      {{ item.value.content }}\n    </view>\n  </ant-tabs>\n</ant-container>\n<!-- #endif -->\n<ant-container title=\"胶囊\">\n  <ant-tabs type=\"capsule\" items=\"{{ items }}\" defaultCurrent=\"{{ 1 }}\" />\n</ant-container>\n\n<ant-container title=\"带副标题\">\n  <ant-tabs type=\"mixin\" items=\"{{ items }}\" />\n</ant-container>\n<!-- #if ALIPAY -->\n<ant-container title=\"带徽标\">\n  <ant-tabs items=\"{{ items }}\">\n    <view slot=\"title\" slot-scope=\"item\">\n      <view a:if=\"{{ item.value.badge }}\">\n        <ant-badge>{{ item.value.title }}</ant-badge>\n      </view>\n      <view a:else>{{ item.value.title }}</view>\n    </view>\n  </ant-tabs>\n</ant-container>\n<!-- #endif -->\n<ant-container title=\"禁用状态\">\n  <ant-tabs items=\"{{ items2 }}\" />\n</ant-container>\n<ant-container title=\"onChange\">\n  <ant-tabs items=\"{{ items }}\" onChange=\"onChange\" />\n</ant-container>\n<ant-container title=\"plus按钮\">\n  <ant-tabs items=\"{{ items }}\">\n    <view slot=\"plus\">\n      <ant-icon type=\"AddOutline\" onTap=\"onPlus\" />\n    </view>\n  </ant-tabs>\n</ant-container>\n<ant-container title=\"控制模式\">\n  <ant-tabs items=\"{{ items }}\" current=\"{{ current }}\" onChange=\"handleChange\" />\n</ant-container>\n<ant-container title=\"content在外层自定义123\">\n  <ant-tabs items=\"{{ items }}\" current=\"{{ current }}\" onChange=\"handleChange\" />\n  <view class=\"content\">{{ items[current].content }}</view>\n</ant-container>\n\n<ant-container title=\"受控模式\">\n  <ant-tabs items=\"{{ items3 }}\" current=\"{{ current }}\" onChange=\"onChange\">\n    <view class=\"content\">{{ items3[current].content }}</view>\n  </ant-tabs>\n\n  <view class=\"ant-container\">\n    current: {{ current }} length: {{ items3.length }}\n  </view>\n\n  <view class=\"buttons\">\n    <ant-button inline onTap=\"onPrevTap\">\n      上一个\n    </ant-button>\n    <ant-button inline onTap=\"onNextTap\">\n      下一个\n    </ant-button>\n    <ant-button inline onTap=\"onAddTap\">\n      添加\n    </ant-button>\n    <ant-button inline onTap=\"onMinusTap\">\n      减少\n    </ant-button>\n  </view>\n\n</ant-container>\n<ant-container title=\"选择后居中滚动\">\n  <ant-tabs items=\"{{ items3 }}\" scrollMode=\"center\" />\n</ant-container>\n\n<ant-container title=\"Swiper\">\n  <ant-tabs items=\"{{ items }}\" current=\"{{ current }}\" onChange=\"onChange\">\n    <swiper\n      current=\"{{ current }}\"\n      autoplay=\"{{ false }}\"\n      vertical=\"{{ false }}\"\n      circular=\"{{ false }}\"\n      onChange=\"onSwipeChange\"\n    >\n      <block a:for=\"{{ items }}\" a:for-index=\"index\" a:for-item=\"item\" a:key=\"{{ index }}\">\n        <swiper-item>\n          <view class=\"content\">{{ item.content }}</view>\n        </swiper-item>\n      </block>\n    </swiper>\n  </ant-tabs>\n\n</ant-container>\n\n<ant-container title=\"纵向模式\">\n  <ant-tabs\n    items=\"{{ items }}\"\n    current=\"{{ current }}\"\n    onChange=\"onChange\"\n    className=\"tabs\"\n    direction=\"vertical\"\n  >\n    <scroll-view\n      scroll-top=\"{{ scrollTop }}\"\n      scroll-y=\"{{ true }}\"\n      onScroll=\"onScroll\"\n      scroll-with-animation=\"{{ true }}\"\n      scroll-animation-duration=\"{{ 300 }}\"\n      class=\"content\"\n    >\n      {{ items[current].longContent }}\n    </scroll-view>\n  </ant-tabs>\n</ant-container>\n"
  },
  {
    "path": "demo/pages/Tabs/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Tabs\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Tabs\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-container\": \"../../../src/Container/index\",\n    \"ant-tabs\": \"../../../src/Tabs/index\",\n    \"ant-badge\": \"../../../src/Badge/index\",\n    \"ant-icon\": \"../../../src/Icon/index\",\n    \"ant-button\": \"../../../src/Button/index\",\n  }\n}\n"
  },
  {
    "path": "demo/pages/Tabs/index.less",
    "content": "page {\n  padding-bottom: 40rpx;\n}\n\n.buttons {\n  margin-top: 20px;\n  display: flex;\n  justify-content: center;\n  gap: 8px;\n}\n\n.sticky-tabs {\n  position: sticky;\n  top: -1px;\n  z-index: 999;\n}"
  },
  {
    "path": "demo/pages/Tabs/index.ts",
    "content": "Page({\n  data: {\n    current: 0,\n    items: [\n      {\n        title: '水果',\n        subTitle: '描述文案',\n        content: '西瓜',\n        longContent: 'Est voluptate sunt consequat laboris proident eu ut qui incididunt sint sint pariatur qui. Ut labore in duis labore cupidatat in ad quis duis aliquip irure occaecat officia reprehenderit consectetur. Enim consequat veniam nulla. Enim do nisi cillum aute pariatur ex dolor mollit ut nisi. Irure non pariatur anim Lorem ad do in elit irure minim exercitation. Dolor aliquip nisi adipisicing sunt adipisicing sunt nisi ad in non laboris in magna dolore. Fugiat aliqua labore elit occaecat consequat. Ipsum officia excepteur anim sint ipsum exercitation laborum. Excepteur exercitation ea occaecat cupidatat et consectetur exercitation non. Incididunt aliqua esse velit nisi ullamco. Do dolore ad ut. Esse ad tempor aliqua cillum consequat occaecat enim dolore enim aliquip aliquip irure. Id aliquip qui nulla dolor dolore et est. Non adipisicing mollit consequat magna sit laborum mollit nulla est consequat. Veniam in eu nisi ex sint deserunt ad sit consequat excepteur qui. Ea est sint adipisicing ea aliqua eiusmod amet pariatur officia ex voluptate. Consectetur in ipsum cillum nulla minim quis aute consequat. Et adipisicing officia nostrud id reprehenderit tempor. Laborum anim aliqua ut enim et pariatur elit tempor tempor incididunt deserunt nulla deserunt enim. Esse deserunt pariatur veniam sunt fugiat irure ullamco excepteur et Lorem. Sit adipisicing nisi consectetur nulla qui sint culpa. In aute cupidatat ad consequat proident est non sint ullamco dolor nisi irure fugiat amet deserunt. Laboris nostrud tempor aute non cillum magna labore ipsum duis ut dolor velit. Qui proident dolor occaecat consequat qui laboris sit est culpa excepteur aliqua pariatur veniam irure voluptate. Cillum adipisicing deserunt nisi quis anim fugiat ipsum incididunt veniam laboris et eiusmod minim. Tempor esse ex reprehenderit occaecat velit non do magna consequat consequat exercitation tempor elit. Ea pariatur irure laborum ipsum reprehenderit sunt sit minim excepteur pariatur magna deserunt aliqua velit non. Culpa irure dolore commodo quis do. Nulla ea consectetur ullamco deserunt laborum consectetur. Amet sunt in esse cupidatat excepteur veniam do. Est quis commodo consequat reprehenderit reprehenderit. Magna laboris dolor dolor laborum. Culpa officia dolor labore aute commodo ex nisi incididunt officia in aute incididunt voluptate. Do nisi dolore ea veniam adipisicing voluptate reprehenderit ea proident aliquip. Labore enim in minim. Aliquip cillum do consequat labore Lorem exercitation. Laborum anim aute in nisi aliqua nulla commodo nostrud laborum. Lorem cillum ut cillum laborum occaecat consequat elit duis. Dolore dolor deserunt nisi dolore laborum sit ea deserunt ipsum dolor ut sit minim. Reprehenderit esse consectetur dolore esse nostrud. Commodo laborum tempor magna cillum Lorem ad qui nisi consequat sit in amet veniam. Ex pariatur eiusmod labore aute id dolor et sunt cupidatat id et non proident enim sint. Duis duis id in et in incididunt Lorem veniam aliquip. Culpa duis deserunt eiusmod laborum labore ea non sit eu ipsum eu.',\n      },\n      {\n        title: '蔬菜',\n        subTitle: '描述文案',\n        badge: true,\n        content: '西红柿',\n        longContent: 'Excepteur esse nisi excepteur exercitation. Aliquip elit ut officia cillum nisi id. Aute in esse cillum. Enim occaecat cupidatat consequat dolor ex nulla esse non. Non ipsum ullamco veniam proident labore et exercitation dolore esse tempor culpa amet in anim mollit. Do officia proident ullamco ea ipsum reprehenderit irure occaecat proident id culpa dolore Lorem deserunt. Aliquip ut ex dolor ut eiusmod elit et velit sunt ipsum aliquip dolore. Ullamco sit excepteur dolore anim irure duis aute labore ex elit. Lorem pariatur esse in cupidatat nostrud reprehenderit tempor aute quis. Minim eiusmod aute do. Lorem aliquip ea consequat occaecat aliqua duis dolore Lorem elit in anim dolore magna veniam adipisicing. Proident consequat Lorem et. Occaecat nisi id mollit do labore eu consequat aliquip aute nulla fugiat. Irure nisi reprehenderit sint proident commodo dolore. Cillum laboris aliquip labore quis ad. Excepteur labore commodo consectetur quis sunt. Dolor voluptate laboris id et do irure exercitation ex elit consequat dolore exercitation. Id nulla ad sint excepteur occaecat sunt nostrud anim consectetur labore consequat dolor ex in sunt. Laborum elit ad enim do aute ullamco minim culpa mollit fugiat laborum adipisicing. Nostrud velit esse consequat et ea. Et deserunt minim ipsum. Anim dolore velit ex cillum occaecat magna irure culpa aliquip ex laboris duis consequat ipsum incididunt. Anim laborum aliqua tempor excepteur mollit in consequat voluptate veniam dolore. Magna commodo officia officia in anim officia ex. Adipisicing mollit eu aliqua ex elit ipsum dolor incididunt adipisicing minim proident excepteur. Veniam veniam ex occaecat culpa eu consequat quis pariatur quis duis duis. Consectetur commodo eu voluptate pariatur sit sit reprehenderit duis esse veniam ullamco ullamco est. Laboris laborum exercitation anim tempor commodo fugiat. Sit ipsum consectetur pariatur in. Officia irure ipsum culpa irure veniam commodo laborum consequat sit laboris incididunt esse. Est in eiusmod ad ad deserunt consequat adipisicing commodo sit non culpa. Officia ut ex laborum fugiat. Magna sit do ullamco ex aute elit reprehenderit. Voluptate commodo Lorem est incididunt ullamco tempor cupidatat sint magna amet occaecat qui magna. Aliquip consequat pariatur tempor voluptate est pariatur excepteur. Nulla mollit adipisicing do magna proident velit consectetur magna nisi aliquip adipisicing et velit quis ad. Mollit minim elit fugiat tempor non in exercitation cillum quis qui pariatur laborum excepteur in cillum. Enim nostrud nisi consequat deserunt deserunt consequat velit laboris amet magna et eu ipsum. Aliqua cillum elit minim do id exercitation magna. Cupidatat incididunt reprehenderit culpa occaecat ullamco anim dolore. Anim occaecat occaecat esse non occaecat duis et fugiat. Pariatur velit dolor Lorem ullamco laborum deserunt deserunt consectetur consequat deserunt mollit esse. Irure nostrud velit nostrud aliqua ad ea voluptate. Culpa ex officia consectetur eiusmod cupidatat. Nulla Lorem ut ea eu deserunt eiusmod aliqua Lorem quis aute elit. Eiusmod cillum nisi veniam veniam fugiat deserunt adipisicing exercitation amet Lorem. Mollit sit dolore tempor et magna non proident cupidatat anim veniam. Nisi velit est occaecat amet dolor ut reprehenderit mollit culpa dolore ad pariatur. Pariatur qui ex qui excepteur reprehenderit. Mollit consectetur esse incididunt adipisicing dolore.',\n      },\n      {\n        title: '动物',\n        subTitle: '描述文案',\n        content: '蚂蚁',\n        longContent: 'Aute cillum et eu. Est ut magna sint ex ex adipisicing qui occaecat sint excepteur eiusmod adipisicing id eiusmod. Proident culpa tempor ullamco ad non ex incididunt ullamco tempor quis fugiat commodo consectetur. Id aliquip in labore occaecat ut exercitation mollit ipsum nisi pariatur occaecat ut minim duis enim. Magna cupidatat id do. Voluptate id tempor cillum aliqua mollit quis veniam sit fugiat culpa qui veniam deserunt reprehenderit. Reprehenderit qui est est consequat commodo occaecat id. Do consequat ut incididunt ea ipsum fugiat aliqua dolore velit incididunt. Dolor quis amet mollit fugiat quis ullamco culpa occaecat. Voluptate do ullamco excepteur duis dolor sit enim officia. Nostrud id aute nisi voluptate cupidatat pariatur duis et cillum. Excepteur nisi exercitation labore elit consequat officia non fugiat. Tempor deserunt eu do culpa quis fugiat proident amet qui deserunt eiusmod velit culpa. Nisi officia aliquip culpa pariatur sunt non quis eiusmod aliqua commodo et Lorem duis minim amet. Voluptate enim laborum ex dolore in anim cillum dolore ut officia Lorem ipsum exercitation irure anim. Pariatur quis consequat tempor eu quis tempor aute esse commodo ipsum non enim sunt. Sit laboris amet consequat. Aute sunt qui eiusmod enim amet ut in elit ea pariatur est et consequat. Occaecat adipisicing id ex nostrud labore anim. Ullamco eiusmod dolor et minim fugiat culpa nulla tempor cupidatat reprehenderit sit fugiat duis quis. Sunt est ipsum adipisicing. Do enim ullamco minim tempor dolore consequat. Consequat non nulla proident aute nulla magna et. Labore quis veniam adipisicing irure reprehenderit ipsum ex eu. Labore sint dolore voluptate laborum id ad eu minim aute consectetur adipisicing aliquip exercitation culpa. Ullamco exercitation dolore elit cupidatat elit ex aliqua pariatur duis cillum. Cillum consectetur ipsum cillum dolore. Et commodo id aliquip do sunt ea pariatur ut aliqua proident occaecat aute esse. Deserunt incididunt sit tempor culpa laboris ea minim laboris magna et consequat. Labore do duis cillum. Eiusmod nostrud enim sunt eiusmod consectetur. Irure ex consectetur officia nisi enim consectetur Lorem exercitation adipisicing sit consequat excepteur. Minim velit in ea nulla tempor ad irure laborum est tempor laboris enim ea non laboris. Velit magna fugiat aute laboris. Commodo sunt voluptate laborum labore tempor ullamco voluptate nostrud ea. Reprehenderit fugiat minim nulla fugiat enim sit Lorem. Est aute magna sunt magna labore do Lorem proident. Laboris et anim non aliqua eu laboris fugiat nostrud tempor deserunt ex officia quis dolore ipsum. Aliquip ea sint qui duis culpa non aliquip voluptate consectetur labore velit. Anim do est enim cupidatat ex et ad reprehenderit officia ullamco exercitation dolore. Non esse sint fugiat laborum eu enim aliqua enim nostrud. Lorem occaecat labore amet voluptate Lorem tempor do fugiat fugiat eu pariatur ea excepteur duis. Officia amet ipsum esse sunt anim deserunt. Esse eu officia mollit. Officia ut labore dolore et duis excepteur sunt cillum qui qui enim magna adipisicing. Dolor ipsum est nisi duis minim laboris magna anim ea labore eiusmod anim sunt deserunt. Est Lorem cupidatat officia laborum Lorem incididunt ex et est culpa occaecat et eiusmod exercitation. Qui do nostrud adipisicing dolore incididunt. Ex nostrud velit deserunt dolore cillum anim et exercitation magna qui pariatur consectetur laboris deserunt.',\n      },\n    ],\n    items2: [\n      {\n        title: '水果',\n        subTitle: '描述文案',\n        content: '西瓜',\n      },\n      {\n        title: '蔬菜',\n        subTitle: '描述文案',\n        content: '西红柿',\n        disabled: true,\n      },\n      {\n        title: '动物',\n        subTitle: '描述文案',\n        content: '蚂蚁',\n      },\n    ],\n    items3: [],\n  },\n  onLoad() {\n    const items3 = new Array(6).fill(null).map((_, index) => {\n      return {\n        title: `Tab ${index}`,\n        content: `Content of tab ${index}`,\n      };\n    });\n    this.setData({\n      items3,\n    });\n  },\n  onChange(current) {\n    /// #if WECHAT\n    current = current.detail;\n    /// #endif\n    this.setData({\n      current,\n    })\n  },\n  handleChange(current) {\n    /// #if WECHAT\n    current = current.detail;\n    /// #endif\n\n    this.setData({\n      current,\n    });\n  },\n  onPlus() {\n    this.alert('plus');\n  },\n  alert(content) {\n    /// #if ALIPAY\n    my.alert({\n      title: content,\n    });\n    /// #endif\n\n    /// #if WECHAT\n    //@ts-ignore\n    wx.showToast({\n      title: content,\n    });\n    /// #endif\n  },\n  onPrevTap() {\n    if (this.data.items.length === 0) {\n      return;\n    }\n    const current =\n      this.data.current === 0\n        ? this.data.items.length - 1\n        : this.data.current - 1;\n    this.setData({\n      current,\n    });\n  },\n  onNextTap() {\n    if (this.data.items3.length === 0) {\n      return;\n    }\n    const current =\n      this.data.current >= this.data.items3.length - 1\n        ? 0\n        : this.data.current + 1;\n    this.setData({\n      current,\n    });\n  },\n  onAddTap() {\n    const items3 = [...this.data.items3];\n    items3.push({\n      title: `Tab ${items3.length}`,\n      content: `Content of tab ${items3.length}`,\n    });\n    this.setData({\n      items3,\n      current: items3.length - 1,\n    });\n  },\n  onMinusTap() {\n    if (this.data.items3.length === 1) {\n      return;\n    }\n    const items3 = [...this.data.items3];\n    items3.splice(items3.length - 1, 1);\n    this.setData({\n      items3,\n      current: Math.min(this.data.current, items3.length - 1),\n    });\n  },\n\n  async updateRect() {\n    this.itemRectList = await Promise.all(\n      this.data.items.map((item, index) =>\n        this.getBoundingClientRect(`#tab-item-${index}`)\n      )\n    );\n    this.scrollViewRect = await this.getBoundingClientRect('#scroll-view');\n  },\n  async onReady() {\n    await this.updateRect();\n  },\n  \n  onTouchStart() {\n    this.tap = false;\n  },\n  onScroll(e) {\n    if (this.tap) {\n      return;\n    }\n    this.scrollTop = e.detail.scrollTop;\n    const scrollTop = this.scrollTop + this.itemRectList[0].top;\n    for (let i = 0; i < this.itemRectList.length; i++) {\n      const item = this.itemRectList[i];\n      if (\n        scrollTop > item.top &&\n        (!this.itemRectList[i + 1] ||\n          scrollTop < this.itemRectList[i + 1].top) &&\n        i !== this.data.current\n      ) {\n        this.setData({\n          current: i,\n        });\n        return;\n      }\n    }\n  },\n});\n"
  },
  {
    "path": "demo/pages/Tag/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基础用法\">\n  <ant-tag>标签</ant-tag>\n</ant-container>\n<ant-container title=\"语义标签\">\n  <view class=\"tag-list\">\n    <ant-tag className=\"myTag\">primary</ant-tag>\n    <ant-tag\n      className=\"myTag\"\n      color=\"success\">\n      success\n    </ant-tag>\n    <ant-tag\n      className=\"myTag\"\n      color=\"warning\">\n      warning\n    </ant-tag>\n    <ant-tag\n      className=\"myTag\"\n      color=\"danger\">\n      danger\n    </ant-tag>\n  </view>\n</ant-container>\n<ant-container title=\"填充模式\">\n  <view class=\"tag-list\">\n    <ant-tag\n      className=\"myTag\"\n      type=\"fill\">\n      fill\n    </ant-tag>\n    <ant-tag\n      className=\"myTag\"\n      type=\"outline\">\n      outline\n    </ant-tag>\n    <ant-tag\n      className=\"myTag\"\n      type=\"fill-light\">\n      fill-light\n    </ant-tag>\n  </view>\n</ant-container>\n<ant-container title=\"自定义图标\">\n  <view class=\"tag-list\">\n    <ant-tag\n      className=\"myTag\"\n      icon=\"AlipayCircleFill\">\n      标签\n    </ant-tag>\n    <ant-tag\n      className=\"myTag\"\n      color=\"success\"\n      icon=\"AlipayCircleFill\">\n      标签\n    </ant-tag>\n    <ant-tag\n      className=\"myTag\"\n      color=\"warning\"\n      icon=\"AlipayCircleFill\">\n      标签\n    </ant-tag>\n    <ant-tag\n      className=\"myTag\"\n      color=\"danger\"\n      icon=\"AlipayCircleFill\">\n      标签\n    </ant-tag>\n  </view>\n</ant-container>\n"
  },
  {
    "path": "demo/pages/Tag/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Tag\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Tag\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-tag\": \"../../../src/Tag/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Tag/index.less",
    "content": ".myTag {\n  margin-right: 16rpx;\n}\n"
  },
  {
    "path": "demo/pages/Tag/index.ts",
    "content": "Page({\n  data: {\n    image:\n      'https://gw.alipayobjects.com/mdn/rms_ce4c6f/afts/img/A*XMCgSYx3f50AAAAAAAAAAABkARQnAQ',\n  },\n});\n"
  },
  {
    "path": "demo/pages/Terms/Fixed/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-terms\n  buttonsFixed\n  termPrefix=\"请阅读并同意\"\n  terms=\"{{terms}}\"\n  buttons=\"{{buttons}}\"\n  onButtonTap=\"handleButtonTap\"\n  onTermTap=\"handleTermTap\"\n/>\n\n"
  },
  {
    "path": "demo/pages/Terms/Fixed/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"TermsFixed\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Terms\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-terms\": \"../../../../src/Terms/index\",\n    \"ant-container\": \"../../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Terms/Fixed/index.less",
    "content": ".page {\n  padding: 24rpx;\n}\n.ant-container-content {\n  padding: 0;\n}\n.term-content {\n  display: block;\n  width: 100%;\n  border-bottom: 1px solid var(--color-border);\n}\n"
  },
  {
    "path": "demo/pages/Terms/Fixed/index.ts",
    "content": "Page({\n  data: {\n    buttons: [\n      {\n        text: '同意协议 + 行动点描述',\n        type: 'primary',\n      },\n      {\n        text: '取消',\n        aide: true,\n        type: 'default',\n      },\n    ],\n    terms: [\n      {\n        name: '《用户协议》',\n        key: 'user',\n      },\n    ],\n  },\n  handleButtonTap(item, index, checked, event) {\n    /// #if ALIPAY\n    console.log(item, index, checked, event);\n    my.showToast({ content: `点击了第 ${index + 1} 个按钮` });\n    /// #endif\n    /// #if WECHAT\n    // @ts-ignore\n    wx.showToast({ title: `点击了第 ${item.detail[1] + 1} 个按钮` });\n    /// #endif\n  },\n  handleTermTap(item, index, event) {\n    /// #if ALIPAY\n    console.log(item, index, event);\n    my.showToast({ content: `点击了第 ${index + 1} 个协议` });\n    /// #endif\n    /// #if WECHAT\n    // @ts-ignore\n    wx.showToast({ title: `点击了第 ${item.detail[1] + 1} 个协议` });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/Terms/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基础用法\">\n  <ant-terms\n    termPrefix=\"请阅读并同意\"\n    terms=\"{{terms}}\"\n    buttons=\"{{buttons1}}\"\n    onButtonTap=\"handleButtonTap\"\n    onTermTap=\"handleTermTap\"\n  />\n</ant-container>\n\n<ant-container title=\"勾选型\">\n  <ant-terms\n    type=\"check\"\n    termPrefix=\"我已阅读并同意\"\n    terms=\"{{terms}}\"\n    buttons=\"{{buttons2}}\"\n    checkboxTipsText=\"请阅读后勾选服务协议\"\n    checkboxTipsVisible=\"{{checkboxTipsVisible}}\"\n    onButtonTap=\"handleButton2Tap\"\n    onTermTap=\"handleTermTap\"\n    onCheckChange=\"handleCheckChange\"\n    onTermPrefixTap=\"handleTermPrefixTap\"\n  />\n</ant-container>\n\n<ant-container title=\"强制阅读型\">\n  <ant-terms\n    type=\"read\"\n    termPrefix=\"当前正在读\"\n    terms=\"{{terms3}}\"\n    buttons=\"{{buttons3}}\"\n    readCurrent=\"{{readCurrent}}\"\n    onButtonTap=\"handleButtonTap\"\n    onTermTap=\"handleTermTap\"\n    onCountdownFinish=\"handleCountdownFinish\"\n    onReadChange=\"handleReadChange\"\n  >\n    <scroll-view\n      enhanced\n      slot=\"read-content\"\n      style=\"height:300px;\"\n      id=\"scroll-view\"\n      scrollTop=\"{{scrollTop}}\"\n      scrollY=\"{{true}}\"\n      scrollWithAnimation=\"{{true}}\"\n      scrollAnimationDuration=\"{{300}}\"\n      lowerThreshold=\"{{100}}\"\n      onScroll=\"onScroll\"\n      onTouchStart=\"onTouchStart\"\n      onScrollToLower=\"onScrollToLower\"\n    >\n      <image\n        class=\"term-content\"\n        id=\"term-content-0\"\n        src=\"https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/966PR7FNh8cAAAAAAAAAAAAADoEQAQFr/original\"\n        mode=\"widthFix\"\n        onLoad=\"onImageLoad\"\n      />\n      <image\n        class=\"term-content\"\n        id=\"term-content-1\"\n        src=\"https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/966PR7FNh8cAAAAAAAAAAAAADoEQAQFr/original\"\n        mode=\"widthFix\"\n        onLoad=\"onImageLoad\"\n      />\n      <image\n        class=\"term-content\"\n        id=\"term-content-2\"\n        src=\"https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/966PR7FNh8cAAAAAAAAAAAAADoEQAQFr/original\"\n        mode=\"widthFix\"\n        onLoad=\"onImageLoad\"\n      />\n    </scroll-view>\n    <view slot=\"read-total\">\n      共{{terms3.length}}份协议\n    </view>\n  </ant-terms>\n</ant-container>\n"
  },
  {
    "path": "demo/pages/Terms/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Terms\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Terms\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-terms\": \"../../../src/Terms/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Terms/index.less",
    "content": ".page {\n  padding: 24rpx;\n}\n.ant-container-content {\n  padding: 0;\n}\n.term-content {\n  display: block;\n  width: 100%;\n  border-bottom: 1px solid var(--color-border);\n}\n"
  },
  {
    "path": "demo/pages/Terms/index.ts",
    "content": "Page({\n  data: {\n    buttons1: [\n      {\n        text: '同意协议 + 行动点描述',\n        type: 'primary',\n      },\n      {\n        text: '取消',\n        aide: true,\n        type: 'default',\n      },\n    ],\n    buttons2: [\n      {\n        text: '行动点描述',\n        type: 'primary',\n      },\n    ],\n    buttons3: [\n      {\n        text: '请阅读全部协议',\n        disabled: true,\n        type: 'primary',\n        countdownTime: 30,\n      },\n    ],\n    terms: [\n      {\n        name: '《用户协议》',\n        key: 'user',\n      },\n    ],\n    terms3: [\n      {\n        name: '《用户协议》',\n        key: 'user',\n      },\n      {\n        name: '《隐私协议》',\n        key: 'private',\n      },\n      {\n        name: '《网络协议》',\n        key: 'internet',\n      },\n    ],\n    checkboxTipsVisible: false,\n    readCurrent: 1,\n  },\n  handleButtonTap(item, index, checked, event) {\n    /// #if ALIPAY\n    console.log(item, index, checked, event);\n    my.showToast({ content: `点击了第 ${index + 1} 个按钮` });\n    /// #endif\n    /// #if WECHAT\n    // @ts-ignore\n    wx.showToast({ title: `点击了第 ${item.detail[1] + 1} 个按钮` });\n    /// #endif\n  },\n  handleButton2Tap(item, index, checked) {\n    /// #if ALIPAY\n    this.setData({ checkboxTipsVisible: !checked });\n    /// #endif\n    /// #if WECHAT\n    this.setData({ checkboxTipsVisible: !item.detail[2] });\n    /// #endif\n  },\n  handleTermTap(item, index, event) {\n    /// #if ALIPAY\n    console.log(item, index, event);\n    my.showToast({ content: `点击了第 ${index + 1} 个协议` });\n    /// #endif\n    /// #if WECHAT\n    // @ts-ignore\n    wx.showToast({ title: `点击了第 ${item.detail[1] + 1} 个协议` });\n    /// #endif\n  },\n  handleCheckChange(checked) {\n    console.log('handleCheckChange', checked);\n    /// #if ALIPAY\n    this.setData({ checkboxTipsVisible: !checked });\n    if (checked) {\n      this.setData({ checkboxTipsVisible: false });\n    }\n    /// #endif\n    /// #if WECHAT\n    this.setData({ checkboxTipsVisible: !checked.detail });\n    if (checked.detail) {\n      this.setData({ checkboxTipsVisible: false });\n    }\n    /// #endif\n  },\n  handleTermPrefixTap(checked) {\n    console.log('handleTermPrefixTap', checked);\n    /// #if ALIPAY\n    this.setData({ checkboxTipsVisible: !checked });\n    if (checked) {\n      this.setData({ checkboxTipsVisible: false });\n    }\n    /// #endif\n    /// #if WECHAT\n    this.setData({ checkboxTipsVisible: !checked.detail });\n    if (checked.detail) {\n      this.setData({ checkboxTipsVisible: false });\n    }\n    /// #endif\n  },\n  handleCountdownFinish(item, index) {\n    console.log('handleCountdownFinish', item, index);\n    this.setData({\n      buttons3: this.data.buttons3.map((button, idx) =>\n        idx === index\n          ? { ...button, text: '同意协议 + 行动点描述', disabled: false }\n          : button\n      ),\n    });\n  },\n  handleReadChange(current) {\n    console.log('handleReadChange', current);\n    /// #if WECHAT\n    current = current.detail;\n    /// #endif\n    this.tap = true;\n    this.setData({\n      scrollTop:\n        this.itemRectList[current].top -\n        this.scrollViewRect.top +\n        Math.random(),\n    });\n  },\n  async onReady() {\n    await this.updateRect();\n  },\n  async onImageLoad() {\n    await this.updateRect();\n  },\n  async updateRect() {\n    this.itemRectList = await Promise.all(\n      this.data.terms3.map((item, index) =>\n        this.getBoundingClientRect(`#term-content-${index}`)\n      )\n    );\n    this.scrollViewRect = await this.getBoundingClientRect('#scroll-view');\n  },\n  onTouchStart() {\n    this.tap = false;\n  },\n  onScroll(e) {\n    if (this.tap) {\n      return;\n    }\n    this.scrollTop = e.detail.scrollTop;\n    const scrollTop = this.scrollTop + this.itemRectList[0].top;\n    for (let i = 0; i < this.itemRectList.length; i++) {\n      const item = this.itemRectList[i];\n      if (\n        scrollTop > item.top &&\n        (!this.itemRectList[i + 1] ||\n          scrollTop < this.itemRectList[i + 1].top) &&\n        i !== this.data.readCurrent\n      ) {\n        this.setData({\n          readCurrent: i,\n        });\n        return;\n      }\n    }\n  },\n  onScrollToLower() {\n    console.log('触底');\n  },\n  getBoundingClientRect(id) {\n    if (typeof my === 'undefined') {\n      return this.getInstanceBoundingClientRect(this, id);\n    }\n    return this.getInstanceBoundingClientRect(my, id);\n  },\n  getInstanceBoundingClientRect(instance, selector) {\n    return new Promise((resolve) => {\n      instance\n        .createSelectorQuery()\n        .select(selector)\n        .boundingClientRect()\n        .exec((ret) => {\n          if (ret && ret[0]) {\n            resolve(ret[0]);\n          }\n        });\n    });\n  },\n});\n"
  },
  {
    "path": "demo/pages/Toast/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基础使用\">\n  <ant-button\n    className=\"button\"\n    inline=\"{{ true }}\"\n    type=\"primary\"\n    data-index=\"1\"\n    onTap=\"handleShowToast\">\n    简短文字\n  </ant-button>\n  <ant-button\n    className=\"button\"\n    inline=\"{{ true }}\"\n    data-index=\"4\"\n    onTap=\"handleShowToast\">\n    过长文字\n  </ant-button>\n</ant-container>\n\n<ant-container title=\"带有图标\">\n  <ant-button\n    className=\"button\"\n    inline=\"{{ true }}\"\n    type=\"primary\"\n    data-index=\"7\"\n    onTap=\"handleShowToast\">\n    成功提示\n  </ant-button>\n  <ant-button\n    className=\"button\"\n    inline=\"{{ true }}\"\n    data-index=\"8\"\n    onTap=\"handleShowToast\">\n    失败提示\n  </ant-button>\n  <ant-button\n    className=\"button\"\n    inline=\"{{ true }}\"\n    data-index=\"9\"\n    onTap=\"handleShowToast\">\n    警告提示\n  </ant-button>\n  <ant-button\n    className=\"button\"\n    inline=\"{{ true }}\"\n    data-index=\"2\"\n    onTap=\"handleShowToast\">\n    自定义图标\n  </ant-button>\n  <ant-button\n    className=\"button\"\n    inline=\"{{ true }}\"\n    data-index=\"5\"\n    onTap=\"handleShowToast\">\n    自定义图片\n  </ant-button>\n\n  <ant-button\n    className=\"button\"\n    inline=\"{{ true }}\"\n    data-index=\"6\"\n    onTap=\"handleShowToast\">\n    加载态\n  </ant-button>\n  <ant-button\n    className=\"button\"\n    inline=\"{{ true }}\"\n    data-index=\"10\"\n    onTap=\"handleShowToast\">\n    支付宝\n  </ant-button>\n</ant-container>\n\n<ant-container title=\"延迟关闭\">\n  <ant-button\n    className=\"button\"\n    inline=\"{{ true }}\"\n    type=\"primary\"\n    data-index=\"3\"\n    onTap=\"handleShowToast\">\n    提示持续3s\n  </ant-button>\n</ant-container>\n\n<ant-toast\n  content=\"最少字符\"\n  visible=\"{{ toast1Show }}\"\n  duration=\"{{ 0 }}\"\n  showMask=\"{{ false }}\"\n  textType=\"short\"\n  maskCloseable=\"{{ true }}\"\n  onClose=\"handleCloseToast\"\n  data-index=\"1\" />\n\n<ant-toast\n  content=\"最长文案不超过2行, 最多可以显示24个字符\"\n  visible=\"{{ toast4Show }}\"\n  data-index=\"4\"\n  duration=\"{{ 0 }}\"\n  textType=\"long\"\n  showMask=\"{{ false }}\"\n  maskCloseable=\"{{ true }}\"\n  onClose=\"handleCloseToast\" />\n\n<ant-toast\n  content=\"欢迎使用新版本\"\n  icon=\"LikeOutline\"\n  visible=\"{{ toast2Show }}\"\n  duration=\"{{ 0 }}\"\n  showMask=\"{{ false }}\"\n  maskCloseable=\"{{ true }}\"\n  onClose=\"handleCloseToast\"\n  data-index=\"2\"\n  className=\"toastWrapper\" />\n\n<ant-toast\n  content=\"自定义图片\"\n  image=\"https://gw.alipayobjects.com/mdn/rms_5118be/afts/img/A*4NPGQ66arP0AAAAAAAAAAAAAARQnAQ\"\n  visible=\"{{ toast5Show }}\"\n  duration=\"{{ 0 }}\"\n  showMask=\"{{ false }}\"\n  maskCloseable=\"{{ true }}\"\n  onClose=\"handleCloseToast\"\n  data-index=\"5\" />\n\n<ant-toast\n  content=\"这个提示持续时间3s\"\n  visible=\"{{ toast3Show }}\"\n  duration=\"{{ 3000 }}\"\n  data-index=\"3\"\n  onClose=\"handleCloseToast\"\n  showMask=\"{{ false }}\"\n  maskCloseable=\"{{ true }}\" />\n\n<ant-toast\n  content=\"加载状态\"\n  visible=\"{{ toast6Show }}\"\n  data-index=\"6\"\n  type=\"loading\"\n  onClose=\"handleCloseToast\"\n  showMask=\"{{ false }}\"\n  duration=\"{{ 0 }}\"\n  maskCloseable=\"{{ true }}\" />\n\n<ant-toast\n  content=\"操作成功\"\n  visible=\"{{ toast7Show }}\"\n  data-index=\"7\"\n  type=\"success\"\n  onClose=\"handleCloseToast\"\n  showMask=\"{{ false }}\"\n  duration=\"{{ 0 }}\"\n  maskCloseable=\"{{ true }}\" />\n\n<ant-toast\n  content=\"失败提示\"\n  visible=\"{{ toast8Show }}\"\n  data-index=\"8\"\n  type=\"error\"\n  onClose=\"handleCloseToast\"\n  showMask=\"{{ false }}\"\n  duration=\"{{ 0 }}\"\n  maskCloseable=\"{{ true }}\" />\n\n<ant-toast\n  content=\"警示信息\"\n  visible=\"{{ toast9Show }}\"\n  data-index=\"9\"\n  type=\"warning\"\n  onClose=\"handleCloseToast\"\n  showMask=\"{{ false }}\"\n  duration=\"{{ 0 }}\"\n  maskCloseable=\"{{ true }}\" />\n\n<ant-toast\n  content=\"支付宝\"\n  visible=\"{{ toast10Show }}\"\n  data-index=\"10\"\n  type=\"alipay\"\n  onClose=\"handleCloseToast\"\n  showMask=\"{{ false }}\"\n  duration=\"{{ 0 }}\"\n  maskCloseable=\"{{ true }}\" />\n"
  },
  {
    "path": "demo/pages/Toast/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Toast\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Toast\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-toast\": \"../../../src/Toast/index\",\n    \"ant-button\": \"../../../src/Button/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Toast/index.less",
    "content": ".image {\n  width: 80rpx;\n  height: 80rpx;\n}\n\n.button {\n  margin-left: 12px;\n  margin-bottom: 8px;\n}\n"
  },
  {
    "path": "demo/pages/Toast/index.ts",
    "content": "Page({\n  data: {\n    toast1Show: false,\n    toast2Show: false,\n    toast3Show: false,\n    toast4Show: false,\n    toast5Show: false,\n    toast6Show: false,\n    toast7Show: false,\n    toast8Show: false,\n    toast9Show: false,\n    toast10Show: false,\n  },\n\n  handleShowToast(e) {\n    const { index }  = e.target.dataset;\n    this.setData({\n      toast1Show: false,\n      toast2Show: false,\n      toast3Show: false,\n      toast4Show: false,\n      toast5Show: false,\n      toast6Show: false,\n      toast7Show: false,\n      toast10Show: false,\n    })\n\n    this.setData({\n      [`toast${index}Show`]: true\n    })\n\n    console.log(this.data)\n  },\n\n  handleCloseToast(e) {\n    const { index }  = e.target.dataset;\n    this.setData({\n      [`toast${index}Show`]: false\n    })\n  }\n});\n"
  },
  {
    "path": "demo/pages/Typography/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基础排版\">\n  <ant-typography\n    className=\"typography\"\n  >\n    简短文字\n  </ant-typography>\n\n  <ant-typography\n    className=\"typography\"\n    fontWeight=\"medium\"\n  >\n    简短文字中等加粗\n  </ant-typography>\n\n  <ant-typography\n    className=\"typography\"\n    fontWeight=\"bold\"\n  >\n    简短文字重度加粗\n  </ant-typography>\n\n  <ant-typography\n    className=\"typography\"\n    lineThrough\n  >\n    简短文字\n  </ant-typography>\n\n  <ant-typography\n    className=\"typography\"\n    underline\n  >\n    简短文字\n  </ant-typography>\n\n  <ant-typography\n    className=\"typography\"\n    selectable\n  >\n    完整展示：Ant Design, a design language for background applications, is refined by Ant UED Team. Ant Design, a design language for background applications, is refined by Ant UED Team.\n  </ant-typography>\n\n  <ant-typography\n    className=\"typography\"\n    ellipsisRow=\"{{3}}\"\n    selectable\n  >\n    超出 3 行的内容省略展示：Ant Design, a design language for background applications, is refined by Ant UED Team. Ant Design, a design language for background applications, is refined by Ant UED Team.\n  </ant-typography>\n</ant-container>\n\n<ant-container title=\"带图标的排版\">\n  <ant-typography\n    className=\"typography\"\n    icon=\"RightOutline\"\n    disabled\n    style=\"color: #1677ff\"\n    data-type=\"link\"\n    onDisabledTap=\"handleDisabledTap\"\n  >\n    链接禁用\n  </ant-typography>\n\n  <ant-typography\n    className=\"typography\"\n    icon=\"RightOutline\"\n    style=\"color: #1677ff\"\n    data-type=\"link\"\n    onTap=\"handleTap\"\n  >\n    链接\n  </ant-typography>\n\n  <ant-typography\n    className=\"typography\"\n    icon=\"TextOutline\"\n    style=\"color: #1677ff\"\n    data-type=\"copy\"\n    data-text=\"想要复制的内容\"\n    onTap=\"handleTap\"\n  >\n    复制\n  </ant-typography>\n\n  <ant-typography\n    className=\"typography\"\n    icon=\"DeleteOutline\"\n    style=\"color: #1677ff\"\n    data-type=\"delete\"\n    onTap=\"handleTap\"\n  >\n    删除\n  </ant-typography>\n\n  <ant-typography\n    className=\"typography\"\n    icon=\"EditSOutline\"\n    style=\"color: #1677ff\"\n    data-type=\"edit\"\n    onTap=\"handleTap\"\n  >\n    编辑\n  </ant-typography>\n\n  <ant-typography\n    className=\"typography\"\n    icon=\"LocationOutline\"\n    style=\"color: #1677ff\"\n    data-type=\"location\"\n    onTap=\"handleTap\"\n  >\n    定位\n  </ant-typography>\n\n  <ant-typography\n    className=\"typography\"\n    icon=\"SendOutline\"\n    style=\"color: #1677ff\"\n    data-type=\"share\"\n    onTap=\"handleTap\"\n  >\n    分享\n  </ant-typography>\n\n\n  <ant-typography\n    className=\"typography\"\n    icon=\"SendOutline\"\n    iconPosition=\"left\"\n    style=\"color: #1677ff\"\n    data-type=\"share\"\n    onTap=\"handleTap\"\n  >\n    分享试试\n  </ant-typography>\n</ant-container>\n"
  },
  {
    "path": "demo/pages/Typography/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Typography\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Typography\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-typography\": \"../../../src/Typography/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Typography/index.less",
    "content": ".typography {\n  margin-bottom: 16px;\n}\n"
  },
  {
    "path": "demo/pages/Typography/index.ts",
    "content": "Page({\n  data: {},\n  handleTap(e) {\n    const { type, text } = e.currentTarget.dataset;\n    /// #if ALIPAY\n    if (type === 'copy') {\n      my.setClipboard({\n        text,\n        success() {\n          my.showToast({ type: 'success', content: `复制成功` });\n        },\n      });\n      return;\n    }\n    my.alert({ content: `点击${type}` });\n    /// #endif\n\n    /// #if WECHAT\n    console.log(e);\n    if (type === 'copy') {\n      // @ts-ignore\n      wx.setClipboardData({\n        data: text,\n        success() {\n          // @ts-ignore\n          wx.showToast({ title: `复制成功` });\n        },\n      });\n      return;\n    }\n    // @ts-ignore\n    wx.showToast({ title: `点击${type}` });\n    /// #endif\n  },\n  handleDisabledTap(e) {\n    const { type } = e.currentTarget.dataset;\n    /// #if ALIPAY\n    my.alert({ content: `禁用状态下点击${type}` });\n    /// #endif\n    /// #if WECHAT\n    // @ts-ignore\n    wx.showToast({ title: `禁用状态下点击${type}` });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/pages/Voucher/index.axml",
    "content": "<!-- #if ALIPAY || WECHAT -->\n<view class=\"navigation-bar\"/>\n<!-- #endif -->\n\n<ant-container title=\"基础用法-按钮\">\n  <ant-voucher onTap=\"onTap\" dataSource=\"{{dataSource}}\" />\n</ant-container>\n\n<ant-container title=\"基础用法-禁用按钮\">\n  <ant-voucher onTap=\"onTap\" dataSource=\"{{dataSource1}}\" />\n</ant-container>\n\n<ant-container title=\"基础用法-图片\">\n  <ant-voucher dataSource=\"{{dataSource2}}\" />\n</ant-container>\n\n<ant-container title=\"基础用法-small\">\n  <ant-voucher size=\"small\" onTap=\"onTap\" dataSource=\"{{dataSource3}}\" />\n</ant-container>\n\n<!-- #if ALIPAY -->\n<ant-container title=\"基础用法-small-整体禁用-插槽\">\n  <ant-voucher size=\"small\" dataSource=\"{{dataSource4}}\" >\n    <view slot=\"voucher-action-area\" class=\"slot-demo\">\n      已过期\n    </view>\n  </ant-voucher>\n</ant-container>\n<!-- #endif -->\n\n<ant-container title=\"水平排列\">\n  <ant-voucher\n    onTap=\"onTap\"\n    dataSource=\"{{[dataSource[0], dataSource1[0], dataSource2[0]]}}\"\n  />\n  <view style=\"padding: 6px\" />\n  <ant-voucher\n    size=\"small\"\n    onTap=\"onTap\"\n    dataSource=\"{{[dataSource[0], dataSource1[0], dataSource2[0]]}}\"\n  />\n</ant-container>\n\n<ant-container title=\"竖直排列\">\n  <ant-voucher\n    direction=\"vertical\"\n    onTap=\"onTap\"\n    dataSource=\"{{[dataSource[0], dataSource1[0], dataSource2[0]]}}\"\n  />\n  <view style=\"padding: 6px\" />\n  <ant-voucher\n    size=\"small\"\n    direction=\"vertical\"\n    onTap=\"onTap\"\n    onVoucherTap=\"onVoucherTap\"\n    dataSource=\"{{[dataSource[0], dataSource1[0], dataSource2[0], dataSource2A[0]]}}\"\n  />\n</ant-container>\n\n<!-- #if ALIPAY -->\n<ant-container title=\"多列（多列样式不区分small和large）\">\n  <ant-voucher\n    direction=\"multipleColumn\"\n    size=\"small\"\n    dataSource=\"{{[dataSource5[0], dataSource6[0], dataSource6[0], dataSource7[0]]}}\"\n    onVoucherTap=\"onVoucherTap\"\n  >\n    <view slot=\"voucher-action-area\" class=\"multiple-column-slot-demo\">\n      <ant-checkbox color=\"#ff3b30\" />\n    </view>\n  </ant-voucher>\n</ant-container>\n<!-- #endif -->\n"
  },
  {
    "path": "demo/pages/Voucher/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"Voucher\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"Voucher\",\n  \"transparentTitle\": \"auto\",\n  \"titlePenetrate\": \"YES\",\n  /// #endif\n\n  \"usingComponents\": {\n    \"ant-voucher\": \"../../../src/Voucher/index\",\n    \"ant-checkbox\": \"../../../src/Checkbox/index\",\n    \"ant-container\": \"../../../src/Container/index\"\n  }\n}\n"
  },
  {
    "path": "demo/pages/Voucher/index.less",
    "content": "page {\n  padding-bottom: 24rpx;\n\n  .ant-checkbox-item {\n    margin: 0;\n  }\n  .ant-checkbox-item-wrap {\n    width: 32rpx;\n    height: 32rpx;\n    flex: 0 0 32rpx;\n  }\n  .ant-checkbox-item-base {\n    margin: 0;\n  }\n  .ant-checkbox-item-content {\n    display: none;\n  }\n  .ant-checkbox-item-fake-checkedIcon-icon {\n    font-size: 21rpx;\n  }\n}\n\n.slot-demo {\n  padding-right: 24rpx;\n  font-size: 26rpx;\n  line-height: 37rpx;\n  color: #666;\n  font-weight: 500;\n}\n\n.multiple-column-slot-demo {\n  padding-top: 5rpx;\n  padding-right: 12rpx;\n}\n"
  },
  {
    "path": "demo/pages/Voucher/index.ts",
    "content": "Page({\n  data: {\n    dataSource: [\n      {\n        title: '主标题文案主标题文案',\n        desc: '副标题文案副标题文案',\n        money: '50',\n        threshold: '满500可用',\n        actionAreaInfo: {\n          disabled: false,\n          text: '去兑换',\n        },\n      },\n    ],\n\n    dataSource1: [\n      {\n        title: '主标题文案主标题文案',\n        desc: '副标题文案副标题文案',\n        money: '50.5',\n        threshold: '满500可用',\n        actionAreaInfo: {\n          disabled: true,\n          text: '去兑换',\n        },\n      },\n    ],\n\n    dataSource2: [\n      {\n        title: '主标题文案主标题文案',\n        desc: '副标题文案副标题文案',\n        money: '150.55',\n        threshold: '满500可用',\n        actionAreaInfo: {\n          imageUrl:\n            'https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*6ru_T531wmgAAAAAAAAAAAAADtF8AQ/original',\n        },\n      },\n    ],\n\n    dataSource2A: [\n      {\n        title: '主标题文案主标题文案',\n        desc: '副标题文案副标题文案',\n        money: '8.8',\n        moneyUnit: '折',\n        threshold: '满500可用',\n        actionAreaInfo: {\n          imageUrl:\n            'https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*6ru_T531wmgAAAAAAAAAAAAADtF8AQ/original',\n        },\n      },\n    ],\n\n    dataSource3: [\n      {\n        title: '主标题文案主标题文案',\n        desc: '副标题文案副标题文案',\n        money: '50.5',\n        threshold: '满500可用',\n        actionAreaInfo: {\n          disabled: false,\n          text: '去使用',\n        },\n      },\n    ],\n\n    dataSource4: [\n      {\n        disabled: true,\n        title: '主标题文案主标题文案',\n        desc: '有效期：2023.12.18',\n        money: '50.99',\n        threshold: '满50可用',\n      },\n    ],\n\n    // 多列\n    dataSource5: [\n      {\n        title: '主标题文案主标题文案',\n        desc: '副标题文案副标题文案',\n        money: '0.5',\n      },\n    ],\n    dataSource6: [\n      {\n        title: '主标题文案主标题文案',\n        desc: '副标题文案副标题文案',\n        money: '150.55',\n      },\n    ],\n    dataSource7: [\n      {\n        title: '主标题文案主标题文案',\n        desc: '副标题文案副标题文案',\n        money: '2.88',\n        moneyUnit: '折',\n      },\n    ],\n  },\n\n  onTap(item, event) {\n    my.alert({\n      content: `onTap item: ${JSON.stringify(item)} \\n event: ${JSON.stringify(\n        event,\n      )}`,\n    });\n  },\n\n  onVoucherTap(item, event) {\n    my.alert({\n      content: `onVoucherTap item: ${JSON.stringify(item)} \\n event: ${JSON.stringify(\n        event,\n      )}`,\n    });\n  },\n});\n"
  },
  {
    "path": "demo/pages/index/index.axml",
    "content": "<view class=\"demo-header\">\n  <view>\n    <view class=\"demo-header-title\">\n      <!-- display: inline -->\n      <text>Ant Design Mini</text>\n    </view>\n    <view>\n      <!-- display: inline -->\n      <text>探索移动端小程序的极致体验</text>\n    </view>\n  </view>\n  <image\n    class=\"side-image\"\n    mode=\"heightFix\"\n    src=\"https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*kQ_zRK8YuGoAAAAAAAAAAAAAARQnAQ\" />\n  <!-- #if ALIPAY || WECHAT -->\n  <view class=\"input-container\">\n    <ant-input\n      placeholder=\"输入组件名称\"\n      onChange=\"onSearch\"\n      focusClassName=\"border\"\n      className=\"input\"\n      allowClear>\n      <ant-icon\n        slot=\"prefix\"\n        type=\"SearchOutline\" />\n    </ant-input>\n  </view>\n  <!-- #endif  -->\n</view>\n<block a:if=\"{{ finding }}\">\n  <ant-list\n    className=\"list\"\n    header=\"搜索结果列表\"\n    radius>\n    <block\n      a:for=\"{{ searchResult }}\"\n      a:for-index=\"index\"\n      a:for-item=\"item\">\n      <ant-list-item\n        arrow=\"right\"\n        onTap=\"listPress\"\n        data-url=\"{{ item.path }}\">\n        {{ item.name }}\n        <view slot=\"brief\">{{ item.nameZN }}</view>\n      </ant-list-item>\n    </block>\n  </ant-list>\n</block>\n<block a:else>\n  <block\n    a:for=\"{{ componentList }}\"\n    a:for-index=\"index\"\n    a:for-item=\"item\"\n    a:key=\"*this\">\n    <block>\n      <ant-list\n        className=\"list\"\n        radius>\n        <view slot=\"header\">{{ item.type }}</view>\n        <block\n          a:for=\"{{ item.list }}\"\n          a:for-index=\"index\"\n          a:for-item=\"itemList\">\n          <ant-list-item\n            arrow=\"right\"\n            onTap=\"listPress\"\n            data-url=\"{{ itemList.path }}\">\n            <view class=\"content-title\">\n              {{ itemList.name }}\n              <view\n                a:if=\"{{ itemList.update }}\"\n                style=\"margin-left: 16rpx\">\n                <ant-tag>Update</ant-tag>\n              </view>\n            </view>\n            <view slot=\"brief\">{{ itemList.nameZN }}</view>\n          </ant-list-item>\n        </block>\n      </ant-list>\n    </block>\n  </block>\n</block>\n"
  },
  {
    "path": "demo/pages/index/index.json5",
    "content": "{\n  \"styleIsolation\": \"shared\",\n  /// #if WECHAT\n  \"navigationBarTitleText\": \"\",\n  /// #endif\n\n  /// #if ALIPAY\n  \"defaultTitle\": \"\",\n  /// #endif\n\n  \"usingComponents\": {\n    /// #if ALIPAY || WECHAT\n    \"ant-input\": \"../../../src/Input/index\",\n    /// #endif\n    \"ant-list\": \"../../../src/List/index\",\n    \"ant-list-item\": \"../../../src/List/ListItem/index\",\n    \"ant-tag\": \"../../../src/Tag/index\",\n    \"ant-icon\": \"../../../src/Icon/index\"\n  },\n  \"transparentTitle\": \"always\"\n}\n"
  },
  {
    "path": "demo/pages/index/index.less",
    "content": "page {\n  width: 100vw;\n}\n\n.list {\n  margin-bottom: 24rpx;\n}\n\n.demo-header {\n  padding-top: 100rpx;\n  display: flex;\n  flex-direction: column;\n  position: relative;\n  height: 460rpx;\n  align-items: center;\n  justify-content: center;\n  color: white;\n  width: 100vw;\n  text-align: center;\n  background: rgb(1, 112, 254);\n  margin-bottom: 66rpx;\n\n  /// #if ALIPAY\n  margin-bottom: 24rpx;\n  /// #endif\n}\n\n.side-image {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  height: 180rpx;\n  opacity: 0.3;\n}\n\n.demo-header-title {\n  font-size: 32px;\n  font-weight: bold;\n  color: white;\n  margin-bottom: 16rpx;\n}\n\n.input-container {\n  position: absolute;\n  width: 100%;\n  top: 560rpx;\n  padding: 0 24rpx;\n  box-sizing: border-box;\n  transform: translateY(-50%);\n}\n\n.input {\n  padding: 16rpx;\n}\n"
  },
  {
    "path": "demo/pages/index/index.ts",
    "content": "import { isAilpayNative } from '../../../src/_util/support';\nimport { allComponents, componentList } from '../../utils/constants';\n\nPage({\n  data: {\n    componentList,\n    finding: false,\n    searchResult: [],\n  },\n  onShow() {\n    this.setData({\n      finding: false,\n      searchResult: [],\n    });\n  },\n  onClearSearch() {\n    this.setData({\n      finding: false,\n      searchResult: [],\n    });\n  },\n  onSearch(e) {\n    /// #if WECHAT\n    e = e.detail;\n    /// #endif\n    if (e.length > 0) {\n      const result = [];\n      allComponents.forEach((searchKey) => {\n        if (searchKey.name.toLowerCase().match(e)) {\n          result.push(searchKey);\n        }\n      });\n      this.setData({\n        finding: true,\n        searchResult: result,\n      });\n    } else {\n      this.setData({\n        finding: false,\n        searchResult: [],\n      });\n    }\n  },\n  listPress(e) {\n    console.log('navigateTo', e.currentTarget.dataset.url);\n    /// #if ALIPAY\n    if (isAilpayNative()) {\n      // @ts-ignore\n      ac.call('navigateTo', {\n        url: e.currentTarget.dataset.url.slice(1),\n      });\n      return;\n    }\n    my.navigateTo({\n      url: e.currentTarget.dataset.url,\n    });\n    /// #endif\n    /// #if WECHAT\n    //@ts-ignore\n    wx.navigateTo({\n      url: '/demo' + e.currentTarget.dataset.url,\n    });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "demo/utils/constants.ts",
    "content": "export const componentList = [\n  {\n    type: 'Copilot',\n    list: [\n      { name: 'Bubble', nameZN: '气泡', path: '/pages/Bubble/index' },\n      /// #if ALIPAY || WECHAT\n      {\n        name: 'Conversations',\n        nameZN: '管理会话',\n        path: '/pages/Conversations/index',\n      },\n      /// #endif\n      { name: 'Prompts', nameZN: '提示列表', path: '/pages/Prompts/index' },\n      { name: 'Welcome', nameZN: '欢迎', path: '/pages/Welcome/index' },\n      { name: 'Actions', nameZN: '操作列表', path: '/pages/Actions/index' },\n      /// #if ALIPAY || WECHAT\n      { name: 'Sender', nameZN: '发送器', path: '/pages/Sender/index' },\n      /// #endif\n      {\n        name: 'ThoughtChain',\n        nameZN: '思维链',\n        path: '/pages/ThoughtChain/index',\n      },\n    ],\n  },\n  {\n    type: '通用',\n    list: [\n      { name: 'Button', nameZN: '按钮', path: '/pages/Button/index' },\n      { name: 'Icon', nameZN: '图标', path: '/pages/Icon/index' },\n      /// #if ALIPAY || WECHAT\n      { name: 'Sticky', nameZN: '黏性吸附', path: '/pages/Sticky/index' },\n      /// #endif\n    ],\n  },\n  {\n    type: '布局',\n    list: [\n      { name: 'Divider', nameZN: '分割线', path: '/pages/Divider/index' },\n      { name: 'Grid', nameZN: '宫格', path: '/pages/Grid/index' },\n      { name: 'Space', nameZN: '间距', path: '/pages/Space/index' },\n    ],\n  },\n  {\n    type: '导航',\n    list: [\n      { name: 'Footer页脚', nameZN: 'Footer页脚', path: '/pages/Footer/index' },\n      {\n        name: 'TabBar',\n        nameZN: 'TabBar底部标签栏',\n        path: '/pages/TabBar/index',\n      },\n      { name: 'Tabs', nameZN: '标签页', path: '/pages/Tabs/index' },\n      {\n        name: 'TabsElevator',\n        nameZN: '标签页-电梯模式',\n        path: '/pages/Tabs/TabsElevator/index',\n      },\n      {\n        name: 'TabsVerticalElevator',\n        nameZN: '标签页-纵向电梯模式',\n        path: '/pages/Tabs/TabsVerticalElevator/index',\n      },\n    ],\n  },\n  {\n    type: '信息展示',\n    list: [\n      { name: 'Card', nameZN: '基础卡片', path: '/pages/Card/index' },\n      { name: 'Avatar', nameZN: '头像', path: '/pages/Avatar/index' },\n      /// #if ALIPAY || WECHAT\n      { name: 'IndexBar', nameZN: '索引', path: '/pages/IndexBar/index' },\n      /// #endif\n      { name: 'Collapse', nameZN: '折叠面板', path: '/pages/Collapse/index' },\n      { name: 'List', nameZN: '列表', path: '/pages/List/index' },\n      /// #if ALIPAY || WECHAT\n      {\n        name: 'SwipeAction',\n        nameZN: '滑动操作',\n        path: '/pages/SwipeAction/index',\n      },\n      /// #endif\n      { name: 'Steps', nameZN: '步骤条', path: '/pages/Steps/index' },\n      { name: 'GuideTour', nameZN: '新手引导', path: '/pages/GuideTour/index' },\n      { name: 'Tag', nameZN: ' 标签', path: '/pages/Tag/index' },\n      /// #if ALIPAY || WECHAT\n      { name: 'Progress', nameZN: '进度条', path: '/pages/Progress/index' },\n      { name: 'Table', nameZN: '表格', path: '/pages/Table/index' },\n      /// #endif\n    ],\n  },\n  {\n    type: '信息录入',\n    list: [\n      /// #if ALIPAY || WECHAT\n      { name: 'Checkbox', nameZN: '复选框', path: '/pages/Checkbox/index' },\n      /// #endif\n      {\n        name: 'Checklist',\n        nameZN: '可勾选列表',\n        path: '/pages/Checklist/index',\n      },\n      /// #if ALIPAY || WECHAT\n      { name: 'Form', nameZN: '表单', path: '/pages/Form/index' },\n\n      { name: 'Input', nameZN: '输入框', path: '/pages/Input/index' },\n      {\n        name: 'InputCustom',\n        nameZN: '输入框-自定义',\n        path: '/pages/InputCustom/index',\n      },\n      {\n        name: 'InputTextarea',\n        nameZN: '输入框-textarea',\n        path: '/pages/InputTextarea/index',\n      },\n      {\n        name: 'InputSearchBar',\n        nameZN: '输入框-搜索框',\n        path: '/pages/InputSearchBar/index',\n      },\n      { name: 'Picker', nameZN: '选择器', path: '/pages/Picker/index' },\n      {\n        name: 'DatePicker',\n        nameZN: '时间选择器',\n        path: '/pages/DatePicker/index',\n      },\n      { name: 'Radio', nameZN: '单选框', path: '/pages/Radio/index' },\n      { name: 'Stepper', nameZN: '步进器', path: '/pages/Stepper/index' },\n      {\n        name: 'ImageUpload',\n        nameZN: '图片上传',\n        path: '/pages/ImageUpload/index',\n      },\n      {\n        name: 'RareWordsKeyboard',\n        nameZN: '生僻字输入键盘',\n        path: '/pages/RareWordsKeyboard/index',\n      },\n      { name: 'Calendar', nameZN: '日历', path: '/pages/Calendar/index' },\n      {\n        name: 'Postscript',\n        nameZN: '资金附言',\n        path: '/pages/Postscript/index',\n      },\n      {\n        name: 'NumberInput',\n        nameZN: '金额输入框',\n        path: '/pages/NumberInput/index',\n      },\n      /// #endif\n      { name: 'Selector', nameZN: '选择组', path: '/pages/Selector/index' },\n      { name: 'Slider', nameZN: '滑动输入条', path: '/pages/Slider/index' },\n      { name: 'Switch', nameZN: '开关', path: '/pages/Switch/index' },\n      { name: 'Rate', nameZN: '星级', path: '/pages/Rate/index' },\n      {\n        name: 'NumberKeyboard',\n        nameZN: '数字键盘-基本使用',\n        path: '/pages/NumberKeyboard/index',\n      },\n      {\n        name: 'NumberKeyboardAmount',\n        nameZN: '数字键盘-金额输入框',\n        path: '/pages/NumberKeyboardAmount/index',\n      },\n      {\n        name: 'NumberKeyboardCode',\n        nameZN: '数字键盘-验证码输入框',\n        path: '/pages/NumberKeyboardCode/index',\n      },\n      {\n        name: 'NumberKeyboardNumber',\n        nameZN: '数字键盘-数字输入框',\n        path: '/pages/NumberKeyboardNumber/index',\n      },\n    ],\n  },\n  {\n    type: '反馈',\n    list: [\n      {\n        name: 'ActionSheet',\n        nameZN: '动作面板',\n        path: '/pages/ActionSheet/index',\n      },\n      { name: 'Loading', nameZN: '加载中', path: '/pages/Loading/index' },\n      { name: 'Skeleton', nameZN: '骨架屏', path: '/pages/Skeleton/index' },\n      { name: 'Dialog', nameZN: '弹窗', path: '/pages/Dialog/index' },\n      /// #if ALIPAY || WECHAT\n      { name: 'Popover', nameZN: '气泡卡片', path: '/pages/Popover/index' },\n      {\n        name: 'PopoverList',\n        nameZN: '气泡菜单',\n        path: '/pages/PopoverList/index',\n      },\n      /// #endif\n      { name: 'Popup', nameZN: '弹出层', path: '/pages/Popup/index' },\n      { name: 'Result', nameZN: '操作结果', path: '/pages/Result/index' },\n      { name: 'Empty', nameZN: '空状态', path: '/pages/Empty/index' },\n      { name: 'Toast', nameZN: '轻提示', path: '/pages/Toast/index' },\n      /// #if ALIPAY || WECHAT\n      { name: 'Feedback', nameZN: '信息反馈', path: '/pages/Feedback/index' },\n      /// #endif\n    ],\n  },\n  {\n    type: '引导提示',\n    list: [\n      { name: 'Badge', nameZN: '徽标', path: '/pages/Badge/index' },\n      { name: 'NoticeBar', nameZN: '通告栏', path: '/pages/NoticeBar/index' },\n    ],\n  },\n  {\n    type: '业务组件',\n    list: [\n      { name: 'Countdown', nameZN: '倒计时', path: '/pages/Countdown/index' },\n      /// #if ALIPAY || WECHAT\n      { name: 'Voucher', nameZN: '优惠券', path: '/pages/Voucher/index' },\n      {\n        name: 'SelectContact',\n        nameZN: '选人组件',\n        path: '/pages/SelectContact/index',\n      },\n      { name: 'Terms', nameZN: '协议', path: '/pages/Terms/index' },\n      {\n        name: 'TermsFixed',\n        nameZN: '固定底部协议',\n        path: '/pages/Terms/Fixed/index',\n      },\n      /// #endif\n    ],\n  },\n  {\n    type: '实验性',\n    list: [\n      {\n        name: 'AutoResize',\n        nameZN: '文本自适应',\n        path: '/pages/AutoResize/index',\n      },\n      {\n        name: 'ConfigProvider',\n        nameZN: '全局容器',\n        path: '/pages/ConfigProvider/index',\n      },\n      {\n        name: 'PageContainer',\n        nameZN: '页面容器',\n        path: '/pages/PageContainer/index',\n      },\n      { name: 'Typography', nameZN: '排版', path: '/pages/Typography/index' },\n      { name: 'SafeArea', nameZN: '安全区', path: '/pages/SafeArea/index' },\n    ],\n  },\n  {\n    type: '待废弃',\n    list: [\n      { name: 'Container', nameZN: '容器', path: '/pages/Container/index' },\n      { name: 'Modal', nameZN: '对话框', path: '/pages/Modal/index' },\n    ],\n  },\n];\n\nexport const allComponents = componentList.reduce(\n  (re, v) => [...re, ...v.list],\n  []\n);\n"
  },
  {
    "path": "docs/components/overview.en.md",
    "content": "---\nsidebar: true\ntoc: false\n---\n\n# Overview\n\n<OverviewCard lang=\"en\"></OverviewCard>\n"
  },
  {
    "path": "docs/components/overview.md",
    "content": "---\nsidebar: true\ntoc: false\n---\n\n# 组件总览\n\n<OverviewCard lang=\"zh-CN\"></OverviewCard>\n"
  },
  {
    "path": "docs/components/wechat-component.tsx",
    "content": "import React from 'react';\nimport wechatConfig from '../../config/wechat.json';\n\nconst WechatComponent: React.FC = () => {\n  return (\n    <div>\n      <ul>\n        {wechatConfig.src\n          .filter((o) => {\n            return ![\n              '_util',\n              'mixins',\n              'style',\n              'ImageIcon',\n              '_locale',\n              'Mask',\n              'Pagination',\n            ].includes(o);\n          })\n          .map((o) => {\n            return (\n              <li style={{ padding: 4 }}>\n                <a href={`/components/${o.toLocaleLowerCase()}`}>{o}</a>\n              </li>\n            );\n          })}\n      </ul>\n    </div>\n  );\n};\n\nexport default WechatComponent;\n"
  },
  {
    "path": "docs/guide/contribute.en.md",
    "content": "---\norder: 9\ntoc: true\n---\n\n# Contribution Guide\n\n### 1. Clone code\n\nCode Repository: https://github.com/ant-design/ant-design-mini/\n\n```bash\n$ git clone git@github.com:ant-design/ant-design-mini.git\n```\n\n### 2. Install dependencies\n\n```bash\n$ npm i\n```\n\n### 3. Start project compilation\n\nRun `dev` command to compile the source code `compiled` directory.\n\n```bash\n$ npm run dev\n```\n\n### 4. Edit with IDE\n\n#### Run in WeChat applet developer tool\n\nDirectly use WeChat developer tools to open the root directory of the project.\n\nAfter opening the project, enter the WeChat directory and install dependencies:\n\n```bash\n$ cd compiled/wechat\n$ npm i\n```\n\nAfter installing the dependency, click the menu bar in WeChat Developer Tool: \"Tools --> Build npm\". After the build is complete, the project is ready to run normally.\n\n> If it is found that it cannot run normally, it may be that WeChat development tools build npm and package the dependency into a file, resulting in an error due to the failure to find the reference dependency in WeChat.\n\n> Such:`import duration from 'dayjs/plugin/duration'`After building npm,`dayjs/plugin`directory in `miniprogram_npm` lost in. need to be `dayjs/plugin` Manually copy directories `miniprogram_npm` In, can be solved.\n\n#### Run in the Alipay applet developer tool.\n\nDirectly use the Alipay applet developer tool to open the root directory of the project to run.\n\n### 5. Preview the document\n\n```bash\n$ npm run dev:doc\n```\n\n### 6. Commit specification\n\nWhen submitting a commit, you need to follow the following principles:\n\n- Minimize code changes: Ensure that the logic of each commit is independent and atomized. Even if the change is only 1 line of code, it should be committed independently;\n- Follow [Conventional Commits principle](https://www.conventionalcommits.org/zh-hans/v1.0.0/)to avoid meaningless Commit Message. When the code is submitted, there will be a Commit Message format check, which you usually use extensively:\n  1. `feat(scope): xxx` to describe a feature commit;\n  2. `fix(scope): xxx` to describe the commit of a bug fix;\n  3. `chore(scope): xxx` to describe small tweaks unrelated to feature and bug fixes;\n- Mention issue: If the change is related to issue, please indicate the issue number in the Commit Message, for example:`fix(scope): [#1] xxxxxx`。\n\n## Ant Design Mini Engineering Solutions\n\n### Use Alipay axml syntax to write view layer, and can support compilation into WeChat version\n\n- Write a code (supports conditional compilation) and generate Alipay and WeChat applet view layer code at the same time:\n\nSource code:\n\n```xml\n<view>\n  <!-- #comments if ALIPAY -->\n  <text a:if=\"{{a}}\">a</text>\n  <text a:if=\"{{a && b}}\">a & b</text>\n  <!-- #comments endif -->\n  <text a:if=\"{{a}}\">a</text>\n  <text a:else>!a</text>\n  <text class=\"{{a ? '1' : '2'}}\"></text>\n  <text class=\"1 {{a ? '1' + '2' : '2'}} 2\"></text>\n</view>\n```\n\nAlipay applet:\n\n```xml\n<view>\n  <text a:if=\"{{a}}\">a</text>\n  <text a:if=\"{{a && b}}\">a & b</text>\n  <text a:if=\"{{a}}\">a</text>\n  <text a:else>!a</text>\n  <text class=\"{{a ? '1' : '2'}}\"></text>\n  <text class=\"1 {{a ? '1' + '2' : '2'}} 2\"></text>\n</view>\n```\n\nmicro letter small program:\n\n```xml\n<view>\n  <text wx:if=\"{{a}}\">a</text>\n  <text wx:else>!a</text>\n  <text class=\"{{a ? '1' : '2'}}\"></text>\n  <text class=\"1 {{a ? '1' + '2' : '2'}} 2\"></text>\n</view>\n```\n"
  },
  {
    "path": "docs/guide/contribute.md",
    "content": "---\norder: 9\ntoc: true\n---\n\n# 贡献指南\n\n### 1. 克隆代码\n\n代码仓库: https://github.com/ant-design/ant-design-mini/\n\n```bash\n$ git clone git@github.com:ant-design/ant-design-mini.git\n```\n\n### 2. 安装依赖\n\n```bash\n$ npm i\n```\n\n### 3. 启动项目编译\n\n运行 `dev` 命令将源码编译到 `compiled` 目录下。\n\n```bash\n$ npm run dev\n```\n\n### 4. 使用 IDE 编辑\n\n#### 在微信小程序开发者工具中运行\n\n直接使用微信开发者工具打开项目的根目录。\n\n打开项目后，进入微信目录并安装依赖：\n\n```bash\n$ cd compiled/wechat\n$ npm i\n```\n\n安装好依赖后，点击微信开发者工具中的菜单栏：“工具 --> 构建 npm”。构建完成后，项目就可以正常运行了。\n\n> 如果发现不能正常运行，可能是微信开发工具构建 npm ，将依赖打包成功一个文件，导致微信中引用依赖找不到而报错。\n\n> 如：`import duration from 'dayjs/plugin/duration'`，构建 npm 之后，`dayjs/plugin`目录 在 `miniprogram_npm` 中丢失。需要将 `dayjs/plugin` 目录手动拷贝到 `miniprogram_npm` 中，可解决。\n\n#### 在支付宝小程序开发者工具中运行\n\n直接使用支付宝小程序开发者工具打开项目根目录即可运行。\n\n### 5. 预览文档\n\n```bash\n$ npm run dev:doc\n```\n\n### 6. Commit 规范\n\n提交 commit 时，需要遵循以下原则：\n\n- 最小化代码变更：保证每个 commit 的逻辑独立且原子化。即使变动只有 1 行代码，也应该独立 commit；\n- 遵循 [Conventional Commits 原则](https://www.conventionalcommits.org/zh-hans/v1.0.0/)，避免无意义的 Commit Message。代码提交时会有 Commit Message 格式校验，通常你会大量使用：\n  1. `feat(scope): xxx` 来描述一个 feature 的 commit；\n  2. `fix(scope): xxx` 来描述一个 bug fixes 的 commit；\n  3. `chore(scope): xxx` 来描述与 feature 和 bug fixes 无关的小调整；\n- 提及 issue：如果改动与 issue 相关，在 Commit Message 中请注明 issue 号，例如：`fix(scope): [#1] xxxxxx`。\n\n## Ant Design Mini 的工程方案\n\n### 使用支付宝 axml 语法编写视图层，并能支持编译成微信版本\n\n- 编写一份代码（支持条件编译），同时生成支付宝与微信小程序视图层代码：\n\n源代码：\n\n```xml\n<view>\n  <!-- #comments if ALIPAY -->\n  <text a:if=\"{{a}}\">a</text>\n  <text a:if=\"{{a && b}}\">a & b</text>\n  <!-- #comments endif -->\n  <text a:if=\"{{a}}\">a</text>\n  <text a:else>!a</text>\n  <text class=\"{{a ? '1' : '2'}}\"></text>\n  <text class=\"1 {{a ? '1' + '2' : '2'}} 2\"></text>\n</view>\n```\n\n支付宝小程序：\n\n```xml\n<view>\n  <text a:if=\"{{a}}\">a</text>\n  <text a:if=\"{{a && b}}\">a & b</text>\n  <text a:if=\"{{a}}\">a</text>\n  <text a:else>!a</text>\n  <text class=\"{{a ? '1' : '2'}}\"></text>\n  <text class=\"1 {{a ? '1' + '2' : '2'}} 2\"></text>\n</view>\n```\n\n微信小程序：\n\n```xml\n<view>\n  <text wx:if=\"{{a}}\">a</text>\n  <text wx:else>!a</text>\n  <text class=\"{{a ? '1' : '2'}}\"></text>\n  <text class=\"1 {{a ? '1' + '2' : '2'}} 2\"></text>\n</view>\n```\n"
  },
  {
    "path": "docs/guide/cooperation.en.md",
    "content": "---\norder: 8\ntoc: true\n---\n\n# Participation in antd-mini construction\n\nThe development of antd-mini is inseparable from every user in the community. To help you participate in the co-construction, here is some necessary information.\n\n## Project operation process\n\n### issue\n\nWhen you encounter problems or requirements in the use of the component library, you can go to the issue area to consult or ask questions. We have prepared a variety of issue templates, please choose the applicable one according to the actual situation. At the same time, if you can help solve other people's doubts, we will also be very grateful.\n\n### feature request\n\nIf the current component library does not meet your development needs, please submit an issue to explain the functionality you need. Note, however, that not all submitted requirements will necessarily be fulfilled. The antd-mini is located in the base component library and does not contain business class components. We discuss each submitted requirement, and once it is confirmed that it is required for the underlying functionality, we initiate the development process.\n\n### bug feedback\n\nWhen submitting bug feedback, please provide relevant information as complete as possible so that we can quickly reproduce and solve the problem.\n\nHere are some considerations when submitting:\n\n- Provide device information, client version, component library version and specific components;\n- Explain the behavior of the components you expect and the behavior that actually occurs;\n- Describe in detail the steps to reproduce the problem;\n- If feasible, provide examples or demos that can reproduce the problem to speed up problem positioning.\n\n## Contribution Code\n\nWe cordially invite you to contribute code to antd-mini. See[Contribution Guide](./contribute.md)Learn more. Before contributing code, be sure to submit an RFC issue and describe your changes in detail so that we can fully discuss them in the RFC to save both parties time.\n"
  },
  {
    "path": "docs/guide/cooperation.md",
    "content": "---\norder: 8\ntoc: true\n---\n\n# 参与 antd-mini 建设\n\nantd-mini 的发展离不开社区的每一位用户。为了帮助你参与共建，这里列出了一些必要的信息。\n\n## 项目运作流程\n\n### issue\n\n当你碰到组件库使用中的问题或需求时，可前往 issue 区查阅或提问。我们准备了多样的 issue 模板，请根据实际情况挑选适用的一种。同时，如果你能帮助解决他人的疑惑，我们也会非常感激。\n\n### feature request\n\n如果当前组件库无法满足你的开发需求，请通过提交 issue 来阐述你所需的功能。不过，请注意，并非所有提交的需求都一定会得到实现。antd-mini 定位于基础组件库，不包含业务类组件。我们会讨论每个提交的需求，一旦确认是基础功能所需，我们便会启动开发流程。\n\n### bug 反馈\n\n提交 bug 反馈时，请尽量完整提供相关信息，方便我们迅速复现与解决该问题。\n\n以下是提交时的一些注意事项：\n\n- 提供设备信息、客户端版本、组件库版本以及具体组件等；\n- 说明你期望的组件行为和实际发生的行为；\n- 详细描述重现问题的步骤；\n- 如果可行，提供可以复现问题的示例或 demo，以加速问题定位。\n\n## 贡献代码\n\n我们诚挚地邀请你为 antd-mini 贡献代码。请参阅[贡献指南](./contribute.md)了解详细信息。在贡献代码前，务必先提交一个 RFC issue 并详尽描述你的修改内容，这样我们能在 RFC 中充分讨论，以节省双方的时间。\n"
  },
  {
    "path": "docs/guide/customize-theme.en.md",
    "content": "---\norder: 4\ntoc: true\n---\n\n# Custom Theme & Dark Mode\n\nantd-mini support using CSS variables to customize themes. Two sets of themes are built into the antd-mini: the basic theme and the dark theme. You can use different themes or modify theme colors by customizing CSS variables. Dark mode is supported by default. You can automatically switch between dark and light modes by prefers the value of-color-scheme as the operating system changes.\n\n## Mode of use\n\n> Setting the theme globally,[CSS Variables](https://developer.mozilla.org/zh-CN/docs/Web/CSS/Using_CSS_custom_properties) To organize styles, by overwriting these CSS variables, you can customize the theme, dynamically switch the theme and other effects;\n\n### Override via CSS\n\n#### Customize the theme of individual components\n\n```xml\n  <ant-button type=\"primary\" icon=\"SmileOutline\" className=\"custom-btn\">Custom Theme</ant-button>\n```\n\n```css\ncustom-btn {\n  --button-color: #1677ff;\n  --button-background-color: #ffffff;\n  --button-border-color: #1677ff;\n  --button-primary-border-color: #1677ff;\n  --button-primary-background-color: #1677ff;\n  --button-primary-color: #ffffff;\n  --button-primary-aide-border-color: #e7f1ff;\n}\n```\n\n#### Customize themes for multiple components\n\nSimilar to the customization of a single component, you only need to wrap the component to be customized with a configProvider or an arbitrary container node (such as ant-container) and set CSS variables on the container node.\n\n```xml\n<ant-container class=\"container\" title=\"标题\">\n  <ant-button type=\"primary\" icon=\"SmileOutline\" className=\"custom-size\">Custom Theme</ant-button>\n</ant-container>\n```\n\n```css\ncontainer {\n  --button-color: #1677ff;\n  --button-background-color: #ffffff;\n  --button-border-color: #1677ff;\n  --button-primary-border-color: #1677ff;\n  --button-primary-background-color: #1677ff;\n  --button-primary-color: #ffffff;\n  --button-primary-aide-border-color: #e7f1ff;\n}\n```\n\n#### Customize the global theme\n\nIn app.less, write CSS variables to take effect globally.\n\n```css\npage {\n  --actionsheet-danger-color: #ff3141;\n  --actionsheet-title-color: #999999;\n  --actionsheet-item-color: #333333;\n  --actionsheet-item-active-bg: #eeeeee;\n  --activesheet-item-cancel-bg: #f5f5f5;\n}\n```\n\n### Covered by ConfigProvider\n\nIn addition to directly customizing themes through CSS variables (currently supporting light and dark themes by default), you can also customize themes or specify built-in themes through ConfigProvider themeVars.\n\n#### Set Theme\n\n```xml\n<ant-config-provider theme=\"dark\">\n  <view>I am a dark theme</view>\n</ant-config-provider>\n\n```\n\n#### Set themeVars custom theme\n\n```xml\n  <ant-config-provider themeVars={{themeVars}}>\n    <ant-button type=\"primary\" onTap=\"handleTap\">\n      Main button\n    </ant-button>\n  </ant-config-provider>\n\n```\n\n```js\nPage({\n  data: {\n    themeVars: {\n      'button-primary-color': 'yellow',\n      'button-primary-background-color': 'green',\n    },\n  },\n});\n```\n\n## CSS Variables\n\n> The CSS variable names used for customization can be viewed in the documentation for each component, or in[Profile](https://github.com/ant-design/ant-design-mini/blob/master/src/style/variables.less)Check the full version of the variable names, the following is an example of button to list some variable names;\n\n| Variable name                                   | Default Value                                                                                                                | Dark Mode Default                                                                                                        | Remarks                 |\n| ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | -------------------- |\n| --button-disabled-opacity                | 0.4                                                                                                                   | 0.4                                                                                                                   | Button Disable Transparency       |\n| --button-color                           | <div style=\"width: 150px; height: 40px; background-color: #1677FF;\">#1677FF</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #3086FF;\">#3086FF</div>                                     | Button Color             |\n| --button-background-color                | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333333;\">#FFFFFF</div>                     | <div style=\"width: 150px; height: 40px; background-color: #000000;color: #fff;\">#000000</div>                                     | Button background color         |\n| --button-border-color                    | <div style=\"width: 150px; height: 40px; background-color: #1677FF;\">#1677FF</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #0A0A0A;color: #fff;\">#0A0A0A</div>                                     | Button border color         |\n| --button-primary-border-color            | <div style=\"width: 150px; height: 40px; background-color: #1677FF;\">#1677FF</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #3086FF;\">#3086FF</div>                                     | Main button border color     |\n| --button-primary-background-color        | <div style=\"width: 150px; height: 40px; background-color: #1677FF;\">#1677FF</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #3086FF;\">#3086FF</div>                                     | Main button background color     |\n| --button-primary-color                   | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333333;\">#FFFFFF</div>                     | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333;\">#FFFFFF</div>                     | Main button color         |\n| --button-primary-aide-border-color       | <div style=\"width: 150px; height: 40px; background-color: #E7F1FF; color: #333333;\">#E7F1FF</div>                     | <div style=\"width: 150px; height: 40px; background-color: #0D2543;\">#0D2543</div>                                     | Primary Secondary Button Border Color |\n| --button-primary-aide-color              | <div style=\"width: 150px; height: 40px; background-color: #1677FF;\">#1677FF</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #3086FF;\">#3086FF</div>                                     | Primary Auxiliary Button Color     |\n| --button-default-aide-border-color       | <div style=\"width: 150px; height: 40px; background-color: #F5F5F5; color: #333333;\">#F5F5F5</div>                     | <div style=\"width: 150px; height: 40px; background-color: #121212; color: #fff;\">#121212</div>                                     | Default Auxiliary Button Border Color |\n| --button-default-aide-background-color   | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333333;\">#FFFFFF</div>                     | <div style=\"width: 150px; height: 40px; background-color: #000000; color: #fff;\">#000000</div>                                     | Default Auxiliary Button Background Color |\n| --button-default-aide-color              | <div style=\"width: 150px; height: 40px; background-color: #333333; color: #FFFFFF;\">#333333</div>                     | <div style=\"width: 150px; height: 40px; background-color: #C5CAD1;\">#C5CAD1</div>                                     | Default Auxiliary Button Color     |\n| --button-primary-danger-background-color | <div style=\"width: 150px; height: 40px; background-color: #FF3141;\">#FF3141</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #FF4A58;\">#FF4A58</div>                                     | Primary Danger Button Background Color |\n| --button-primary-danger-border-color     | <div style=\"width: 150px; height: 40px; background-color: #FF3141;\">#FF3141</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #FF4A58;\">#FF4A58</div>                                     | Primary Hazard Button Border Color |\n| --button-primary-danger-color            | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333333;\">#FFFFFF</div>                     | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333333;\">#FFFFFF</div>                     | Primary Hazard Button Color     |\n| --button-default-danger-background-color | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333333;\">#FFFFFF</div>                     | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333333;\">#FFFFFF</div>                     | Default Hazard Button Background Color |\n| --button-default-danger-border-color     | <div style=\"width: 150px; height: 40px; background-color: #FF3141;\">#FF3141</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #FF4A58;\">#FF4A58</div>                                     | Default Hazard Button Border Color |\n| --button-default-danger-color            | <div style=\"width: 150px; height: 40px; background-color: #FF3141;\">#FF3141</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #FF4A58;\">#FF4A58</div>                                     | Default Hazard Button Color     |\n| --button-text-danger-color               | <div style=\"width: 150px; height: 40px; background-color: #FF3141;\">#FF3141</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #FF4A58;\">#FF4A58</div>                                     | Hazard button text color     |\n| --button-danger-default-color            | <div style=\"width: 150px; height: 40px; background-color: #FF3141;\">#FF3141</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #FF4A58;\">#FF4A58</div>                                     | Danger Button Default Color     |\n| --button-active-bg                       | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0.08);\">rgba(255, 255, 255, 0.08)</div> | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0.08);\">rgba(255, 255, 255, 0.08)</div> | Button to activate background color     |\n"
  },
  {
    "path": "docs/guide/customize-theme.md",
    "content": "---\norder: 4\ntoc: true\n---\n\n# 定制主题 & 深色模式\n\nantd-mini 支持使用 CSS 变量 来自定义主题。antd-mini 内置了两套主题：基础主题和深色主题。\n通过自定义 CSS 变量，可以使用不同的主题或修改主题颜色。同时默认支持了深色模式，通过 prefers-color-scheme 的值的变化可以随操作系统自动切换深色/浅色模式。\n\n## 使用方式\n\n> 全局设置主题，通过[CSS 变量](https://developer.mozilla.org/zh-CN/docs/Web/CSS/Using_CSS_custom_properties) 来组织样式，通过覆盖这些 CSS 变量，可以实现定制主题、动态切换主题等效果；\n\n### 通过 CSS 覆盖\n\n#### 定制单个组件的主题\n\n```xml\n  <ant-button type=\"primary\" icon=\"SmileOutline\" className=\"custom-btn\">自定义主题</ant-button>\n```\n\n```css\ncustom-btn {\n  --button-color: #1677ff;\n  --button-background-color: #ffffff;\n  --button-border-color: #1677ff;\n  --button-primary-border-color: #1677ff;\n  --button-primary-background-color: #1677ff;\n  --button-primary-color: #ffffff;\n  --button-primary-aide-border-color: #e7f1ff;\n}\n```\n\n#### 定制多个组件的主题\n\n与单个组件的定制方式类似，只需用一个 configProvider 或者一个任意的容器节点（比如 ant-container）包裹住需要定制的组件，并将 CSS 变量 设置在容器节点上。\n\n```xml\n<ant-container class=\"container\" title=\"标题\">\n  <ant-button type=\"primary\" icon=\"SmileOutline\" className=\"custom-size\">自定义主题</ant-button>\n</ant-container>\n```\n\n```css\ncontainer {\n  --button-color: #1677ff;\n  --button-background-color: #ffffff;\n  --button-border-color: #1677ff;\n  --button-primary-border-color: #1677ff;\n  --button-primary-background-color: #1677ff;\n  --button-primary-color: #ffffff;\n  --button-primary-aide-border-color: #e7f1ff;\n}\n```\n\n#### 定制全局的主题\n\n在 app.less 中，写入 CSS 变量，即可对全局生效\n\n```css\npage {\n  --actionsheet-danger-color: #ff3141;\n  --actionsheet-title-color: #999999;\n  --actionsheet-item-color: #333333;\n  --actionsheet-item-active-bg: #eeeeee;\n  --activesheet-item-cancel-bg: #f5f5f5;\n}\n```\n\n### 通过 ConfigProvider 覆盖\n\n除了通过 CSS 变量直接定制主题（目前默认支持 light 和 dark 主题），也可以通过 ConfigProvider 的 themeVars 来定制主题或指定内置主题。\n\n#### 设置主题\n\n```xml\n<ant-config-provider theme=\"dark\">\n  <view>我是深色主题</view>\n</ant-config-provider>\n\n```\n\n#### 设置 themeVars 定制主题\n\n```xml\n  <ant-config-provider themeVars={{themeVars}}>\n    <ant-button type=\"primary\" onTap=\"handleTap\">\n      主要按钮\n    </ant-button>\n  </ant-config-provider>\n\n```\n\n```js\nPage({\n  data: {\n    themeVars: {\n      'button-primary-color': 'yellow',\n      'button-primary-background-color': 'green',\n    },\n  },\n});\n```\n\n## CSS 变量\n\n> 定制使用的 CSS 变量名称可以在每个组件的文档里查看，或者在[配置文件](https://github.com/ant-design/ant-design-mini/blob/master/src/style/variables.less)查看完整版便变量名称 ，下面是以 button 为例的列举的一些变量名称；\n\n| 变量名                                   | 默认值                                                                                                                | 深色模式默认值                                                                                                        | 备注                 |\n| ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | -------------------- |\n| --button-disabled-opacity                | 0.4                                                                                                                   | 0.4                                                                                                                   | 按钮禁用透明度       |\n| --button-color                           | <div style=\"width: 150px; height: 40px; background-color: #1677FF;\">#1677FF</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #3086FF;\">#3086FF</div>                                     | 按钮颜色             |\n| --button-background-color                | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333333;\">#FFFFFF</div>                     | <div style=\"width: 150px; height: 40px; background-color: #000000;color: #fff;\">#000000</div>                                     | 按钮背景颜色         |\n| --button-border-color                    | <div style=\"width: 150px; height: 40px; background-color: #1677FF;\">#1677FF</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #0A0A0A;color: #fff;\">#0A0A0A</div>                                     | 按钮边框颜色         |\n| --button-primary-border-color            | <div style=\"width: 150px; height: 40px; background-color: #1677FF;\">#1677FF</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #3086FF;\">#3086FF</div>                                     | 主要按钮边框颜色     |\n| --button-primary-background-color        | <div style=\"width: 150px; height: 40px; background-color: #1677FF;\">#1677FF</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #3086FF;\">#3086FF</div>                                     | 主要按钮背景颜色     |\n| --button-primary-color                   | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333333;\">#FFFFFF</div>                     | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333;\">#FFFFFF</div>                     | 主要按钮颜色         |\n| --button-primary-aide-border-color       | <div style=\"width: 150px; height: 40px; background-color: #E7F1FF; color: #333333;\">#E7F1FF</div>                     | <div style=\"width: 150px; height: 40px; background-color: #0D2543;\">#0D2543</div>                                     | 主要辅助按钮边框颜色 |\n| --button-primary-aide-color              | <div style=\"width: 150px; height: 40px; background-color: #1677FF;\">#1677FF</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #3086FF;\">#3086FF</div>                                     | 主要辅助按钮颜色     |\n| --button-default-aide-border-color       | <div style=\"width: 150px; height: 40px; background-color: #F5F5F5; color: #333333;\">#F5F5F5</div>                     | <div style=\"width: 150px; height: 40px; background-color: #121212; color: #fff;\">#121212</div>                                     | 默认辅助按钮边框颜色 |\n| --button-default-aide-background-color   | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333333;\">#FFFFFF</div>                     | <div style=\"width: 150px; height: 40px; background-color: #000000; color: #fff;\">#000000</div>                                     | 默认辅助按钮背景颜色 |\n| --button-default-aide-color              | <div style=\"width: 150px; height: 40px; background-color: #333333; color: #FFFFFF;\">#333333</div>                     | <div style=\"width: 150px; height: 40px; background-color: #C5CAD1;\">#C5CAD1</div>                                     | 默认辅助按钮颜色     |\n| --button-primary-danger-background-color | <div style=\"width: 150px; height: 40px; background-color: #FF3141;\">#FF3141</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #FF4A58;\">#FF4A58</div>                                     | 主要危险按钮背景颜色 |\n| --button-primary-danger-border-color     | <div style=\"width: 150px; height: 40px; background-color: #FF3141;\">#FF3141</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #FF4A58;\">#FF4A58</div>                                     | 主要危险按钮边框颜色 |\n| --button-primary-danger-color            | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333333;\">#FFFFFF</div>                     | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333333;\">#FFFFFF</div>                     | 主要危险按钮颜色     |\n| --button-default-danger-background-color | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333333;\">#FFFFFF</div>                     | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333333;\">#FFFFFF</div>                     | 默认危险按钮背景颜色 |\n| --button-default-danger-border-color     | <div style=\"width: 150px; height: 40px; background-color: #FF3141;\">#FF3141</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #FF4A58;\">#FF4A58</div>                                     | 默认危险按钮边框颜色 |\n| --button-default-danger-color            | <div style=\"width: 150px; height: 40px; background-color: #FF3141;\">#FF3141</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #FF4A58;\">#FF4A58</div>                                     | 默认危险按钮颜色     |\n| --button-text-danger-color               | <div style=\"width: 150px; height: 40px; background-color: #FF3141;\">#FF3141</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #FF4A58;\">#FF4A58</div>                                     | 危险按钮文字颜色     |\n| --button-danger-default-color            | <div style=\"width: 150px; height: 40px; background-color: #FF3141;\">#FF3141</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #FF4A58;\">#FF4A58</div>                                     | 危险按钮默认颜色     |\n| --button-active-bg                       | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0.08);\">rgba(255, 255, 255, 0.08)</div> | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0.08);\">rgba(255, 255, 255, 0.08)</div> | 按钮激活背景颜色     |\n"
  },
  {
    "path": "docs/guide/faq.en.md",
    "content": "---\norder: 10\ntoc: true\n---\n\n# FAQ\n\n### 3. Can x be used with 2.x, 1.x, 0.x\n\nBecause there is no migration cost to upgrade from 2.x, 1.x to 3.x, you can do it directly from 2.x, 1.x. upgrade to 3.x, under reference[Upgrade Guide](https://mini.ant.design/guide/migration)。\n\nFor 0.x, you can use the npm alias to install.\n\nIn `package.json` This is defined in the file:\n\n```json\n{\n  \"dependencies\": {\n    \"antd-mini\": \"^3.0.0\",\n    \"antd-mini-v0\": \"npm:antd-mini@^0.0.26\"\n  }\n}\n```\n\n```\n$ npm install\n```\n\nUse:\n\n```json\n{\n  \"usingComponents\": {\n    \"button\": \"antd-mini/es/Button/index\",\n    \"button-v0\": \"antd-mini-v0/es/Button/index\"\n  }\n}\n```\n\n```html\n<button>这是3.x antd-mini</button>\n<antd-mini-v0>这是0.x antd-mini</antd-mini-v0>\n```\n\n### In the Alipay applet page, how to override the antd-mini style and ensure that it takes effect\n\nThe new Alipay applet developer tool is configured for the created page by default `styleIsolation: 'apply-shared'`This will result in the page style not being able to affect external components.\n\nYou can solve this problem by modifying the style isolation configuration of the corresponding page.json:\n\n```json\n{\n  \"styleIsolation\": \"shared\"\n}\n```\n\n`styleIsolation` Configuration items are available in the following two modes:\n\n- `apply-shared`: This means that the app.acss style and other settings have `shared` page or custom component styles affect the current page, but styles in the current page acss are not applied externally.\n- `shared`(default): indicates that the app.acss style and other settings are `shared` the page or custom component styles will affect the current page, and the styles in the acss of the current page will also be applied externally.\n\nOfficial documentation reference link:[Page Style Isolation](https://opendocs.alipay.com/mini/framework/page-acss#%E9%A1%B5%E9%9D%A2%E6%A0%B7%E5%BC%8F%E9%9A%94%E7%A6%BB)\n"
  },
  {
    "path": "docs/guide/faq.md",
    "content": "---\norder: 10\ntoc: true\n---\n\n# 常见问题\n\n### 3.x 能否和 2.x, 1.x, 0.x 一起使用\n\n因为 2.x, 1.x 升级到 3.x 没有迁移成本，所以你可以直接从 2.x, 1.x 升级到 3.x，参考下[升级指南](https://mini.ant.design/guide/migration)。\n\n对于 0.x, 你可以使用 npm 别名来安装。\n\n在 `package.json` 文件中是这样定义的：\n\n```json\n{\n  \"dependencies\": {\n    \"antd-mini\": \"^3.0.0\",\n    \"antd-mini-v0\": \"npm:antd-mini@^0.0.26\"\n  }\n}\n```\n\n```\n$ npm install\n```\n\n使用：\n\n```json\n{\n  \"usingComponents\": {\n    \"button\": \"antd-mini/es/Button/index\",\n    \"button-v0\": \"antd-mini-v0/es/Button/index\"\n  }\n}\n```\n\n```html\n<button>这是3.x antd-mini</button>\n<antd-mini-v0>这是0.x antd-mini</antd-mini-v0>\n```\n\n### 在支付宝小程序页面中，如何覆盖 antd-mini 的样式并确保其生效\n\n新版支付宝小程序开发者工具默认为创建的页面配置了 `styleIsolation: 'apply-shared'`，这将导致页面样式无法影响到外部组件。\n\n您可以通过修改对应 page.json 的样式隔离配置来解决此问题：\n\n```json\n{\n  \"styleIsolation\": \"shared\"\n}\n```\n\n`styleIsolation` 配置项有如下两种模式可供选择：\n\n- `apply-shared`：这意味着 app.acss 样式和其它设定了 `shared` 的页面或自定义组件样式会影响当前页面，但当前页面 acss 中的样式不会作用于外部。\n- `shared`（默认）：表示 app.acss 样式和其它设定了 `shared` 的页面或自定义组件样式会影响当前页面，同时当前页面 acss 中的样式也会作用于外部。\n\n官方文档参考链接：[页面样式隔离](https://opendocs.alipay.com/mini/framework/page-acss#%E9%A1%B5%E9%9D%A2%E6%A0%B7%E5%BC%8F%E9%9A%94%E7%A6%BB)\n"
  },
  {
    "path": "docs/guide/i18n.en.md",
    "content": "---\norder: 5\ntoc: true\n---\n\n# Internationalization\n\nantd-mini v3 supports internationalization of global settings, and multi-language support is realized by setting Locale. The component uses Chinese by default;\n\n## Mode of use\n\n1. Introducing components in the page JSON file`ConfigProvider` Components to globally configure multilingual files;\n\n```json\n{\n  \"usingComponents\": {\n    \"ant-config-provider\": \"antd-mini/es/ConfigProvider/index\"\n  }\n}\n```\n\n2. introduce the corresponding language source file in js\n\n```js\nimport enUS from 'antd-mini/es/_locale/en-US';\nPage({\n  data: {\n    locale: esES,\n  },\n});\n```\n\n2. Used in AXML, it is important to note that the entire project is only passed for the first time.`ConfigProvider`设置 Locale 会全局生效，\n   同一个项目的不同页面设置了不同的Language，只会生效一次；\n\n```xml\n<ant-config-provider locale={{locale}}>\n  <ant-button>\n      I am a button.\n  </ant-button>\n</ant-config-provider>\n```\n\n## Currently Supported Languages\n\n| Language                    | File Name | Supported version |\n| ----------------------- | ------ | -------- |\n| Simplified Chinese                | zh-CN  | 3.0      |\n| Traditional Chinese (Taiwan)    | zh-TW  | 3.0      |\n| Traditional Chinese (Hong Kong)    | zh-HK  | 3.0      |\n| Arabic (Saudi Arabia) | ar-SA  | 3.0      |\n| English (American)            | en-US  | 3.0      |\n| Korean (South Korea)          | ko-KR  | 3.0      |\n| German (Germany)            | de-DE  | 3.0      |\n| Russian (Russia)          | ru-RU  | 3.0      |\n| French (France)            | fr-FR  | 3.0      |\n| Spanish (Spain)      | es-ES  | 3.0      |\n| Italian (Italy)      | it-IT  | 3.0      |\n| Malay (Malaysia)      | ms-MY  | 3.0      |\n| Indonesian                  | in-ID  | 3.0      |\n| Thai (Thailand)            | th-TH  | 3.0      |\n| Portuguese (Brazil)        | pt-BR  | 3.0      |\n| Japanese (Japan)            | ja-JP  | 3.0      |\n| Turkish (Turkey)      | tr-TR  | 3.0      |\n| Vietnamese                  | vi-VN  | 3.0      |\n\n\nView here[Language Pack Source Files](https://github.com/ant-design/ant-design-mini/blob/master/src/_locale/zh-CN.ts)\n\n## FAQ\n\n### Can't find the language pack you want?\n\nIf you can't find the language pack you need, you are welcome to create a new language pack based on the English language pack and send us a Pull Request.\n"
  },
  {
    "path": "docs/guide/i18n.md",
    "content": "---\norder: 5\ntoc: true\n---\n\n# 国际化\n\nantd-mini v3 支持全局设置国际化，通过设置 Locale 来实现多语言支持；组件默认使用中文；\n\n## 使用方式\n\n1. 在页面 JSON 文件中引入组件`ConfigProvider` 组件来全局配置多语言文件；\n\n```json\n{\n  \"usingComponents\": {\n    \"ant-config-provider\": \"antd-mini/es/ConfigProvider/index\"\n  }\n}\n```\n\n2. 在 js 中引入对应的语言源文件\n\n```js\nimport enUS from 'antd-mini/es/_locale/en-US';\nPage({\n  data: {\n    locale: esES,\n  },\n});\n```\n\n2. 在 AXML 中使用，需要注意，整个项目中仅有第一次通过`ConfigProvider`设置 Locale 会全局生效，\n   同一个项目的不同页面设置了不同的语言，只会生效一次；\n\n```xml\n<ant-config-provider locale={{locale}}>\n  <ant-button>\n      我是一个按钮\n  </ant-button>\n</ant-config-provider>\n```\n\n## 目前支持的语言\n\n| 语言                    | 文件名 | 支持版本 |\n| ----------------------- | ------ | -------- |\n| 简体中文                | zh-CN  | 3.0      |\n| 繁体中文（中国台湾）    | zh-TW  | 3.0      |\n| 繁体中文（中国香港）    | zh-HK  | 3.0      |\n| 阿拉伯语（沙特阿拉伯 ） | ar-SA  | 3.0      |\n| 英语（美式）            | en-US  | 3.0      |\n| 朝鲜语（韩国）          | ko-KR  | 3.0      |\n| 德语（德国）            | de-DE  | 3.0      |\n| 俄语（俄罗斯）          | ru-RU  | 3.0      |\n| 法语（法国）            | fr-FR  | 3.0      |\n| 西班牙语（西班牙）      | es-ES  | 3.0      |\n| 意大利语（意大利）      | it-IT  | 3.0      |\n| 马来语（马来西亚）      | ms-MY  | 3.0      |\n| 印尼语                  | in-ID  | 3.0      |\n| 泰语（泰国）            | th-TH  | 3.0      |\n| 葡萄牙语（巴西）        | pt-BR  | 3.0      |\n| 日语（日本）            | ja-JP  | 3.0      |\n| 土耳其语（土耳其）      | tr-TR  | 3.0      |\n| 越南语                  | vi-VN  | 3.0      |\n\n\n在这里查看[语言包源文件](https://github.com/ant-design/ant-design-mini/blob/master/src/_locale/zh-CN.ts)\n\n## 常见问题\n\n### 找不到你想要的语言包?\n\n如果你找不到你需要的语言包，欢迎你在 英文语言包 的基础上创建一个新的语言包，并给我们发一个 Pull Request。\n"
  },
  {
    "path": "docs/guide/migration.en.md",
    "content": "---\norder: 6\ntoc: true\n---\n\n# Upgrade Guide\n\nThe last version of Ant Design Mini v2 was `v2.36.8`The first version of v3 was `v3.0.0`。\n\nWhat did we do for the v3 version?\n\n- Component Visual Upgrade\n- Support dark mode\n- Support theme customization\n- Internationalized multi-language support\n\nAmong them, dark mode, theme customization and internationalization of multilingual are brand-new functions, which can be directly used when upgraded to v3.\n\nFor visual upgrade of components, we modified the styles of some components in v2 version to meet the latest visual specifications. During the upgrade process, we made maximum forward compatibility without destroying the component structure, className prefix and Props parameters of v2 version. Theoretically, v2 can be directly upgraded to v3 without Breaking Change. Although we have made as much compatibility guarantee as possible in the development of the new version, we still**It is strongly recommended that the access party conduct a complete regression test during the upgrade from v2 to v3 to prevent inconsistent business performance due to some unexpected Edge Case.**\n\n## Upgrade Description\n\n| Component Name       | Upgrade Description                                                                                                |\n| -------------- | ------------------------------------------------------------------------------------------------------- |\n| Button         | 🛠New `aide` Properties;                                                                                    |\n| Calendar       | 🛠Remove `localeText` attributes; original `title` property is defined `format` attribute substitution;                                     |\n| Empty          | 🛠New `buttonInfo` 、`imageMode` Properties;`onClickButton` the incident;                                          |\n| Popover        | 🛠New `showCloseIcon` 、`imageUrl` 、`actionText` Properties;`onTapAction` the incident;                           |\n| Popup          | 🛠New `backgroundImage` 、`showClose` 、`showBack` Properties;`onClickBackIcon` 、`onClickCloseIcon` the incident; |\n| Toast          | 🛠New `textType` attributes; original `type` Property Added `alipay` type;                                          |\n| Card           | 🆕New Components                                                                                             |\n| Dialog         | 🆕New Components                                                                                             |\n| SafeArea       | 🆕New Components                                                                                             |\n| AutoResize     | 🆕New Components                                                                                             |\n| ConfigProvider | 🆕New Components                                                                                             |\n| Countdown      | 🆕New Components                                                                                             |\n| Table          | 🆕New Components                                                                                             |\n| Feedback       | 🆕New Components                                                                                             |\n| PopoverList    | 🆕New Components                                                                                             |\n| SelectContact  | 🆕New Components                                                                                             |\n| Sticky         | 🆕New Components                                                                                             |\n| Voucher        | 🆕New Components                                                                                             |\n| NumberInput    | 🆕New Components                                                                                             |\n| Postscript     | 🆕New Components                                                                                             |\n\n<style>\n    th:nth-of-type(1){\n        width: 0px !important;\n    }\n</style>\n\n## Historical Version\n\nMigration Guide:\n\n- [Upgrade from v1 to v2](https://2x-mini.ant.design/guide/migration-v2)\n- [Upgrade from v0 to v1](https://2x-mini.ant.design/guide/migration-v1)\n\nFull Document Address:\n\n- [Version v2](https://2x-mini.ant.design)\n- [Version v1](https://1x-mini.ant.design)\n- [v0 version](https://0x-mini.ant.design)\n"
  },
  {
    "path": "docs/guide/migration.md",
    "content": "---\norder: 6\ntoc: true\n---\n\n# 升级指南\n\nAnt Design Mini v2 的最后一个版本是 `v2.36.8`，v3 的第一个版本是 `v3.0.0`。\n\n我们针对 v3 版本做了什么？\n\n- 组件视觉升级\n- 支持暗黑模式\n- 支持主题定制\n- 支持国际化多语言\n\n其中暗黑模式、主题定制、国际化多语言为全新功能，升级到 v3 可以直接使用。\n\n对于组件视觉升级，我们修改了部分 v2 版本中组件的样式以满足最新的视觉规范，我们在升级过程中做了最大程度的向前兼容，未破坏 v2 版本的组件结构、className 前缀和 Props 参数，理论上从 v2 可以直接升级到 v3 而无 Breaking Change。虽然在新版本开发过程中做了尽可能的兼容保障，但我们仍然**强烈建议接入方在从 v2 升级到 v3 的过程中进行完整回归测试，防止因为某些预期外的 Edge Case 导致业务表现不一致。**\n\n## 升级说明\n\n| 组件名称       | 升级说明                                                                                                |\n| -------------- | ------------------------------------------------------------------------------------------------------- |\n| Button         | 🛠 新增 `aide` 属性；                                                                                    |\n| Calendar       | 🛠 去掉 `localeText` 属性；原有的 `title` 属性由 `format` 属性替换；                                     |\n| Empty          | 🛠 新增 `buttonInfo` 、`imageMode` 属性；`onClickButton` 事件；                                          |\n| Popover        | 🛠 新增 `showCloseIcon` 、`imageUrl` 、`actionText` 属性；`onTapAction` 事件；                           |\n| Popup          | 🛠 新增 `backgroundImage` 、`showClose` 、`showBack` 属性；`onClickBackIcon` 、`onClickCloseIcon` 事件； |\n| Toast          | 🛠 新增 `textType` 属性；原有的 `type` 属性新增 `alipay` 类型；                                          |\n| Card           | 🆕 全新组件                                                                                             |\n| Dialog         | 🆕 全新组件                                                                                             |\n| SafeArea       | 🆕 全新组件                                                                                             |\n| AutoResize     | 🆕 全新组件                                                                                             |\n| ConfigProvider | 🆕 全新组件                                                                                             |\n| Countdown      | 🆕 全新组件                                                                                             |\n| Table          | 🆕 全新组件                                                                                             |\n| Feedback       | 🆕 全新组件                                                                                             |\n| PopoverList    | 🆕 全新组件                                                                                             |\n| SelectContact  | 🆕 全新组件                                                                                             |\n| Sticky         | 🆕 全新组件                                                                                             |\n| Voucher        | 🆕 全新组件                                                                                             |\n| NumberInput    | 🆕 全新组件                                                                                             |\n| Postscript     | 🆕 全新组件                                                                                             |\n\n<style>\n    th:nth-of-type(1){\n        width: 0px !important;\n    }\n</style>\n\n## 历史版本\n\n迁移指南：\n\n- [从 v1 升级到 v2](https://2x-mini.ant.design/guide/migration-v2)\n- [从 v0 升级到 v1](https://2x-mini.ant.design/guide/migration-v1)\n\n完整文档地址：\n\n- [v2 版本](https://2x-mini.ant.design)\n- [v1 版本](https://1x-mini.ant.design)\n- [v0 版本](https://0x-mini.ant.design)\n"
  },
  {
    "path": "docs/guide/quick-start.en.md",
    "content": "---\norder: 1\ntoc: true\n---\n\n# Used in Alipay applet\n\nHere is how to install and use the Ant Design Mini component library in the native Alipay applet.\n\n### 1. Install dependencies\n\n```shell\n$ npm i antd-mini --save\n```\n\n### 2. Open the component2\n\nFrom v2.11.0 onwards, small programs are required to open `component2`. When enabled, the applet custom component uses the new lifecycle run mode.\n\nHow to enable it: In Details> Project Configuration in the IDE, select Enable component2 Compilation \".\n\nDetails can refer[Upgrade to v2](https://2x-mini.ant.design/guide/migration-v2)。\n\n### 3. Introduce components into the page JSON file.\n\n```json\n{\n  \"usingComponents\": {\n    \"ant-button\": \"antd-mini/es/Button/index\"\n  }\n}\n```\n\n### 4. Use in the AXML file.\n\n```xml\n<ant-button>I am a button.</ant-button>\n```\n"
  },
  {
    "path": "docs/guide/quick-start.md",
    "content": "---\norder: 1\ntoc: true\n---\n\n# 在支付宝小程序中使用\n\n这里介绍如何在原生支付宝小程序中安装使用 Ant Design Mini 组件库。\n\n### 1. 安装依赖\n\n```shell\n$ npm i antd-mini --save\n```\n\n### 2. 开启 component2\n\n从 v2.11.0 版本起，需要小程序开启 `component2`。开启后，小程序自定义组件会使用新的生命周期运行模式。\n\n开启方法：在 IDE 中的“详情 > 项目配置”中，勾选“启用 component2 编译”。\n\n详情可以参考[升级到 v2](https://2x-mini.ant.design/guide/migration-v2)。\n\n### 3. 在页面 JSON 文件中引入组件\n\n```json\n{\n  \"usingComponents\": {\n    \"ant-button\": \"antd-mini/es/Button/index\"\n  }\n}\n```\n\n### 4. 在 AXML 文件中使用\n\n```xml\n<ant-button>我是一个按钮</ant-button>\n```\n"
  },
  {
    "path": "docs/guide/using-uni-app.en.md",
    "content": "---\norder: 3\ntoc: true\n---\n\n# Use in uni-app\n\nHere is a button component (Button) as an example to explain how to use antd-mini in uni-app projects.\n\n### Create Project Path\n\n#### Referenced in Alipay applet\n\nCreate a new directory under the project path `mycomponents`(must be this name and cannot be modified), and install antd-mini dependencies in this directory.\n\nReference command:\n\n```shell\nmkdir mycomponents\ncd mycomponents\n\n# 安装依赖\nnpm init -y\nnpm i antd-mini --save\n```\n\nAfter the operation is completed, the project structure should be as follows:\n\n```diff\n .\n  ├── App.vue\n  ├── index.html\n  ├── main.js\n  ├── manifest.json\n+ ├── mycomponents\n+ │   ├── node_modules\n+ │   │   ├── antd-mini\n+ │   │   │   ├── es\n+ │   │   │   │   ├── Button\n+ │   │   │   │   ├── Calendar\n+ │   │   │   ├── package.json\n  ├── pages\n  ├── pages.json\n  ├── static\n  └── unpackage\n```\n\nAfter the dependency is installed, you can modify pages.json in `page.style` Add under Configuration `usingComponents`。\n配置时需要注意路径大小写和实际组件一致，否则可能引发报错。\n\n```diff\n{\n  \"pages\": [\n    {\n      \"path\": \"pages/index/index\",\n      \"style\": {\n+       // #ifdef MP-ALIPAY\n+       \"usingComponents\": {\n+         \"ant-button\": \"/mycomponents/node_modules/antd-mini/es/Button/index\"\n+       }\n+       // #endif\n        \"navigationBarTitleText\": \"uni-app\"\n      }\n    }\n  ],\n  ...\n}\n```\n\n### Cited in WeChat applet\n\nCreate a new directory under the project path `wxcomponents`(must be this name and cannot be modified), and install antd-mini dependencies in this directory.\n\nReference command:\n\n```shell\nmkdir wxcomponents\ncd wxcomponents\n\n# 安装依赖\nnpm init -y\nnpm i antd-mini --save\n```\n\nAfter the operation is completed, the project structure should be as follows:\n\n```diff\n .\n  ├── App.vue\n  ├── index.html\n  ├── main.js\n  ├── manifest.json\n  ├── pages\n  ├── pages.json\n  ├── static\n  └── unpackage\n+ ├── wxcomponents\n+ │   ├── node_modules\n+ │   │   ├── antd-mini\n+ │   │   │   ├── es\n+ │   │   │   │   ├── Button\n+ │   │   │   │   ├── Calendar\n+ │   │   │   ├── package.json\n```\n\nAfter the dependency installation is completed, click \"run\"> \"run to applet simulator\"> \"wechat applet developer tool\" in the uni-app to compile the project into wechat applet.\n\nUse the WeChat applet developer tool to open the uni-app compiled WeChat applet. After that, in the WeChat applet developer tool, click \"Tools\"> \"Build npm\".\n\nAt this point the project structure should be as follows:\n\n```diff\n.\n  ├── mp-weixin\n+ │   ├── wxcomponents\n+ │   │   ├── node_modules\n+ │   │   │   ├── antd-mini\n+ │   │   │   miniprogram_npm\n+ │   │   │   │   ├── antd-mini\n+ │   │   │   │   │   ├── Button\n```\n\nModify pages.json, in `page.style` Add under Configuration `usingComponents`. When referencing components under the wxcomponents/miniprogram_npm, the configuration should also be aware that the case of the path is consistent with that of the actual component.\n\n```diff\n{\n  \"pages\": [\n    {\n      \"path\": \"pages/index/index\",\n      \"style\": {\n+       // #ifdef MP-WEIXIN\n+       \"usingComponents\": {\n+         \"ant-button\": \"/wxcomponents/miniprogram_npm/antd-mini/Button/index\"\n+       }\n+       // #endif\n        \"navigationBarTitleText\": \"uni-app\"\n      }\n    }\n  ],\n  ...\n}\n```\n\n## Use in page\n\nCan be used directly in the page.\n\n```diff\n+ <ant-button type=\"default\" @tap=\"handleTap\">次要按钮</ant-button>\n```\n\n```diff\n<script>\nexport default {\n  methods: {\n+   handleTap: function () {\n+     console.log('this is handle tap');\n+   }\n  }\n}\n</script>\n```\n\n## Reference Documentation\n\n- [uni-app official website: applet custom component support](https://zh.uniapp.dcloud.io/tutorial/miniprogram-subject.html)\n- [Example of using uniapp antd-mini](https://github.com/DiamondYuan/antd-mini-uniapp)\n"
  },
  {
    "path": "docs/guide/using-uni-app.md",
    "content": "---\norder: 3\ntoc: true\n---\n\n# 在 uni-app 中使用\n\n这里以按钮组件（Button）为例，讲解如何在 uni-app 项目中使用 antd-mini。\n\n### 建立项目路径\n\n#### 在支付宝小程序中引用\n\n在项目路径下新建目录 `mycomponents`（必须是这个名称，不可修改），并在此目录下安装 antd-mini 依赖。\n\n参考命令：\n\n```shell\nmkdir mycomponents\ncd mycomponents\n\n# 安装依赖\nnpm init -y\nnpm i antd-mini --save\n```\n\n操作完成后，项目结构应该如下：\n\n```diff\n .\n  ├── App.vue\n  ├── index.html\n  ├── main.js\n  ├── manifest.json\n+ ├── mycomponents\n+ │   ├── node_modules\n+ │   │   ├── antd-mini\n+ │   │   │   ├── es\n+ │   │   │   │   ├── Button\n+ │   │   │   │   ├── Calendar\n+ │   │   │   ├── package.json\n  ├── pages\n  ├── pages.json\n  ├── static\n  └── unpackage\n```\n\n依赖安装完成后，可以修改 pages.json，在 `page.style` 配置下新增 `usingComponents`。\n配置时需要注意路径大小写和实际组件一致，否则可能引发报错。\n\n```diff\n{\n  \"pages\": [\n    {\n      \"path\": \"pages/index/index\",\n      \"style\": {\n+       // #ifdef MP-ALIPAY\n+       \"usingComponents\": {\n+         \"ant-button\": \"/mycomponents/node_modules/antd-mini/es/Button/index\"\n+       }\n+       // #endif\n        \"navigationBarTitleText\": \"uni-app\"\n      }\n    }\n  ],\n  ...\n}\n```\n\n### 在微信小程序中引用\n\n在项目路径下新建目录 `wxcomponents`（必须是这个名称，不可修改），并在此目录下安装 antd-mini 依赖。\n\n参考命令：\n\n```shell\nmkdir wxcomponents\ncd wxcomponents\n\n# 安装依赖\nnpm init -y\nnpm i antd-mini --save\n```\n\n操作完成后，项目结构应该如下：\n\n```diff\n .\n  ├── App.vue\n  ├── index.html\n  ├── main.js\n  ├── manifest.json\n  ├── pages\n  ├── pages.json\n  ├── static\n  └── unpackage\n+ ├── wxcomponents\n+ │   ├── node_modules\n+ │   │   ├── antd-mini\n+ │   │   │   ├── es\n+ │   │   │   │   ├── Button\n+ │   │   │   │   ├── Calendar\n+ │   │   │   ├── package.json\n```\n\n依赖安装完成后，在 uni-app 里点击 \"运行\" > \"运行到小程序模拟器\" > \"微信小程序开发者工具\"，将项目编译为微信小程序。\n\n使用微信小程序开发者工具打开 uni-app 编译后的微信小程序。之后在微信小程序开发者工具中，点击 \"工具\" > \"构建 npm\"。\n\n此时项目结构应该如下：\n\n```diff\n.\n  ├── mp-weixin\n+ │   ├── wxcomponents\n+ │   │   ├── node_modules\n+ │   │   │   ├── antd-mini\n+ │   │   │   miniprogram_npm\n+ │   │   │   │   ├── antd-mini\n+ │   │   │   │   │   ├── Button\n```\n\n修改 pages.json，在 `page.style` 配置下新增 `usingComponents`。引用 wxcomponents/miniprogram_npm 下的组件时，配置同样要注意路径大小写和实际组件保持一致。\n\n```diff\n{\n  \"pages\": [\n    {\n      \"path\": \"pages/index/index\",\n      \"style\": {\n+       // #ifdef MP-WEIXIN\n+       \"usingComponents\": {\n+         \"ant-button\": \"/wxcomponents/miniprogram_npm/antd-mini/Button/index\"\n+       }\n+       // #endif\n        \"navigationBarTitleText\": \"uni-app\"\n      }\n    }\n  ],\n  ...\n}\n```\n\n## 在页面中使用\n\n在页面中直接使用即可。\n\n```diff\n+ <ant-button type=\"default\" @tap=\"handleTap\">次要按钮</ant-button>\n```\n\n```diff\n<script>\nexport default {\n  methods: {\n+   handleTap: function () {\n+     console.log('this is handle tap');\n+   }\n  }\n}\n</script>\n```\n\n## 参考文档\n\n- [uni-app 官方网站：小程序自定义组件支持](https://zh.uniapp.dcloud.io/tutorial/miniprogram-subject.html)\n- [uniapp 使用 antd-mini 示例](https://github.com/DiamondYuan/antd-mini-uniapp)\n"
  },
  {
    "path": "docs/guide/using-wechat.en.md",
    "content": "---\norder: 2\ntoc: true\n---\n\n# Used in WeChat applet\n\nThe following takes Button (button component) as an example to explain how to use antd-mini in WeChat applets.\n\n### 1. Install dependencies\n\n```shell\n# 安装依赖\nnpm i antd-mini --save\n```\n\nThe above commands will help you install the antd-mini dependencies in your project.\n\n### Building npm\n\nAfter the dependency installation is completed, please select \"Tools\"-> \"Build npm\" in the menu bar of WeChat Developer Tools \".\n\n### 3. Reference the component in the project.\n\nPlease configure `usingComponents` field, refer to the antd-mini component correctly, as in the following example:\n\n```diff\n{\n  \"usingComponents\": {\n+   \"ant-button\": \"antd-mini/Button/index\",\n  }\n}\n```\n\nNote that the case of the component path must be the same as that of the actual component. Otherwise, an error may be reported.\n\n### 4. Use components in the page.\n\nOn the page, you can use the button components provided by the antd-mini as follows:\n\n```diff\n+   <ant-button type=\"primary\" bindtap=\"handleTap\">主要按钮</ant-button>\n```\n\nAt the same time, don't forget `.js` Add a method to the file that handles the click event:\n\n```diff\nPage({\n+   handleTap: function (e) {\n+      wx.showToast({\n+            title: '点击按钮',\n+       });\n+   },\n});\n```\n\n## FAQ\n\n1. The WeChat applet does not support setting default values and scope slots for slots, so the slot capability of components in the WeChat version is limited.\n\n```axml\n<!-- 微信小程序本身不支持下面例子中这样的 给插槽设置默认值 -->\n<slot>默认值</slot>\n\n<!-- 微信小程序本身不支持下面例子中这样的 作用域插槽 -->\n<slot item=\"{{item}}\" index=\"{{index}}\"></slot>\n```\n\n2. After introducing the component, encounter `[WXML file compile error] undefined?`、 `[WXML file compile error] WXML file not found: ./xxx` Relevant report error. Remove the following configuration from app.json and try it.\n\n```diff\n{\n  \"pages\": [\n    \"pages/index/index\"\n  ],\n- \"componentFramework\": \"glass-easel\",\n- \"lazyCodeLoading\": \"requiredComponents\n}\n```\n\n## List of adapted components\n\nThe following is a list of components that have been adapted to WeChat applets in the antd-mini. You can use these components directly in the project.\n\n<code src=\"../components/wechat-component.tsx\" inline=\"true\"></code>\n\n## Reference Documentation\n\nFor more details, please refer to the official documents of WeChat applet on npm support:\n\n[WeChat applet document: npm support](https://developers.weixin.qq.com/miniprogram/dev/devtools/npm.html)\n"
  },
  {
    "path": "docs/guide/using-wechat.md",
    "content": "---\norder: 2\ntoc: true\n---\n\n# 在微信小程序中使用\n\n以下以 Button（按钮组件）为例，讲解如何在微信小程序中使用 antd-mini。\n\n### 1. 安装依赖\n\n```shell\n# 安装依赖\nnpm i antd-mini --save\n```\n\n上述命令将帮助您在项目中安装 antd-mini 的依赖。\n\n### 2. 构建 npm\n\n依赖安装完成后，请在微信开发者工具菜单栏中选择：“工具” -> “构建 npm”。\n\n### 3. 在项目中引用组件\n\n请在页面配置的 `usingComponents` 字段中，按照以下示例正确引用 antd-mini 的组件：\n\n```diff\n{\n  \"usingComponents\": {\n+   \"ant-button\": \"antd-mini/Button/index\",\n  }\n}\n```\n\n引用时请注意，组件路径的大小写需要与实际组件严格一致，否则可能导致报错。\n\n### 4. 在页面中使用组件\n\n在页面上，您可如下使用 antd-mini 提供的按钮组件：\n\n```diff\n+   <ant-button type=\"primary\" bindtap=\"handleTap\">主要按钮</ant-button>\n```\n\n同时，不要忘记在对应页面的 `.js` 文件中添加处理点击事件的方法：\n\n```diff\nPage({\n+   handleTap: function (e) {\n+      wx.showToast({\n+            title: '点击按钮',\n+       });\n+   },\n});\n```\n\n## 常见问题\n\n1. 微信小程序不支持给插槽设置默认值和作用域插槽，所以微信版本中组件的插槽能力受限。\n\n```axml\n<!-- 微信小程序本身不支持下面例子中这样的 给插槽设置默认值 -->\n<slot>默认值</slot>\n\n<!-- 微信小程序本身不支持下面例子中这样的 作用域插槽 -->\n<slot item=\"{{item}}\" index=\"{{index}}\"></slot>\n```\n\n2. 引入组件后，遇到 `[ WXML 文件编译错误] undefined？`、 `[ WXML 文件编译错误] WXML file not found: ./xxx` 相关报错。去掉 app.json 以下配置，试试。\n\n```diff\n{\n  \"pages\": [\n    \"pages/index/index\"\n  ],\n- \"componentFramework\": \"glass-easel\",\n- \"lazyCodeLoading\": \"requiredComponents\n}\n```\n\n## 已适配的组件列表\n\n以下是 antd-mini 中已经适配微信小程序的组件列表，您可以直接在项目中使用这些组件。\n\n<code src=\"../components/wechat-component.tsx\" inline=\"true\"></code>\n\n## 参考文档\n\n若需了解更多详情，可参考微信小程序关于 npm 支持的官方文档：\n\n[微信小程序文档：npm 支持](https://developers.weixin.qq.com/miniprogram/dev/devtools/npm.html)\n"
  },
  {
    "path": "docs/resources.en.md",
    "content": "---\nsidebar: true\ntoc: true\n---\n\n# Resources\n\nHere is a summary of resources related to Ant Design Mini.\n\n## Design Resources\n\nAnt Design Mini related design resources and design tools are available here for download. More design resources are being sorted out and improved.\n\n<ResourceCard title=\"Sketch Packages\" description=\"移动组件 Sketch 模板包\" link=\"https://gw.alipayobjects.com/os/bmw-prod/b5db6765-b75a-4c4f-975d-4ae23a696b04.sketch\" image=\"https://gw.alipayobjects.com/zos/bmw-prod/49ece2a4-b8c3-4e95-8d40-c67dc95c3d85.svg\"></ResourceCard>\n\n<ResourceCard title=\"Media Resources\" description=\"antd-mini 的 logo 和 banner\" link=\"https://gw.alipayobjects.com/os/bmw-prod/c00078ee-67aa-4170-be69-f4eaef2a579e.zip\" image=\"https://gw.alipayobjects.com/zos/bmw-prod/be366cde-85c9-401e-8a74-cf2126fd99eb.svg\"></ResourceCard>\n"
  },
  {
    "path": "docs/resources.md",
    "content": "---\nsidebar: true\ntoc: true\n---\n\n# 资源\n\n这里汇总了与 Ant Design Mini 相关资源\n\n## 设计资源\n\n这里提供 Ant Design Mini 相关设计资源和设计工具的下载，更多设计资源正在整理和完善中。\n\n<ResourceCard title=\"Sketch 组件包\" description=\"移动组件 Sketch 模板包\" link=\"https://gw.alipayobjects.com/os/bmw-prod/b5db6765-b75a-4c4f-975d-4ae23a696b04.sketch\" image=\"https://gw.alipayobjects.com/zos/bmw-prod/49ece2a4-b8c3-4e95-8d40-c67dc95c3d85.svg\"></ResourceCard>\n\n <ResourceCard title=\"媒体素材\" description=\"antd-mini 的 logo 和 banner\" link=\"https://gw.alipayobjects.com/os/bmw-prod/c00078ee-67aa-4170-be69-f4eaef2a579e.zip\" image=\"https://gw.alipayobjects.com/zos/bmw-prod/be366cde-85c9-401e-8a74-cf2126fd99eb.svg\"></ResourceCard>\n"
  },
  {
    "path": "mini.project.json",
    "content": "{\n  \"format\": 2,\n  \"compileOptions\": {\n    \"typescript\": true,\n    \"less\": true,\n    \"component2\": true,\n    \"enableNodeModuleBabelTransform\": true\n  },\n  \"uploadExclude\": [\n    \"dist/**/*\"\n  ],\n  \"miniprogramRoot\": \"compiled/alipay/demo\",\n  \"developOptions\": {\n    \"skipTranspile\": false,\n    \"minify\": false,\n    \"sourcemap\": false,\n    \"lazyCompile\": false\n  }\n}"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"antd-mini\",\n  \"version\": \"3.4.3\",\n  \"description\": \"antd-mini 是支付宝小程序 UI 组件库，遵循 Ant Design 规范。\",\n  \"miniprogram\": \"compiled/wechat/src\",\n  \"scripts\": {\n    \"dev\": \"tsx ./scripts/dev.ts\",\n    \"build:axml\": \"tsx ./scripts/compile-axml.ts\",\n    \"transform\": \"tsx ./scripts/transform.ts\",\n    \"generate\": \"tsx ./scripts/generate.ts\",\n    \"dev:doc\": \"rimraf node_modules/.cache && node ./scripts/dev-doc.js\",\n    \"build\": \"rimraf node_modules/.cache && npm run build:axml && node ./scripts/build.js\",\n    \"deploy:docs\": \"npm run build && echo 'mini.ant.design' > ./docs-dist/CNAME && gh-pages -d docs-dist\",\n    \"changelog\": \"auto-changelog -p --ignore-commit-pattern \\\"chore\\\\(release\\\\)\\\"\",\n    \"prepublishOnly\": \"npm run build\",\n    \"pub\": \"node scripts/publish.js\",\n    \"test\": \"vitest run\",\n    \"check-compiled\": \"tsx ./scripts/check-compiled.ts\",\n    \"cov\": \"vitest run --coverage && tsx ./scripts/patch-coverage.ts\",\n    \"local-pub:beta\": \"node scripts/quick-release.js beta\",\n    \"local-pub:alpha\": \"node scripts/quick-release.js alpha\",\n    \"local-pub:latest\": \"node scripts/quick-release.js latest\"\n  },\n  \"gitHooks\": {\n    \"pre-commit\": \"lint-staged\",\n    \"commit-msg\": \"node scripts/verifyCommitMsg.js\"\n  },\n  \"lint-staged\": {\n    \"*.ts\": [\n      \"eslint --ext .ts\"\n    ],\n    \"*.js\": [\n      \"eslint --ext .js\"\n    ]\n  },\n  \"dependencies\": {\n    \"@mini-types/alipay\": \"^3.0.5\",\n    \"@preact/signals-core\": \"^1.7.0\",\n    \"async-validator\": \"^4.0.7\",\n    \"dayjs\": \"1.11.7\",\n    \"fast-deep-equal\": \"3.1.3\",\n    \"lodash.filter\": \"^4.6.0\",\n    \"lodash.get\": \"^4.4.2\",\n    \"lodash.isfunction\": \"^3.0.9\",\n    \"lodash.kebabcase\": \"^4.1.1\",\n    \"lodash.reduce\": \"^4.6.0\",\n    \"pinyin-firstletter\": \"^1.0.2\",\n    \"tslib\": \"2.5.0\"\n  },\n  \"overrides\": {\n    \"get-func-name\": \"2.0.0\"\n  },\n  \"devDependencies\": {\n    \"@alipay/axml-transverter\": \"^1.0.1\",\n    \"@ant-design/cssinjs\": \"1.20.0\",\n    \"@ant-design/icons\": \"^5.3.6\",\n    \"@babel/code-frame\": \"^7.22.13\",\n    \"@babel/core\": \"^7.22.20\",\n    \"@babel/generator\": \"^7.22.15\",\n    \"@babel/parser\": \"^7.22.16\",\n    \"@babel/preset-env\": \"^7.22.20\",\n    \"@babel/preset-typescript\": \"^7.22.15\",\n    \"@babel/runtime\": \"7.22.3\",\n    \"@ctrl/tinycolor\": \"3.6.0\",\n    \"@diamondyuan/gulp-ifdef\": \"^0.3.0\",\n    \"@emotion/babel-preset-css-prop\": \"11.10.0\",\n    \"@emotion/css\": \"11.11.2\",\n    \"@emotion/react\": \"11.11.0\",\n    \"@emotion/server\": \"11.11.0\",\n    \"@galacean/effects\": \"^2.2.2\",\n    \"@swc/types\": \"0.1.12\",\n    \"@types/gulp\": \"^4.0.13\",\n    \"@types/less\": \"^3.0.3\",\n    \"@types/node\": \"20.14.2\",\n    \"@types/react\": \"^18.0.0\",\n    \"@types/react-dom\": \"^18.0.0\",\n    \"@types/through2\": \"^2.0.39\",\n    \"@typescript-eslint/eslint-plugin\": \"^5.6.0\",\n    \"@typescript-eslint/parser\": \"^5.6.0\",\n    \"@vitest/coverage-istanbul\": \"^1.5.0\",\n    \"antd\": \"~5.17.0\",\n    \"antd-token-previewer\": \"2.0.0-alpha.6\",\n    \"atropos\": \"^2.0.2\",\n    \"auto-changelog\": \"^2.4.0\",\n    \"chalk\": \"^4.1.0\",\n    \"classnames\": \"2.3.2\",\n    \"clone-deep\": \"^4.0.1\",\n    \"conventional-changelog-cli\": \"^2.1.1\",\n    \"copy-to-clipboard\": \"^3.3.3\",\n    \"deepmerge-ts\": \"^7.0.3\",\n    \"dumi\": \"^2.3.0\",\n    \"esbuild\": \"^0.19.2\",\n    \"eslint\": \"^8.4.1\",\n    \"eslint-config-ali\": \"^13.0.0\",\n    \"eslint-config-prettier\": \"^8.3.0\",\n    \"eslint-plugin-import\": \"^2.25.3\",\n    \"extract-changelog-release\": \"^1.0.2\",\n    \"framer-motion\": \"^12.0.1\",\n    \"gh-pages\": \"^3.0.0\",\n    \"glob\": \"^9.0.1\",\n    \"gulp\": \"^4.0.2\",\n    \"gulp-babel\": \"^8.0.0\",\n    \"gulp-changed\": \"^4.0.3\",\n    \"gulp-clean-css\": \"^4.0.0\",\n    \"gulp-debug\": \"^4.0.0\",\n    \"gulp-ifdef\": \"^0.2.0\",\n    \"gulp-inject-envs\": \"^1.0.0\",\n    \"gulp-less\": \"^5.0.0\",\n    \"gulp-rename\": \"^1.2.3\",\n    \"gulp-typescript\": \"^6.0.0-alpha.1\",\n    \"gulp-watch\": \"^5.0.1\",\n    \"inquirer\": \"^8.2.1\",\n    \"istanbul-lib-coverage\": \"^3.2.0\",\n    \"less\": \"^4.1.2\",\n    \"lint-staged\": \"^10.0.7\",\n    \"lodash.clonedeep\": \"4.5.0\",\n    \"lodash.set\": \"^4.3.2\",\n    \"lodash.throttle\": \"^4.1.1\",\n    \"merge2\": \"^1.4.1\",\n    \"minidev\": \"^1.0.7\",\n    \"postcss-less\": \"^6.0.0\",\n    \"pre-commit\": \"^1.2.2\",\n    \"prettier\": \"^2.2.1\",\n    \"prism-react-renderer\": \"^1.3.5\",\n    \"rc-drawer\": \"6.2.0\",\n    \"rc-footer\": \"0.6.8\",\n    \"rc-util\": \"5.41.0\",\n    \"react\": \"^18.0.0\",\n    \"react-copy-to-clipboard\": \"^5.1.0\",\n    \"react-dom\": \"^18.0.0\",\n    \"react-intersection-observer\": \"^9.13.1\",\n    \"resize-observer-polyfill\": \"^1.5.1\",\n    \"rimraf\": \"^6.0.1\",\n    \"shallowequal\": \"^1.1.0\",\n    \"stylelint\": \"^14.1.0\",\n    \"stylelint-config-standard\": \"^24.0.0\",\n    \"tsx\": \"^4.6.2\",\n    \"typescript\": \"^4.0.0\",\n    \"vitest\": \"^1.5.0\",\n    \"yorkie\": \"^2.0.0\"\n  },\n  \"files\": [\n    \"es\",\n    \"less\",\n    \"compiled/wechat/src\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/ant-design/ant-design-mini.git\",\n    \"branch\": \"master\",\n    \"platform\": \"github\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/ant-design/ant-design-mini/issues\"\n  },\n  \"keywords\": [\n    \"ant-mini\",\n    \"mini-program\",\n    \"mini-ali-ui\",\n    \"mini-antui\",\n    \"alipay\"\n  ],\n  \"license\": \"MIT\",\n  \"homepage\": \"https://github.com/ant-design/ant-design-mini\"\n}"
  },
  {
    "path": "project.config.json",
    "content": "{\n  \"description\": \"Ant Design Mini 示例小程序\",\n  \"miniprogramRoot\": \"compiled/wechat/\",\n  \"compileType\": \"miniprogram\",\n  \"libVersion\": \"3.0.1\",\n  \"packOptions\": {\n    \"ignore\": [],\n    \"include\": []\n  },\n  \"setting\": {\n    \"packNpmManually\": true,\n    \"packNpmRelationList\": [\n      {\n        \"packageJsonPath\": \"compiled/wechat/package.json\",\n        \"miniprogramNpmDistDir\": \"compiled/wechat\"\n      }\n    ],\n    \"babelSetting\": {\n      \"ignore\": [],\n      \"disablePlugins\": [],\n      \"outputPath\": \"\"\n    },\n    \"ignoreDevUnusedFiles\": false,\n    \"ignoreUploadUnusedFiles\": false,\n    \"es6\": true,\n    \"enhance\": true,\n    \"postcss\": false,\n    \"minified\": true\n  },\n  \"condition\": {},\n  \"editorSetting\": {\n    \"tabIndent\": \"insertSpaces\",\n    \"tabSize\": 2\n  },\n  \"useCompilerPlugins\": [\n    \"typescript\",\n    \"less\"\n  ],\n  \"srcMiniprogramRoot\": \"wechat/\",\n  \"projectname\": \"antd\",\n  \"simulatorPluginLibVersion\": {},\n  \"appid\": \"\"\n}\n"
  },
  {
    "path": "scripts/axml/index.ts",
    "content": "import { TransformCompiler as axmlParser } from '@alipay/axml-transverter';\n\nexport { wechatCustomMapping } from './mapping';\n\nexport default axmlParser;\n"
  },
  {
    "path": "scripts/axml/mapping.ts",
    "content": "export const wechatCustomMapping = {\n  view: {\n    onTouchStart: 'bindtouchstart',\n    onTouchMove: 'bindtouchmove',\n    onTouchEnd: 'bindtouchend',\n    catchTouchStart: 'catchtouchstart',\n    catchTouchMove: 'catchtouchmove',\n    catchTouchEnd: 'catchtouchend',\n    onAnimationEnd: 'bindanimationend',\n  },\n  'scroll-view': {\n    onTouchStart: 'binddragstart',\n    onTouchMove: 'binddragging',\n    onTouchEnd: 'binddragend',\n    onScroll: 'bindscroll',\n    onScrollToUpper: 'bindscrolltoupper',\n    onScrollToLower: 'bindscrolltolower',\n  },\n  input: {\n    onInput: 'bindinput',\n    onConfirm: 'bindconfirm',\n    onFocus: 'bindfocus',\n    onBlur: 'bindblur',\n    onKeyboardHeightChange: 'bindkeyboardheightchange',\n    onNicknameReview: 'bindnicknamereview',\n  },\n  textarea: {\n    onInput: 'bindinput',\n    onConfirm: 'bindconfirm',\n    onFocus: 'bindfocus',\n    onBlur: 'bindblur',\n  },\n  'ant-checkbox-group': {\n    onChange: 'bindchange',\n  },\n  'ant-button': {\n    onDisabledTap: 'binddisabledtap',\n  },\n  'ant-textarea': {\n    onChange: 'bindchange',\n  },\n  'ant-slider': {\n    onAfterChange: 'bindafterchange',\n  },\n  'ant-input': {\n    onBlur: 'bindblur',\n    onConfirm: 'bindconfirm',\n    onFocus: 'bindfocus',\n    onChange: 'bindchange',\n  },\n  'ant-popup': {\n    onClose: 'bindclose',\n    onAfterShow: 'bindaftershow',\n    onAfterClose: 'bindafterclose',\n    onClickBack: 'bindclickback',\n  },\n  'ant-picker': {\n    onOk: 'bindok',\n    onCancel: 'bindcancel',\n  },\n  'ant-cascader-picker': {\n    onOk: 'bindok',\n    onCancel: 'bindcancel',\n  },\n  'ant-date-picker': {\n    onCancel: 'bindcancel',\n    onOk: 'bindok',\n    onPickerChange: 'bindpickerchange',\n  },\n  'ant-selector': {\n    onSelectMin: 'bindselectmin',\n    onSelectMax: 'bindselectmax',\n  },\n  'ant-guide-tour': {\n    onCancel: 'bindcancel',\n  },\n  'ant-uploader': {\n    onPreview: 'bindpreview',\n  },\n  'ant-range-picker': {\n    onOk: 'bindok',\n  },\n  'ant-action-sheet': {\n    onAction: 'bindaction',\n    onClose: 'bindclose',\n  },\n  'ant-toast': {\n    onClose: 'bindclose',\n  },\n  'rare-words-keyboard': {\n    onClose: 'bindclose',\n    onError: 'binderror',\n  },\n  'ant-rare-words-keyboard': {\n    onChange: 'bindchange',\n    onClose: 'bindclose',\n    onError: 'binderror',\n  },\n  'ant-modal': {\n    onPrimaryButtonTap: 'bindprimarybuttontap',\n    onSecondaryButtonTap: 'bindsecondarybuttontap',\n    onCancelButtonTap: 'bindcancelbuttontap',\n    onClose: 'bindclose',\n  },\n  'ant-dialog': {\n    onClose: 'bindclose',\n    onButtonTap: 'bindbuttontap',\n  },\n  'number-keyboard': {\n    onClose: 'bindclose',\n  },\n  'ant-number-keyboard': {\n    onClose: 'bindclose',\n  },\n  'movable-view': {\n    onChange: 'bindchange',\n    onChangeEnd: 'bindchangeend',\n    catchTouchEnd: 'catchtouchend',\n    onTouchCancel: 'bindtouchcancel',\n    catchTouchStart: 'catchtouchstart',\n  },\n  'ant-swipe-action': {\n    onSwipeEnd: 'bindswipeend',\n    onSwipeStart: 'bindswipestart',\n    onButtonTap: 'bindbuttontap',\n  },\n  'ant-popover': {\n    onVisibleChange: 'bindvisiblechange',\n    onTapAction: 'bindtapaction',\n  },\n  'ant-popover-list': {\n    onVisibleChange: 'bindvisiblechange',\n    onTapItem: 'bindtapitem',\n  },\n  'ant-feedback': {\n    onVisibleChange: 'bindvisiblechange',\n    onTapFeedItem: 'bindtapfeeditem',\n  },\n  'ant-mask': {\n    onMaskTap: 'bindmasktap',\n  },\n  'ant-sticky': {\n    onStickyChange: 'bindstickychange',\n    onGetHeaderHeight: 'bindgetheaderheight',\n  },\n  'ant-card': {\n    onOperateClick: 'bindoperateclick',\n    onFoldChange: 'bindfoldchange',\n    onTitleSticky: 'bindtitlesticky',\n  },\n  'ant-icon': {\n    catchTap: 'catchtap',\n    onTap: 'bindtap',\n  },\n  'ant-grid': {\n    onTap: 'bindtap',\n    onFirstAppear: 'bindfirstappear',\n  },\n  'ant-countdown': {\n    onCountdownChange: 'bindcountdownchange',\n    onCountdownFinish: 'bindcountdownfinish',\n  },\n  'ant-voucher': {\n    onBtnTap: 'bindbtntap',\n    onVoucherTap: 'bindvouchertap',\n  },\n  'ant-typography': {\n    onTap: 'bindtap',\n    catchTap: 'catchtap',\n    onDisabledTap: 'binddisabledtap',\n  },\n  'ant-page-container': {\n    onActionTap: 'bindactiontap',\n    onSecondaryActionTap: 'bindsecondaryactiontap',\n  },\n  'ant-footer': {\n    onLinkTap: 'bindlinktap',\n    onChipTap: 'bindchiptap',\n  },\n  'ant-terms': {\n    onButtonTap: 'bindbuttontap',\n    onTermTap: 'bindtermtap',\n    onCheckChange: 'bindcheckchange',\n    onTermPrefixTap: 'bindtermprefixtap',\n    onCountdownFinish: 'bindcountdownfinish',\n    onReadChange: 'bindreadchange',\n  },\n  'ant-number-input': {\n    onChange: 'bindchange',\n    onLinkTap: 'bindlinktap',\n  },\n  'ant-postscript': {\n    onChange: 'bindchange',\n  },\n  'ant-select-contact': {\n    onSelect: 'bindselect',\n  },\n  'ant-empty': {\n    onClickButton: 'bindclickbutton',\n  },\n  'ant-prompts': {\n    onItemTap: 'binditemtap',\n  },\n  'ant-conversations': {\n    onItemTap: 'binditemtap',\n    onMenuItemTap: 'bindmenuitemtap',\n  },\n  'ant-thought-chain': {\n    onExpand: 'bindexpand',\n    onContentTap: 'bindcontenttap'\n  },\n  'ant-actions': {\n    onItemTap: 'binditemtap',\n  },\n  'ant-bubble': {\n    onTypingComplete: 'bindtypingcomplete',\n  },\n  'ant-sender': {\n    onChange: 'bindchange',\n    onSubmit: 'bindsubmit',\n    onCancel: 'bindcancel',\n  },\n};\n"
  },
  {
    "path": "scripts/build.js",
    "content": "const path = require('path');\nconst { fork } = require('child_process');\nconst { minidev } = require('minidev');\nconst fs = require('fs');\nconst compile = require('./compile');\nconst getSourceCode = require('./getSourceCode');\n\nasync function buildMiniProgram() {\n  const cache = path.join(__dirname, '../.cache');\n  if (fs.existsSync(cache)) {\n    fs.rmdirSync(cache, {\n      recursive: true,\n    });\n  }\n  await minidev.build({\n    project: path.join(__dirname, '../'),\n    output: path.join(__dirname, '../dist'),\n    enableLess: true,\n    enableTypescript: true,\n    cacheDir: cache,\n  });\n  const colorFilename = path.join(\n    __dirname,\n    '../compiled/alipay/src/style/themes/color.less'\n  );\n  const colorContent = await fs.promises.readFile(colorFilename, 'utf-8');\n  const appJSONFilename = path.join(\n    __dirname,\n    '../compiled/alipay/demo/app.json'\n  );\n  const appJSONContent = await fs.promises.readFile(appJSONFilename, 'utf-8');\n  await fs.promises.writeFile(\n    colorFilename,\n    colorContent.replace('default', 'dark')\n  );\n  await fs.promises.writeFile(\n    appJSONFilename,\n    appJSONContent.replace('#FFFFFF', '#000000')\n  );\n  if (fs.existsSync(cache)) {\n    fs.rmdirSync(cache, {\n      recursive: true,\n    });\n  }\n  await minidev.build({\n    project: path.join(__dirname, '../'),\n    output: path.join(__dirname, '../dist-theme-dark'),\n    enableLess: true,\n    enableTypescript: true,\n    cacheDir: cache,\n  });\n  await fs.promises.writeFile(colorFilename, colorContent);\n  await fs.promises.writeFile(appJSONFilename, appJSONContent);\n}\n\nfunction buildDocs() {\n  return new Promise((resolve, reject) => {\n    const child = fork(\n      `${process.cwd()}/node_modules/dumi/bin/dumi.js`,\n      ['build'],\n      {\n        env: {\n          NODE_OPTIONS: '--openssl-legacy-provider',\n          FORCE_COLOR: 1,\n        },\n      }\n    );\n    child.on('close', (code) => {\n      if (code !== 0) {\n        reject();\n      }\n      resolve();\n    });\n    process.on('exit', () => {\n      child.kill();\n    });\n  });\n}\n\nasync function getPagesSourceCode(pages, theme, platform) {\n  const sourceCode = {};\n  const arr = await Promise.all(\n    pages.map((item) =>\n      getSourceCode({\n        page: item,\n        theme,\n        platform,\n      })\n    )\n  );\n  arr.forEach((item) => {\n    Object.assign(sourceCode, item);\n  });\n  return sourceCode;\n}\n\nasync function buildPreview(theme = 'default') {\n  const list = ['appConfig.json', 'index.html', 'index.js', 'index.worker.js'];\n  const dist = {};\n  list.forEach((item) => {\n    const content = fs.readFileSync(\n      path.join(\n        __dirname,\n        theme === 'dark' ? '../dist-theme-dark/ng-main' : '../dist/ng-main',\n        item\n      ),\n      'utf-8'\n    );\n    dist[item] = content;\n  });\n  const appJSONFilename = path.join(\n    __dirname,\n    '../compiled/alipay/demo/app.json'\n  );\n  const appConfig = require(appJSONFilename);\n  const pages = appConfig.pages;\n  const iframeContent = fs.readFileSync(\n    path.join(__dirname, '../.dumi/theme/builtins/iframe.html'),\n    'utf-8'\n  );\n  const codeIframeContent = fs.readFileSync(\n    path.join(__dirname, '../.dumi/theme/builtins/code.html'),\n    'utf-8'\n  );\n  fs.writeFileSync(\n    path.join(\n      __dirname,\n      `../docs-dist/preview${theme === 'dark' ? '-theme-dark' : ''}.json`\n    ),\n    JSON.stringify({\n      dist,\n      sourceCode: {\n        alipay: await getPagesSourceCode(pages, theme, 'alipay'),\n        wechat: await getPagesSourceCode(pages, theme, 'wechat'),\n      },\n    })\n  );\n  if (theme === 'dark') {\n    return;\n  }\n  fs.writeFileSync(\n    path.join(__dirname, '../docs-dist/code.html'),\n    codeIframeContent\n  );\n  fs.writeFileSync(\n    path.join(__dirname, '../docs-dist/preview.html'),\n    iframeContent\n  );\n  fs.mkdirSync(path.join(__dirname, '../docs-dist/mini'));\n  const packageInfo = {};\n  fs.writeFileSync(\n    path.join(__dirname, '../docs-dist/mini/packageInfo.json'),\n    JSON.stringify(packageInfo)\n  );\n}\n\n(async () => {\n  try {\n    await compile();\n    await Promise.all([buildMiniProgram(), buildDocs()]);\n    await Promise.all([buildPreview(), buildPreview('dark')]);\n    console.log('build success!');\n  } catch (err) {\n    console.log(err);\n    process.exit(1);\n  }\n})();\n"
  },
  {
    "path": "scripts/check-compiled.ts",
    "content": "/* eslint-disable no-console */\nimport { exec } from 'child_process';\nimport { join } from 'path';\n\n// 设置你的compiled目录的相对路径\nconst compiledDir = join(__dirname, '../compiled');\n\n// 执行git status命令\nexec(\n  'git status --porcelain',\n  { cwd: compiledDir },\n  (error, stdout, stderr) => {\n    if (error) {\n      console.error(`执行出错: ${error}`);\n      return;\n    }\n    if (stderr) {\n      console.error(`错误信息: ${stderr}`);\n      return;\n    }\n\n    // 分析git status的输出\n    if (stdout.trim() === '') {\n      console.log('所有文件都已添加到git。');\n    } else {\n      console.log('以下文件未添加到git或有变动：');\n      // 输出未跟踪或变动的文件列表\n      const lines = stdout.split('\\n');\n      lines.forEach((line) => {\n        if (line) {\n          // 输出文件状态和名称\n          const [status, file] = line.trim().split(/\\s+/);\n          console.log(`${status} ${file}`);\n        }\n      });\n      process.exit(1);\n    }\n  }\n);\n"
  },
  {
    "path": "scripts/compile-axml.ts",
    "content": "import { compileAntdMini } from './mini-compiler';\n\ncompileAntdMini(false);\n"
  },
  {
    "path": "scripts/compile.js",
    "content": "/* eslint-disable @typescript-eslint/no-var-requires */\nconst path = require('path');\nconst gulp = require('gulp');\nconst less = require('gulp-less');\nconst rename = require('gulp-rename');\nconst cleanCss = require('gulp-clean-css');\nconst ts = require('gulp-typescript');\nconst merge = require('merge2');\n\nfunction series(tasks, output) {\n  const src = path.join(__dirname, '../compiled/alipay/src');\n  gulp.task('less', () =>\n    gulp\n      .src(`${src}/**/index.less`)\n      .pipe(less())\n      // eslint-disable-next-line no-console\n      .on('error', (e) => {\n        console.error(e);\n        process.exit(1);\n      })\n      .pipe(cleanCss())\n      .pipe(\n        rename({\n          extname: '.acss',\n        })\n      )\n      .pipe(gulp.dest(output))\n  );\n\n  gulp.task('less-raw', () =>\n    gulp.src(`${src}/**/*.less`).pipe(gulp.dest(output))\n  );\n\n  gulp.task('json', () => gulp.src(`${src}/**/*.json`).pipe(gulp.dest(output)));\n\n  gulp.task('axml', () => gulp.src(`${src}/**/*.axml`).pipe(gulp.dest(output)));\n\n  gulp.task('sjs', () => gulp.src(`${src}/**/*.sjs`).pipe(gulp.dest(output)));\n\n  gulp.task('ts', () => {\n    const tsResult = gulp\n      .src([`${src}/**/*.ts`, `!${src}/**/__tests__/*.ts`])\n      .pipe(ts.createProject(path.join(__dirname, '../tsconfig.json'))())\n      .on('error', (err) => {\n        console.log(err);\n        process.exit(1);\n      });\n    return merge([\n      tsResult.dts.pipe(gulp.dest(output)),\n      tsResult.js.pipe(gulp.dest(output)),\n    ]);\n  });\n\n  return new Promise((resolve) => gulp.series(...tasks, resolve)());\n}\n\nmodule.exports = () =>\n  Promise.all([\n    series(\n      ['ts', 'less', 'json', 'axml', 'sjs'],\n      path.join(__dirname, '../es')\n    ),\n    series(\n      ['ts', 'less-raw', 'json', 'axml', 'sjs'],\n      path.join(__dirname, '../less')\n    ),\n  ]);\n"
  },
  {
    "path": "scripts/copy.ts",
    "content": "import * as ofs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\n\nconst rootDir = path.resolve(__dirname, '..');\n\nexport function copyDirSourceCode(sourceDir: string) {\n  console.log(sourceDir);\n  const files = ofs.readdirSync(\n    path.resolve(rootDir, 'scripts/tsxml/fixtures')\n  );\n  const examples = files\n    .map((file) => {\n      if (!file.endsWith('.tsx')) {\n        return;\n      }\n      const tsx = ofs.readFileSync(\n        path.resolve(rootDir, 'scripts/tsxml/fixtures', file),\n        'utf-8'\n      );\n\n      const axml = ofs.readFileSync(\n        path.resolve(\n          rootDir,\n          'scripts/tsxml/fixtures',\n          'snapshot',\n          file.replace('.tsx', '.axml')\n        ),\n        'utf-8'\n      );\n      return `\n转换例子:\naxml\n${markdownCode(axml)}\ntsx\n${markdownCode(tsx)}\n  `.trim();\n    })\n    .filter(Boolean)\n    .join('\\n\\n');\n\n  const json = tryRead(path.resolve(sourceDir, 'index.json'));\n  const props = tryRead(path.resolve(sourceDir, 'props.ts'));\n  const axml = tryRead(path.resolve(sourceDir, 'index.axml'));\n\n  const isComponent = !!props;\n\n  const randomPath = path.resolve(\n    os.tmpdir(),\n    Math.random().toString(36).slice(2)\n  );\n\n  ofs.writeFileSync(\n    randomPath,\n    `\n  ${examples}\n\n请参考上面的例子，学习 axml 是如何转换为 tsx 的。\n然后将我写的 axml 转换为 tsx。\n\n下面是一些额外的要求, 请仔细阅读。\n\n  1. 不要写 import React from 'react';\n  2. 分析 json 的内容。 如果组件在 usingComponents 中存在, 则从正确的位置导入。\n\n    2.1 比如 <component-name />  就需要写 import ComponentName from 'component_path.axml'; component 的名字需要改成驼峰。\n    2.2 导入 component 的时候，需要以 .axml 结尾。 例如 \"component-name\": \"component_path\"  就需要写 import ComponentName from 'component_path.axml';\n\n  3. 如果组件不存在，就从 tsxml 导入, 比如 <view / > 就需要写 import { View } from 'tsxml';\n  4. 请不要擅自将 class 转换为 className, 请保持原样\n  5. 参考下面的代码，如果用户使用的 slot 有默认值, 需要在 slob 标签的前后加上 if alipay 的注释。\n   ${markdownCode(`\n   {/* #if ALIPAY */}\n   <Slot name=\"extraBrief\">\n     {/* #endif */}\n\n     {extraBrief}\n\n     {/* #if ALIPAY */}\n   </Slot>\n   {/* #endif */}`)}\n\n   请加上注释。 不要使用三元表达式\n\n   6. 所有的事件处理保持字符串, 例如 <view onClick=\"onClick\" />.  ref 也是一样 <view ref=\"handleRef\" />\n\n  ${\n    isComponent\n      ? `7. 你需要学习 props 的内容\n\n      7.1 你需要从 props 的代码里获取 props 的名字。然后 在生成的 tsx 里面添加正确的导入\n      7.2 请不要自己定义 props 类型，而是从 './props' 导入，举例子 import { IconProps } from 'tsxml';\n      7.3 注意, IconProps 只是举个例子，要写的是正确的 props 的名字。 在使用的时候，不要忘记用 TSXMLProps 包一层。\n      7.3 对于 props 上为使用到的变量，请忽略\n      7.4 对于 props 里未声明的变量，请使用 InternalData\n\n        import { InternalData } from 'tsxml'\n        export default (\n          { className, style, imageMode, maxCount }: IUploaderProps,\n          { value }: InternalData\n        )\n      7.5. 请直接从 props 解构获取数据，而不是声明 props 变量。\n\n        <Text style={style} /> 而不是 <Text style={props.style} />\n        `\n      : ''\n  }\n  8. Adjust the style field to use a string instead of an object in the TSX code. For example, style=\"color: red; font-size: 12px;\" instead of style={{ color: 'red', fontSize: '12px' }}\n  9. import-sjs 转化为 import.  比如 <import-sjs from=\"./scroll.sjs\" name=\"scroll\"></import-sjs>  转化为  import scroll from './scroll.sjs'\n  10. 组件的 prop 字段。如果在 axml 中使用了 class , 在转换后请保持 class。 而不是转换为 className\n  11. 组件的 style 字段，请不要使用对象。 请使用字符串。 例如 style=\"color: red; font-size: 12px;\"\n  12. 组件最外层需要用 ${isComponent ? `<Component / >` : `<Page />`} 。\n  13. 输出结果里不要有 a:if\n  ${\n    !isComponent\n      ? `14. 所有在 \"{{variableName}}\" 里声明的变量, 全部放到 InternalData 里\n\n      <Modal visible=\"{{basicVisible}}\" /> 转换后应该是 ({ basicVisible }: InternalData) => <Modal visible={basicVisible} >\n      `\n      : ''\n  }\n  Take a deep breath and work on this problem step-by-step.\n  Finally, please return the complete result of tsx at one time. Instead of returning import and code separately.\n  ${JSON.stringify({ json, props, axml }, null, 2)}\n  `\n  );\n  console.log(randomPath);\n}\n\nfunction tryRead(filePath: string) {\n  try {\n    return ofs.readFileSync(filePath, 'utf-8');\n  } catch (error) {\n    return '';\n  }\n}\n\nfunction markdownCode(content: string) {\n  return `\n\\`\\`\\`\n${content}\n\\`\\`\\`\n  `.trim();\n}\n"
  },
  {
    "path": "scripts/create-config.js",
    "content": "const fs = require('fs/promises');\nconst { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, statSync } = require('fs');\nconst path = require('path');\n\n\nfunction getFilesWithIdentifiers(dir) {\n  const results = [];\n  // 定义递归函数\n  function walk(currentDir) {\n    const files = readdirSync(currentDir); // 读取当前目录下的所有文件和文件夹\n\n    files.forEach(file => {\n      const fullPath = path.join(currentDir, file); // 构造文件/文件夹的完整路径\n      const stat = statSync(fullPath); // 获取文件/文件夹的状态\n\n      if (stat.isDirectory()) {\n        // 如果是文件夹，递归进入该文件夹\n        walk(fullPath);\n      } else {\n        // 如果是文件，生成标识并存储\n        const relativePath = path.relative(dir, fullPath); // 获取相对于根目录的相对路径\n        const identifier = relativePath.split(path.sep).slice(0, -1).join('/'); // 提取文件夹路径作为标识\n\n        const r = identifier || path.basename(dir)\n        results.indexOf(r) === -1 && results.push(r)\n      }\n    });\n  }\n\n  // 开始递归遍历\n  walk(dir);\n\n  return results;\n}\n\nasync function createConfig() {\n  // 确保config目录存在\n  const configDirs = [\n    'config',\n    'config/wechat',\n    'config/alipay',\n  ];\n\n  configDirs.forEach(dir => {\n    const dirPath = path.resolve(__dirname, '..', dir);\n    if (!existsSync(dirPath)) {\n      mkdirSync(dirPath, { recursive: true });\n    }\n  });\n\n  // 删除配置文件\n  await Promise.all(\n    [\n      'config/alipay/app.json',\n      'config/wechat.json',\n      'config/wechat/app.json',\n    ].map((dir) => {\n      return fs.rm(path.resolve(__dirname, '..', dir), {\n        recursive: true,\n        force: true,\n      });\n    })\n  );\n  const getComponentsList = async (componentType = 'src', platform = 'wechat') => {\n    const componentsList = (await fs.readdir(path.resolve(__dirname, '..', componentType)))\n      .filter((file) => {\n        if (file[0] === '.') return false;\n        const mdFilePath = path.resolve(__dirname, '..', componentType, file, 'index.md');\n        // 如果没有markdown文件，进入白名单\n        if (!existsSync(mdFilePath)) return true;\n        const markdownContent = readFileSync(mdFilePath, { encoding: 'utf-8' });\n        // 匹配supportPlatform: 后面的数组值\n        const regex = /supportPlatform:\\s*\\[(.*?)\\]/s;\n        const match = markdownContent.match(regex);\n        if (match) {\n          const platformsStr = match[1];\n          const platforms = platformsStr.split(',').map(p => p.trim().replace(/['\"]/g, ''));\n          if (!platforms.includes(platform)) return false;\n        }\n        return true;\n      });\n    return componentsList;\n  }\n  /** 生成平台配置文件 **/\n  // 获取微信平台支持的组件列表\n  const wechatFiles = [...(await getComponentsList('src', 'wechat')), ...(await getComponentsList('copilot', 'wechat'))]\n\n  // 生成微信平台配置\n  writeFileSync(path.resolve(__dirname, '..', 'config', 'wechat.json'), JSON.stringify({\n    src: wechatFiles,\n  }, null, 2), 'utf8')\n\n  const wechatAppJsonList = [];\n\n  const getDemoPageFiles = async (demoDir = 'demo') => {\n    // 获取demo文件列表\n    const demoPageFiles = await getFilesWithIdentifiers(path.resolve(__dirname, '..', demoDir, 'pages'));\n    const appJsonList = wechatAppJsonList\n    const platformFiles = wechatFiles\n\n    // 遍历页面\n    demoPageFiles.map(fileName => {\n      platformFiles.forEach(name => {\n        if (fileName.startsWith(`${name}/`) || fileName === name) {\n          appJsonList.push(fileName);\n        }\n      })\n    })\n    return demoPageFiles;\n  }\n\n\n  const demoPageFiles = [...(await getDemoPageFiles('demo')), ...(await getDemoPageFiles('copilot-demo'))];\n\n\n  /** 生成config/wechat/app.json */\n  writeFileSync(path.resolve(__dirname, '..', 'config', 'wechat', 'app.json'), JSON.stringify({\n    \"darkmode\": true,\n    pages: ['demo/pages/index/index', ...wechatAppJsonList.filter(item => item !== 'index').map(fileName => `demo/pages/${fileName}/index`)],\n  }, null, 2), 'utf8');\n\n  /** 生成config/alipay/app.json */\n  writeFileSync(path.resolve(__dirname, '..', 'config', 'alipay', 'app.json'), JSON.stringify({\n    \"darkmode\": true,\n    \"window\": {\n      \"enableWK\": \"YES\",\n      \"enableDSL\": \"YES\",\n      \"enableJSC\": \"YES\",\n      \"defaultTitle\": \"小程序版 antd-mini 库\",\n      \"titleBarColor\": \"#ffffff\",\n      \"pullRefresh\": false,\n      \"allowsBounceVertical\": false,\n      \"enableInPageRenderInput\": \"YES\"\n    },\n    \"lazyCodeLoading\": \"requiredComponents\",\n    \"debug\": true,\n    pages: ['pages/index/index', ...demoPageFiles.filter(item => item !== 'pages').map(fileName => `pages/${fileName}/index`).filter(item => item !== 'pages/index/index')],\n  }, null, 2), 'utf8');\n}\nmodule.exports = createConfig;\n"
  },
  {
    "path": "scripts/dev-doc.js",
    "content": "const { fork, spawn } = require('child_process');\nconst { minidev } = require('minidev');\nconst chalk = require('chalk');\nconst createConfigJson = require('./create-config');\nconst { existsSync } = require('fs');\n\n(async () => {\n  const path = require('path');\n  await createConfigJson();\n  // 如果本地开发时发现没有compiled文档，则提示先进行build操作\n  if (!existsSync(path.resolve(__dirname, '..', 'compiled'))) {\n    console.log('本地没有compiled文件夹，请先执行npm run dev');\n    return;\n  }\n  const { devServer } = await minidev.dev({\n    project: path.join(__dirname, '../'),\n  });\n\n  let server;\n\n  devServer.on('done', () => {\n    if (server) {\n      return;\n    }\n    server = true;\n    fork(`${process.cwd()}/node_modules/dumi/bin/dumi.js`, ['dev'], {\n      env: {\n        NODE_OPTIONS: '--openssl-legacy-provider',\n        FORCE_COLOR: 1,\n        SERVER: devServer.server,\n        DUMI_CACHE: 'none',\n      },\n    });\n\n    // console.log(\n    //   chalk.blue.bold('\\nStarting Compiler src path code to compiled path...')\n    // );\n    // const child = spawn('tsx', [`${process.cwd()}/scripts/dev.ts`]);\n    // child.stdout.on('data', (data) => {\n    //   console.log(`\\nCompiler src path code to compiled: ${data}`);\n    // });\n\n    // child.stderr.on('data', (data) => {\n    //   console.error(`\\nCompiler src path code to compiled error: ${data}`);\n    // });\n\n    // child.on('close', (code) => {\n    //   console.error(`\\nCompiler src path code to compiled exit: ${code}`);\n    // });\n  });\n\n  devServer.on('error', (err) => {\n    console.log(err);\n  });\n})();\n"
  },
  {
    "path": "scripts/dev.ts",
    "content": "import { compileAntdMini } from './mini-compiler';\n\ncompileAntdMini(true);\n"
  },
  {
    "path": "scripts/generate.ts",
    "content": "import * as fs from 'fs';\nimport { globSync } from 'glob';\nimport * as path from 'path';\n\nconst __dirname = new URL('.', import.meta.url).pathname;\nconst rootDir = path.resolve(__dirname, '../');\n\nfunction readFile(filePath) {\n  let res = '';\n  try {\n    res = fs.readFileSync(filePath, 'utf-8');\n  } catch (error) {\n    // 忽略\n  }\n  return res;\n}\n\nfunction parseSrc(fileName, sourceRoot, targetRoot) {\n  const tsx = fs.readFileSync(path.resolve(sourceRoot, fileName), 'utf-8');\n  const props = readFile(\n    path.resolve(sourceRoot, path.dirname(fileName), 'props.ts')\n  );\n  const json = readFile(\n    path.resolve(sourceRoot, path.dirname(fileName), 'index.json')\n  );\n  const axml = fs.readFileSync(\n    path.resolve(targetRoot, fileName.replace('.tsx', '')),\n    'utf-8'\n  );\n  return {\n    prompt: 'transform axml to tsx',\n    input: {\n      props,\n      axml,\n      json,\n    },\n    output: tsx,\n  };\n}\n\nconst run = async () => {\n  const componentRoot = path.resolve(rootDir, './src');\n  const alipayComponentRoot = path.resolve(rootDir, 'compiled/alipay/src');\n  const componentFiles = globSync('**/*.axml.tsx', {\n    cwd: componentRoot,\n  });\n  const components = await Promise.all(\n    componentFiles.map((fileName) =>\n      parseSrc(fileName, componentRoot, alipayComponentRoot)\n    )\n  );\n\n  const demoRoot = path.resolve(rootDir, './demo');\n  const alipayDemoRoot = path.resolve(rootDir, 'compiled/alipay/demo');\n  const demoFiles = globSync('**/*.axml.tsx', {\n    cwd: demoRoot,\n  });\n  const demos = await Promise.all(\n    demoFiles.map((fileName) => parseSrc(fileName, demoRoot, alipayDemoRoot))\n  );\n  await fs.writeFileSync(\n    path.resolve(rootDir, 'knowledge.json'),\n    JSON.stringify(components.concat(demos), null, 2)\n  );\n};\n\nrun();\n"
  },
  {
    "path": "scripts/getSourceCode.js",
    "content": "const fs = require('fs');\nconst path = require('path');\nconst { glob } = require('glob');\nconst less = require('less');\n\nfunction getFileContent(file) {\n  return fs.promises.readFile(file, 'utf-8');\n}\n\nfunction lessCompile(filename, theme) {\n  return fs.promises.readFile(filename, 'utf-8').then(\n    (content) =>\n      new Promise((resolve, reject) => {\n        less.render(\n          content,\n          {\n            filename,\n            modifyVars: {\n              theme,\n            },\n          },\n          (e, output) => {\n            if (e) {\n              reject(e);\n            }\n            resolve(output.css);\n          }\n        );\n      })\n  );\n}\n\nmodule.exports = async function getSourceCode({ page, theme, platform }) {\n  const map = {\n    '.js': getFileContent,\n    '.ts': getFileContent,\n    '.axml': getFileContent,\n    '.wxml': getFileContent,\n    '.acss': getFileContent,\n    '.wxss': getFileContent,\n    '.less': lessCompile,\n    '.sjs': getFileContent,\n    '.wxs': getFileContent,\n    '.json': getFileContent,\n  };\n\n  const platformDir = platform === 'wechat' ? 'wechat' : 'alipay';\n\n  const cwd = path.join(\n    __dirname,\n    '..',\n    'compiled',\n    platformDir,\n    'demo',\n    page,\n    '../'\n  );\n  const json = {};\n  const list = (\n    await glob('**/*.+(js|axml|acss|less|sjs|json|wxml|wxss|wxs)', {\n      cwd,\n    })\n  ).map(async (item) => {\n    const content = await map[path.extname(item)](path.join(cwd, item));\n\n    let componentBase = '$1antd-mini';\n    if (platform === 'alipay') {\n      componentBase = '$1antd-mini/es';\n    }\n\n    json[path.join(page, '../', item).replace('.less', '.acss')] =\n      content.replace(/('|\")[^'\"]*\\/src/g, componentBase);\n  });\n  await Promise.all(list);\n  return json;\n};\n"
  },
  {
    "path": "scripts/github/cli.js",
    "content": "module.exports = async (type, { github, context, core }) => {\n  if (type === 'dist-tag') {\n    const commentContent = process.env.COMMENT_CONTENT;\n    if (!commentContent) {\n      throw new Error('COMMENT_CONTENT is required');\n    }\n    const argv = commentContent.split(' ').slice(1);\n    const distTag = argv[0];\n    if (['alpha', 'beta', 'dev'].includes(distTag)) {\n      return distTag;\n    }\n    return 'latest';\n  }\n};\n"
  },
  {
    "path": "scripts/github/createIssueCommentPrNextResult.js",
    "content": "const { createVersionText } = require('./helpers');\n\nmodule.exports = async ({ github, context, core }) => {\n  const commentBody = createVersionText('PR Next', process.env.DIST_VERSION, context);\n\n  await github.rest.issues.createComment({\n    issue_number: context.issue.number,\n    owner: context.repo.owner,\n    repo: context.repo.repo,\n    body: commentBody,\n  });\n\n  await github.rest.checks.update({\n    owner: context.repo.owner,\n    repo: context.repo.repo,\n    status: 'completed',\n    completed_at: new Date(),\n    conclusion: 'success',\n    check_run_id: process.env.CHECK_RUN_ID,\n    output: {\n      title: 'PR Next Version publish successful!',\n      summary: `A version for pull request is **published**. version: **${process.env.DIST_VERSION}**`,\n    },\n  });\n};\n"
  },
  {
    "path": "scripts/github/createPrNextCheckSuite.js",
    "content": "module.exports = async ({ github, context, core, status = 'start' }) => {\n  if (status === 'start') {\n    // 创建一个 checkSuite\n    const suite = await github.rest.checks.createSuite({\n      owner: context.repo.owner,\n      repo: context.repo.repo,\n      head_sha: process.env.HEAD_SHA,\n    });\n\n    // 创建一个 checkRun\n    const check = await github.rest.checks.create({\n      owner: context.repo.owner,\n      repo: context.repo.repo,\n      name: '🚀🚀🚀 Pre-Release Version for pull request',\n      status: 'in_progress',\n      head_sha: suite.data.head_sha,\n      output: {\n        title: 'Pre-Release version is publishing. Please wait for a moment...',\n        summary: `A version for pull request is **running**. sha: **${process.env.HEAD_SHA}**`,\n      },\n    });\n    return check.data.id;\n  } else {\n    await github.rest.checks.update({\n      owner: context.repo.owner,\n      repo: context.repo.repo,\n      status: 'completed',\n      completed_at: new Date(),\n      conclusion: 'failure',\n      check_run_id: process.env.CHECK_RUN_ID,\n      output: {\n        title: 'Pre-Release Version publish failed',\n        summary: `A version for pull request is **failed**. please check the error.`,\n      },\n    });\n  }\n};\n"
  },
  {
    "path": "scripts/github/helpers.js",
    "content": "const createVersionText = (type = 'Pre-Release', version, context) => {\n  return (\n    `🎉 ${type} version ${version}  publish successful! You can install this version via \\`npm install antd-mini@${version}\\`` +\n    ` [@${context.payload.comment.user.login}](https://github.com/${context.payload.comment.user.login})\\n\\n` +\n    '```\\n' +\n    version +\n    '\\n' +\n    '```\\n\\n' +\n    '```\\n' +\n    `npm install antd-mini@${version}\\n` +\n    '```\\n\\n' +\n    `https://www.npmjs.com/package/antd-mini/v/${version}`\n  );\n};\n\nmodule.exports = {\n  createVersionText,\n};\n"
  },
  {
    "path": "scripts/github/notifyReleaseResult.js",
    "content": "const { createVersionText } = require('./helpers');\n\nmodule.exports = async (type, { github, context, core }, stage) => {\n  if (stage === 'end') {\n    const issueBody = createVersionText(\n      type,\n      process.env.DIST_VERSION,\n      context\n    );\n\n    await github.rest.issues.createComment({\n      issue_number: context.issue.number,\n      owner: context.repo.owner,\n      repo: context.repo.repo,\n      body: issueBody,\n    });\n    await github.rest.checks.update({\n      owner: context.repo.owner,\n      repo: context.repo.repo,\n      status: 'completed',\n      completed_at: new Date(),\n      conclusion: 'success',\n      check_run_id: process.env.CHECK_RUN_ID,\n      output: {\n        title: 'PR Next Version publish successful!',\n        summary: `A version for pull request is **published**. version: **${process.env.DIST_VERSION}**`,\n      },\n    });\n  } else if (stage === 'start') {\n    // 创建一个 checkSuite\n    const suite = await github.rest.checks.createSuite({\n      owner: context.repo.owner,\n      repo: context.repo.repo,\n      head_sha: process.env.HEAD_SHA,\n    });\n\n    // 创建一个 checkRun\n    const check = await github.rest.checks.create({\n      owner: context.repo.owner,\n      repo: context.repo.repo,\n      name: '🚀🚀🚀 Release Version',\n      status: 'in_progress',\n      head_sha: suite.data.head_sha,\n      output: {\n        title: 'Release version is publishing. Please wait for a moment...',\n        summary: `A version for pull request is **running**. sha: **${process.env.HEAD_SHA}**`,\n      },\n    });\n    return check.data.id;\n  } else if (stage === 'failure') {\n    await github.rest.checks.update({\n      owner: context.repo.owner,\n      repo: context.repo.repo,\n      status: 'completed',\n      completed_at: new Date(),\n      conclusion: 'failure',\n      check_run_id: process.env.CHECK_RUN_ID,\n      output: {\n        title: 'Release Version publish failed',\n        summary: `A version for pull request is **failed**. please check the error.`,\n      },\n    });\n  }\n};\n"
  },
  {
    "path": "scripts/mini-compiler.ts",
    "content": "import ifdef from '@diamondyuan/gulp-ifdef';\nimport * as ofs from 'fs';\nimport * as fs from 'fs/promises';\nimport gulp from 'gulp';\nimport changed from 'gulp-changed';\nimport debug from 'gulp-debug';\nimport less from 'gulp-less';\nimport rename from 'gulp-rename';\nimport ts from 'gulp-typescript';\nimport json5 from 'json5';\nimport path, { resolve } from 'path';\nimport * as through2 from 'through2';\nimport axmlParser, { wechatCustomMapping } from './axml';\nimport createConfigJson from './create-config';\nimport { transformTsxJS } from './tsxjs';\nimport * as tsxml from './tsxml/index';\n\n// 定义支持的平台类型\ntype PlatformType = 'WECHAT' | 'ALIPAY';\n\nconst ALL_PLATFORMS: PlatformType[] = ['WECHAT', 'ALIPAY'];\n\ninterface MiniProgramSourceCompileOption {\n  source: string;\n  dest: string;\n  watch: boolean;\n  debug?: string | string[];\n  allowList?: string[];\n  tsconfig: string;\n  assets: string[];\n  buildOption: {\n    platformId?: PlatformType | string;\n    defVar: any;\n    compileTs: boolean;\n    compileLess: boolean;\n    styleExt: string;\n    platform: tsxml.PlatformConfig;\n    xmlScriptOption?: {\n      forceCommonjs?: boolean;\n    };\n    xmlScriptExt: string;\n    xmlExt: string;\n  };\n}\n\nexport type FilePrecess = (old: string) => Promise<string> | string;\n\nexport type TransFormFactory = (handler) => any;\n\nconst include = function (list: string[], source: string) {\n  return through2.obj(function (file, enc, callback) {\n    const relativeName = path.relative(source, file.path);\n    const match = list.some((o) => {\n      return relativeName.startsWith(o + '/');\n    });\n    if (match) {\n      callback(null, file);\n    } else {\n      return callback();\n    }\n  });\n};\n\nexport function miniCompiler(option: MiniProgramSourceCompileOption) {\n  function task(\n    options: { name: string; glob: string[]; destExtension: string },\n    handler: (\n      stream: NodeJS.ReadWriteStream,\n      factory: TransFormFactory\n    ) => NodeJS.ReadWriteStream\n  ) {\n    function taskImplFactory(init: boolean) {\n      return () => {\n        let srcStream = gulp.src(\n          [...options.glob, '!**/__tests__/**', '!global.d.ts'],\n          {\n            cwd: option.source,\n          }\n        );\n        if (Array.isArray(option.allowList)) {\n          srcStream = srcStream.pipe(include(option.allowList, option.source));\n        }\n        if (option.watch && !init) {\n          srcStream = srcStream.pipe(\n            changed(option.dest, { extension: options.destExtension })\n          );\n        }\n        let enableDebug = false;\n        if (Array.isArray(option.debug)) {\n          enableDebug = option.debug.includes(options.name);\n        } else {\n          enableDebug = option.debug === options.name;\n        }\n        if (enableDebug) {\n          srcStream = srcStream.pipe(debug({ title: options.name }));\n        }\n        srcStream = srcStream.pipe(\n          ifdef(option.buildOption.defVar, {\n            insertBlanks: false,\n            extname: [\n              'axml',\n              'ts',\n              'js',\n              'sjs',\n              'acss',\n              'less',\n              'tsx',\n              'json',\n              'json5',\n              'md',\n            ],\n          })\n        );\n        const transformFileFactory = (task: FilePrecess) => {\n          return through2.obj(async (file, _encoding, callback) => {\n            if (file.isBuffer()) {\n              const content = file.contents.toString();\n              try {\n                const res = await task(content);\n                file.contents = Buffer.from(res);\n                callback(null, file);\n              } catch (error) {\n                console.log('compile error', file);\n                callback(error);\n              }\n            }\n          });\n        };\n        return handler(srcStream, transformFileFactory);\n      };\n    }\n    // 先执行一次初始化的任务\n    gulp.series(taskImplFactory(true))(() => {\n      // 如果是 watch 模式，就注册 watch 事件\n      if (option.watch) {\n        gulp.watch(\n          options.glob,\n          { cwd: option.source },\n          gulp.series(taskImplFactory(false))\n        );\n      }\n    });\n  }\n\n  // 拷贝 less 源码文件\n  task(\n    {\n      name: 'less',\n      glob: ['**/*.less'],\n      destExtension: option.buildOption.compileLess\n        ? option.buildOption.styleExt\n        : '.less',\n    },\n    function (stream: NodeJS.ReadWriteStream) {\n      if (option.buildOption.compileLess) {\n        return (\n          stream\n            .pipe(less())\n            // eslint-disable-next-line no-console\n            .on('error', (e) => {\n              console.log(e);\n              if (!option.watch) {\n                process.exit(1);\n              }\n            })\n            .pipe(\n              rename({\n                extname: option.buildOption.styleExt,\n              })\n            )\n            .pipe(gulp.dest(option.dest))\n        );\n      }\n      return stream.pipe(gulp.dest(option.dest));\n    }\n  );\n\n  // 拷贝 ts 源码文件\n  task(\n    {\n      name: 'ts',\n      glob: ['**/*.ts', '!**/*.sjs.ts'],\n      destExtension: '.ts',\n    },\n    function (stream: NodeJS.ReadWriteStream) {\n      if (option.buildOption.compileTs) {\n        const tsResult = stream\n          .pipe(ts.createProject(option.tsconfig)())\n          .on('error', (err) => {\n            console.log(err);\n            if (!option.watch) {\n              process.exit(1);\n            }\n          });\n        return tsResult.js.pipe(gulp.dest(option.dest));\n      }\n      return stream.pipe(gulp.dest(option.dest));\n    }\n  );\n\n  // 拷贝 ts 源码文件\n  task(\n    {\n      name: 'sjs',\n      glob: ['**/*.sjs', '**/*.sjs.ts'],\n      destExtension: '.ts',\n    },\n    function (stream: NodeJS.ReadWriteStream, factory) {\n      return stream\n        .pipe(\n          rename(function (file) {\n            file.basename = path.basename(file.basename, '.sjs');\n            file.extname = option.buildOption.xmlScriptExt;\n          })\n        )\n        .pipe(\n          factory((tsxml: string) => {\n            return transformTsxJS(tsxml, option.buildOption.xmlScriptOption);\n          })\n        )\n        .pipe(gulp.dest(option.dest));\n    }\n  );\n\n  task(\n    {\n      name: 'axml',\n      glob: ['**/*.axml'],\n      destExtension: option.buildOption.xmlExt,\n    },\n    function (stream: NodeJS.ReadWriteStream, factory) {\n      return stream\n        .pipe(\n          factory(async (content: string) => {\n            const Compiler = new axmlParser({\n              platform: option.buildOption.platformId,\n              customMapping:\n                option.buildOption.platformId === 'WECHAT'\n                  ? wechatCustomMapping\n                  : {},\n              camelCaseProperty: true,\n            });\n            const transCode = Compiler.compile(content);\n            return transCode;\n          })\n        )\n        .on('error', (e) => {\n          console.error(e);\n          if (!option.watch) {\n            process.exit(1);\n          }\n        })\n        .pipe(\n          rename(function (file) {\n            file.basename = path.basename(file.basename, '.axml');\n            file.extname = option.buildOption.xmlExt;\n          })\n        )\n        .pipe(gulp.dest(option.dest));\n    }\n  );\n\n  task(\n    {\n      name: 'tsxml',\n      glob: ['**/*.axml.tsx'],\n      destExtension: option.buildOption.xmlExt,\n    },\n    function (stream: NodeJS.ReadWriteStream, factory) {\n      return stream\n        .pipe(\n          factory(async (content: string) => {\n            const ast = tsxml.parseCode(content);\n            const res = await tsxml.tsxmlToAxml(\n              tsxml.TransformContext.create(\n                ast,\n                option.buildOption.platform,\n                content\n              )\n            );\n            return res;\n          })\n        )\n        .on('error', (e) => {\n          console.error(e);\n          if (!option.watch) {\n            process.exit(1);\n          }\n        })\n        .pipe(\n          rename(function (file) {\n            file.basename = path.basename(file.basename, '.axml');\n            file.extname = option.buildOption.xmlExt;\n          })\n        )\n        .pipe(gulp.dest(option.dest));\n    }\n  );\n\n  option.assets.forEach((ext) => {\n    task(\n      {\n        name: `copy-${ext}`,\n        glob: ['**/{,.}*.' + ext],\n        destExtension: '.' + ext,\n      },\n      function (stream: NodeJS.ReadWriteStream) {\n        return stream.pipe(gulp.dest(option.dest));\n      }\n    );\n  });\n\n  task(\n    {\n      name: 'json5',\n      glob: ['**/{,.}*.json5'],\n      destExtension: '.json',\n    },\n    function (stream: NodeJS.ReadWriteStream, factory) {\n      return stream\n        .pipe(\n          factory((content: string) => {\n            const ast = json5.parse(content);\n            return JSON.stringify(ast, null, 2);\n          })\n        )\n        .pipe(\n          rename(function (file) {\n            file.extname = '.json';\n          })\n        )\n        .pipe(gulp.dest(option.dest));\n    }\n  );\n}\n\n// 构建DefVar配置，支持多平台组合，更易于扩展\nfunction buildDefVar(\n  primaryPlatform: PlatformType\n): Record<string, boolean | string> {\n  // 基础配置，所有平台默认关闭\n  const defVar: Record<string, boolean | string> = {\n    platform: primaryPlatform,\n  };\n\n  // 初始化所有平台为false\n  ALL_PLATFORMS.forEach((platform) => {\n    defVar[platform] = false;\n  });\n\n  // 设置主平台为true\n  defVar[primaryPlatform] = true;\n\n  return defVar;\n}\n\n// 创建通用编译配置\nfunction createPlatformBuildOption(\n  platformId: PlatformType,\n  platformConfig: {\n    compileTs: boolean;\n    compileLess: boolean;\n    platform: tsxml.PlatformConfig;\n    styleExt: string;\n    xmlExt: string;\n    xmlScriptExt: string;\n    xmlScriptOption?: {\n      forceCommonjs?: boolean;\n    };\n  }\n) {\n  return {\n    platformId,\n    defVar: buildDefVar(platformId),\n    ...platformConfig,\n  };\n}\n\n// 配置组件编译\nfunction compilePlatformComponents(\n  platformId: PlatformType,\n  watch: boolean,\n  allowList: string[] | undefined,\n  buildOption: any\n) {\n  // 常规组件\n  miniCompiler({\n    tsconfig: resolve(\n      __dirname,\n      '..',\n      platformId === 'WECHAT' ? 'tsconfig.wechat.json' : 'tsconfig.json'\n    ),\n    source: resolve(__dirname, '..', 'src'),\n    dest: resolve(__dirname, '..', 'compiled', platformId.toLowerCase(), 'src'),\n    watch,\n    allowList,\n    assets: [\n      'md',\n      platformId === 'WECHAT' ? 'js' : 'acss',\n      'js',\n      platformId === 'WECHAT' ? '' : 'sjs',\n      'json',\n    ].filter(Boolean),\n    buildOption,\n  });\n\n  // Copilot组件\n  miniCompiler({\n    tsconfig: resolve(\n      __dirname,\n      '..',\n      platformId === 'WECHAT' ? 'tsconfig.wechat.json' : 'tsconfig.json'\n    ),\n    source: resolve(__dirname, '..', 'copilot'),\n    dest: resolve(__dirname, '..', 'compiled', platformId.toLowerCase(), 'src'),\n    watch,\n    allowList,\n    assets: [\n      'md',\n      platformId === 'WECHAT' ? 'js' : 'acss',\n      'js',\n      platformId === 'WECHAT' ? '' : 'sjs',\n      'json',\n    ].filter(Boolean),\n    buildOption,\n  });\n\n  // 常规组件demo页面\n  miniCompiler({\n    tsconfig: resolve(\n      __dirname,\n      '..',\n      platformId === 'WECHAT'\n        ? 'tsconfig.wechat.demo.json'\n        : 'tsconfig.alipay.demo.json'\n    ),\n    source: resolve(__dirname, '..', 'demo'),\n    dest: resolve(\n      __dirname,\n      '..',\n      'compiled',\n      platformId.toLowerCase(),\n      'demo'\n    ),\n    watch,\n    assets: [\n      'md',\n      platformId === 'WECHAT' ? 'js' : 'acss',\n      'js',\n      platformId === 'WECHAT' ? '' : 'sjs',\n      'json',\n    ].filter(Boolean),\n    buildOption: {\n      ...buildOption,\n      compileTs: true,\n    },\n  });\n\n  // copilot组件demo页面\n  miniCompiler({\n    tsconfig: resolve(\n      __dirname,\n      '..',\n      platformId === 'WECHAT'\n        ? 'tsconfig.wechat.demo.json'\n        : 'tsconfig.alipay.demo.json'\n    ),\n    source: resolve(__dirname, '..', 'copilot-demo'),\n    dest: resolve(\n      __dirname,\n      '..',\n      'compiled',\n      platformId.toLowerCase(),\n      'demo'\n    ),\n    watch,\n    assets: [\n      'md',\n      platformId === 'WECHAT' ? 'js' : 'acss',\n      'js',\n      platformId === 'WECHAT' ? '' : 'sjs',\n      'json',\n    ].filter(Boolean),\n    buildOption: {\n      ...buildOption,\n      compileTs: true,\n    },\n  });\n\n  // 配置文件编译\n  miniCompiler({\n    tsconfig: resolve(\n      __dirname,\n      '..',\n      platformId === 'WECHAT' ? 'tsconfig.wechat.json' : 'tsconfig.json'\n    ),\n    source: resolve(__dirname, '..', 'config', platformId.toLowerCase()),\n    dest: resolve(\n      __dirname,\n      '..',\n      'compiled',\n      platformId.toLowerCase(),\n      platformId === 'ALIPAY' ? 'demo' : ''\n    ),\n    watch,\n    assets: [platformId === 'WECHAT' ? 'wxss' : 'less', 'js', 'ts', 'json'],\n    buildOption,\n  });\n}\n\nexport async function compileAntdMini(watch: boolean) {\n  if (!watch) {\n    await Promise.all(\n      [\n        'compiled/alipay/demo/pages',\n        'compiled/alipay/src',\n        'compiled/wechat/demo',\n        'compiled/wechat/src',\n      ].map((dir) => {\n        return fs.rm(resolve(__dirname, '..', dir), {\n          recursive: true,\n          force: true,\n        });\n      })\n    );\n  }\n\n  await createConfigJson();\n  const wechatConfig = JSON.parse(\n    ofs.readFileSync(resolve(__dirname, '..', 'config/wechat.json'), 'utf-8')\n  );\n\n  const wechatAllowList = wechatConfig.src;\n\n  // 微信平台配置\n  const wechatPlatformConfig = {\n    compileTs: true,\n    compileLess: true,\n    platform: tsxml.wechat,\n    styleExt: '.wxss',\n    xmlExt: '.wxml',\n    xmlScriptExt: '.wxs',\n    xmlScriptOption: {\n      forceCommonjs: true,\n    },\n  };\n\n  // 支付宝平台配置\n  const alipayPlatformConfig = {\n    compileTs: false,\n    compileLess: false,\n    platform: tsxml.alipay,\n    xmlExt: '.axml',\n    styleExt: '.acss',\n    xmlScriptExt: '.sjs',\n    xmlScriptOption: {},\n  };\n\n  // 创建各平台的编译配置\n  const wechatBuildOption = createPlatformBuildOption(\n    'WECHAT',\n    wechatPlatformConfig\n  );\n\n  const alipayBuildOption = createPlatformBuildOption(\n    'ALIPAY',\n    alipayPlatformConfig\n  );\n\n  // 各平台组件编译\n  compilePlatformComponents(\n    'WECHAT',\n    watch,\n    wechatAllowList,\n    wechatBuildOption\n  );\n  compilePlatformComponents('ALIPAY', watch, undefined, alipayBuildOption);\n}\n"
  },
  {
    "path": "scripts/patch-coverage.ts",
    "content": "import * as path from 'path';\nimport * as fs from 'node:fs/promises';\n\n(async () => {\n  const __dirname = path.dirname(new URL(import.meta.url).pathname);\n\n  const coveragePath = path.resolve(\n    __dirname,\n    '..',\n    'coverage/coverage-final.json'\n  );\n\n  const coverageInfo = JSON.parse(await fs.readFile(coveragePath, 'utf-8'));\n\n  Object.keys(coverageInfo).filter((key) => {\n    if (key.includes('ant-design-mini/node_modules')) {\n      delete coverageInfo[key];\n    }\n    if (key.includes('ant-design-mini/scripts')) {\n      delete coverageInfo[key];\n    }\n  });\n\n  await fs.writeFile(coveragePath, JSON.stringify(coverageInfo, null, 2));\n})();\n"
  },
  {
    "path": "scripts/publish.js",
    "content": "const inquirer = require(\"inquirer\");\nconst {\n  getVersion,\n  genNewVersion,\n  npmPublish,\n  gitSync\n} = require(\"./publishUtils\")\n\ngetVersion().then((versionInfo) => {\n  inquirer\n    .prompt([\n      {\n        type: \"list\",\n        name: \"tag\",\n        message: \"请选择 npm tag\",\n        choices: Object.keys(versionInfo),\n      },\n    ])\n    .then((answers) => {\n      const { tag } = answers;\n      const currentVersion = versionInfo[tag];\n\n      return genNewVersion(tag, currentVersion)\n        .then((newVersion) => {\n          return npmPublish(currentVersion, newVersion, tag);\n        })\n        .then((newVersion) => {\n          return gitSync(newVersion)\n        });\n    })\n    .catch((error) => {\n      console.log(error);\n    });\n}).catch(err=>{\n  console.log(err)\n})\n"
  },
  {
    "path": "scripts/publishInCI.js",
    "content": "const {\n  doPublish,\n  generateSematicVersion,\n  writePkgJson,\n  PKG_JSON_PATH,\n} = require('./publishUtils');\n\nlet distTag = process.env.DIST_TAG;\n\nconsole.log('dist tag:', distTag);\n\nlet version = process.env.DIST_VERSION;\nif (!version) {\n  const currentVersion = require(PKG_JSON_PATH).version;\n  console.log(`currentVersion`, currentVersion);\n  version = generateSematicVersion(distTag, 'patch', currentVersion);\n}\n\nconsole.log('version:', version);\n\nif (process.env.SETUP_RELEASE) {\n  const originPkgJson = require(PKG_JSON_PATH);\n  originPkgJson.version = version;\n  writePkgJson(JSON.stringify(originPkgJson, null, 2));\n} else {\n  doPublish(distTag, version);\n}\n"
  },
  {
    "path": "scripts/publishRC.js",
    "content": "const { doPublish, PKG_JSON_PATH, getVersion } = require('./publishUtils');\n\nconst semver = require('semver');\n\nasync function main() {\n  let distTag = process.env.DIST_TAG;\n  let prereleaseText = undefined;\n  let releaseType = undefined;\n  if (distTag === 'beta') {\n    releaseType = 'prerelease';\n    prereleaseText = 'beta';\n  } else if (distTag === 'alpha') {\n    releaseType = 'prerelease';\n    prereleaseText = 'alpha';\n  }\n\n  if (!releaseType) {\n    console.log('distTag only allow `alpha` and `beta`');\n    return;\n  }\n\n  console.log('dist tag:', distTag);\n\n  const currentVersion = require(PKG_JSON_PATH).version;\n  console.log(`currentVersion`, currentVersion);\n\n  let baseVersion = currentVersion;\n  // 如果需要获取到最新的可用版本，要做一下检测\n  const latestVersions = await getVersion();\n  console.log(`latestVersions`, latestVersions);\n  if (distTag) {\n    const latestVersion = latestVersions[distTag];\n    if (latestVersion) {\n      // 如果查到的 npm 上的最新版比当前版本要大，那就用\n      if (semver.gte(latestVersion, currentVersion)) {\n        console.log(\n          `${latestVersion} >= ${currentVersion}, use ${baseVersion}`\n        );\n        baseVersion = latestVersion;\n      } else {\n        console.log(`${latestVersion} < ${currentVersion}, use ${baseVersion}`);\n      }\n    }\n  }\n  console.log('use base version: ', baseVersion);\n  const version = semver.inc(baseVersion, releaseType, prereleaseText);\n\n  console.log('version:', version);\n\n  doPublish(distTag, version);\n}\n\nmain();\n"
  },
  {
    "path": "scripts/publishUtils.js",
    "content": "const inquirer = require('inquirer');\nconst { exec, execSync } = require('child_process');\nconst { cwd } = require('process');\nconst PKG_JSON_PATH = `${cwd()}/package.json`;\n\n/**\n * @param {'latest' | 'alpha' | 'beta'} tag\n * @param {'Major' | 'minor' | 'patch' | 'other'} versionLevel\n * @param {string} currentVersion\n */\nfunction generateSematicVersion(tag, versionLevel, currentVersion) {\n  let newVersion = '';\n  const [curMajor, curMinor, curPatch, curTag, curNumber] =\n    currentVersion.match(/([0-9a-z]+)(?=[-|.])?/gim);\n\n  if (versionLevel === 'Major') {\n    const major = Number(curMajor) + 1;\n    newVersion = `${tag === 'latest'\n        ? `${major}.0.0`\n        : tag === 'alpha'\n          ? `${major}.0.0-alpha.1`\n          : `${major}.0.0-beta.1`\n      }`;\n  } else if (versionLevel === 'minor') {\n    const minor = Number(curMinor) + 1;\n    newVersion = `${tag === 'latest'\n        ? `${curMajor}.${minor}.0`\n        : tag === 'alpha'\n          ? `${curMajor}.${minor}.0-alpha.1`\n          : `${curMajor}.${minor}.0-beta.1`\n      }`;\n  } else if (versionLevel === 'patch') {\n    const patch = Number(curPatch) + 1;\n    newVersion = `${tag === 'latest'\n        ? `${curMajor}.${curMinor}.${patch}`\n        : tag === 'alpha'\n          ? `${curMajor}.${curMinor}.${patch}-alpha.1`\n          : `${curMajor}.${curMinor}.${patch}-beta.1`\n      }`;\n  } else {\n    // 仅限 alpha 和 beta\n    let newNumber = Number(curNumber) + 1;\n    if (isNaN(newNumber)) {\n      newNumber = 1;\n    }\n    newVersion = `${tag === 'alpha'\n        ? `${curMajor}.${curMinor}.${curPatch}-alpha.${newNumber}`\n        : `${curMajor}.${curMinor}.${curPatch}-beta.${newNumber}`\n      }`;\n  }\n  return newVersion;\n}\n\n// 拿到版本信息, 以 antd-mini 为基准\nfunction getVersion(depName = 'antd-mini') {\n  return new Promise((resolve, reject) => {\n    exec(`npm info ${depName}`, function (error, stdout, stderr) {\n      if (error) {\n        return reject(error);\n      }\n\n      if (stderr) {\n        return reject(stderr);\n      }\n\n      const res = stdout.split('\\n').reduce((prev, cur) => {\n        if (cur.includes('alpha')) {\n          prev['alpha'] = cur.slice(cur.indexOf(':') + 2);\n        } else if (cur.includes('beta')) {\n          prev['beta'] = cur.slice(cur.indexOf(':') + 2);\n        } else if (cur.includes('latest')) {\n          prev['latest'] = cur.slice(cur.indexOf(':') + 2);\n        }\n        return prev;\n      }, {});\n      resolve(res);\n    });\n  });\n}\n\n// 生成新版本信息\nfunction genNewVersion(tag, currentVersion) {\n  const choices =\n    tag === 'latest'\n      ? ['Major', 'minor', 'patch']\n      : ['Major', 'minor', 'patch', 'other'];\n\n  return new Promise((resolve, reject) => {\n    inquirer\n      .prompt([\n        {\n          type: 'list',\n          name: 'version',\n          message: '请选择发布的版本',\n          choices,\n        },\n      ])\n      .then((res) => {\n        const { version } = res;\n        const newVersion = generateSematicVersion(tag, version, currentVersion);\n        resolve(newVersion);\n      })\n      .catch((error) => {\n        console.log(error);\n      });\n  });\n}\n\n// 用户确认\nfunction npmPublish(oldVersion, newVersion, tag) {\n  return new Promise((resolve, reject) => {\n    inquirer\n      .prompt([\n        {\n          type: 'list',\n          name: 'confirm',\n          message: `现有版本为：${oldVersion}，新版本为：${newVersion}，是否发布？`,\n          choices: ['是', '否'],\n        },\n      ])\n      .then((res) => {\n        const { confirm } = res;\n        if (confirm === '是') {\n          doPublish(tag, newVersion);\n          resolve(newVersion);\n        }\n      });\n  });\n}\n\n/**\n * @param {'latest' | 'alpha' | 'beta'} tag\n * @param {string} newVersion\n */\nfunction doPublish(tag, newVersion) {\n  console.log('发布中 ...');\n  const originPkgJson = require(PKG_JSON_PATH);\n  publish('antd-mini', tag, newVersion);\n  // 只回写正式版的 package.json\n  if (tag === 'latest') {\n    originPkgJson.version = newVersion;\n  }\n  writePkgJson(JSON.stringify(originPkgJson, null, 2));\n  console.log('发布完成');\n}\n\nfunction writePkgJson(str) {\n  const fs = require('fs');\n  fs.writeFileSync(PKG_JSON_PATH, str, { encoding: 'utf-8' });\n}\n\nfunction publish(npmName, tag, version) {\n  const pkgJsonStr = updatePkgJson(npmName, version);\n  writePkgJson(pkgJsonStr);\n\n  // 显式指定 registry，防止使用错误的 registry\n  const registry = process.env.NPM_REGISTRY || 'https://registry.npmjs.org/';\n  console.log(`发布到 registry: ${registry}`);\n\n  execSync(`npm publish --tag=${tag} --registry=${registry}`, { stdio: 'inherit' });\n}\n\nfunction updatePkgJson(npmName, version) {\n  const pkgJson = require(PKG_JSON_PATH);\n  pkgJson.name = npmName;\n  pkgJson.version = version;\n  return JSON.stringify(pkgJson, null, 2);\n}\n\nfunction gitSync(newVersion) {\n  return new Promise((resolve, reject) => {\n    inquirer\n      .prompt([\n        {\n          type: 'list',\n          name: 'git',\n          message: `是否同步 git ？`,\n          choices: ['是', '否'],\n        },\n      ])\n      .then((res) => {\n        const { git } = res;\n        if (git === '是') {\n          // tag + 分支\n          execSync(`git tag ${newVersion}`);\n          execSync(`git push origin ${newVersion}:${newVersion}`);\n          console.log('git 同步完成');\n        }\n        resolve();\n      });\n  });\n}\n\nmodule.exports = {\n  getVersion,\n  genNewVersion,\n  npmPublish,\n  writePkgJson,\n  publish,\n  updatePkgJson,\n  gitSync,\n  doPublish,\n  generateSematicVersion,\n  execSync,\n  PKG_JSON_PATH\n};\n"
  },
  {
    "path": "scripts/quick-release.js",
    "content": "#!/usr/bin/env node\n\n/**\n * Ant Design Mini - 快速发布脚本 (基于 publishInCI.js 改造)\n *\n * 🚀 功能说明:\n * 这是一个增强的本地 NPM 包发布脚本，整合了 publishInCI.js 的所有功能，\n * 支持自动版本生成、环境变量配置等高级特性。\n *\n * 📋 执行流程:\n * 1. 版本管理 - 自动生成或使用指定版本号\n * 2. 环境检查 - 验证 NPM Token 和包信息\n * 3. 安装依赖 - npm install\n * 4. NPM 认证 - 配置 .npmrc 文件\n * 5. 发布包   - 发布到 NPM 并创建 Git 标签\n *\n * 🎯 基本使用方法:\n * node scripts/quick-release.js [dist-tag] [version-level]\n *\n * 📝 示例:\n * node scripts/quick-release.js latest         # 发布当前版本到 latest\n * node scripts/quick-release.js beta patch     # 发布 patch 版本到 beta\n * node scripts/quick-release.js alpha minor    # 发布 minor 版本到 alpha\n *\n * 🔧 高级用法 (环境变量):\n * export DIST_TAG=beta                         # 指定发布标签\n * export DIST_VERSION=3.1.7                    # 指定版本号\n * export AUTO_VERSION=true                     # 启用自动版本生成\n * export SETUP_RELEASE=true                    # 仅更新版本号，不发布\n * node scripts/quick-release.js\n *\n * 🔧 命令行参数:\n * --auto-version    启用自动版本生成\n *\n * 📝 版本生成示例:\n * AUTO_VERSION=true node scripts/quick-release.js beta patch    # 生成 patch 版本\n * AUTO_VERSION=true node scripts/quick-release.js alpha minor   # 生成 minor 版本\n * AUTO_VERSION=true node scripts/quick-release.js latest major  # 生成 major 版本\n *\n * 🔧 前置条件:\n * 1. 设置环境变量: export NPM_TOKEN=your_npm_token_here\n * 2. 确保有 NPM 包的发布权限\n * 3. Git 用户信息已配置\n * 4. Node.js 18+ 环境\n *\n * 🔒 安全提醒:\n * - NPM Token 具有发布权限，请妥善保管\n * - 不要将 Token 提交到代码仓库\n *\n * 📚 详细文档: ./quick-release-guide.md\n */\n\nconst { execSync } = require('child_process');\nconst {\n  doPublish,\n  generateSematicVersion,\n  writePkgJson,\n  PKG_JSON_PATH,\n} = require('./publishUtils');\n\n// 支持从环境变量或命令行参数获取发布标签\nlet distTag = process.env.DIST_TAG || process.argv[2] || 'latest';\nlet packageJson = require(PKG_JSON_PATH);\n\nfunction log(message, type = 'info') {\n  const colors = {\n    info: '\\x1b[36m',    // cyan\n    success: '\\x1b[32m', // green\n    error: '\\x1b[31m',   // red\n    warning: '\\x1b[33m', // yellow\n    reset: '\\x1b[0m'\n  };\n\n  const icons = {\n    info: '📢',\n    success: '✅',\n    error: '❌',\n    warning: '⚠️'\n  };\n\n  console.log(`${colors[type]}${icons[type]} ${message}${colors.reset}`);\n}\n\nfunction execCommand(command, description) {\n  log(`执行: ${description}`);\n  try {\n    execSync(command, { stdio: 'inherit', cwd: process.cwd() });\n    log(`${description} 完成`, 'success');\n  } catch (error) {\n    log(`${description} 失败: ${error.message}`, 'error');\n    throw error;\n  }\n}\n\n// 支持从环境变量获取版本号，或自动生成新版本\nlet targetVersion = process.env.DIST_VERSION;\nif (!targetVersion) {\n  const currentVersion = packageJson.version;\n  // 如果指定了版本生成级别，则自动生成新版本\n  const versionLevel = process.argv[3] || 'patch'; // 默认为 patch 版本\n  if (process.env.AUTO_VERSION === 'true' || process.argv.includes('--auto-version')) {\n    targetVersion = generateSematicVersion(distTag, versionLevel, currentVersion);\n    log(`自动生成新版本: ${currentVersion} -> ${targetVersion}`, 'info');\n  } else {\n    targetVersion = currentVersion;\n  }\n} else {\n  log(`使用指定版本: ${targetVersion}`, 'info');\n}\n\nasync function main() {\n  try {\n    log('🚀 开始快速发布流程');\n    log(`包名: ${packageJson.name}`);\n    log(`当前版本: ${packageJson.version}`);\n    log(`目标版本: ${targetVersion}`);\n    log(`发布标签: ${distTag}`);\n\n    // 如果是仅设置版本模式\n    if (process.env.SETUP_RELEASE === 'true') {\n      log('📝 仅更新版本号模式');\n      const originPkgJson = require(PKG_JSON_PATH);\n      originPkgJson.version = targetVersion;\n      writePkgJson(JSON.stringify(originPkgJson, null, 2));\n      log(`版本号已更新为: ${targetVersion}`, 'success');\n      return;\n    }\n\n    // 检查NPM token\n    if (!process.env.NPM_TOKEN) {\n      log('错误: 未设置 NPM_TOKEN 环境变量', 'error');\n      log('请运行: export NPM_TOKEN=your_npm_token');\n      process.exit(1);\n    }\n\n    // 1. 更新版本号 (如果需要)\n    if (targetVersion !== packageJson.version) {\n      log('1/6 更新版本号');\n      const originPkgJson = require(PKG_JSON_PATH);\n      originPkgJson.version = targetVersion;\n      writePkgJson(JSON.stringify(originPkgJson, null, 2));\n      log(`版本号已更新: ${packageJson.version} -> ${targetVersion}`, 'success');\n      // 重新读取更新后的 package.json\n      delete require.cache[require.resolve(PKG_JSON_PATH)];\n      packageJson = require(PKG_JSON_PATH);\n    }\n\n    // 2. 安装依赖\n    log('2/6 安装依赖');\n    execCommand('rimraf node_modules', '删除依赖');\n    execCommand('npm install', '安装依赖');\n\n    // 4. 设置 NPM 认证\n    log('4/6 设置 NPM 认证');\n    if (process.env.NPM_TOKEN) {\n      // 临时创建 .npmrc 文件用于认证\n      const fs = require('fs');\n      const npmrcContent = `registry=https://registry.npmjs.org/\\n//registry.npmjs.org/:_authToken=${process.env.NPM_TOKEN}\\n`;\n      fs.writeFileSync('.npmrc', npmrcContent);\n      log('NPM 认证配置完成', 'success');\n    } else {\n      log('警告: 未设置 NPM_TOKEN，使用默认认证', 'warning');\n    }\n\n    // 5. 发布包\n    log('5/6 发布包');\n    doPublish(distTag, targetVersion);\n    log('包发布成功', 'success');\n\n    // 6. 创建并推送标签\n    log('6/6 处理 Git 标签');\n    try {\n      // 检查标签是否已存在\n      try {\n        execSync(`git rev-parse ${targetVersion}`, { stdio: 'ignore' });\n        log(`标签 ${targetVersion} 已存在`, 'warning');\n      } catch {\n        // 创建标签\n        execCommand(`git tag ${targetVersion}`, '创建 Git 标签');\n        execCommand(`git push origin ${targetVersion}`, '推送标签');\n      }\n    } catch (error) {\n      log(`Git 标签操作失败 (可忽略): ${error.message}`, 'warning');\n    }\n\n    // 清理临时文件\n    if (process.env.NPM_TOKEN) {\n      const fs = require('fs');\n      if (fs.existsSync('.npmrc')) {\n        fs.unlinkSync('.npmrc');\n        log('清理临时认证文件', 'success');\n      }\n    }\n\n    // 完成\n    log('='.repeat(50));\n    log('🎉 发布完成！', 'success');\n    log(`包名: ${packageJson.name}`);\n    log(`版本: ${targetVersion}`);\n    log(`标签: ${distTag}`);\n    log(`安装命令: npm install ${packageJson.name}@${distTag}`);\n    log('='.repeat(50));\n\n  } catch (error) {\n    log(`发布失败: ${error.message}`, 'error');\n\n    // 清理临时文件\n    if (process.env.NPM_TOKEN) {\n      const fs = require('fs');\n      if (fs.existsSync('.npmrc')) {\n        fs.unlinkSync('.npmrc');\n        log('清理临时认证文件');\n      }\n    }\n\n    process.exit(1);\n  }\n}\n\nif (require.main === module) {\n  main();\n}\n"
  },
  {
    "path": "scripts/renamePageConfig.ts",
    "content": "import { glob } from 'glob';\nimport { resolve } from 'path';\nimport { promises as fsPromises } from 'fs';\nimport * as prettier from 'prettier';\n\nglob(['**/*.json'], { cwd: 'demo/pages' })\n  .then(async (filePaths) => {\n    for (const filePath of filePaths) {\n      const absolutePath = resolve('demo/pages', filePath);\n\n      const tsxFilePath = absolutePath.replace('index.json', 'index.axml.tsx');\n      const exists = await fsPromises\n        .access(tsxFilePath)\n        .then(() => true)\n        .catch(() => false);\n\n      if (exists) {\n        const fileContents = await fsPromises.readFile(absolutePath, 'utf-8');\n        if (!fileContents.includes('defaultTitle')) {\n          return;\n        }\n        const updatedContents = fileContents.replace(\n          /\"defaultTitle\": \"(.*)\",/,\n          (_, titleValue) => {\n            return `\n/// #if WECHAT\nnavigationBarTitleText: '${titleValue}',\n/// #endif\n\n/// #if ALIPAY\ndefaultTitle: '${titleValue}',\n/// #endif\n`;\n          }\n        );\n\n        const tempFilePath = absolutePath + '5';\n\n        await fsPromises.writeFile(\n          tempFilePath,\n          prettier.format(updatedContents, {\n            parser: 'json',\n          })\n        );\n        await fsPromises.unlink(absolutePath);\n      }\n    }\n  })\n  .catch((error) => console.error(error));\n"
  },
  {
    "path": "scripts/todo.ts",
    "content": "import { join } from 'path';\nimport * as fs from 'fs';\n\nasync function check() {\n  const filesList = await fs.readdirSync('src');\n  const pagesList = await fs.readdirSync('demo/pages');\n\n  const { src, pages } = JSON.parse(\n    await fs.readFileSync('config/wechat.json', 'utf-8')\n  );\n\n  const doneSet = new Set(\n    ['.umi-production', '.umi', 'tsxml', 'IndexBar']\n      .concat(src)\n      .concat(pages.map((o) => o.replace('pages/', '')))\n  );\n\n  console.log('------pages-------');\n  pagesList.forEach((e) => {\n    if (!doneSet.has(e)) {\n      console.log(e);\n    }\n  });\n\n  console.log('------files-------');\n  filesList.forEach((e) => {\n    if (!doneSet.has(e)) {\n      const lines = fs\n        .readFileSync(join(`src/${e}/index.ts`), 'utf8')\n        .split('\\n').length;\n      console.log(e, lines);\n    }\n  });\n}\n\ncheck();\n"
  },
  {
    "path": "scripts/transform.ts",
    "content": "import * as ofs from 'fs';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { copyDirSourceCode } from './copy';\n\nconst folder = process.argv[2];\n\nconst rootDir = path.resolve(__dirname, '..');\n\nconst sourceDir = path.resolve(rootDir, folder);\n\n(async () => {\n  copyDirSourceCode(sourceDir);\n  const stat = await fs.stat(sourceDir);\n  if (!stat.isDirectory()) {\n    console.log(folder, 'is not a directory');\n  }\n\n  const files = await fs.readdir(sourceDir);\n  for (const fileName of files) {\n    const src = path.resolve(sourceDir, fileName);\n    if (ofs.statSync(src).isDirectory()) {\n      continue;\n    }\n    const ext = path.extname(fileName);\n    if (ext === '.axml') {\n      const tsxmlPath = path.resolve(sourceDir, fileName) + '.tsx';\n      ofs.writeFileSync(tsxmlPath, '');\n    }\n    for (const handler of handlers) {\n      handler(path.resolve(sourceDir, fileName));\n    }\n  }\n})();\n\nfunction transformExt(originalExt: string, newExt: string) {\n  return (src: string) => {\n    const ext = path.extname(src);\n    if (ext !== originalExt) {\n      return false;\n    }\n    const content = ofs.readFileSync(src, 'utf-8');\n    ofs.unlinkSync(src);\n    ofs.writeFileSync(\n      path.resolve(path.dirname(src), path.basename(src, ext) + newExt),\n      content\n    );\n    return true;\n  };\n}\n\nconst handlers = [\n  transformExt('.js', '.ts'),\n  transformExt('.sjs', '.sjs.ts'),\n  transformExt('.acss', '.less'),\n];\n"
  },
  {
    "path": "scripts/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"module\": \"ESNext\",\n    \"target\": \"ES2020\",\n    \"moduleResolution\": \"node\",\n    \"lib\": [\n      \"es2015\"\n    ],\n    \"jsx\": \"preserve\",\n    \"types\": [\n      \"node\"\n    ],\n    \"paths\": {\n      \"tsxml\": [\n        \"../src/tsxml/index.tsx\"\n      ]\n    },\n    \"allowSyntheticDefaultImports\": true\n  },\n  \"include\": [\n    \"./**/*\"\n  ]\n}\n"
  },
  {
    "path": "scripts/tsxjs/babel-plugin-export-default-to-module-exports.ts",
    "content": "import * as t from '@babel/types';\n\nexport function exportDefaultToModuleExports() {\n  return {\n    visitor: {\n      ExportDefaultDeclaration(path) {\n        const declaration = path.get('declaration');\n        // 将 export default 转换为 module.exports\n        const assignment = t.assignmentExpression(\n          '=',\n          t.memberExpression(t.identifier('module'), t.identifier('exports')),\n          declaration.node,\n        );\n        path.replaceWith(assignment);\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "scripts/tsxjs/index.spec.ts",
    "content": "import { expect, it } from 'vitest';\nimport { transformTsxJS } from './index';\n\nit('test', async () => {\n  const code = `\n  function a() {}\n\n  export default {\n    a\n  }\n  `;\n  expect(await transformTsxJS(code, { forceCommonjs: true }))\n    .toMatchInlineSnapshot(`\n      \"function a() {}\n      module.exports = {\n        a: a\n      };\"\n    `);\n\n  expect(await transformTsxJS(code)).toMatchInlineSnapshot(`\n    \"function a() {}\n    export default {\n      a: a\n    };\"\n  `);\n});\n"
  },
  {
    "path": "scripts/tsxjs/index.ts",
    "content": "import * as babel from '@babel/core';\nimport { exportDefaultToModuleExports } from './babel-plugin-export-default-to-module-exports';\n\nexport async function transformTsxJS(\n  code,\n  option?: {\n    forceCommonjs?: boolean;\n  }\n) {\n  const babelConfig: any = {\n    filename: 'code.ts',\n    presets: [\n      [\n        '@babel/preset-env',\n        {\n          // 仍然需要保留 export default\n          modules: false,\n          exclude: ['@babel/plugin-transform-typeof-symbol'],\n        },\n      ],\n      '@babel/preset-typescript',\n    ],\n    plugins: [],\n  };\n  if (option?.forceCommonjs) {\n    babelConfig.plugins.push(exportDefaultToModuleExports);\n  }\n  const result = await babel.transformAsync(code, babelConfig);\n  return result.code;\n}\n"
  },
  {
    "path": "scripts/tsxml/context.ts",
    "content": "import * as types from '@babel/types';\nimport { codeFrameColumns } from '@babel/code-frame';\nimport generate from '@babel/generator';\nimport prettier from 'prettier';\nimport { h, toHtml } from './h';\nimport { PlatformConfig } from './platform';\n\nexport interface ITransformContext<T extends types.Node = types.Node> {\n  readonly extraAttr?: Record<string, boolean | string>;\n  node: T;\n  extends<V extends types.Node>(\n    node: V,\n    extraAttr?: Record<string, string | boolean>\n  ): ITransformContext<V>;\n  throw(node: types.Node, message?: string): TransformError;\n  h(tagName: string, props: unknown, ...children: unknown[]): unknown;\n  if(): string;\n  else(): string;\n  elseif(): string;\n  for(): string;\n  forItem(): string;\n  forKey(): string;\n  forIndex(): string;\n  readonly platform: PlatformConfig;\n  getAttrName(tagName: string, name: string): string;\n  getTagName(tagName: string): string;\n  toAxmlExpression(disableFormatWhenMultipleLine?: boolean): string;\n  toAxmlObject(): string;\n}\n\nexport class TransformError extends Error {\n  constructor(public ctx: string, message?: string) {\n    super(message ?? 'transform Error');\n  }\n}\n\nexport class TransformContext<T extends types.Node = types.Node>\n  implements ITransformContext<T>\n{\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  static async toHtml(vnode: any): Promise<string> {\n    const html = toHtml(vnode);\n    const res = TransformContext.formatAxml(html);\n    return res;\n  }\n\n  static formatAxml(axml: string) {\n    return prettier.format(axml, {\n      parser: 'html',\n      printWidth: 80,\n      tabWidth: 2,\n      bracketSameLine: true,\n      bracketSpacing: true,\n      singleAttributePerLine: true,\n      htmlWhitespaceSensitivity: 'ignore',\n    });\n  }\n\n  static format(axml: string) {\n    return prettier.format(axml, {\n      parser: 'babel',\n      printWidth: 80,\n      tabWidth: 2,\n      singleQuote: true,\n      semi: false,\n      bracketSameLine: true,\n      bracketSpacing: true,\n      singleAttributePerLine: true,\n      htmlWhitespaceSensitivity: 'ignore',\n    });\n  }\n\n  static create<T extends types.Node = types.Node>(\n    node: T,\n    config: PlatformConfig,\n    code: string\n  ): ITransformContext<T> {\n    return new TransformContext(node, config, code);\n  }\n\n  get node(): T {\n    return this._node;\n  }\n\n  public get platform(): PlatformConfig {\n    return this.config;\n  }\n\n  private constructor(\n    private _node: T,\n    private config: PlatformConfig,\n    private code: string,\n    public extraAttr: Record<string, string | boolean> = {}\n  ) {}\n\n  extends<T extends types.Node = types.Node>(\n    child: T,\n    x\n  ): ITransformContext<T> {\n    return new TransformContext<T>(child, this.config, this.code, x);\n  }\n\n  throw(child: types.Node, message?: string): TransformError {\n    const errorCtx = new TransformContext(child, this.config, this.code);\n    return new TransformError(errorCtx.getFrame(), message);\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  h(tagName: string, props: any, ...children: any[]): any {\n    return h(tagName, props, ...children);\n  }\n\n  toAxmlExpression(disableFormatWhenMultipleLine: boolean): string {\n    let messages = TransformContext.format(\n      generate(this.node, {\n        concise: disableFormatWhenMultipleLine,\n      }).code\n    ).trim() as string;\n\n    if (messages.startsWith(';')) {\n      messages = messages.slice(1);\n    }\n\n    const res = `{{ ${messages} }}`;\n    if (disableFormatWhenMultipleLine && res.split('\\n').length > 1) {\n      return `{{ ${generate(this.node).code} }}`;\n    }\n    return res;\n  }\n\n  toAxmlObject() {\n    return `{${\n      generate(this.node, {\n        concise: true,\n      }).code\n    }}`;\n  }\n\n  getAttrName(tagName: string, name: string): string {\n    if (name === 'key') {\n      return this.config.forKey;\n    }\n    const result = this.config.props?.[tagName]?.[name];\n    if (result) {\n      return result;\n    }\n    if (this.platform.basicEvent[name]) {\n      return this.platform.basicEvent[name];\n    }\n    return name;\n  }\n\n  getTagName(tagName: string): string {\n    return tagName.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n  }\n\n  if() {\n    return this.config.if;\n  }\n  for() {\n    return this.config.for;\n  }\n  else(): string {\n    return this.config.else;\n  }\n  elseif(): string {\n    return this.config.elseif;\n  }\n  forIndex(): string {\n    return this.config.forIndex;\n  }\n  forItem(): string {\n    return this.config.forItem;\n  }\n  forKey(): string {\n    return this.config.forKey;\n  }\n  getFrame() {\n    const result = codeFrameColumns(this.code, this._node.loc, {});\n    return result;\n  }\n}\n"
  },
  {
    "path": "scripts/tsxml/fixtures/command.tsx",
    "content": "import { $toArray, View } from 'tsxml';\nimport Component from './component';\n\nexport default ({ row }: { row: number }) => (\n  <Component>\n    {$toArray(row).map((_, index) => (\n      <View>{index}</View>\n    ))}\n  </Component>\n);\n"
  },
  {
    "path": "scripts/tsxml/fixtures/component.tsx",
    "content": "import { Component, View, Slot } from 'tsxml';\n\nexport default () => (\n  <Component>\n    <Slot></Slot>\n    <View>1</View>\n    <View>1</View>\n  </Component>\n);\n"
  },
  {
    "path": "scripts/tsxml/fixtures/event.tsx",
    "content": "import { Text, View, TSXMLProps } from 'tsxml';\n\ninterface Props {\n  a: boolean;\n  b: boolean;\n}\n\nexport default ({ a }: TSXMLProps<Props>) => (\n  <View>\n    <Text onTap=\"a\" catchTap=\"b\">\n      {a}\n    </Text>\n  </View>\n);\n"
  },
  {
    "path": "scripts/tsxml/fixtures/if.tsx",
    "content": "import { Text, View, TSXMLProps } from 'tsxml';\n\ninterface Props {\n  a: boolean;\n  b: boolean;\n  c: boolean;\n  index: number;\n}\n\nexport default ({ a, b, c, index }: TSXMLProps<Props>) => (\n  <View>\n    {/* one */}\n    {!!a && <Text>a</Text>}\n    {!!a && b && <Text> a & b</Text>}\n    {a ? <Text>a</Text> : <Text>!a</Text>}\n    {a ? <Text>1</Text> : b ? <Text>2</Text> : <Text>3</Text>}\n    {a ? <Text>1</Text> : b ? <Text>2</Text> : c && <Text>3</Text>}\n    {<Text class={a ? '1' : '2'}></Text>}\n    <Text class={`1 ${a ? '1' + '2' : 2} 2`}></Text>\n    <View>{a || b}</View>\n    <Text>右侧-{index + 1 > 3 ? 3 : index + 1}个按钮</Text>\n  </View>\n);\n"
  },
  {
    "path": "scripts/tsxml/fixtures/index.tsx",
    "content": "import { Text, View, TSXMLProps, InternalData } from 'tsxml';\n\ninterface Props {\n  todoList: { id: string; content: string }[];\n}\n\nexport default (\n  { todoList }: TSXMLProps<Props>,\n  { mixin, item, progress3 }: InternalData\n) => (\n  <View class=\"ant-calendar\">\n    {todoList.map((task, taskIndex) => (\n      <Text\n        hidden={!mixin.value}\n        key={`a-${task.id}`}\n        data-item-id={taskIndex}\n        data-num={20}\n      >\n        {taskIndex} {task}\n      </Text>\n    ))}\n    {todoList.map((task, taskIndex) => (\n      <Text\n        hidden={!mixin.value}\n        key={'todoList'}\n        data-item-id={taskIndex}\n        data-num={20}\n      >\n        {taskIndex} {task}\n      </Text>\n    ))}\n    <test loading />\n    <Text>{(progress3 / 100) * 200}步</Text>\n    <view slot=\"label\" slot-scope=\"item\">\n      {item.index + 1} {item.value.label}\n    </view>\n  </View>\n);\n"
  },
  {
    "path": "scripts/tsxml/fixtures/page.tsx",
    "content": "import { View, Page } from 'tsxml';\n\nexport default () => (\n  <Page>\n    <View>1</View>\n    <View>1</View>\n  </Page>\n);\n"
  },
  {
    "path": "scripts/tsxml/fixtures/sjs.sjs.js",
    "content": "function format(a) {\n  return a + 1;\n}\n\nexport default {\n  format,\n};\n"
  },
  {
    "path": "scripts/tsxml/fixtures/sjs.tsx",
    "content": "import { TSXMLProps, View } from 'tsxml';\nimport helper from './sjs.sjs';\n\ninterface Props {\n  b: number;\n  c: string;\n}\n\nexport default ({ b, c }: TSXMLProps<Props>) => (\n  <View data-id={helper.format(b)}>text {helper.format(c)}</View>\n);\n"
  },
  {
    "path": "scripts/tsxml/fixtures/snapshot/command.axml",
    "content": "<block\n  a:for=\"{{ row }}\"\n  a:for-index=\"index\"\n  a:for-item=\"_\">\n  <view>{{ index }}</view>\n</block>\n"
  },
  {
    "path": "scripts/tsxml/fixtures/snapshot/command.wxml",
    "content": "<block\n  wx:for=\"{{ row }}\"\n  wx:for-index=\"index\"\n  wx:for-item=\"_\">\n  <view>{{ index }}</view>\n</block>\n"
  },
  {
    "path": "scripts/tsxml/fixtures/snapshot/component.axml",
    "content": "<slot />\n<view>1</view>\n<view>1</view>\n"
  },
  {
    "path": "scripts/tsxml/fixtures/snapshot/component.wxml",
    "content": "<slot />\n<view>1</view>\n<view>1</view>\n"
  },
  {
    "path": "scripts/tsxml/fixtures/snapshot/event.axml",
    "content": "<view>\n  <!-- display: inline -->\n  <text\n    onTap=\"a\"\n    catchTap=\"b\"\n    >{{ a }}</text\n  >\n</view>\n"
  },
  {
    "path": "scripts/tsxml/fixtures/snapshot/event.wxml",
    "content": "<view>\n  <!-- display: inline -->\n  <text\n    bindtap=\"a\"\n    catchtap=\"b\"\n    >{{ a }}</text\n  >\n</view>\n"
  },
  {
    "path": "scripts/tsxml/fixtures/snapshot/if.axml",
    "content": "<view>\n  <!-- display: inline -->\n  <text a:if=\"{{ !!a }}\">a</text>\n  <!-- display: inline -->\n  <text a:if=\"{{ !!a && b }}\">a & b</text>\n  <!-- display: inline -->\n  <text a:if=\"{{ a }}\">a</text>\n  <!-- display: inline -->\n  <text a:else>!a</text>\n  <!-- display: inline -->\n  <text a:if=\"{{ a }}\">1</text>\n  <!-- display: inline -->\n  <text a:elif=\"{{ b }}\">2</text>\n  <!-- display: inline -->\n  <text a:else>3</text>\n  <!-- display: inline -->\n  <text a:if=\"{{ a }}\">1</text>\n  <!-- display: inline -->\n  <text a:elif=\"{{ b }}\">2</text>\n  <!-- display: inline -->\n  <text a:elif=\"{{ c }}\">3</text>\n  <text class=\"{{ a ? '1' : '2' }}\" />\n  <text class=\"1 {{ a ? '1' + '2' : 2 }} 2\" />\n  <view>{{ a || b }}</view>\n  <!-- display: inline -->\n  <text>右侧-{{ index + 1 > 3 ? 3 : index + 1 }}个按钮</text>\n</view>\n"
  },
  {
    "path": "scripts/tsxml/fixtures/snapshot/if.wxml",
    "content": "<view>\n  <!-- display: inline -->\n  <text wx:if=\"{{ !!a }}\">a</text>\n  <!-- display: inline -->\n  <text wx:if=\"{{ !!a && b }}\">a & b</text>\n  <!-- display: inline -->\n  <text wx:if=\"{{ a }}\">a</text>\n  <!-- display: inline -->\n  <text wx:else>!a</text>\n  <!-- display: inline -->\n  <text wx:if=\"{{ a }}\">1</text>\n  <!-- display: inline -->\n  <text wx:elif=\"{{ b }}\">2</text>\n  <!-- display: inline -->\n  <text wx:else>3</text>\n  <!-- display: inline -->\n  <text wx:if=\"{{ a }}\">1</text>\n  <!-- display: inline -->\n  <text wx:elif=\"{{ b }}\">2</text>\n  <!-- display: inline -->\n  <text wx:elif=\"{{ c }}\">3</text>\n  <text class=\"{{ a ? '1' : '2' }}\" />\n  <text class=\"1 {{ a ? '1' + '2' : 2 }} 2\" />\n  <view>{{ a || b }}</view>\n  <!-- display: inline -->\n  <text>右侧-{{ index + 1 > 3 ? 3 : index + 1 }}个按钮</text>\n</view>\n"
  },
  {
    "path": "scripts/tsxml/fixtures/snapshot/index.axml",
    "content": "<view class=\"ant-calendar\">\n  <block\n    a:for=\"{{ todoList }}\"\n    a:for-index=\"taskIndex\"\n    a:for-item=\"task\"\n    a:key=\"a-{{ task.id }}\">\n    <!-- display: inline -->\n    <text\n      hidden=\"{{ !mixin.value }}\"\n      data-item-id=\"{{ taskIndex }}\"\n      data-num=\"{{ 20 }}\"\n      >{{ taskIndex }}{{ task }}</text\n    >\n  </block>\n  <block\n    a:for=\"{{ todoList }}\"\n    a:for-index=\"taskIndex\"\n    a:for-item=\"task\"\n    a:key=\"todoList\">\n    <!-- display: inline -->\n    <text\n      hidden=\"{{ !mixin.value }}\"\n      data-item-id=\"{{ taskIndex }}\"\n      data-num=\"{{ 20 }}\"\n      >{{ taskIndex }}{{ task }}</text\n    >\n  </block>\n  <test loading />\n  <!-- display: inline -->\n  <text>{{ (progress3 / 100) * 200 }}步</text>\n  <view\n    slot=\"label\"\n    slot-scope=\"item\">\n    {{ item.index + 1 }} {{ item.value.label }}\n  </view>\n</view>\n"
  },
  {
    "path": "scripts/tsxml/fixtures/snapshot/index.wxml",
    "content": "<view class=\"ant-calendar\">\n  <block\n    wx:for=\"{{ todoList }}\"\n    wx:for-index=\"taskIndex\"\n    wx:for-item=\"task\"\n    wx:key=\"a-{{ task.id }}\">\n    <!-- display: inline -->\n    <text\n      hidden=\"{{ !mixin.value }}\"\n      data-item-id=\"{{ taskIndex }}\"\n      data-num=\"{{ 20 }}\"\n      >{{ taskIndex }}{{ task }}</text\n    >\n  </block>\n  <block\n    wx:for=\"{{ todoList }}\"\n    wx:for-index=\"taskIndex\"\n    wx:for-item=\"task\"\n    wx:key=\"todoList\">\n    <!-- display: inline -->\n    <text\n      hidden=\"{{ !mixin.value }}\"\n      data-item-id=\"{{ taskIndex }}\"\n      data-num=\"{{ 20 }}\"\n      >{{ taskIndex }}{{ task }}</text\n    >\n  </block>\n  <test loading />\n  <!-- display: inline -->\n  <text>{{ (progress3 / 100) * 200 }}步</text>\n  <view\n    slot=\"label\"\n    slot-scope=\"item\">\n    {{ item.index + 1 }} {{ item.value.label }}\n  </view>\n</view>\n"
  },
  {
    "path": "scripts/tsxml/fixtures/snapshot/page.axml",
    "content": "<view>1</view>\n<view>1</view>\n"
  },
  {
    "path": "scripts/tsxml/fixtures/snapshot/page.wxml",
    "content": "<view>1</view>\n<view>1</view>\n"
  },
  {
    "path": "scripts/tsxml/fixtures/snapshot/sjs.axml",
    "content": "<import-sjs\n  from=\"./sjs.sjs\"\n  name=\"helper\" />\n\n<view data-id=\"{{ helper.format(b) }}\">text {{ helper.format(c) }}</view>\n"
  },
  {
    "path": "scripts/tsxml/fixtures/snapshot/sjs.wxml",
    "content": "<wxs\n  src=\"./sjs.wxs\"\n  module=\"helper\" />\n\n<view data-id=\"{{ helper.format(b) }}\">text {{ helper.format(c) }}</view>\n"
  },
  {
    "path": "scripts/tsxml/fixtures/snapshot/style.axml",
    "content": "<view>\n  <container\n    title=\"自定义大小\"\n    class=\"container\">\n    <view class=\"list\">\n      <loading style=\"width: 40px; height: 40px\" />\n      <loading style=\"width: 30px; height: 30px\" />\n      <loading\n        className=\"custom-size\"\n        style=\"{{ iconSize ? 'width:' + iconSize + 'px;height:' + iconSize + 'px;font-size:' + iconSize + 'px' : '' }}\" />\n      <!-- display: inline -->\n      <text\n        a=\"1\"\n        b=\"2\"\n        class=\"ant-calendar-cell-top-text {{ item.top.className ? item.top.className : '' }}\"\n        >1111</text\n      >\n    </view>\n  </container>\n</view>\n"
  },
  {
    "path": "scripts/tsxml/fixtures/snapshot/style.wxml",
    "content": "<view>\n  <container\n    title=\"自定义大小\"\n    class=\"container\">\n    <view class=\"list\">\n      <loading style=\"width: 40px; height: 40px\" />\n      <loading style=\"width: 30px; height: 30px\" />\n      <loading\n        className=\"custom-size\"\n        style=\"{{ iconSize ? 'width:' + iconSize + 'px;height:' + iconSize + 'px;font-size:' + iconSize + 'px' : '' }}\" />\n      <!-- display: inline -->\n      <text\n        a=\"1\"\n        b=\"2\"\n        class=\"ant-calendar-cell-top-text {{ item.top.className ? item.top.className : '' }}\"\n        >1111</text\n      >\n    </view>\n  </container>\n</view>\n"
  },
  {
    "path": "scripts/tsxml/fixtures/snapshot/template.axml",
    "content": "<view>\n  <text\n    value=\"{{ [1, 2] }}\"\n    slot=\"123\"\n    slot-scope=\"props\" />\n  <template name=\"taskTpl\">\n    <view class=\"task-item\">\n      <!-- display: inline -->\n      <text class=\"desc\">{{ taskDescription }}</text>\n    </view>\n  </template>\n  <template\n    is=\"taskTpl\"\n    data=\"{{ taskDescription, a }}\" />\n</view>\n"
  },
  {
    "path": "scripts/tsxml/fixtures/snapshot/template.wxml",
    "content": "<view>\n  <text\n    value=\"{{ [1, 2] }}\"\n    slot=\"123\"\n    slot-scope=\"props\" />\n  <template name=\"taskTpl\">\n    <view class=\"task-item\">\n      <!-- display: inline -->\n      <text class=\"desc\">{{ taskDescription }}</text>\n    </view>\n  </template>\n  <template\n    is=\"taskTpl\"\n    data=\"{{ taskDescription, a }}\" />\n</view>\n"
  },
  {
    "path": "scripts/tsxml/fixtures/style.tsx",
    "content": "import { View } from 'tsxml';\n\nexport default ({ item, iconSize }) => (\n  <View>\n    <container title=\"自定义大小\" class=\"container\">\n      <view class=\"list\">\n        <loading style=\"width: 40px; height: 40px;\" />\n        <loading style=\"width: 30px; height: 30px;\" />\n        <loading\n          className=\"custom-size\"\n          style={\n            iconSize\n              ? 'width:' +\n                iconSize +\n                'px;height:' +\n                iconSize +\n                'px;font-size:' +\n                iconSize +\n                'px'\n              : ''\n          }\n        />\n        <text\n          a=\"1\"\n          b=\"2\"\n          class={`ant-calendar-cell-top-text ${\n            item.top.className ? item.top.className : ''\n          }`}\n        >\n          1111\n        </text>\n      </view>\n    </container>\n  </View>\n);\n"
  },
  {
    "path": "scripts/tsxml/fixtures/template.tsx",
    "content": "import { Template, View, Text } from 'tsxml';\n\nexport default ({ taskDescription, a }) => (\n  <View>\n    <Text value={[1, 2]} slot=\"123\" slot-scope=\"props\"></Text>\n    <Template name=\"taskTpl\">\n      <View class=\"task-item\">\n        <Text class=\"desc\">{taskDescription}</Text>\n      </View>\n    </Template>\n    <Template is=\"taskTpl\" data={{ taskDescription, a }}></Template>\n  </View>\n);\n"
  },
  {
    "path": "scripts/tsxml/h.ts",
    "content": "export type Children = Node | string;\nexport interface Node {\n  tagName: string;\n  properties: Record<string, string | number | boolean>;\n  children: Children;\n}\n\nexport function h(tagName: string, props: any, ...children: any[]) {\n  return {\n    tagName,\n    properties: props,\n    children,\n  };\n}\n\nexport function toHtml(vNode: Node | Children | Array<Node | Children>) {\n  if (!vNode) return '';\n  if (typeof vNode === 'string') {\n    return vNode;\n  }\n  if (Array.isArray(vNode)) {\n    return vNode.map((o) => toHtml(o)).join('');\n  }\n  let props = '';\n  if (vNode.properties) {\n    props = Object.keys(vNode.properties)\n      .map((key) => {\n        const value = vNode.properties[key];\n        if (value === true) {\n          return `${key}`;\n        }\n\n        return `${key}=\"${vNode.properties[key]}\"`;\n      })\n      .join(' ');\n  }\n\n  if (Array.isArray(vNode.children) && vNode.children.length > 0) {\n    let prefix = '';\n    if (vNode.tagName === 'text') {\n      prefix = `<!-- display: inline -->`;\n    }\n    return `${prefix}<${vNode.tagName} ${props}>${vNode.children\n      .filter(Boolean)\n      .map((o) => {\n        if (typeof o === 'string' && vNode.tagName === 'text') {\n          return o.trim();\n        }\n        return o;\n      })\n      .map((o) => toHtml(o))\n      .join('')}</${vNode.tagName}>`;\n  }\n\n  return `<${vNode.tagName} ${props} />`;\n}\n"
  },
  {
    "path": "scripts/tsxml/index.spec.ts",
    "content": "import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { expect, it } from 'vitest';\nimport { TransformContext } from './context';\nimport { tsxmlToAxml } from './parser';\nimport { alipay, wechat } from './platform';\nimport { parseCode } from './utils';\n\nasync function textTsXml(fixtureName: string) {\n  const fixture = await fs.readFile(\n    path.resolve(__dirname, `./fixtures/${fixtureName}.tsx`),\n    'utf-8'\n  );\n  const code = fixture;\n  const ast = parseCode(fixture);\n  const ctx = TransformContext.create(ast, alipay, code);\n\n  expect(await tsxmlToAxml(ctx)).toMatchFileSnapshot(\n    `fixtures/snapshot/${fixtureName}.axml`\n  );\n  expect(\n    await tsxmlToAxml(TransformContext.create(ast, wechat, code))\n  ).toMatchFileSnapshot(`fixtures/snapshot/${fixtureName}.wxml`);\n}\n\nit('index', async () => {\n  await textTsXml('index');\n});\n\nit('if', async () => {\n  await textTsXml('if');\n});\n\nit('测试解析为 axml', async () => {\n  await textTsXml('sjs');\n  await textTsXml('style');\n});\n\nit('需要支持拍平 page 和 component', async () => {\n  await textTsXml('page');\n  await textTsXml('component');\n});\n\nit('测试事件', async () => {\n  await textTsXml('event');\n});\n\nit('template', async () => {\n  await textTsXml('template');\n});\n\nit('command', async () => {\n  await textTsXml('command');\n});\n"
  },
  {
    "path": "scripts/tsxml/index.ts",
    "content": "export { TransformContext } from './context';\nexport { tsxmlToAxml } from './parser';\nexport { parseCode, parseXmlScript } from './utils';\nexport { alipay, wechat, PlatformConfig } from './platform';\n"
  },
  {
    "path": "scripts/tsxml/parser.ts",
    "content": "import * as types from '@babel/types';\nimport { ITransformContext, TransformContext } from './context';\nimport { getAxmlArrowFunctionExpression, parseXmlScript } from './utils';\n\nexport function getJSXElementName(\n  ctx: ITransformContext<types.JSXElement>\n): string {\n  const nameNode = ctx.node.openingElement.name;\n  switch (nameNode.type) {\n    case 'JSXIdentifier': {\n      return nameNode.name;\n    }\n    default: {\n      throw ctx.throw(nameNode, 'Unsupported JSXElement name');\n    }\n  }\n}\n\nexport function getJSXAttributeName(\n  ctx: ITransformContext<types.JSXAttribute>\n): string {\n  const nameNode = ctx.node.name;\n  switch (nameNode.type) {\n    case 'JSXIdentifier': {\n      return nameNode.name;\n    }\n    default: {\n      throw ctx.throw(nameNode, 'Unsupported JSXElement name');\n    }\n  }\n}\n\nexport async function tsxmlToAxml(ctx: ITransformContext<types.File>) {\n  const xmlScript = await parseXmlScript(ctx);\n  const imports = await Promise.all(\n    xmlScript.map((o) =>\n      TransformContext.toHtml(\n        ctx.h(ctx.platform.xmlScript.tagName, {\n          [ctx.platform.xmlScript.from]: o.path,\n          [ctx.platform.xmlScript.name]: o.moduleName,\n        })\n      )\n    )\n  );\n  const arrowFunctionCtx = getAxmlArrowFunctionExpression(ctx);\n  if (arrowFunctionCtx === null) {\n    throw ctx.throw(ctx.node, 'tsxml 必须使用 export default 导出');\n  }\n  const axml = await TransformContext.toHtml(\n    transformJSXElement(arrowFunctionCtx)\n  );\n  return imports.concat([axml]).join('\\n');\n}\n\ninterface NodeAttr {\n  name: string;\n  value: string;\n}\n\nexport function transformJSXElement(ctx: ITransformContext) {\n  switch (ctx.node.type) {\n    case 'ArrowFunctionExpression': {\n      return transformJSXElement(ctx.extends(ctx.node.body));\n    }\n    case 'JSXEmptyExpression': {\n      return null;\n    }\n    case 'JSXElement': {\n      const tagName = ctx.getTagName(\n        getJSXElementName(ctx as ITransformContext<types.JSXElement>)\n      );\n\n      if (tagName === 'page' || tagName === 'component') {\n        return [\n          ...ctx.node.children.map((node) => {\n            return transformJSXElement(ctx.extends(node));\n          }),\n        ];\n      }\n      const props = ctx.node.openingElement.attributes\n        .map((attr) => {\n          if (attr.type === 'JSXSpreadAttribute') {\n            throw ctx.throw(ctx.node);\n          }\n          const attrName = ctx.getAttrName(\n            tagName,\n            getJSXAttributeName(ctx.extends(attr))\n          );\n          if (attr.value === null) {\n            return {\n              name: attrName,\n              value: true,\n            };\n          }\n          switch (attr.value.type) {\n            case 'StringLiteral': {\n              return { name: attrName, value: attr.value.value };\n            }\n            case 'JSXExpressionContainer': {\n              return {\n                name: attrName,\n                value: transformAttrExpression(\n                  ctx.extends(attr.value.expression)\n                ),\n              };\n            }\n            default: {\n              throw ctx.throw(ctx.node);\n            }\n          }\n        })\n        .filter((o): o is NodeAttr => !!o)\n        .reduce((acc, cur) => {\n          acc[cur.name] = cur.value;\n          return acc;\n        }, ctx.extraAttr);\n\n      return ctx.h(\n        tagName,\n        { ...props },\n        ...ctx.node.children.map((node) => {\n          return transformJSXElement(ctx.extends(node));\n        })\n      );\n    }\n    case 'StringLiteral': {\n      return ctx.node.value;\n    }\n    case 'JSXText': {\n      return ctx.node.value;\n    }\n    case 'JSXExpressionContainer': {\n      return transformJSXElement(ctx.extends(ctx.node.expression));\n    }\n    case 'LogicalExpression': {\n      if (ctx.node.operator === '&&') {\n        const isElse = ctx.extraAttr?.[ctx.else()];\n        return transformJSXElement(\n          ctx.extends(ctx.node.right, {\n            [isElse ? ctx.elseif() : ctx.if()]: ctx\n              .extends(ctx.node.left)\n              .toAxmlExpression(true),\n          })\n        );\n      }\n      return ctx.extends(ctx.node).toAxmlExpression(true);\n    }\n    case 'CallExpression': {\n      if (ctx.node.callee.type !== 'MemberExpression') {\n        throw ctx.throw(ctx.node);\n      }\n\n      const callee = ctx.node.callee;\n\n      if (\n        !types.isIdentifier(callee.property) ||\n        callee.property.name !== 'map'\n      ) {\n        return ctx.toAxmlExpression(ctx.node);\n      }\n      if (ctx.node.arguments.length !== 1) {\n        throw ctx.throw(ctx.node);\n      }\n      const mapFunction = ctx.node.arguments[0];\n      if (mapFunction.type !== 'ArrowFunctionExpression') {\n        throw ctx.throw(mapFunction);\n      }\n      const mapFunctionItem = mapFunction.params[0];\n      const mapFunctionItemIndex = mapFunction.params[1];\n      let itemName = 'item';\n      if (mapFunctionItem) {\n        if (mapFunctionItem.type !== 'Identifier') {\n          throw ctx.throw(mapFunctionItem);\n        } else {\n          itemName = mapFunctionItem.name;\n        }\n      }\n      let indexName = 'index';\n      if (mapFunctionItemIndex) {\n        if (mapFunctionItemIndex.type !== 'Identifier') {\n          throw ctx.throw(mapFunctionItemIndex);\n        } else {\n          indexName = mapFunctionItemIndex.name;\n        }\n      }\n\n      let forItem = ctx.extends(callee.object).toAxmlExpression();\n\n      if (\n        types.isCallExpression(callee.object) &&\n        types.isIdentifier(callee.object.callee, { name: '$toArray' })\n      ) {\n        forItem = ctx.extends(callee.object.arguments[0]).toAxmlExpression();\n      }\n      const forProps = {\n        [ctx.for()]: forItem,\n        [ctx.forIndex()]: indexName,\n        [ctx.forItem()]: itemName,\n      };\n\n      const { forKey, arrowFunction } = findForKey(ctx.node.arguments[0], ctx);\n      if (forKey) {\n        forProps[ctx.forKey()] = forKey;\n      }\n      return ctx.h(\n        'block',\n        forProps,\n        transformJSXElement(ctx.extends(arrowFunction))\n      );\n    }\n    case 'ObjectExpression': {\n      return ctx.toAxmlExpression();\n    }\n    case 'MemberExpression': {\n      return ctx.toAxmlExpression();\n    }\n    case 'BinaryExpression': {\n      return ctx.toAxmlExpression();\n    }\n    case 'NumericLiteral': {\n      return ctx.toAxmlExpression();\n    }\n    case 'Identifier': {\n      return ctx.toAxmlExpression();\n    }\n    case 'TemplateLiteral': {\n      const expression = ctx.node;\n      const quasis = expression.quasis;\n      const expressions = expression.expressions;\n      const res: string[] = [];\n      for (let i = 0; i < quasis.length; i++) {\n        res.push(quasis[i].value.raw);\n        if (expressions[i]) {\n          res.push(ctx.extends(expressions[i]).toAxmlExpression(true));\n        }\n      }\n      return res.join('');\n    }\n    case 'ConditionalExpression': {\n      if (\n        ctx.node.consequent.type !== 'JSXElement' &&\n        ctx.node.alternate.type !== 'JSXElement'\n      ) {\n        return ctx.toAxmlExpression();\n      }\n      const isElse = ctx.extraAttr?.[ctx.else()];\n      return [\n        transformJSXElement(\n          ctx.extends(ctx.node.consequent, {\n            [isElse ? ctx.elseif() : ctx.if()]: ctx\n              .extends(ctx.node.test)\n              .toAxmlExpression(true),\n          })\n        ),\n        transformJSXElement(\n          ctx.extends(ctx.node.alternate, {\n            [ctx.else()]: true,\n          })\n        ),\n      ];\n    }\n\n    default: {\n      throw ctx.throw(\n        ctx.node,\n        'Unsupported JSXElement (' + ctx.node.type + ')'\n      );\n    }\n  }\n}\n\nfunction findForKey(_arrowFunction: types.Node, ctx) {\n  const arrowFunction = types.cloneNode(_arrowFunction, true);\n  if (arrowFunction.type !== 'ArrowFunctionExpression') {\n    return { arrowFunction };\n  }\n  const body = arrowFunction.body;\n  if (body.type !== 'JSXElement') {\n    return { arrowFunction };\n  }\n  const attrIndex = body.openingElement.attributes.findIndex((e) => {\n    return e.type === 'JSXAttribute' && e.name.name === 'key';\n  });\n  if (attrIndex !== -1) {\n    const attr = body.openingElement.attributes[attrIndex];\n    if (attr.type === 'JSXAttribute') {\n      body.openingElement.attributes.splice(attrIndex, 1);\n      return {\n        arrowFunction,\n        forKey: transformJSXElement(ctx.extends(attr.value)),\n      };\n    }\n  }\n  return { arrowFunction };\n}\n\nfunction transformAttrExpression(ctx: ITransformContext) {\n  const expression = ctx.node;\n  switch (expression.type) {\n    case 'Identifier': {\n      return `{{ ${expression.name} }}`;\n    }\n    case 'TemplateLiteral': {\n      const quasis = expression.quasis;\n      const expressions = expression.expressions;\n      const res: string[] = [];\n      for (let i = 0; i < quasis.length; i++) {\n        res.push(quasis[i].value.raw);\n        if (expressions[i]) {\n          res.push(ctx.extends(expressions[i]).toAxmlExpression(true));\n        }\n      }\n      return res.join('');\n    }\n    case 'UnaryExpression':\n    case 'ConditionalExpression':\n    case 'LogicalExpression':\n    case 'BooleanLiteral':\n    case 'MemberExpression':\n    case 'NumericLiteral':\n    case 'BinaryExpression':\n    case 'CallExpression': {\n      return ctx.toAxmlExpression(true);\n    }\n\n    case 'ArrayExpression': {\n      const result = ctx.toAxmlExpression();\n      if (result.startsWith('{{ ;')) {\n        return result.replace(/^\\{\\{ ;/, '{{ ');\n      } else {\n        return result;\n      }\n      break;\n    }\n\n    case 'ObjectExpression': {\n      return ctx.toAxmlObject();\n    }\n    default: {\n      throw ctx.throw(ctx.node, '解析 Attribute 失败 + ' + expression.type);\n    }\n  }\n}\n"
  },
  {
    "path": "scripts/tsxml/platform.ts",
    "content": "export const alipay: PlatformConfig = {\n  if: 'a:if',\n  for: 'a:for',\n  elseif: 'a:elif',\n  forItem: 'a:for-item',\n  forIndex: 'a:for-index',\n  forKey: 'a:key',\n  else: 'a:else',\n  xmlScript: {\n    from: 'from',\n    name: 'name',\n    tagName: 'import-sjs',\n    ext: 'sjs',\n  },\n  basicEvent: {\n    onTap: 'onTap',\n    catchTap: 'catchTap',\n    'tsxml-for': 'a:for',\n    'tsxml-for-item': 'a:for-item',\n    'tsxml-for-index': 'a:for-index',\n    'tsxml-for-key': 'a:key',\n    'tsxml-if': 'a:if',\n  },\n};\n\nexport const wechat: PlatformConfig = {\n  if: 'wx:if',\n  for: 'wx:for',\n  elseif: 'wx:elif',\n  else: 'wx:else',\n  forItem: 'wx:for-item',\n  forIndex: 'wx:for-index',\n  forKey: 'wx:key',\n  xmlScript: {\n    name: 'module',\n    from: 'src',\n    tagName: 'wxs',\n    ext: 'wxs',\n  },\n  basicEvent: {\n    ref: 'bindref',\n    onVisibleChange: 'bindvisiblechange',\n    onMaskTap: 'bindmasktap',\n    onTap: 'bindtap',\n    catchTap: 'catchtap',\n    onChange: 'bindchange',\n    onScroll: 'bindscroll',\n    'tsxml-for': 'wx:for',\n    'tsxml-for-item': 'wx:for-item',\n    'tsxml-for-index': 'wx:for-index',\n    'tsxml-for-key': 'wx:key',\n    'tsxml-if': 'wx:if',\n  },\n  props: {\n    view: {\n      onTouchStart: 'bindtouchstart',\n      onTouchMove: 'bindtouchmove',\n      onTouchEnd: 'bindtouchend',\n      onAnimationEnd: 'bindanimationend',\n    },\n    input: {\n      onInput: 'bindinput',\n      onConfirm: 'bindconfirm',\n      onFocus: 'bindfocus',\n      onBlur: 'bindblur',\n      onKeyboardHeightChange: 'bindkeyboardheightchange',\n      onNicknameReview: 'bindnicknamereview',\n    },\n    textarea: {\n      onInput: 'bindinput',\n      onConfirm: 'bindconfirm',\n      onFocus: 'bindfocus',\n      onBlur: 'bindblur',\n    },\n    'checkbox-group': {\n      onChange: 'bindchange',\n    },\n    'ant-textarea': {\n      onChange: 'bindchange',\n    },\n    'ant-slider': {\n      onAfterChange: 'bindafterchange',\n    },\n    'ant-input': {\n      onBlur: 'bindblur',\n      onConfirm: 'bindconfirm',\n      onFocus: 'bindfocus',\n      onChange: 'bindchange',\n    },\n    'ant-popup': {\n      onClose: 'bindclose',\n    },\n    'ant-picker': {\n      onOk: 'bindok',\n      onCancel: 'bindcancel',\n    },\n    'ant-cascader-picker': {\n      onOk: 'bindok',\n      onCancel: 'bindcancel',\n    },\n    'ant-date-picker': {\n      onCancel: 'bindcancel',\n      onOk: 'bindok',\n      onPickerChange: 'bindpickerchange',\n    },\n    'ant-selector': {\n      onSelectMin: 'bindselectmin',\n      onSelectMax: 'bindselectmax',\n    },\n    'ant-guide-tour': {\n      onCancel: 'bindcancel',\n    },\n    uploader: {\n      onPreview: 'bindpreview',\n    },\n    'ant-range-picker': {\n      onOk: 'bindok',\n    },\n    'ant-action-sheet': {\n      onAction: 'bindaction',\n      onClose: 'bindclose',\n    },\n    'rare-words-keyboard': {\n      onClose: 'bindclose',\n      onError: 'binderror',\n    },\n    'ant-rare-words-keyboard': {\n      onClose: 'bindclose',\n      onError: 'binderror',\n    },\n    'ant-modal': {\n      onPrimaryButtonTap: 'bindprimarybuttontap',\n      onSecondaryButtonTap: 'bindsecondarybuttontap',\n      onCancelButtonTap: 'bindcancelbuttontap',\n      onClose: 'bindclose',\n    },\n    'number-keyboard': {\n      onClose: 'bindclose',\n    },\n    'ant-number-keyboard': {\n      onClose: 'bindclose',\n    },\n    'movable-view': {\n      onChange: 'bindchange',\n      onChangeEnd: 'bindchangeend',\n      catchTouchEnd: 'catchtouchend',\n      onTouchCancel: 'bindtouchcancel',\n      catchTouchStart: 'catchtouchstart',\n    },\n    'ant-swipe-action': {\n      onSwipeEnd: 'bindswipeend',\n      onSwipeStart: 'bindswipestart',\n      onButtonTap: 'bindbuttontap',\n    },\n  },\n};\n\nexport interface PlatformConfig {\n  for: string;\n  if: string;\n  else: string;\n  elseif: string;\n  forItem: string;\n  forIndex: string;\n  forKey: string;\n  xmlScript: {\n    from: string;\n    name: string;\n    tagName: string;\n    ext: string;\n  };\n  basicEvent: Record<string, string>;\n  props?: {\n    [key: string]: Record<string, string>;\n  };\n}\n"
  },
  {
    "path": "scripts/tsxml/utils.ts",
    "content": "import * as types from '@babel/types';\nimport { parse } from '@babel/parser';\nimport { ITransformContext } from './context';\n\nexport function getAxmlArrowFunctionExpression(\n  ctx: ITransformContext<types.File>\n): ITransformContext<types.ArrowFunctionExpression> | null {\n  const file = ctx.node;\n  const exportDefaultDeclaration =\n    (file.program.body.find(\n      (o) => o.type === 'ExportDefaultDeclaration'\n    ) as types.ExportDefaultDeclaration) ?? null;\n  if (!exportDefaultDeclaration) {\n    return null;\n  }\n  const declaration = exportDefaultDeclaration.declaration;\n  if (declaration.type === 'ArrowFunctionExpression') {\n    return ctx.extends(declaration);\n  }\n  return null;\n}\n\nexport function parseCode(content: string) {\n  const ast = parse(content, {\n    plugins: ['jsx', 'typescript'],\n    sourceType: 'unambiguous',\n  });\n  return ast;\n}\n\nexport interface XmlScript {\n  path: string;\n  moduleName: string;\n}\n\nexport function parseXmlScript(\n  ctx: ITransformContext<types.File>\n): XmlScript[] {\n  const imports: types.ImportDeclaration[] = ctx.node.program.body\n    .filter((p): p is types.ImportDeclaration => p.type === 'ImportDeclaration')\n    .filter((k) => k.source.value.endsWith('.sjs'));\n\n  const nodes: XmlScript[] = [];\n\n  for (const importValue of imports) {\n    const specifiers = importValue.specifiers;\n    if (importValue.specifiers.length !== 1) {\n      throw ctx.throw(importValue, '只支持单个导入');\n    }\n    const firstSpecifier = specifiers[0];\n    if (firstSpecifier.type !== 'ImportDefaultSpecifier') {\n      throw ctx.throw(specifiers[0], '暂不支持非默认导入');\n    }\n    nodes.push({\n      path: importValue.source.value.replace(\n        /sjs$/,\n        ctx.platform.xmlScript.ext\n      ),\n      moduleName: firstSpecifier.local.name,\n    });\n  }\n  return nodes;\n}\n"
  },
  {
    "path": "scripts/verifyCommitMsg.js",
    "content": "/* eslint-disable @typescript-eslint/no-var-requires */\n/* eslint-disable no-console */\nconst REG = /^(revert: )?(feat|fix|docs|style|refactor|perf|workflow|build|ci|chore|types|release)(\\(.+\\))?: .{1,60}/;\nconst  MergeCommitREG = /^Merge remote-tracking branch.+/;\nconst commitMsg = require('fs').readFileSync(process.env.GIT_PARAMS, 'utf-8').trim();\nconst chalk = require('chalk');\n\nif (!REG.test(commitMsg) && !MergeCommitREG.test(commitMsg)) {\n  console.error(`${chalk.bgRed.white(' ERROR ')}`, chalk.red('invalid commit message:'), commitMsg);\n  console.error('Proper commit message format is required for automated changelog generation.');\n  console.error(chalk.green('Please see https://opendocs.alipay.com/cloud/08jm0h for more'));\n  process.exit(1);\n}\n"
  },
  {
    "path": "src/ActionSheet/index.axml",
    "content": "<import-sjs\n  from=\"./index.sjs\"\n  name=\"helper\" />\n\n<ant-popup\n  className=\"ant-actionsheet-popup\"\n  visible=\"{{ visible }}\"\n  position=\"bottom\"\n  zIndex=\"{{ zIndex }}\"\n  onClose=\"onClose\">\n  <view\n    style=\"{{ style }}\"\n    class=\"ant-actionsheet {{ className ? className : '' }} {{ helper.isIconMode(actions) ? 'ant-actionsheet-icon' : '' }}\">\n    <!-- #if ALIPAY -->\n    <slot name=\"title\">\n    <!-- #endif -->\n      <view\n        a:if=\"{{ title }}\"\n        class=\"ant-actionsheet-title-wrap\">\n        <view class=\"ant-actionsheet-title-content\">{{ title }}</view>\n      </view>\n    <!-- #if ALIPAY -->\n    </slot>\n    <!-- #endif -->\n\n    <view class=\"ant-actionsheet-list\">\n      <block\n        a:for=\"{{ actions }}\"\n        a:for-index=\"index\"\n        a:for-item=\"item\"\n        a:key=\"text\">\n        <view\n          class=\"ant-actionsheet-list-item {{ item.disabled ? 'ant-actionsheet-list-item-disabled' : '' }}\"\n          hover-class=\"{{ item.disabled ? '' : 'ant-actionsheet-list-item-active' }}\"\n          onTap=\"onAction\"\n          data-index=\"{{ index }}\"\n          data-item=\"{{ item }}\">\n          <view\n            a:if=\"{{ helper.isIconMode(actions) }}\"\n            class=\"ant-actionsheet-list-item-icon\"\n            style=\"background-image: url('{{ item.icon }}')\" />\n\n          <view class=\"ant-actionsheet-list-item-content\">\n            <view\n              class=\"ant-actionsheet-list-item-title {{ item.danger ? 'ant-actionsheet-list-item-title-danger' : '' }}\">\n              {{ item.text }}\n            </view>\n            <view\n              a:if=\"{{ item.description }}\"\n              class=\"ant-actionsheet-list-item-description\">\n              {{ item.description }}\n            </view>\n          </view>\n        </view>\n      </block>\n    </view>\n    <view class=\"ant-actionsheet-cancel-gap\" />\n    <!-- #if ALIPAY -->\n    <slot name=\"cancelText\">\n    <!-- #endif -->\n      <view\n        class=\"ant-actionsheet-cancel\"\n        onTap=\"onClose\">\n        {{ cancelText }}\n      </view>\n    <!-- #if ALIPAY -->\n    </slot>\n    <!-- #endif -->\n  </view>\n</ant-popup>\n"
  },
  {
    "path": "src/ActionSheet/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Feedback\n  order: 12\ntoc: 'content'\n---\n\n# ActionSheet\n\nActions menu panel that pops up from the bottom. Triggered by a user action, providing a set of two or more options related to the action, allowing the user to complete the action without leaving the field. Compared with the dialog box, the position of the action panel is more suitable for the scene of one-handed operation in the era of large screen.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-action-sheet\": \"antd-mini/es/ActionSheet/index\"\n#endif\n#if WECHAT\n  \"ant-action-sheet\": \"antd-mini/ActionSheet/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n> `ant-action-sheet` Components must pass `visible` Property controls the show/hide state.`actions` property passes in the data to drive the options rendering.\n\n```xml\n<ant-action-sheet\n  title=\"choose your operation\"\n  visible=\"{{visible}}\"\n  actions=\"{{actions}}\"\n#if ALIPAY\n  onAction=\"handleAction\"\n  onClose=\"handleClose\"\n#endif\n#if WECHAT\n  bindaction=\"handleAction\"\n  bindclose=\"handleClose\"\n#endif\n/>\n\n<ant-button\n  inline=\"{{true}}\"\n  size=\"large\"\n#if ALIPAY\n  onTap=\"handleOpen\"\n#endif\n#if WECHAT\n  bindtap=\"handleOpen\"\n#endif\n>\n  Open Panel\n</ant-button>\n```\n\n```js\nPage({\n  data: {\n    visible: true,\n    actions: [\n      {\n        text: 'copy',\n        key: 'copy',\n      },\n      {\n        text: 'modify',\n        key: 'modify',\n      },\n    ],\n  },\n  handleOpen() {\n    this.setData({\n      visible: true,\n    });\n  },\n  handleClose(e) {\n    this.setData({\n      visible: false,\n    });\n  },\n  handleAction(item, index, e) {\n#if ALIPAY\n    if (item.key === 'delete') {\n      my.confirm({\n        content: 'are you sure?',\n      });\n      return;\n    }\n    my.alert({ content: `you clicked ${item.key}` });\n#endif\n#if WECHAT\n    const [clickItem, clickIndex] = item.detail;\n    wx.showToast({ title: `you clicked ${clickItem.key}(${clickIndex})` });\n#endif\n  },\n});\n```\n\n### Option Status\n\n> [actions](#actionsheetitem) Each of the items provided `icon` `danger` `description` `disabled` Used to set the option state.\n\n```xml\n<ant-action-sheet\n  title=\"请选择你要进行的操作\"\n  actions=\"{{actions}}\"\n/>\n```\n\n```js\nPage({\n  data: {\n    actions: [\n      {\n        text: 'copy',\n        key: 'copy',\n        description: 'select copy content',\n      },\n      {\n        text: 'modify',\n        key: 'modify',\n        disabled: true,\n      },\n      {\n        text: 'delete',\n        key: 'delete',\n        danger: true,\n      },\n      {\n        text: 'backup',\n        key: 'backup',\n        description: 'select backup content',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_e7937b/afts/img/A*I0oNS4RCQzUAAAAAAAAAAAAAARQnAQ',\n      },\n      {\n        text: 'save',\n        key: 'save',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_e7937b/afts/img/A*BNczQ7hmp2gAAAAAAAAAAAAAARQnAQ',\n      },\n      {\n        text: 'sync',\n        key: 'sync',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_e7937b/afts/img/A*eRaVSrV56dIAAAAAAAAAAAAAARQnAQ',\n      },\n    ],\n  },\n});\n```\n\n### Demo Code\n\n<code src='../../demo/pages/ActionSheet/index'></code>\n\n## API\n\n| Property                   | Description                               | Type                                                                                                                                        | Default Value |\n| ---------------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ------ |\n| actions                | Panel Options List                       | [ActionSheetItem](#actionsheetitem)[]                                                                                                       | []     |\n| cancelText             | Cancel Button Text                       | string                                                                                                                                      | Cancel   |\n| className              | Class Name                               | string                                                                                                                                      | -      |\n| style                  | Style                               | string                                                                                                                                      | -      |\n| title                  | Title                               | string                                                                                                                                      | -      |\n| visible                | Whether to expand                           | boolean                                                                                                                                     | false  |\n| zIndex                 | Pop-up Level                           | number                                                                                                                                      | 998    |\n| #if ALIPAY onClose     | Trigger on shutdown                         | (event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                           | -      |\n| #if ALIPAY onAction    | Triggered when option is clicked, not triggered when disabled | (item: [ActionSheetItem](#actionsheetitem), index: number, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -      |\n| #if WECHAT bindclose  | Trigger on shutdown                         | (event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                           | -      |\n| #if WECHAT bindaction | Triggered when option is clicked, not triggered when disabled | (item: [ActionSheetItem](#actionsheetitem), index: number, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -      |\n\n### ActionSheetItem\n\n| Property        | Description         | Type    | Default Value |\n| ----------- | ------------ | ------- | ------ |\n| text        | Text         | string  | -      |\n| icon        | Icons         | -       | -      |\n| danger      | Whether dangerous mode | boolean | false  |\n| description | Description         | string  | -      |\n| disabled    | Disable     | boolean | false  |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For more information, see ConfigProvider Components.\n\n| Variable name                       | Default Value                                                                                            | Dark Mode Default                                                                                    | Remarks           |\n| ---------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | -------------- |\n| --actionsheet-danger-color   | <div style=\"width: 150px; height: 30px; background-color: #ff3141;\">#ff3141</div>                 | <div style=\"width: 150px; height: 30px; background-color: #ff4a58;\">#ff4a58</div>                 | Hazardous color       |\n| --actionsheet-title-color    | <div style=\"width: 150px; height: 30px; background-color: #999999;\">#999999</div>                 | <div style=\"width: 150px; height: 30px; background-color: #616161;\">#616161</div>                 | Title Color       |\n| --actionsheet-item-color     | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | Item Color       |\n| --actionsheet-item-active-bg | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #333333;\">#eeeeee</div> | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #fff;\">#2b2b2b</div> | Entries Activate Background Color |\n| --activesheet-item-cancel-bg | <div style=\"width: 150px; height: 30px; background-color: #f5f5f5; color: #333333;\">#f5f5f5</div> | <div style=\"width: 150px; height: 30px; background-color: #121212; color: #fff;\">#121212</div> | Entries cancel background color |\n"
  },
  {
    "path": "src/ActionSheet/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-popup\": \"../Popup/index\"\n  }\n}\n"
  },
  {
    "path": "src/ActionSheet/index.less",
    "content": "@import (reference) './variable.less';\n@import (reference) '../style/mixins/hairline.less';\n\n@actionsheetPrefix: ant-actionsheet;\n.@{actionsheetPrefix} {\n  padding-left: 24 * @rpx;\n  padding-right: 24 * @rpx;\n  padding-bottom: constant(safe-area-inset-bottom);\n  padding-bottom: env(safe-area-inset-bottom);\n  &-title-wrap {\n    text-align: center;\n    position: relative;\n    margin: 0 -24 * @rpx;\n  }\n  &-title-content {\n    display: inline-block;\n    text-align: left;\n    padding: 36 * @rpx 30 * @rpx;\n    font-size: 30 * @rpx;\n    color: @actionsheet-title-color;\n    .hairline('bottom', @actionsheet-item-active-bg);\n  }\n  &-list {\n    margin: 0 -24 * @rpx;\n  }\n  &-list-item {\n    color: @actionsheet-item-color;\n    padding: 32 * @rpx 30 * @rpx;\n    text-align: center;\n    position: relative;\n    font-size: 36 * @rpx;\n    .hairline('bottom', @actionsheet-item-active-bg);\n    &-title-danger {\n      color: @actionsheet-danger-color;\n      font-weight: bold;\n    }\n    &-description {\n      color: @actionsheet-title-color;\n      font-size: 28 * @rpx;\n      line-height: 40 * @rpx;\n      margin-top: 8 * @rpx;\n    }\n    &-active {\n      background-color: @actionsheet-item-active-bg;\n    }\n    &:last-child {\n      &&:after {\n        display: none;\n      }\n    }\n  }\n  &-list-item-disabled {\n    .@{actionsheetPrefix}-list-item-icon,\n    .@{actionsheetPrefix}-list-item-content {\n      opacity: @opacity-disabled;\n    }\n  }\n\n  &-cancel-gap {\n    height: 16 * @rpx;\n    background: @activesheet-item-cancel-bg;\n    margin: 0 -24 * @rpx;\n  }\n\n  &-cancel {\n    color: @actionsheet-item-color;\n    padding: 32 * @rpx 30 * @rpx;\n    font-size: 36 * @rpx;\n    text-align: center;\n    margin: 0 -24 * @rpx;\n    &:active {\n      background-color: @actionsheet-item-active-bg;\n    }\n  }\n}\n\n.@{actionsheetPrefix}-icon {\n  .@{actionsheetPrefix}-title-wrap {\n    text-align: left;\n  }\n  .@{actionsheetPrefix}-list-item {\n    display: flex;\n    align-items: center;\n    &-icon {\n      height: @actionsheet-icon-height;\n      flex: 0 0 @actionsheet-icon-width;\n      margin-right: 24 * @rpx;\n      background-size: contain;\n      background-position: center center;\n      background-repeat: no-repeat;\n    }\n    &-content {\n      text-align: left;\n    }\n  }\n}\n"
  },
  {
    "path": "src/ActionSheet/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 反馈引导\n  order: 12\ntoc: 'content'\n---\n\n# ActionSheet 动作面板\n\n从底部弹出的动作菜单面板。由用户操作触发，提供一组与操作相关的两个或多个选项，让用户在不离场的情况下完成操作。相比于对话框，动作面板的位置更适合于在大屏幕时代单手操作的场景。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-action-sheet\": \"antd-mini/es/ActionSheet/index\"\n#endif\n#if WECHAT\n  \"ant-action-sheet\": \"antd-mini/ActionSheet/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n> `ant-action-sheet` 组件必须通过 `visible` 属性控制显示/隐藏状态。`actions` 属性传入数据驱动选项渲染。\n\n```xml\n<ant-action-sheet\n  title=\"choose your operation\"\n  visible=\"{{visible}}\"\n  actions=\"{{actions}}\"\n#if ALIPAY\n  onAction=\"handleAction\"\n  onClose=\"handleClose\"\n#endif\n#if WECHAT\n  bindaction=\"handleAction\"\n  bindclose=\"handleClose\"\n#endif\n/>\n\n<ant-button\n  inline=\"{{true}}\"\n  size=\"large\"\n#if ALIPAY\n  onTap=\"handleOpen\"\n#endif\n#if WECHAT\n  bindtap=\"handleOpen\"\n#endif\n>\n  打开面板\n</ant-button>\n```\n\n```js\nPage({\n  data: {\n    visible: true,\n    actions: [\n      {\n        text: 'copy',\n        key: 'copy',\n      },\n      {\n        text: 'modify',\n        key: 'modify',\n      },\n    ],\n  },\n  handleOpen() {\n    this.setData({\n      visible: true,\n    });\n  },\n  handleClose(e) {\n    this.setData({\n      visible: false,\n    });\n  },\n  handleAction(item, index, e) {\n#if ALIPAY\n    if (item.key === 'delete') {\n      my.confirm({\n        content: 'are you sure?',\n      });\n      return;\n    }\n    my.alert({ content: `you clicked ${item.key}` });\n#endif\n#if WECHAT\n    const [clickItem, clickIndex] = item.detail;\n    wx.showToast({ title: `you clicked ${clickItem.key}(${clickIndex})` });\n#endif\n  },\n});\n```\n\n### 选项状态\n\n> [actions](#actionsheetitem) 的每一项提供 `icon` `danger` `description` `disabled` 用来设置选项状态。\n\n```xml\n<ant-action-sheet\n  title=\"请选择你要进行的操作\"\n  actions=\"{{actions}}\"\n/>\n```\n\n```js\nPage({\n  data: {\n    actions: [\n      {\n        text: 'copy',\n        key: 'copy',\n        description: 'select copy content',\n      },\n      {\n        text: 'modify',\n        key: 'modify',\n        disabled: true,\n      },\n      {\n        text: 'delete',\n        key: 'delete',\n        danger: true,\n      },\n      {\n        text: 'backup',\n        key: 'backup',\n        description: 'select backup content',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_e7937b/afts/img/A*I0oNS4RCQzUAAAAAAAAAAAAAARQnAQ',\n      },\n      {\n        text: 'save',\n        key: 'save',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_e7937b/afts/img/A*BNczQ7hmp2gAAAAAAAAAAAAAARQnAQ',\n      },\n      {\n        text: 'sync',\n        key: 'sync',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_e7937b/afts/img/A*eRaVSrV56dIAAAAAAAAAAAAAARQnAQ',\n      },\n    ],\n  },\n});\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/ActionSheet/index'></code>\n\n## API\n\n| 属性                   | 说明                               | 类型                                                                                                                                        | 默认值 |\n| ---------------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ------ |\n| actions                | 面板选项列表                       | [ActionSheetItem](#actionsheetitem)[]                                                                                                       | []     |\n| cancelText             | 取消按钮文字                       | string                                                                                                                                      | 取消   |\n| className              | 类名                               | string                                                                                                                                      | -      |\n| style                  | 样式                               | string                                                                                                                                      | -      |\n| title                  | 标题                               | string                                                                                                                                      | -      |\n| visible                | 是否展开                           | boolean                                                                                                                                     | false  |\n| zIndex                 | 弹窗层级                           | number                                                                                                                                      | 998    |\n| #if ALIPAY onClose     | 关闭时触发                         | (event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                           | -      |\n| #if ALIPAY onAction    | 点击选项时触发，禁用状态下不会触发 | (item: [ActionSheetItem](#actionsheetitem), index: number, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -      |\n| #if WECHAT bindclose  | 关闭时触发                         | (event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                           | -      |\n| #if WECHAT bindaction | 点击选项时触发，禁用状态下不会触发 | (item: [ActionSheetItem](#actionsheetitem), index: number, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -      |\n\n### ActionSheetItem\n\n| 属性        | 说明         | 类型    | 默认值 |\n| ----------- | ------------ | ------- | ------ |\n| text        | 文本         | string  | -      |\n| icon        | 图标         | -       | -      |\n| danger      | 是否危险模式 | boolean | false  |\n| description | 描述         | string  | -      |\n| disabled    | 是否禁用     | boolean | false  |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                       | 默认值                                                                                            | 深色模式默认值                                                                                    | 备注           |\n| ---------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | -------------- |\n| --actionsheet-danger-color   | <div style=\"width: 150px; height: 30px; background-color: #ff3141;\">#ff3141</div>                 | <div style=\"width: 150px; height: 30px; background-color: #ff4a58;\">#ff4a58</div>                 | 危险颜色       |\n| --actionsheet-title-color    | <div style=\"width: 150px; height: 30px; background-color: #999999;\">#999999</div>                 | <div style=\"width: 150px; height: 30px; background-color: #616161;\">#616161</div>                 | 标题颜色       |\n| --actionsheet-item-color     | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | 条目颜色       |\n| --actionsheet-item-active-bg | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #333333;\">#eeeeee</div> | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #fff;\">#2b2b2b</div> | 条目激活背景色 |\n| --activesheet-item-cancel-bg | <div style=\"width: 150px; height: 30px; background-color: #f5f5f5; color: #333333;\">#f5f5f5</div> | <div style=\"width: 150px; height: 30px; background-color: #121212; color: #fff;\">#121212</div> | 条目取消背景色 |\n"
  },
  {
    "path": "src/ActionSheet/index.sjs.ts",
    "content": "function isIconMode(actions) {\n  return actions.some(action => !!action.icon)\n}\nexport default {\n  isIconMode,\n}\n"
  },
  {
    "path": "src/ActionSheet/index.ts",
    "content": "import {\n  Component,\n  IPlatformEvent,\n  triggerEventOnly,\n  triggerEventValues,\n} from '../_util/simply';\nimport { ActionSheetDefaultProps, IActionItem } from './props';\n\nComponent({\n  props: ActionSheetDefaultProps,\n  methods: {\n    onAction(e: IPlatformEvent) {\n      const { item, index } = e.currentTarget.dataset as {\n        item: IActionItem;\n        index: number;\n      };\n      if (item?.disabled) return;\n\n      triggerEventOnly(this, 'close', e);\n      triggerEventValues(this, 'action', [item, index], e);\n    },\n    onClose(e: IPlatformEvent) {\n      triggerEventOnly(this, 'close', e);\n    },\n  },\n});\n"
  },
  {
    "path": "src/ActionSheet/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\nexport interface IActionItem {\n  text: string;\n  icon: string;\n  description?: string;\n  danger?: boolean;\n  disabled?: boolean;\n}\n/**\n * @description 头像，可展示头像以及用户名等简要信息。\n */\nexport interface IActionSheetProps extends IBaseProps {\n  /**\n   * @description 标题\n   * @default \"\"\n   */\n  title: string;\n\n  /**\n   * @description 面板选项列表\n   * @default []\n   */\n  actions: IActionItem[];\n\n  /**\n   * @description 取消按钮文字\n   * @default []\n   */\n  cancelText: string;\n\n  /**\n   * @description 是否显示\n   * @default false\n   */\n  visible: boolean;\n\n  zIndex: number;\n\n  /**\n   * @description 点击选项时触发，禁用或加载状态下不会触发\n   */\n\n  onAction: (aciton: IActionItem, index: number, e) => void;\n\n  /**\n   * @description 关闭时触发\n   */\n\n  onClose: (e) => void;\n}\n\nexport const ActionSheetDefaultProps: Partial<IActionSheetProps> = {\n  title: '',\n  actions: [],\n  cancelText: '取消',\n  visible: false,\n  // 弹窗层级\n  zIndex: 998,\n};\n"
  },
  {
    "path": "src/ActionSheet/variable.less",
    "content": "@import (reference) '../style/themes/index.less';\n@import (reference) '../style/variables.less';\n\n@actionsheet-danger-color: var(--actionsheet-danger-color, @COLOR_RED);\n@actionsheet-icon-width: 48 * @rpx;\n@actionsheet-icon-height: 48 * @rpx;\n@actionsheet-title-color: var(--actionsheet-title-color, @COLOR_TEXT_ASSIST);\n@actionsheet-item-color: var(--actionsheet-item-color, @COLOR_TEXT_PRIMARY);\n@actionsheet-item-active-bg: var(--actionsheet-item-active-bg, @COLOR_BORDER);\n@activesheet-item-cancel-bg: var(\n  --activesheet-item-cancel-bg,\n  @COLOR_BACKGROUND\n);\n"
  },
  {
    "path": "src/Alphabet/index.axml",
    "content": "<view class=\"alphabet-container\">\n  <view\n    a:for=\"{{alphabet}}\"\n    a:key=\"*this\"\n    class=\"alphabet-container-item {{item === touchKey ? 'alphabet-container-active' : ''}}\"\n    catchTouchStart=\"onTouchStart\"\n    catchTouchMove=\"onTouchMove\"\n    catchTouchEnd=\"onTouchEnd\"\n    data-item=\"{{item, index}}\"\n    id=\"{{'mya' + index}}\"\n  >\n    {{item}}\n    <view class=\"alphabet-container-item-tip\" a:if=\"{{ item === touchKey }}\">\n      {{item}}\n    </view>\n    <view class=\"alphabet-container-item-triangle\" a:if=\"{{ item === touchKey }}\" />\n  </view>\n</view>\n"
  },
  {
    "path": "src/Alphabet/index.json",
    "content": "{  \n  \"styleIsolation\": \"shared\",\n  \"component\": true\n}"
  },
  {
    "path": "src/Alphabet/index.less",
    "content": ".alphabet-container {\n  position: absolute;\n  top: 50%;\n  right: 0;\n  width: 28rpx;\n  min-height: 48px;\n  padding-left: 12rpx;\n  text-align: center;\n  transform: translate(0, -50%);\n\n  &-item {\n    position: relative;\n    display: flex;\n    width: 14px;\n    height: 14px;\n    font-size: 10px;\n    line-height: 14rpx;\n    color: #999;\n    text-align: center;\n    border-radius: 14rpx;\n    align-items: center;\n    justify-content: center;\n\n    &-tip {\n      position: absolute;\n      left: -180rpx;\n      width: 100rpx;\n      height: 100rpx;\n      font-size: 56rpx;\n      line-height: 100rpx;\n      color: white;\n      text-align: center;\n      background: rgb(204, 204, 204);\n      border-radius: 100rpx;\n    }\n\n    &-triangle {\n      position: absolute;\n      left: -94.66rpx;\n      width: 0;\n      height: 0;\n      border: 35.35rpx solid transparent;\n      border-left: 35.35rpx solid rgb(204, 204, 204);\n    }\n  }\n\n  &-active {\n    color: white;\n    background: #1677ff;\n  }\n}\n"
  },
  {
    "path": "src/Alphabet/index.ts",
    "content": "import { Component, getValueFromProps } from '../_util/simply';\nimport { assertAilpayNativeNotSupport } from '../_util/support';\n\nassertAilpayNativeNotSupport('Alphabet');\n\nlet d = false;\n\nComponent({\n  props: {\n    /** 字母表 */\n    alphabet: [],\n\n    /** 滚动到子元素，值应为某子元素的 id。当滚动到该元素时，元素顶部对齐滚动区域顶部 */\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    onScrollIntoView: (_item: string) => {\n      return _item;\n    },\n  },\n  methods: {\n    onTouchStart(e: any) {\n      if (this.data.moving) return;\n      const alphabet = getValueFromProps(this, 'alphabet');\n      const point = (e && Array.isArray(e.touches) && e.touches[0]) || {};\n      const { item, index } = e.target.dataset.item;\n      const { clientY } = point;\n\n      this.setData({\n        touchClientY: clientY,\n        touchKeyIndex: index,\n        moving: true,\n        touchKey: alphabet[index],\n      });\n      this.onAlphabetClick(item);\n      /// #if ALIPAY\n      my.vibrateShort();\n      /// #endif\n      /// #if WECHAT\n      // @ts-ignore\n      wx.vibrateShort();\n      /// #endif\n    },\n\n    onTouchMove(e: any) {\n      const point = e.changedTouches[0];\n      const movePageY = point.clientY;\n      const { touchClientY, touchKeyIndex, touchKey, itemScrollHeight } =\n        this.data;\n      const alphabet = getValueFromProps(this, 'alphabet');\n      const movingHeight = Math.abs(movePageY - touchClientY);\n      const movingNum = parseInt(`${movingHeight / itemScrollHeight}`, 10);\n      const newIndex =\n        movePageY < touchClientY\n          ? touchKeyIndex - movingNum\n          : touchKeyIndex + movingNum;\n\n      if (d || !alphabet[newIndex] || touchKey === alphabet[newIndex]) return;\n\n      d = true;\n      this.setData({ touchKey: alphabet[newIndex] }, () => {\n        d = false;\n      });\n      /// #if ALIPAY\n      my.vibrateShort();\n      /// #endif\n      /// #if WECHAT\n      // @ts-ignore\n      wx.vibrateShort();\n      /// #endif\n      this.onAlphabetClick(alphabet[newIndex]);\n    },\n\n    onTouchEnd() {\n      if (!this.data.moving) return;\n\n      setTimeout(() => this.setData({ moving: false }), 200);\n      this.setData({ touchKeyIndex: -1, touchKey: '' });\n    },\n\n    onAlphabetClick(item: string) {\n      const onScrollIntoView = getValueFromProps(this, 'onScrollIntoView');\n\n      onScrollIntoView && onScrollIntoView(item);\n    },\n  },\n\n  /** 按下触摸点的高度 */\n  touchClientY: 0,\n\n  /** 选中字母的下标 */\n  touchKeyIndex: -1,\n\n  /** 选中的字母 */\n  touchKey: '',\n\n  /** 每个字母的高度 */\n  itemScrollHeight: 16,\n\n  /** 是否正在滚动 */\n  moving: false,\n});\n"
  },
  {
    "path": "src/AutoResize/index.axml",
    "content": "<view class=\"ant-autoresize-fontsize-container-{{$id}} {{ className }}\">\n  <view class=\"ant-autoresize-slot\" style=\"{{wrapAndEllipsisStyle}}\">\n    <!-- 默认插槽，子组件在这里渲染 -->\n    <slot></slot>\n  </view>\n</view>"
  },
  {
    "path": "src/AutoResize/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Other\n  order: 16\ntoc: 'content'\n---\n\n# AutoResize\n\nWhen multi-language adaptation of existing components is required, this component can be used in the original layout to complete the adaptation of different lengths of text in the component;\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-auto-resize\": \"antd-mini/es/AutoResize/index\"\n#endif\n#if WECHAT\n  \"ant-auto-resize\": \"antd-mini/AutoResize/index\"\n#endif\n}\n```\n\n## Code Sample\n\n<code src=\"../../demo/pages/AutoResize/index\"></code>\n\n## API\n\n| Property        | Description                                                                                                                    | Type    | Default Value |\n| ----------- | ----------------------------------------------------------------------------------------------------------------------- | ------- | ------ |\n| text        | Text to be passed in, used to calculate the width                                                                                              | string  | -      |\n| minFontSize | The minimum font size limit can be set according to the business.                                                                                      | number  | 30     |\n| maxFontSize | The original design font size of this area, which cannot exceed this font size at most.                                                                                  | number  | 36     |\n| wrap        | Whether to support line feed                                                                                                            | boolean | false  |\n| ratio       | Copy width ratio, calculated `maxFontSize / ratio * Copy length`, there are scenes where the English characters are long but the container width is enough to display, but the font is reduced, which can be increased at this time. |\n"
  },
  {
    "path": "src/AutoResize/index.json",
    "content": "{  \n  \"styleIsolation\": \"shared\",\n  \"component\": true\n}\n"
  },
  {
    "path": "src/AutoResize/index.less",
    "content": "@import (reference) './variable.less';\n"
  },
  {
    "path": "src/AutoResize/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 实验性\n  order: 16\ntoc: 'content'\n---\n\n# AutoResize 文本自适应\n\n当需要对现有组件做多语言适配时，可以在原布局中使用本组件，以完成不同长度的文本在组件中的适配；通过计算当前文字的长宽和当前文案所处的容器长宽自动进行适配，且支持通过 ratio 来计算放大比例；\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-auto-resize\": \"antd-mini/es/AutoResize/index\"\n#endif\n#if WECHAT\n  \"ant-auto-resize\": \"antd-mini/AutoResize/index\"\n#endif\n}\n```\n\n## 代码示例\n\n<code src=\"../../demo/pages/AutoResize/index\"></code>\n\n## API\n\n| 属性        | 说明                                                                                                                    | 类型    | 默认值 |\n| ----------- | ----------------------------------------------------------------------------------------------------------------------- | ------- | ------ |\n| text        | 要传入的文本，用来计算宽度                                                                                              | string  | -      |\n| minFontSize | 最小字号限制，可以根据业务自行设置                                                                                      | number  | 30     |\n| maxFontSize | 该区域的原设计字号，最大不能超过该字号                                                                                  | number  | 36     |\n| wrap        | 是否支持换行                                                                                                            | boolean | false  |\n| ratio       | 文案宽度比，计算方式为 `maxFontSize / ratio * 文案长度`，有场景英文字符长但容器宽度足够显示，却缩小了字体，此时可以增大 |\n"
  },
  {
    "path": "src/AutoResize/index.ts",
    "content": "import { getInstanceBoundingClientRect } from '../_util/jsapi/get-instance-bounding-client-rect';\nimport { Component, getValueFromProps } from '../_util/simply';\nimport { AutoResizeDefaultProps } from './props';\n\nComponent({\n  props: AutoResizeDefaultProps,\n  data: {\n    /** 换行或省略号样式 */\n    wrapAndEllipsisStyle: '',\n  },\n  methods: {\n    getInstance() {\n      if (this.$id) {\n        return my;\n      }\n      return this;\n    },\n    async getBoundingClientRect(query: string) {\n      return await getInstanceBoundingClientRect(this.getInstance(), query);\n    },\n    adjustFontSize() {\n      // 用createSelectorQuery来获取容器尺寸信息\n      this.getBoundingClientRect(\n        `.ant-autoresize-fontsize-container-${this.$id}`\n      ).then((rect) => {\n        if (!rect) return;\n        const [text, maxFontSize, ratio] = getValueFromProps(this, [\n          'text',\n          'maxFontSize',\n          'ratio',\n        ]);\n        // 假设自适应逻辑是基于容器宽度来设置字号\n        const containerWidth = rect.width;\n        const textLength = text.length;\n\n        /** 判断是否还有空隙 总宽度 - 字体宽度 > 0 */\n        const hasSpace =\n          containerWidth - (maxFontSize / ratio) * textLength > 0;\n\n        if (!hasSpace) {\n          this.checkTextOverflow();\n        }\n      });\n    },\n    // 检查是否超长\n    checkTextOverflow() {\n      // 子组件插槽的类名是default-slot\n      Promise.all([\n        this.getBoundingClientRect('.ant-autoresize-slot'),\n        this.getBoundingClientRect('.ant-autoresize-fontsize-container'),\n      ]).then((rects) => {\n        const textRect = rects[0];\n        const containerRect = rects[1];\n        if (textRect && containerRect) {\n          const [wrap, minFontSize] = getValueFromProps(this, [\n            'wrap',\n            'minFontSize',\n          ]);\n          let newStyle = '';\n          // 如果容器宽度小于文本宽度，且容器高度支持换行，则换行；\n          // wrap为true时，文案超长会换行，注意样式如margin-top重叠\n          if (containerRect.height / 2 > textRect.height || wrap) {\n            newStyle = `font-size: ${minFontSize}rpx; overflow: visible; white-space: pre-wrap; word-wrap: break-word; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;`;\n          } else {\n            // 如果不支持换行，则直接出现省略号；\n            newStyle = `font-size: ${minFontSize}rpx; max-width: ${textRect.width}px; width: ${textRect.width}px; overflow: hidden; display: inline-block; text-overflow: ellipsis; white-space: nowrap; -webkit-box-orient: vertical;`;\n          }\n          // 设置样式...\n          this.setData({\n            wrapAndEllipsisStyle: newStyle,\n          });\n        }\n      });\n    },\n  },\n  /// #if ALIPAY\n  didMount() {\n    this.adjustFontSize();\n  },\n  /// #endif\n  /// #if WECHAT\n  attached() {\n    this.adjustFontSize();\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/AutoResize/props.ts",
    "content": "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { IBaseProps } from '../_util/base';\n\n/**\n * @description 文本自适应，用于未知长度的文案需要自适应宽度的场景。\n */\n\nexport interface IAutoResizeProps extends IBaseProps {\n  /**\n   * @description 要传入的文本，用来计算宽度\n   */\n  text?: string;\n  /**\n   * @description 最小字号限制， 可以根据业务自行设置\n   * @default 30\n   */\n  minFontSize?: number;\n  /**\n   * @description 是否禁用\n   * @default 36\n   */\n  maxFontSize?: number;\n  /**\n   * @description 是否支持换行\n   * @default false\n   */\n  wrap: boolean;\n  /**\n   * @description 文案宽度比，计算方式为maxFontSize / ratio * 文案长度,\n   * 有场景英文字符长但容器宽度足够显示，却缩小了字体，此时可以增大ratio使用maxFontSize字号\n   * @default 2\n   */\n  ratio?: number;\n}\n\nexport const AutoResizeDefaultProps: Partial<IAutoResizeProps> = {\n  text: '',\n  minFontSize: 30,\n  maxFontSize: 36,\n  wrap: false,\n  ratio: 2,\n};\n"
  },
  {
    "path": "src/AutoResize/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n"
  },
  {
    "path": "src/Avatar/index.axml",
    "content": "<import-sjs\n  from=\"./index.sjs\"\n  name=\"utils\" />\n\n<view\n  class=\"ant-avatar {{ className ? className : '' }}\"\n  style=\"{{ style }}\">\n  <image\n    class=\"ant-avatar-image {{ utils.getClass(size) }}\"\n    src=\"{{ src || utils.defaultSrc }}\" />\n</view>\n"
  },
  {
    "path": "src/Avatar/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Information Display\n  order: 8\ntoc: content\n---\n\n# Avatar\n\nWhen you need to show the characteristics of people or things more intuitively.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-avatar\": \"antd-mini/es/Avatar/index\"\n#endif\n#if WECHAT\n  \"ant-avatar\": \"antd-mini/Avatar/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n```xml\n<ant-avatar src=\"{{imagesUrl}}\" className=\"avatar\" />\n<ant-avatar size=\"large\" src=\"{{imagesUrl}}\" className=\"avatar\" />\n<ant-avatar size=\"x-small\" src=\"{{imagesUrl}}\" style=\"width: 100rpx\" />\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Avatar/index'></code>\n\n## API\n\n| Property      | Description       | Type   | Default Value       |\n|---------|----------|------|-----------|\n| className | Class Name      | string | -         |\n| size     | size, optional `x-small`、`small`、`medium`、`large` | string | `medium` |\n| src      | avatar address    | string | Gray built-in picture |\n| style    | Style      | string | -         |\n"
  },
  {
    "path": "src/Avatar/index.json",
    "content": "{  \n  \"styleIsolation\": \"shared\",\n  \"component\": true\n}\n"
  },
  {
    "path": "src/Avatar/index.less",
    "content": "@import (reference) './variable.less';\n\n@avatarPrefix: ant-avatar;\n\n.@{avatarPrefix} {\n  display: inline-flex;\n  align-items: center;\n  &-image {\n    width: @avatar-size-medium;\n    height: @avatar-size-medium;\n    border-radius: @avatar-img-radius;\n    // 头像大小设置\n    &-x-small {\n      width: @avatar-size-x-small;\n      height: @avatar-size-x-small;\n    }\n    &-small {\n      width: @avatar-size-small;\n      height: @avatar-size-small;\n    }\n    &-medium {\n      width: @avatar-size-medium;\n      height: @avatar-size-medium;\n    }\n    &-large {\n      width: @avatar-size-large;\n      height: @avatar-size-large;\n    }\n  }\n  &-circle {\n    border-radius: 100vh;\n  }\n}\n"
  },
  {
    "path": "src/Avatar/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 数据展示\n  order: 8\ntoc: content\n---\n\n# Avatar 头像\n\n需要更加直观地展现人物或事物特征时。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-avatar\": \"antd-mini/es/Avatar/index\"\n#endif\n#if WECHAT\n  \"ant-avatar\": \"antd-mini/Avatar/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n```xml\n<ant-avatar src=\"{{imagesUrl}}\" className=\"avatar\" />\n<ant-avatar size=\"large\" src=\"{{imagesUrl}}\" className=\"avatar\" />\n<ant-avatar size=\"x-small\" src=\"{{imagesUrl}}\" style=\"width: 100rpx\" />\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Avatar/index'></code>\n\n## API\n\n| 属性      | 说明       | 类型   | 默认值       |\n|---------|----------|------|-----------|\n| className | 类名      | string | -         |\n| size     | 大小，可选 `x-small`、`small`、`medium`、`large` | string | `medium` |\n| src      | 头像地址    | string | 灰色内置图片 |\n| style    | 样式      | string | -         |\n"
  },
  {
    "path": "src/Avatar/index.sjs.ts",
    "content": "function getClass(size) {\n  const list = ['x-small', 'small', 'medium', 'large'];\n  if (list.indexOf(size) >= 0) {\n    return `ant-avatar-image-${size}`;\n  }\n  return 'ant-avatar-image-medium';\n}\nconst defaultSrc =\n  'https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*qIuWQLqszlsAAAAAQFAAAAgAetF8AQ/original';\n\nexport default { getClass, defaultSrc };\n"
  },
  {
    "path": "src/Avatar/index.ts",
    "content": "import { Component } from '../_util/simply';\nimport { AvatarDefaultProps } from './props';\n\nComponent({ props: AvatarDefaultProps });\n"
  },
  {
    "path": "src/Avatar/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\n/**\n * @description 头像，可展示头像以及用户名等简要信息。\n */\nexport interface IAvatarProps extends IBaseProps {\n  /**\n   * @description 尺寸，x-small(80*80) small(88*88) medium(104*104) large(120*120)\n   * @default \"medium\"\n   */\n  size: 'x-small' | 'small' | 'medium' | 'large';\n  /**\n   * @description 头像地址，默认为灰色的内置图片\n   */\n  src: string;\n}\n\nexport const AvatarDefaultProps: Partial<IAvatarProps> = {\n  size: 'medium',\n  src: '',\n};\n"
  },
  {
    "path": "src/Avatar/variable.less",
    "content": "@import (reference) '../style/themes/index.less';\n\n// 头像圆角\n@avatar-img-radius: 50vh;\n// 头像大小 80rpx\n@avatar-size-x-small: 36 * @rpx;\n// 头像大小 88rpx\n@avatar-size-small: 60 * @rpx;\n// 头像大小 104rpx\n@avatar-size-medium: 92 * @rpx;\n// 头像大小 120rpx\n@avatar-size-large: 140 * @rpx;\n"
  },
  {
    "path": "src/Badge/index.axml",
    "content": "<import-sjs\n  from=\"./index.sjs\"\n  name=\"_sjs\" />\n\n<view\n  class=\"ant-badge {{ className || '' }}\"\n  style=\"{{ style }}\">\n  <view class=\"ant-badge-body\">\n    <slot />\n  </view>\n  <view\n    a:if=\"{{ type === 'dot' }}\"\n    class=\"ant-badge-content\"\n    style=\"{{ _sjs.setPositionStyle(position, offsetX, offsetY) }}\">\n    <view\n      class=\"ant-badge-dot {{ stroke ? 'ant-badge-dot-stroke' : '' }}\"\n      style=\"{{ bgColor ? 'background-color: ' + bgColor + ';' : '' }}\" />\n  </view>\n  <view\n    a:else\n    class=\"ant-badge-content ant-badge-content-not-dot {{ type === 'bubble' ? 'ant-badge-content-' + position + '-bubble' : '' }} {{ stroke ? 'ant-badge-content-stroke' : '' }}\"\n    style=\"{{ bgColor ? 'background-color: ' + bgColor + ';' : '' }} {{ _sjs.setBubbleStyle(type, position) }};{{ _sjs.setPositionStyle(position, offsetX, offsetY) }}\">\n    <view class=\"ant-badge-icon-container\" />\n    <view class=\"ant-badge-content-text\">\n      <!-- #if WECHAT -->\n      <slot a:if=\"{{!text}}\" name=\"text\"></slot>\n      <!-- #endif  -->\n      <!-- #if ALIPAY -->\n      <slot name=\"text\">\n      <!-- #endif -->\n        <block a:if=\"{{text}}\">\n          <view\n            a:if=\"{{ type === 'number' }}\"\n            class=\"ant-badge-number\">\n            <!-- display: inline -->\n            <text a:if=\"{{ _sjs.getOverCount(text) }}\">99+</text>\n            <!-- display: inline -->\n            <text a:else>{{ text }}</text>\n          </view>\n          <view\n            a:if=\"{{ type === 'text' }}\"\n            class=\"ant-badge-text\">\n            {{ text }}\n          </view>\n          <view\n            a:if=\"{{ type === 'bubble' }}\"\n            class=\"ant-badge-bubble\">\n            {{ text }}\n          </view>\n        </block>\n      <!-- #if ALIPAY -->\n      </slot>\n      <!-- #endif -->\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "src/Badge/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Feedback\n  order: 12\ntoc: 'content'\n---\n\n# Badge\n\n徽标，显示红点、数字或文字。用于提醒用户，有待处理的事项或者新的更新数量。当需要在右上角展示数字、文字或小红点时使用。适合于提示产品化的新消息、功能或服务等内容，通过显眼的视觉形式吸引用户注意，并促使其进行相关操作。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-badge\": \"antd-mini/es/Badge/index\"\n#endif\n#if WECHAT\n  \"ant-badge\": \"antd-mini/Badge/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-badge type=\"dot\" position=\"top-right\"><view class=\"box\" /></ant-badge>\n<ant-badge type=\"text\" text=\"new\" position=\"top-right\"><view class=\"box\" /></ant-badge>\n<ant-badge type=\"number\" text=\"{{2}}\" position=\"top-right\"><view class=\"box\" /></ant-badge>\n<ant-badge type=\"bubble\" text=\"new\" position=\"top-right\"><view class=\"box\" /></ant-badge>\n```\n\n### 带边框\n\n```xml\n<ant-badge stroke type=\"dot\" position=\"top-right\"><view class=\"box\" /></ant-badge>\n```\n\n### 自定义背景和位置\n\n```xml\n<ant-badge type=\"dot\" position=\"bottom-right\"><view class=\"box\" /></ant-badge>\n<ant-badge type=\"dot\" position=\"top-center\" bgColor=\"#1677FF\"><view class=\"box\" /></ant-badge>\n```\n\n### 设置偏移\n\n```xml\n<ant-badge type=\"dot\" position=\"bottom-right\" offsetX=\"-20px\" offsetY=\"-14px\">\n  <view class=\"box\" />\n</ant-badge>\n```\n\n### 自定义内容\n\n```xml\n<ant-badge type=\"text\" position=\"top-right\">\n  <ant-icon type=\"GlobalOutline\" slot=\"text\" />\n  <view class=\"box\" />\n</ant-badge>\n```\n\n### Demo 代码\n\n<code src=\"../../demo/pages/Badge/index\"></code>\n\n## API\n\n| 属性      | 说明                                                                                                                                     | 类型                     | 默认值      |\n| --------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ | ----------- |\n| bgColor   | 自定义背景色，CSS 色值                                                                                                                   | string                   | -           |\n| className | 组件根节点的类名                                                                                                                         | string                   | -           |\n| offsetX   | 水平方向偏移量                                                                                                                           | string                   | '-50%'      |\n| offsetY   | 垂直方向的偏移量                                                                                                                         | string                   | '-50%'      |\n| position  | 徽标相对于容器的位置，选项包括：`top-left`、`top-right`、`top-center`、`left`、`right`、`bottom-left`、`bottom-center` 和 `bottom-right` | string                   | `top-right` |\n| stroke    | 徽标是否带有描边                                                                                                                         | boolean                  | false       |\n| style     | 自定义样式                                                                                                                               | object                   | -           |\n| text      | 徽标内容，为空代表仅展示红点；可以是数字或文字；若是数字且超过 99，则显示为 `...`                                                        | string \\| number \\| slot | -           |\n| type      | 徽标类型，选项包括：`dot`（红点）、`number`（数字类型，超过 99 会自动转换）、`text`（文字气泡）和 `bubble`（气泡形态，带有箭头）         | string                   | `dot`       |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                   | 默认值                                                                                            | 深色模式默认值                                                                                    | 备注           |\n| ------------------------ | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | -------------- |\n| --badge-text-color       | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #000000;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #000000;\">#ffffff</div> | Badge 文字颜色 |\n| --badge-background-color | <div style=\"width: 150px; height: 30px; background-color: #ff3141; color: #ffffff;\">#ff3141</div> | <div style=\"width: 150px; height: 30px; background-color: #ff4a58; color: #ffffff;\">#ff4a58</div> | Badge 背景颜色 |\n"
  },
  {
    "path": "src/Badge/index.json",
    "content": "{  \n  \"styleIsolation\": \"shared\",\n  \"component\": true\n}\n"
  },
  {
    "path": "src/Badge/index.less",
    "content": "@import (reference) './variable.less';\n\n@badgePrefix: ant-badge;\n\n.@{badgePrefix} {\n  display: inline-block;\n  position: relative;\n\n  &-content {\n    position: absolute;\n    display: flex;\n    height: 28 * @rpx;\n    align-self: center;\n    align-items: center;\n    font-size: 18 * @rpx;\n    padding: 4 * @rpx 8 * @rpx;\n    box-sizing: border-box;\n    word-break: keep-all;\n    justify-content: center;\n    top: 0;\n    left: 100%;\n    transform: translate(-50%, -50%);\n\n    &-stroke {\n      border: 2 * @rpx solid @badge-text-color;\n      border-color: @badge-text-color;\n    }\n\n    &-text {\n      padding-left: 4 * @rpx;\n\n      &:empty {\n        display: none;\n      }\n      /// #if ALIPAY\n      .ant-badge-icon-container:empty ~ & {\n        padding-left: 0;\n      }\n      /// #endif\n    }\n\n    .ant-icon {\n      font-size: 18 * @rpx;\n      color: @badge-text-color;\n    }\n\n    &-not-dot {\n      min-width: 28 * @rpx;\n      height: 28 * @rpx;\n      border-radius: 28 * @rpx;\n      display: flex;\n      background-color: @badge-background-color;\n    }\n  }\n\n  &-dot {\n    width: 20 * @rpx;\n    height: 20 * @rpx;\n    border-radius: 50%;\n    background-color: @badge-background-color;\n\n    &-stroke {\n      border: 2 * @rpx solid @badge-text-color;\n    }\n  }\n\n  &-number,\n  &-text,\n  &-bubble {\n    color: @badge-text-color;\n  }\n}\n"
  },
  {
    "path": "src/Badge/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 反馈引导\n  order: 12\ntoc: 'content'\n---\n\n# Badge 徽标\n\n徽标，显示红点、数字或文字。用于提醒用户，有待处理的事项或者新的更新数量。当需要在右上角展示数字、文字或小红点时使用。适合于提示产品化的新消息、功能或服务等内容，通过显眼的视觉形式吸引用户注意，并促使其进行相关操作。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-badge\": \"antd-mini/es/Badge/index\"\n#endif\n#if WECHAT\n  \"ant-badge\": \"antd-mini/Badge/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-badge type=\"dot\" position=\"top-right\"><view class=\"box\" /></ant-badge>\n<ant-badge type=\"text\" text=\"new\" position=\"top-right\"><view class=\"box\" /></ant-badge>\n<ant-badge type=\"number\" text=\"{{2}}\" position=\"top-right\"><view class=\"box\" /></ant-badge>\n<ant-badge type=\"bubble\" text=\"new\" position=\"top-right\"><view class=\"box\" /></ant-badge>\n```\n\n### 带边框\n\n```xml\n<ant-badge stroke type=\"dot\" position=\"top-right\"><view class=\"box\" /></ant-badge>\n```\n\n### 自定义背景和位置\n\n```xml\n<ant-badge type=\"dot\" position=\"bottom-right\"><view class=\"box\" /></ant-badge>\n<ant-badge type=\"dot\" position=\"top-center\" bgColor=\"#1677FF\"><view class=\"box\" /></ant-badge>\n```\n\n### 设置偏移\n\n```xml\n<ant-badge type=\"dot\" position=\"bottom-right\" offsetX=\"-20px\" offsetY=\"-14px\">\n  <view class=\"box\" />\n</ant-badge>\n```\n\n### 自定义内容\n\n```xml\n<ant-badge type=\"text\" position=\"top-right\">\n  <ant-icon type=\"GlobalOutline\" slot=\"text\" />\n  <view class=\"box\" />\n</ant-badge>\n```\n\n### Demo 代码\n\n<code src=\"../../demo/pages/Badge/index\"></code>\n\n## API\n\n| 属性      | 说明                                                                                                                                     | 类型                     | 默认值      |\n| --------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ | ----------- |\n| bgColor   | 自定义背景色，CSS 色值                                                                                                                   | string                   | -           |\n| className | 组件根节点的类名                                                                                                                         | string                   | -           |\n| offsetX   | 水平方向偏移量                                                                                                                           | string                   | '-50%'      |\n| offsetY   | 垂直方向的偏移量                                                                                                                         | string                   | '-50%'      |\n| position  | 徽标相对于容器的位置，选项包括：`top-left`、`top-right`、`top-center`、`left`、`right`、`bottom-left`、`bottom-center` 和 `bottom-right` | string                   | `top-right` |\n| stroke    | 徽标是否带有描边                                                                                                                         | boolean                  | false       |\n| style     | 自定义样式                                                                                                                               | object                   | -           |\n| text      | 徽标内容，为空代表仅展示红点；可以是数字或文字；若是数字且超过 99，则显示为 `...`                                                        | string \\| number \\| slot | -           |\n| type      | 徽标类型，选项包括：`dot`（红点）、`number`（数字类型，超过 99 会自动转换）、`text`（文字气泡）和 `bubble`（气泡形态，带有箭头）         | string                   | `dot`       |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                   | 默认值                                                                                            | 深色模式默认值                                                                                    | 备注           |\n| ------------------------ | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | -------------- |\n| --badge-text-color       | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #000000;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #000000;\">#ffffff</div> | Badge 文字颜色 |\n| --badge-background-color | <div style=\"width: 150px; height: 30px; background-color: #ff3141; color: #ffffff;\">#ff3141</div> | <div style=\"width: 150px; height: 30px; background-color: #ff4a58; color: #ffffff;\">#ff4a58</div> | Badge 背景颜色 |\n"
  },
  {
    "path": "src/Badge/index.sjs.ts",
    "content": "function setPositionStyle(\n  position,\n  offsetX: string | number = '-50%',\n  offsetY: string | number = '-50%'\n) {\n  const transformStyle = `transform: translate(calc(${offsetX}), calc(${offsetY}));`;\n  switch (position) {\n    case 'top-left':\n      return `top: 0; left: 0; ${transformStyle}`;\n    case 'top-center':\n      return `top: 0; left: 50%; ${transformStyle}`;\n    case 'top-right':\n      return `top: 0; left: 100%; ${transformStyle}`;\n    case 'left':\n      return `top: 50%; left: 0; ${transformStyle}`;\n    case 'right':\n      return `top: 50%; left: 100%; ${transformStyle}`;\n    case 'bottom-left':\n      return `top: 100%; left: 0; ${transformStyle}`;\n    case 'bottom-center':\n      return `top: 100%; left: 50%; ${transformStyle}`;\n    case 'bottom-right':\n      return `top: 100%; left: 100%; ${transformStyle}`;\n    default:\n      return `top: 0; left: 0; ${transformStyle}`;\n  }\n}\n\nfunction setBubbleStyle(type, position) {\n  if (type !== 'bubble') return '';\n  switch (position) {\n    case 'top-left':\n      return 'border-bottom-right-radius: 0;';\n    case 'top-right':\n      return 'border-bottom-left-radius: 0;';\n    case 'bottom-left':\n      return 'border-top-right-radius: 0;';\n    case 'bottom-right':\n      return 'border-top-left-radius: 0;';\n    default:\n      return '';\n  }\n}\n\nfunction getOverCount(text) {\n  let overCount = false;\n  if (typeof text === 'number') {\n    if (text >= 100) {\n      overCount = true;\n    }\n  }\n  return overCount;\n}\n\nexport default { \n  setPositionStyle, \n  setBubbleStyle,\n  getOverCount,\n};\n"
  },
  {
    "path": "src/Badge/index.ts",
    "content": "import { Component } from '../_util/simply';\nimport { BadgeFunctionalProps } from './props';\n\nComponent({ props: BadgeFunctionalProps });\n"
  },
  {
    "path": "src/Badge/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n/**\n * @description 徽标，红点、数字或文字。用于告诉用户待处理的事物或更新数。\n */\n\nexport interface IBadgeProps extends IBaseProps {\n  /**\n   * @description badge 类型\n   * @default dot\n   */\n  type: 'dot' | 'number' | 'text' | 'bubble';\n  /**\n   * @description 红点内容，为空时表示只显示红点；可以是数字，也可以是文字；如果是数字，超过 99 会自动变成 ...\n   */\n  text: string | number;\n  /**\n   * @description 相对于 children 所在访问，left-top(左上角) top-right(右上角)\n   * @default \"top-right\"\n   */\n  position:\n    | 'top-left'\n    | 'top-center'\n    | 'top-right'\n    | 'left'\n    | 'right'\n    | 'bottom-left'\n    | 'bottom-center'\n    | 'bottom-right';\n  /**\n   * @description 水平方向偏移量（字符串类型，需要带上像素单位）\n   * @default \"-50%\"\n   */\n  offsetX: string;\n  /**\n   * @description 垂直方向偏移量（字符串类型，需要带上像素单位）\n   * @default \"-50%\"\n   */\n  offsetY: number | string;\n  /**\n   * @description 是否有描边\n   * @default false\n   */\n  stroke: boolean;\n  /**\n   * @description 背景色\n   */\n  bgColor: string;\n}\n\nexport const BadgeDefaultProps: Partial<IBadgeProps> = {\n  position: 'top-right',\n  stroke: false,\n  type: 'dot',\n  bgColor: '',\n};\n\nexport const BadgeFunctionalProps: Partial<IBadgeProps> = {\n  type: 'dot',\n  text: null,\n  position: 'top-right',\n  offsetX: null,\n  offsetY: null,\n  stroke: false,\n  bgColor: '',\n};\n"
  },
  {
    "path": "src/Badge/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n// 字体颜色，同时作用于 stroke 边框\n@badge-text-color: var(--badge-text-color, @COLOR_WHITE);\n// 背景颜色\n@badge-background-color: var(--badge-background-color, @COLOR_RED);\n"
  },
  {
    "path": "src/Button/index.axml",
    "content": "<import-sjs from=\"./index.sjs\" name=\"utils\" />\n\n<!-- #if ALIPAY -->\n<button\n  form-type=\"{{ formType }}\"\n  hover-class=\"{{ utils.getHoverClass(loading, type, activeClassName) }}\"\n  scope=\"{{ scope }}\"\n  onTap=\"{{ onTap ? 'onTap' : '' }}\"\n  onGetAuthorize=\"onGetAuthorize\"\n  onFollowLifestyle=\"onFollowLifestyle\"\n  onError=\"onError\"\n  onGetUserInfo=\"onGetUserInfo\"\n  onGetPhoneNumber=\"onGetPhoneNumber\"\n  catchTap=\"{{ catchTap ? 'catchTap' : '' }}\"\n  public-id=\"{{ publicId }}\"\n  open-type=\"{{ openType }}\"\n  class=\"ant-button {{ inline ? 'ant-button-inline ' + utils.getClass(size) : '' }} {{ 'ant-button-' + type + (danger ? '-danger' : (utils.isAide(aide, type) ? '-aide' : '' )) }} {{ disabled || loading ? 'ant-button-disabled' : '' }} {{ className ? className : '' }}\"\n  style=\"{{ style }}\"\n>\n  <view class=\"ant-button-wrap\">\n    <ant-icon a:if=\"{{ !!icon }}\" type=\"{{ icon }}\" />\n    <view class=\"ant-button-content-text {{ icon ? 'ant-button-content-text-margin' : '' }}\">\n      <slot />\n      <view a:if=\"{{ !inline && subText }}\" class=\"ant-button-content-subtext\">\n        {{ subText }}\n      </view>\n    </view>\n    <view\n      a:if=\"{{loading}}\"\n      class=\"ant-button-content-loading-container\"\n    >\n      <loading\n        type=\"mini\"\n        color=\"currentColor\"\n        className=\"ant-button-content-loading\"\n      ></loading>\n    </view>\n  </view>\n</button>\n<!-- #endif -->\n<!-- #if WECHAT -->\n<button\n  form-type=\"{{ formType }}\"\n  hover-class=\"{{ utils.getHoverClass(loading, type, activeClassName) }}\"\n  scope=\"{{ scope }}\"\n  bindgetuserinfo=\"onGetUserInfo\"\n  bindcontact=\"onContact\"\n  bindgetphonenumber=\"onGetPhoneNumber\"\n  bindgetrealtimephonenumber=\"onGetRealTimePhoneNumber\"\n  binderror=\"onError\"\n  bindlaunchapp=\"onLaunchApp\"\n  bindopensetting=\"onOpenSetting\"\n  bindagreeprivacyauthorization=\"onAgreePrivacyAuthorization\"\n  bindchooseavatar=\"onChooseAvatar\"\n  public-id=\"{{ publicId }}\"\n  open-type=\"{{ openType }}\"\n  class=\"ant-button {{ inline ? 'ant-button-inline ' + utils.getClass(size) : '' }} {{ 'ant-button-' + type + (danger ? '-danger' : (utils.isAide(aide, type) ? '-aide' : '' )) }} {{ disabled || loading ? 'ant-button-disabled' : '' }} {{ className ? className : '' }}\"\n  style=\"{{ style }}\"\n>\n  <view class=\"ant-button-wrap\">\n    <ant-icon a:if=\"{{ !!icon }}\" type=\"{{ icon }}\" />\n    <view class=\"ant-button-content-text {{ icon ? 'ant-button-content-text-margin' : '' }}\">\n      <slot />\n      <view a:if=\"{{ !inline && subText }}\" class=\"ant-button-content-subtext\">\n        {{ subText }}\n      </view>\n    </view>\n    <view\n      a:if=\"{{loading}}\"\n      class=\"ant-button-content-loading-container\"\n    >\n      <loading\n        type=\"mini\"\n        color=\"currentColor\"\n        className=\"ant-button-content-loading\"\n      ></loading>\n    </view>\n  </view>\n</button>\n<!-- #endif -->\n"
  },
  {
    "path": "src/Button/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: General\n  order: 2\ntoc: 'content'\n---\n\n# Button\n\nUsed to start an immediate operation. Marks a (or encapsulates a set of) operation commands that trigger the corresponding business logic in response to user click behavior.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-button\": \"antd-mini/es/Button/index\"\n#endif\n#if WECHAT\n  \"ant-button\": \"antd-mini/Button/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n#if ALIPAY\n<ant-button type=\"primary\">Alipay</ant-button>\n#endif\n#if WECHAT\n<ant-button type=\"primary\">WeChat</ant-button>\n#endif\n<ant-button type=\"primary\">Main button</ant-button>\n<ant-button type=\"default\">Secondary button</ant-button>\n<ant-button type=\"text\">Text Button</ant-button>\n<ant-button title=\"副标题\" type=\"primary\">With auxiliary copy button</ant-button>\n#if ALIPAY\n<ant-button disabled type=\"primary\" onTap=\"handleTap\" onDisabledTap=\"handleDisabledTap\"> \nDisable </ant-button>\n#endif\n#if WECHAT\n<ant-button disabled type=\"primary\" bindtap=\"handleTap\" bindisabledtap=\"handleDisabledTap\"> \n#endif\n<ant-button type=\"primary\" loading>Loading Status</ant-button>\n<ant-button type=\"primary\" danger>Danger</ant-button>\n```\n\n### Inline Button\n\n```xml\n<ant-button type=\"primary\" inline>Inline Button</ant-button>\n<ant-button type=\"primary\" inline size=\"large\">Button Size-Large</ant-button>\n<ant-button type=\"primary\" inline size=\"medium\">Button Size-Medium</ant-button>\n<ant-button type=\"primary\" inline size=\"small\">Button Size-Small</ant-button>\n<ant-button type=\"primary\" inline danger size=\"large\">Danger</ant-button>\n```\n\n### Button with icon\n\n```xml\n<ant-button type=\"primary\" icon=\"SmileOutline\">Button with icon</ant-button>\n<ant-button type=\"default\" icon=\"SmileOutline\">Button with icon</ant-button>\n<ant-button type=\"default\" danger icon=\"ForbidFill\">Button with icon</ant-button>\n<ant-button type=\"default\" loading icon=\"ForbidFill\">Button with icon</ant-button>\n<ant-button type=\"default\" inline danger size=\"large\" icon=\"ForbidFill\">Button with icon</ant-button>\n```\n\n### More Customizations\n\n```xml\n<ant-button type=\"primary\" icon=\"SmileOutline\" className=\"custom-size\">Custom Size</ant-button>\n<ant-button type=\"primary\" icon=\"SmileOutline\" className=\"round\">Custom Fillet</ant-button>\n```\n\n```css\n.custom-size {\n  font-size: 22rpx;\n}\n.round {\n  border-radius: 50rpx;\n}\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Button/index'></code>\n\n## API\n\n### Button\n\nThe following table describes the API properties for the Button component:\n\n| Property                        | Description                                                            | Type                                                                          | Default Value    |\n| --------------------------- | --------------------------------------------------------------- | ----------------------------------------------------------------------------- | --------- |\n| type                        | Button type, optional `primary`、`default`、`text`                     | string                                                                        | `default` |\n| danger                      | Whether it is a danger button                                                  | boolean                                                                       | false     |\n| disabled                    | Whether it is an invalid button                                                  | boolean                                                                       | false     |\n| activeClassName             | Class name when pressed                                                    | string                                                                        | -         |\n| className                   | Class Name                                                            | string                                                                        | -         |\n| style                       | Style                                                            | string                                                                        | -         |\n| inline                      | Inline button                                                  | boolean                                                                       | false     |\n| icon                        | Icon on the left side of the button                                                    | string                                                                        | -         |\n| loading                     | Whether it is loading or not, it cannot be clicked during loading.                                    | boolean                                                                       | -         |\n| size                        | Button size. Only in `inline` Effective under, optional `small`、`medium`、`large` | string                                                                        | `medium`  |\n| aide                        | Whether the button is a secondary button Only default and primary buttons consume this parameter     | boolean                                                                       | false     |\n| subText                     | Secondary text, displayed on the second line.`inline` Do not take effect                       | string                                                                        | -         |\n| #if ALIPAY catchTap         | Click the button to trigger this callback, non-bubbling                                    | (e: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -         |\n| #if ALIPAY onTap            | Click the button to trigger this callback                                            | (e: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -         |\n| #if ALIPAY onDisabledTap    | Click Departure Callback when disabled (not supported by WeChat)                                | (e: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -         |\n| #if WECHAT catchtap        | Click the button to trigger this callback, non-bubbling                                    | (e: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -         |\n| #if WECHAT bindtap         | Click the button to trigger this callback                                            | (e: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -         |\n| #if WECHAT binddisabledtap | Click Departure Callback when disabled (not supported by WeChat)                                | (e: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -         |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For more information, see ConfigProvider Components.\n\n| Variable name                                   | Default Value                                                                                                                | Dark Mode Default                                                                                                        | Remarks                 |\n| ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | -------------------- |\n| --button-disabled-opacity                | 0.4                                                                                                                   | 0.4                                                                                                                   | Button Disable Transparency       |\n| --button-color                           | <div style=\"width: 150px; height: 40px; background-color: #1677FF;\">#1677FF</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #3086FF;\">#3086FF</div>                                     | Button Color             |\n| --button-background-color                | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333333;\">#FFFFFF</div>                     | <div style=\"width: 150px; height: 40px; background-color: #1a1a1a; color: #FFFFFF;\">#1a1a1a</div>                     | Button background color         |\n| --button-border-color                    | <div style=\"width: 150px; height: 40px; background-color: #1677FF;\">#1677FF</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #3086ff; color: #FFFFFF;\">#3086ff</div>                     | Button border color         |\n| --button-primary-border-color            | <div style=\"width: 150px; height: 40px; background-color: #1677FF;\">#1677FF</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #3086FF;\">#3086FF</div>                                     | Main button border color     |\n| --button-primary-background-color        | <div style=\"width: 150px; height: 40px; background-color: #1677FF;\">#1677FF</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #3086FF;\">#3086FF</div>                                     | Main button background color     |\n| --button-primary-color                   | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333333;\">#FFFFFF</div>                     | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #000000;\">#FFFFFF</div>                     | Main button color         |\n| --button-primary-aide-border-color       | <div style=\"width: 150px; height: 40px; background-color: #E7F1FF; color: #333333;\">#E7F1FF</div>                     | <div style=\"width: 150px; height: 40px; background-color: #0D2543; color: #FFFFFF;\">#0D2543</div>                     | Primary Secondary Button Border Color |\n| --button-primary-aide-color              | <div style=\"width: 150px; height: 40px; background-color: #1677FF;\">#1677FF</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #3086FF;\">#3086FF</div>                                     | Primary Auxiliary Button Color     |\n| --button-default-aide-border-color       | <div style=\"width: 150px; height: 40px; background-color: #F5F5F5; color: #333333;\">#F5F5F5</div>                     | <div style=\"width: 150px; height: 40px; background-color: #121212; color: #FFFFFF;\">#121212</div>                     | Default Secondary Button Border Color |\n| --button-default-aide-background-color   | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333333;\">#FFFFFF</div>                     | <div style=\"width: 150px; height: 40px; background-color: #1a1a1a; color: #FFFFFF;\">#1a1a1a</div>                     | Default Auxiliary Button Background Color |\n| --button-default-aide-color              | <div style=\"width: 150px; height: 40px; background-color: #333333; color: #FFFFFF;\">#333333</div>                     | <div style=\"width: 150px; height: 40px; background-color: #C5CAD1; color: #FFFFFF;\">#C5CAD1</div>                     | Default Auxiliary Button Color     |\n| --button-primary-danger-background-color | <div style=\"width: 150px; height: 40px; background-color: #FF3141;\">#FF3141</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #FF4A58;\">#FF4A58</div>                                     | Primary Danger Button Background Color |\n| --button-primary-danger-border-color     | <div style=\"width: 150px; height: 40px; background-color: #FF3141;\">#FF3141</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #FF4A58;\">#FF4A58</div>                                     | Primary Hazard Button Border Color |\n| --button-primary-danger-color            | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333333;\">#FFFFFF</div>                     | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333333;\">#FFFFFF</div>                     | Primary Hazard Button Color     |\n| --button-default-danger-background-color | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333333;\">#FFFFFF</div>                     | <div style=\"width: 150px; height: 40px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div>                     | Default Hazard Button Background Color |\n| --button-default-danger-border-color     | <div style=\"width: 150px; height: 40px; background-color: #FF3141;\">#FF3141</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #FF4A58;\">#FF4A58</div>                                     | Default Hazard Button Border Color |\n| --button-default-danger-color            | <div style=\"width: 150px; height: 40px; background-color: #FF3141;\">#FF3141</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #FF4A58;\">#FF4A58</div>                                     | Default Hazard Button Color     |\n| --button-text-danger-color               | <div style=\"width: 150px; height: 40px; background-color: #FF3141;\">#FF3141</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #FF4A58;\">#FF4A58</div>                                     | Hazard button text color     |\n| --button-danger-default-color            | <div style=\"width: 150px; height: 40px; background-color: #FF3141;\">#FF3141</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #FF4A58;\">#FF4A58</div>                                     | Hazard Button Default Color     |\n| --button-active-bg                       | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0.08);\">rgba(255, 255, 255, 0.08)</div> | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0.08);\">rgba(255, 255, 255, 0.08)</div> | Button to activate background color     |\n\n### More Properties\n\nThe following are additional properties that the Button component supports:\n\n- `public-id`\n- `open-type`\n- `scope`\n- `form-type`\n- `onGetAuthorize`\n- `onFollowLifestyle`\n- `onError`\n- `onGetUserInfo`\n- `onGetPhoneNumber`\n\nFor specific attribute descriptions, please refer to the official documents of Alipay applet.\n\n[Button component property description](https://opendocs.alipay.com/mini/component/button#%E5%B1%9E%E6%80%A7%E8%AF%B4%E6%98%8E)\n"
  },
  {
    "path": "src/Button/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"loading\": \"../Loading/index\",\n    \"ant-icon\": \"../Icon/index\"\n  }\n}\n"
  },
  {
    "path": "src/Button/index.less",
    "content": "@import (reference) './variable.less';\n\n@buttonPrefix: ant-button;\n\n.@{buttonPrefix} {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  height: auto;\n  line-height: normal;\n  padding: @button-padding;\n  border-radius: 50vh;\n  border: 0 none;\n  box-sizing: border-box;\n  font-size: @button-font-size;\n  z-index: 2;\n\n  &-large {\n    font-size: @button-large-font-size;\n    padding: @button-padding;\n  }\n\n  &-medium {\n    font-size: @button-medium-font-size;\n    padding: @button-medium-padding;\n  }\n\n  &-small {\n    font-size: @button-small-font-size;\n    padding: @button-small-padding;\n  }\n\n  &-primary {\n    color: @button-primary-color;\n    background-color: @button-primary-background-color;\n    box-shadow: inset 0 0 0 @button-border-size @button-primary-background-color;\n  }\n\n  &-default {\n    color: @button-color;\n    background-color: @button-background-color;\n    box-shadow: inset 0 0 0 @button-border-size @button-border-color;\n  }\n\n  &-capsule {\n    color: @button-primary-color;\n    background-color: @button-default-aide-border-color;\n    box-shadow: none;\n  }\n  &-primary-aide {\n    background-color: @button-primary-aide-background-color;\n    box-shadow: inset 0 0 0 @button-border-size\n      @button-primary-aide-border-color;\n    color: @button-color;\n  }\n\n  &-default-aide {\n    color: @button-default-aide-color;\n    background-color: @button-default-aide-background-color;\n    box-shadow: inset 0 0 0 @button-border-size\n      @button-default-aide-border-color;\n  }\n\n  &-text {\n    color: @button-color;\n    background-color: transparent;\n    box-shadow: none;\n  }\n\n  &-primary-danger {\n    color: @button-primary-danger-color;\n    background-color: @button-primary-danger-background-color;\n    box-shadow: inset 0 0 0 @button-border-size\n      @button-primary-danger-border-color;\n  }\n\n  &-default-danger {\n    color: @button-default-danger-color;\n    background-color: @button-default-danger-background-color;\n    box-shadow: inset 0 0 0 @button-border-size\n      @button-default-danger-border-color;\n  }\n\n  &-text-danger {\n    color: @button-text-danger-color;\n    background-color: transparent;\n    box-shadow: none;\n  }\n\n  &-text-active {\n    background-color: @button-active-bg;\n  }\n\n  &-active {\n    filter: brightness(0.92);\n  }\n\n  &-disabled {\n    opacity: @button-disabled-opacity;\n  }\n\n  &-wrap {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    justify-content: center;\n  }\n\n  &-content-text-margin {\n    margin-left: @h-spacing-standard;\n  }\n  &-content-text {\n    /// #if ALIPAY\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    /// #endif\n    &:empty {\n      margin-left: 0;\n      width: 0;\n      opacity: 0;\n      &::after {\n        content: '\\00a0';\n      }\n    }\n  }\n\n  &-content-subtext {\n    font-size: @button-subtext-size;\n    opacity: 0.6;\n  }\n\n  &-content-loading-container {\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    width: 33px;\n    height: 16px;\n    margin-left: 8px;\n  }\n\n  &-content-loading {\n    position: relative;\n  }\n\n  &-inline {\n    /// #if ALIPAY\n    display: inline-block;\n    /// #endif\n    /// #if WECHAT\n    display: inline-flex;\n    /// #endif\n    border-radius: @button-corner-radius;\n\n    .@{buttonPrefix}-content-loading-container {\n      width: @button-icon-size;\n      height: @button-icon-size;\n    }\n\n    .@{buttonPrefix}-content-loading {\n      transform: scale(0.5);\n    }\n  }\n\n  /// #if WECHAT\n  &::after {\n    border-width: 0;\n  }\n  /// #endif\n}\n"
  },
  {
    "path": "src/Button/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 通用\n  order: 2\ntoc: 'content'\n---\n\n# Button 按钮\n\n用于开始一个即时操作。标记了一个（或封装一组）操作命令，响应用户点击行为，触发相应的业务逻辑。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-button\": \"antd-mini/es/Button/index\"\n#endif\n#if WECHAT\n  \"ant-button\": \"antd-mini/Button/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n#if ALIPAY\n<ant-button type=\"primary\">Alipay</ant-button>\n#endif\n#if WECHAT\n<ant-button type=\"primary\">WeChat</ant-button>\n#endif\n<ant-button type=\"primary\">Main button</ant-button>\n<ant-button type=\"default\">Secondary button</ant-button>\n<ant-button type=\"text\">Text Button</ant-button>\n<ant-button title=\"副标题\" type=\"primary\">With auxiliary copy button</ant-button>\n#if ALIPAY\n<ant-button disabled type=\"primary\" onTap=\"handleTap\" onDisabledTap=\"handleDisabledTap\"> \nDisable </ant-button>\n#endif\n#if WECHAT\n<ant-button disabled type=\"primary\" bindtap=\"handleTap\" bindisabledtap=\"handleDisabledTap\"> \n#endif\n<ant-button type=\"primary\" loading>Loading Status</ant-button>\n<ant-button type=\"primary\" danger>Danger</ant-button>\n```\n\n### 行内按钮\n\n```xml\n<ant-button type=\"primary\" inline>行内按钮</ant-button>\n<ant-button type=\"primary\" inline size=\"large\">按钮尺寸-大</ant-button>\n<ant-button type=\"primary\" inline size=\"medium\">按钮尺寸-中</ant-button>\n<ant-button type=\"primary\" inline size=\"small\">按钮尺寸-小</ant-button>\n<ant-button type=\"primary\" inline danger size=\"large\">危险</ant-button>\n```\n\n### 带图标按钮\n\n```xml\n<ant-button type=\"primary\" icon=\"SmileOutline\">带图标按钮</ant-button>\n<ant-button type=\"default\" icon=\"SmileOutline\">带图标按钮</ant-button>\n<ant-button type=\"default\" danger icon=\"ForbidFill\">带图标按钮</ant-button>\n<ant-button type=\"default\" loading icon=\"ForbidFill\">带图标按钮</ant-button>\n<ant-button type=\"default\" inline danger size=\"large\" icon=\"ForbidFill\">带图标按钮</ant-button>\n```\n\n### 更多自定义\n\n```xml\n<ant-button type=\"primary\" icon=\"SmileOutline\" className=\"custom-size\">自定义大小</ant-button>\n<ant-button type=\"primary\" icon=\"SmileOutline\" className=\"round\">自定义圆角</ant-button>\n```\n\n```css\n.custom-size {\n  font-size: 22rpx;\n}\n.round {\n  border-radius: 50rpx;\n}\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Button/index'></code>\n\n## API\n\n### Button\n\n以下表格介绍了 Button 组件的 API 属性：\n\n| 属性                        | 说明                                                            | 类型                                                                          | 默认值    |\n| --------------------------- | --------------------------------------------------------------- | ----------------------------------------------------------------------------- | --------- |\n| type                        | 按钮类型，可选 `primary`、`default`、`text`                     | string                                                                        | `default` |\n| danger                      | 是否为危险按钮                                                  | boolean                                                                       | false     |\n| disabled                    | 是否为失效按钮                                                  | boolean                                                                       | false     |\n| activeClassName             | 按下时的类名                                                    | string                                                                        | -         |\n| className                   | 类名                                                            | string                                                                        | -         |\n| style                       | 样式                                                            | string                                                                        | -         |\n| inline                      | 是否为内联按钮                                                  | boolean                                                                       | false     |\n| icon                        | 按钮左侧图标                                                    | string                                                                        | -         |\n| loading                     | 是否加载中，加载中时不可点击                                    | boolean                                                                       | -         |\n| size                        | 按钮大小。仅在 `inline` 下生效，可选 `small`、`medium`、`large` | string                                                                        | `medium`  |\n| aide                        | 按钮是否是辅助按钮 只有 default 和 primary 按钮才消费该参数     | boolean                                                                       | false     |\n| subText                     | 辅助文字，显示在第二行。`inline` 下不生效                       | string                                                                        | -         |\n| #if ALIPAY catchTap         | 点击按钮，触发此回调，非冒泡                                    | (e: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -         |\n| #if ALIPAY onTap            | 点击按钮，触发此回调                                            | (e: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -         |\n| #if ALIPAY onDisabledTap    | 禁用时点击出发回调（微信不支持）                                | (e: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -         |\n| #if WECHAT catchtap        | 点击按钮，触发此回调，非冒泡                                    | (e: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -         |\n| #if WECHAT bindtap         | 点击按钮，触发此回调                                            | (e: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -         |\n| #if WECHAT binddisabledtap | 禁用时点击出发回调（微信不支持）                                | (e: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -         |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                                   | 默认值                                                                                                                | 深色模式默认值                                                                                                        | 备注                 |\n| ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | -------------------- |\n| --button-disabled-opacity                | 0.4                                                                                                                   | 0.4                                                                                                                   | 按钮禁用透明度       |\n| --button-color                           | <div style=\"width: 150px; height: 40px; background-color: #1677FF;\">#1677FF</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #3086FF;\">#3086FF</div>                                     | 按钮颜色             |\n| --button-background-color                | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333333;\">#FFFFFF</div>                     | <div style=\"width: 150px; height: 40px; background-color: #1a1a1a; color: #FFFFFF;\">#1a1a1a</div>                     | 按钮背景颜色         |\n| --button-border-color                    | <div style=\"width: 150px; height: 40px; background-color: #1677FF;\">#1677FF</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #3086ff; color: #FFFFFF;\">#3086ff</div>                     | 按钮边框颜色         |\n| --button-primary-border-color            | <div style=\"width: 150px; height: 40px; background-color: #1677FF;\">#1677FF</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #3086FF;\">#3086FF</div>                                     | 主要按钮边框颜色     |\n| --button-primary-background-color        | <div style=\"width: 150px; height: 40px; background-color: #1677FF;\">#1677FF</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #3086FF;\">#3086FF</div>                                     | 主要按钮背景颜色     |\n| --button-primary-color                   | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333333;\">#FFFFFF</div>                     | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #000000;\">#FFFFFF</div>                     | 主要按钮颜色         |\n| --button-primary-aide-border-color       | <div style=\"width: 150px; height: 40px; background-color: #E7F1FF; color: #333333;\">#E7F1FF</div>                     | <div style=\"width: 150px; height: 40px; background-color: #0D2543; color: #FFFFFF;\">#0D2543</div>                     | 主要辅助按钮边框颜色 |\n| --button-primary-aide-color              | <div style=\"width: 150px; height: 40px; background-color: #1677FF;\">#1677FF</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #3086FF;\">#3086FF</div>                                     | 主要辅助按钮颜色     |\n| --button-default-aide-border-color       | <div style=\"width: 150px; height: 40px; background-color: #F5F5F5; color: #333333;\">#F5F5F5</div>                     | <div style=\"width: 150px; height: 40px; background-color: #121212; color: #FFFFFF;\">#121212</div>                     | 默认辅助按钮边框颜色 |\n| --button-default-aide-background-color   | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333333;\">#FFFFFF</div>                     | <div style=\"width: 150px; height: 40px; background-color: #1a1a1a; color: #FFFFFF;\">#1a1a1a</div>                     | 默认辅助按钮背景颜色 |\n| --button-default-aide-color              | <div style=\"width: 150px; height: 40px; background-color: #333333; color: #FFFFFF;\">#333333</div>                     | <div style=\"width: 150px; height: 40px; background-color: #C5CAD1; color: #FFFFFF;\">#C5CAD1</div>                     | 默认辅助按钮颜色     |\n| --button-primary-danger-background-color | <div style=\"width: 150px; height: 40px; background-color: #FF3141;\">#FF3141</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #FF4A58;\">#FF4A58</div>                                     | 主要危险按钮背景颜色 |\n| --button-primary-danger-border-color     | <div style=\"width: 150px; height: 40px; background-color: #FF3141;\">#FF3141</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #FF4A58;\">#FF4A58</div>                                     | 主要危险按钮边框颜色 |\n| --button-primary-danger-color            | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333333;\">#FFFFFF</div>                     | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333333;\">#FFFFFF</div>                     | 主要危险按钮颜色     |\n| --button-default-danger-background-color | <div style=\"width: 150px; height: 40px; background-color: #FFFFFF; color: #333333;\">#FFFFFF</div>                     | <div style=\"width: 150px; height: 40px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div>                     | 默认危险按钮背景颜色 |\n| --button-default-danger-border-color     | <div style=\"width: 150px; height: 40px; background-color: #FF3141;\">#FF3141</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #FF4A58;\">#FF4A58</div>                                     | 默认危险按钮边框颜色 |\n| --button-default-danger-color            | <div style=\"width: 150px; height: 40px; background-color: #FF3141;\">#FF3141</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #FF4A58;\">#FF4A58</div>                                     | 默认危险按钮颜色     |\n| --button-text-danger-color               | <div style=\"width: 150px; height: 40px; background-color: #FF3141;\">#FF3141</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #FF4A58;\">#FF4A58</div>                                     | 危险按钮文字颜色     |\n| --button-danger-default-color            | <div style=\"width: 150px; height: 40px; background-color: #FF3141;\">#FF3141</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #FF4A58;\">#FF4A58</div>                                     | 危险按钮默认颜色     |\n| --button-active-bg                       | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0.08);\">rgba(255, 255, 255, 0.08)</div> | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0.08);\">rgba(255, 255, 255, 0.08)</div> | 按钮激活背景颜色     |\n\n### 更多属性\n\n以下是 Button 组件支持的其他属性：\n\n- `public-id`\n- `open-type`\n- `scope`\n- `form-type`\n- `onGetAuthorize`\n- `onFollowLifestyle`\n- `onError`\n- `onGetUserInfo`\n- `onGetPhoneNumber`\n\n具体的属性说明，请参考支付宝小程序的官方文档。\n\n[Button 组件属性说明](https://opendocs.alipay.com/mini/component/button#%E5%B1%9E%E6%80%A7%E8%AF%B4%E6%98%8E)\n"
  },
  {
    "path": "src/Button/index.sjs.ts",
    "content": "function getClass(size) {\n  const list = ['small', 'medium', 'large'];\n  if (list.indexOf(size) >= 0) {\n    return `ant-button-${size}`;\n  }\n  return 'ant-button-medium';\n}\n\nfunction getHoverClass(loading, type, activeClassName) {\n  if (loading) {\n    return '';\n  }\n  let className = 'ant-button-active';\n  if (type === 'text') {\n    className += ' ant-button-text-active';\n  }\n  if (activeClassName) {\n    className += ' ' + activeClassName;\n  }\n  return className;\n}\n\nfunction isAide(aide, type) {\n  return aide && ['default', 'primary'].indexOf(type) > -1;\n}\n\nexport default { getClass, getHoverClass, isAide };\n"
  },
  {
    "path": "src/Button/index.ts",
    "content": "/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport fmtEvent from '../_util/fmtEvent';\nimport { ButtonDefaultProps } from './props';\n\nComponent({\n  /// #if WECHAT\n  properties: {\n    className: String,\n    style: String,\n    disabled: Boolean,\n    activeClassName: String,\n    subText: String,\n    inline: Boolean,\n    size: {\n      type: String,\n      value: 'medium',\n    },\n    icon: String,\n    loading: Boolean,\n    danger: Boolean,\n    formType: {\n      type: String,\n      value: 'button',\n    },\n    publicId: String,\n    openType: String,\n    scope: String,\n    type: {\n      type: String,\n      value: 'default',\n    },\n    aide: {\n      type: Boolean,\n      value: false,\n    },\n  },\n  options: {\n    styleIsolation: 'shared',\n  } as unknown,\n  /// #endif\n  props: ButtonDefaultProps,\n  methods: {\n    /// #if ALIPAY\n    onTap(e) {\n      const { onTap, disabled, loading, onDisabledTap } = this.props;\n      if (disabled && onDisabledTap) {\n        const event = fmtEvent(this.props, e);\n        onDisabledTap(event);\n      }\n      if (onTap && !disabled && !loading) {\n        const event = fmtEvent(this.props, e);\n        return onTap(event);\n      }\n    },\n    catchTap(e) {\n      const { catchTap, disabled, loading, onDisabledTap } = this.props;\n      if (disabled && onDisabledTap) {\n        const event = fmtEvent(this.props, e);\n        onDisabledTap(event);\n      }\n      if (catchTap && !disabled && !loading) {\n        const event = fmtEvent(this.props, e);\n        return catchTap(event);\n      }\n    },\n    onGetAuthorize(e) {\n      if (this.props.onGetAuthorize) {\n        this.props.onGetAuthorize(fmtEvent(this.props, e));\n      }\n    },\n    onFollowLifestyle(e) {\n      if (this.props.onFollowLifestyle) {\n        this.props.onFollowLifestyle(fmtEvent(this.props, e));\n      }\n    },\n    onError(e) {\n      if (this.props.onError) {\n        this.props.onError(fmtEvent(this.props, e));\n      }\n    },\n    onGetUserInfo(e) {\n      if (this.props.onGetUserInfo) {\n        this.props.onGetUserInfo(fmtEvent(this.props, e));\n      }\n    },\n    onGetPhoneNumber(e) {\n      if (this.props.onGetPhoneNumber) {\n        this.props.onGetPhoneNumber(fmtEvent(this.props, e));\n      }\n    },\n    /// #endif\n    /// #if WECHAT\n    ...{\n      onGetUserInfo: function (event) {\n        this.triggerEvent('getuserinfo', event.detail);\n      },\n      onContact: function (event) {\n        this.triggerEvent('contact', event.detail);\n      },\n      onGetPhoneNumber: function (event) {\n        this.triggerEvent('getphonenumber', event.detail);\n      },\n      onGetRealTimePhoneNumber: function (event) {\n        this.triggerEvent('getrealtimephonenumber', event.detail);\n      },\n      onError: function (event) {\n        this.triggerEvent('error', event.detail);\n      },\n      onLaunchApp: function (event) {\n        this.triggerEvent('launchapp', event.detail);\n      },\n      onOpenSetting: function (event) {\n        this.triggerEvent('opensetting', event.detail);\n      },\n      onAgreePrivacyAuthorization: function (event) {\n        this.triggerEvent('agreeprivacyauthorization', event.detail);\n      },\n      onChooseAvatar: function (event) {\n        this.triggerEvent('chooseavatar', event.detail);\n      },\n    },\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "src/Button/props.ts",
    "content": "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { IBaseProps } from '../_util/base';\n\n/**\n * @description 按钮，用户只需单击一下即可执行操作并做出选择。\n * 常用于表单提交、界面跳转、模块引导点击。具体用法和小程序框架中 button 保持一致，在 button 基础上做了样式的封装。\n * 封装后的按钮可改变按钮形态、增加 loading，以及内置了几种不同样式的按钮。\n */\n\nexport interface IButtonProps extends IBaseProps {\n  /**\n   * @description 按钮类型\n   * @default default\n   */\n  type?: 'default' | 'primary' | 'text';\n  /**\n   * @description 按钮是否是辅助按钮 只有 default 和 primary 按钮才消费该参数\n   * @default false\n   */\n  aide?: boolean;\n  /**\n   * @description 是否禁用\n   * @default false\n   */\n  disabled?: boolean;\n  /**\n   * @description 按下时的类名\n   */\n  activeClassName?: string;\n  /**\n   * @description 辅助文字，显示在第二行\n   */\n  subText?: string;\n  /**\n   * @description 内联，不撑满父级宽度\n   * @default false\n   */\n  inline?: boolean;\n  /**\n   * @description 内联尺寸\n   * @default medium\n   */\n  size?: 'small' | 'medium' | 'large';\n  /**\n   * @description 按钮左侧图标\n   */\n  icon?: string;\n  /**\n   * @description 是否加载中，加载中时不可点击\n   * @default false\n   */\n  loading?: boolean;\n  /**\n   * @description 是否为危险按钮，危险按钮的颜色会变成红色\n   * @default false\n   */\n  danger?: boolean;\n  /**\n   * @description 按钮原生类型，在表单提交时有效\n   * @default button\n   */\n  formType?: 'button' | 'submit' | 'reset';\n  /**\n   * @description 点击回调\n   */\n  onTap?: (event: any) => void;\n  /**\n   * @description 点击回调\n   */\n  catchTap?: (event: any) => void;\n  /**\n   * @description 禁用时点击回调\n   */\n  onDisabledTap?: (event: any) => void;\n  /**\n   * @description 生活号 id，必须是当前小程序同主体且已关联的生活号，open-type=\"lifestyle\" 时有效。\n   */\n  publicId?: string;\n  /**\n   * @description 开放能力。\n   */\n  openType?: string;\n  /**\n   * @description 当 openType 为 getAuthorize 时有效。\n   */\n  scope?: string;\n\n  onGetAuthorize?: (event: any) => void;\n  onFollowLifestyle?: (event: any) => void;\n  onError?: (event: any) => void;\n  onGetUserInfo?: (event: any) => void;\n  onGetPhoneNumber?: (event: any) => void;\n}\n\nexport const ButtonDefaultProps: Partial<IButtonProps> = {\n  type: 'default',\n  formType: 'button',\n  size: 'medium',\n  aide: false,\n};\n"
  },
  {
    "path": "src/Button/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n/* size | 按钮内间距 */\n@button-padding: var(--button-padding, @size-3);\n\n/* size | 大按钮内间距 */\n@button-large-padding: var(--button-large-padding, @size-3);\n\n/* size | 中按钮内间距 */\n@button-medium-padding: var(--button-medium-padding-top, @size-2)\n  var(--button-medium-padding-left, @size-3);\n\n/* size | 小按钮内间距 */\n@button-small-padding: var(--button-small-padding-top, @size-1)\n  var(--button-small-padding-left, @size-3);\n\n/* corner-radius| 按钮圆角 */\n@button-corner-radius: @corner-radius-circle;\n\n/* font-size | 副标题字号 */\n@button-subtext-size: var(--button-subtext-size, @sizeFont2);\n\n/* color | 按钮边框宽度 */\n@button-border-size: var(--button-border-size, @border-width-standard);\n\n/* opacity | disable状态不透明度 */\n@button-disabled-opacity: var(--button-disabled-opacity, @OPACITY_DISABLE);\n\n/* color | 默认按钮文字色 */\n@button-color: var(--button-color, @COLOR_BRAND1);\n\n/* color | 默认按钮背景色 */\n@button-background-color: var(--button-background-color, @COLOR_WHITE_CHANGE);\n\n/* color | 默认按钮边框色 */\n@button-border-color: var(--button-border-color, @COLOR_BRAND2);\n\n/* color |primary按钮背景色 */\n@button-primary-background-color: var(\n  --button-primary-background-color,\n  @COLOR_BRAND1\n);\n\n/* color |primary按钮边框色 */\n@button-primary-border-color: var(--button-primary-border-color, @COLOR_BRAND1);\n\n/* color |primary按钮文字色 */\n@button-primary-color: var(--button-primary-color, @COLOR_WHITE);\n\n/* color |primary辅助按钮边框色 */\n@button-primary-aide-border-color: var(\n  --button-primary-aide-border-color,\n  @COLOR_WATHET\n);\n\n/* color |primary辅助按钮边框色 */\n@button-primary-aide-background-color: var(--color-wathet, @COLOR_WATHET);\n\n/* color |primary辅助按钮文字色 */\n@button-primary-aide-color: var(--button-primary-aide-color, @COLOR_BRAND1);\n\n/* color |default辅助按钮边框色 */\n@button-default-aide-border-color: var(\n  --button-default-aide-border-color,\n  @COLOR_BORDER_GREYCARD\n);\n\n/* color |default辅助按钮边框色 */\n@button-default-aide-background-color: var(\n  --button-default-aide-background-color,\n  @COLOR_WHITE_CHANGE\n);\n\n/* color |default辅助按钮文字色 */\n@button-default-aide-color: var(\n  --button-default-aide-color,\n  @COLOR_TEXT_PRIMARY\n);\n\n/* color |primary danger按钮背景色 */\n@button-primary-danger-background-color: var(\n  --button-primary-danger-background-color,\n  @COLOR_RED\n);\n\n/* color |primary danger按钮边框色 */\n@button-primary-danger-border-color: var(\n  --button-primary-danger-border-color,\n  @COLOR_RED\n);\n\n/* color |primary danger按钮文字色 */\n@button-primary-danger-color: var(--button-primary-danger-color, @COLOR_WHITE);\n\n/* color |default danger 按钮背景色 */\n@button-default-danger-background-color: var(\n  --button-default-danger-background-color,\n  @COLOR_WHITE\n);\n\n/* color |default danger按钮边框色 */\n@button-default-danger-border-color: var(\n  --button-default-danger-border-color,\n  @COLOR_RED\n);\n\n/* color |default danger按钮文字色 */\n@button-default-danger-color: var(--button-default-danger-color, @COLOR_RED);\n\n/* color |text danger按钮文字色 */\n@button-text-danger-color: var(--button-text-danger-color, @COLOR_RED);\n\n/* color |danger-ghost按钮文字色 */\n@button-danger-default-color: var(--button-danger-default-color, @COLOR_RED);\n/* color |active按钮文字色 */\n\n@button-active-bg: var(--button-active-bg, @COLOR_WHITE_FADED);\n\n@button-inline-size: var(--button-inline-size, @sizeFont5);\n\n/* 图标尺寸 */\n@button-icon-size: var(--button-icon-size, @sizeIconFont);\n\n/* font-size | 默认按钮字号 */\n@button-font-size: var(--button-font-size, @sizeFont8);\n\n/* font-size | 大按钮字号 */\n@button-large-font-size: var(--button-large-font-size, @sizeFont8);\n\n/* font-size | 中按钮字号 */\n@button-medium-font-size: var(--button-medium-font-size, @sizeFont7);\n\n/* font-size | 小按钮字号 */\n@button-small-font-size: var(--button-small-font-size, @sizeFont5);\n"
  },
  {
    "path": "src/Calendar/helper.sjs.ts",
    "content": "declare function getRegExp(reg: string, mode: string): any;\n\nfunction keys(obj) {\n  /// #if ALIPAY\n\n  if (typeof Object.keys === 'function') {\n    return Object.keys(obj);\n  }\n  /// #endif\n\n  /// #if WECHAT\n  return JSON.stringify(obj)\n    .replace(getRegExp('{|}|\"', 'g'), '')\n    .split(',')\n    .map(function (item) {\n      return item.split(':')[0];\n    });\n  /// #endif\n}\n\nfunction getClassName(value, index, showSelectableDatesOnly) {\n  const {\n    isSelected,\n    isSelectedBegin,\n    isSelectedEnd,\n    isRowBegin,\n    isRowEnd,\n    inThisMonth,\n    isToday,\n    disabled,\n    className,\n    isRange,\n  } = value;\n\n  const classNames = {\n    disabled: disabled,\n    today: inThisMonth && isToday,\n    selected: inThisMonth && isSelected,\n    'selected-begin': inThisMonth && isSelectedBegin,\n    'selected-end': inThisMonth && isSelectedEnd,\n    'selected-row-begin': inThisMonth && isRowBegin && isSelected,\n    'selected-row-end': inThisMonth && isRowEnd && isSelected,\n    hidden: !inThisMonth || (showSelectableDatesOnly && !isRange),\n    'row-end': index % 7 === 6,\n  };\n\n  let result = `ant-calendar-cell ${className || ''}`;\n  keys(classNames).forEach((key) => {\n    if (classNames[key]) {\n      result += ` ant-calendar-cell-${key}`;\n    }\n  });\n  return result;\n}\n\nfunction getSpaceClassName(index, items) {\n  const isNotEnd = index % 7 !== 6;\n  const nextItem = items[index + 1];\n  const nextSelected = nextItem && nextItem.isSelected && nextItem.inThisMonth;\n  const isSelected = items[index].isSelected;\n\n  const classNames = {\n    active: isNotEnd && isSelected && nextSelected,\n  };\n  let result = 'ant-calendar-cell-space';\n  keys(classNames).forEach((key) => {\n    if (classNames[key]) {\n      result += ` ant-calendar-cell-space-${key}`;\n    }\n  });\n  return result;\n}\n\nfunction getMarkCellClassName(index, items) {\n  if (items[index].length - 1 === index) {\n    return `ant-calendar-mark-cell ant-calendar-mark-cell-last`;\n  }\n  return 'ant-calendar-mark-cell';\n}\n\nfunction isDisplay(index, items) {\n  // 找到需要当前月需要展示的日期最大最小索引\n  const _items_reduce = items.reduce(\n    (res, item) => {\n      // !item.inThisMonth 被隐藏掉的日期\n      // !item.isRange 不在传入范围内的日期\n      if (!(!item.inThisMonth || !item.isRange)) {\n        if (res.minIndex === null || res.maxIndex === null) {\n          res.minIndex = item.index;\n          res.maxIndex = item.index;\n        }\n        res.minIndex = Math.min(res.minIndex, item.index);\n        res.maxIndex = Math.max(res.maxIndex, item.index);\n      }\n      return res;\n    },\n    { minIndex: null, maxIndex: null }\n  );\n\n  if (_items_reduce.maxIndex === null || _items_reduce.maxIndex === null)\n    return true;\n  return (\n    index >= Math.floor(_items_reduce.minIndex / 7) * 7 &&\n    index <= Math.ceil(_items_reduce.maxIndex / 7) * 7\n  );\n}\n\nexport default {\n  getSpaceClassName,\n  getClassName,\n  getMarkCellClassName,\n  isDisplay,\n};\n"
  },
  {
    "path": "src/Calendar/index.axml",
    "content": "<import-sjs\n  from=\"./helper.sjs\"\n  name=\"helper\" />\n\n<import-sjs\n  from=\"./scroll.sjs\"\n  name=\"scroll\" />\n\n<view\n  class=\"ant-calendar {{ className ? className : '' }}\"\n  style=\"{{ style }}\">\n  <view class=\"ant-calendar-mark\">\n    <block\n      a:for=\"{{ markItems }}\"\n      a:for-index=\"index\"\n      a:for-item=\"item\"\n      a:key=\"*this\">\n      <view class=\"{{ helper.getMarkCellClassName(index, markItems) }}\">\n        <!-- #if ALIPAY -->\n        <ant-auto-resize text=\"{{ item }}\" minFontSize=\"13\" maxFontSize=\"28\">\n          <text>{{ item }}</text>\n        </ant-auto-resize>\n        <!-- #endif -->\n        <!-- #if WECHAT -->\n        <text>{{ item }}</text>\n        <!-- #endif -->\n      </view>\n    </block>\n  </view>\n  <view\n    a:if=\"{{ !!elementSize }}\"\n    class=\"ant-calendar-sticky\">\n    <view class=\"ant-calendar-sticky-title\">\n      <!-- #if ALIPAY -->\n      <slot name=\"calendarTitle\">\n      <!-- #endif -->\n        <view class=\"ant-calendar-title\">\n          {{ monthList[headerState].title }}\n        </view>\n      <!-- #if ALIPAY -->\n      </slot>\n      <!-- #endif -->\n    </view>\n  </view>\n  <scroll-view\n    scroll-y=\"{{ true }}\"\n    class=\"ant-calendar-body\"\n    data-elementsize=\"{{ elementSize }}\"\n    data-monthlist=\"{{ monthList }}\"\n    onScroll=\"{{ scroll.handleScroll }}\"\n    scroll-into-view=\"{{ scrollIntoViewId }}\"\n    scroll-with-animation\n    scroll-animation-duration=\"{{ 300 }}\"\n    disable-lower-scroll=\"out-of-bounds\"\n    disable-upper-scroll=\"out-of-bounds\"\n    ref=\"handleRef\">\n    <block\n      a:for=\"{{ monthList }}\"\n      a:for-index=\"index\"\n      a:for-item=\"currentMonth\"\n      a:key=\"title\">\n      <view\n        class=\"ant-calendar-body-container {{ currentMonth.className || '' }}\" style=\"{{ currentMonth.style || '' }}\">\n        <view class=\"ant-calendar-title-container\">\n          <!-- #if ALIPAY -->\n          <slot name=\"calendarTitle\">\n          <!-- #endif -->\n            <view class=\"ant-calendar-title\">{{ currentMonth.title }}</view>\n          <!-- #if ALIPAY -->\n          </slot>\n          <!-- #endif -->\n        </view>\n        <view class=\"ant-calendar-cells\">\n          <block\n            a:for=\"{{ currentMonth.cells }}\"\n            a:for-index=\"index\"\n            a:for-item=\"item\"\n            a:key=\"time\">\n            <block a:if=\"{{helper.isDisplay(index, currentMonth.cells)}}\">\n              <view\n                class=\"{{ helper.getClassName(item, index, showSelectableDatesOnly) }}\"\n                id=\"id_{{ item.time }}\"\n                data-time=\"{{ item }}\"\n                onTap=\"clickCell\">\n                <view class=\"ant-calendar-cell-container\">\n                  <view class=\"ant-calendar-cell-top\">\n                    <!-- display: inline -->\n                     <!-- #if WECHAT -->\n                      <ant-auto-resize wx:if=\"{{ item.top.label }}\" text=\"{{ item.top.label }}\" minFontSize=\"13\" maxFontSize=\"18\">\n                        <text\n                        a:if=\"{{ item.top }}\"\n                        class=\"ant-calendar-cell-top-text {{ item.top.className ? item.top.className : '' }}\"\n                        >{{ item.top.label }}</text>\n                      </ant-auto-resize>\n                      <ant-auto-resize wx:else text=\"{{ item.top.label}}\" minFontSize=\"13\" maxFontSize=\"18\">\n                        <block>\n                          <text\n                            a:if=\"{{ item.top }}\"\n                            class=\"ant-calendar-cell-top-text {{ item.top.className ? item.top.className : '' }}\"\n                            >{{ item.top.label }}</text>\n                        </block>\n                      </ant-auto-resize>\n                      <!-- #endif -->\n                    <!-- #if ALIPAY -->\n                    <ant-auto-resize text=\"{{ item.top.label }}\" minFontSize=\"13\" maxFontSize=\"18\">\n                      <text\n                      a:if=\"{{ item.top }}\"\n                      class=\"ant-calendar-cell-top-text {{ item.top.className ? item.top.className : '' }}\"\n                      >{{ item.top.label }}</text>\n                    </ant-auto-resize>\n                  <!-- #endif -->\n                  </view>\n                  <view class=\"ant-calendar-cell-center\">{{ item.date }}</view>\n                  <view class=\"ant-calendar-cell-bottom\">\n                    <!-- #if ALIPAY -->\n                    <slot\n                      name=\"cell-bottom\"\n                      cell=\"{{ item }}\">\n                    <!-- #endif -->\n                      <!-- display: inline -->\n                      <text\n                        a:if=\"{{ item.bottom }}\"\n                        class=\"{{ item.bottom.className }}\"\n                        >{{ item.bottom.label }}</text\n                      >\n                    <!-- #if ALIPAY -->\n                    </slot>\n                    <!-- #endif -->\n                  </view>\n                </view>\n              </view>\n              <view\n                a:if=\"{{ index % 7 !== 6 }}\"\n                class=\"{{ helper.getSpaceClassName(index, currentMonth.cells) }}\" />\n            </block>\n          </block>\n        </view>\n      </view>\n    </block>\n  </scroll-view>\n</view>\n"
  },
  {
    "path": "src/Calendar/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Information Display\n  order: 8\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Calendar\n\nCalendar Component\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-calendar\": \"antd-mini/es/Calendar/index\"\n#endif\n#if WECHAT\n  \"ant-calendar\": \"antd-mini/Calendar/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<!-- 默认多选 -->\n<ant-calendar defaultValue=\"{{defaultValue}}\"></ant-calendar>\n<!-- 单选 -->\n<ant-calendar selectionMode=\"single\" defaultValue=\"{{defaultValue}}\" changedScrollIntoView />\n```\n\n### Custom Top\n\n```xml\n<ant-calendar monthRange=\"{{demo3.monthRange}}\">\n  <view slot=\"calendarTitle\">Custom Top</view>\n</ant-calendar>\n```\n\n### Custom Date Cell\n\n```xml\n<ant-calendar\n  monthRange=\"{{monthRange}}\"\n  showSelectableDatesOnly\n  onFormatter=\"{{demoFormatter ? demoFormatter : 'demoFormatter'}}\"\n  onMonthFormatter=\"{{demoMonthFormatter ? demoMonthFormatter : 'demoMonthFormatter'}}\"\n></ant-calendar>\n```\n\n```js\nimport dayjs from 'dayjs';\nfunction demoFormatter(cell) {\n  const isOdd = dayjs(cell.time).date() % 2 === 1;\n  const isNotBeginEnd = !cell.isSelectedBegin && !cell.isSelectedEnd;\n  const isWeekend = dayjs(cell.time).day() > 4;\n  let topClassName;\n  if (isNotBeginEnd) {\n    topClassName = isOdd ? 'odd' : 'even';\n  }\n  return {\n    top: {\n      className: topClassName,\n      label: isOdd ? '奇数' : '偶数',\n    },\n    bottom: {\n      label: isWeekend ? '周末' : '',\n    },\n  };\n}\nfunction demoMonthFormatter(month) {\n  return {\n    ...month,\n  };\n}\n```\n\n### Dynamic control, only three days before and after the selection are allowed\n\n```xml\n<ant-calendar\n  monthRange=\"{{monthRange}}\"\n  onFormatter=\"{{demoFormatter ? demoFormatter : 'demoFormatter'}}\"\n></ant-calendar>\n```\n\n```js\nimport dayjs from 'dayjs';\nfunction demoFormatter(cell, value) {\n  if (Array.isArray(value) && value.length == 1) {\n    const current = value[0];\n    return {\n      disabled: dayjs(cell.time).diff(dayjs(current), 'days') > 3,\n      bottom:\n        dayjs(cell.time).diff(dayjs(current), 'days') > 3\n          ? {\n              label: '不可选',\n            }\n          : undefined,\n    };\n  }\n  return {};\n}\n```\n\n### Controlled Mode\n\n```xml\n<ant-calendar\n  ref=\"handleRef\"\n  value=\"{{demo9.value}}\"\n  selectionMode=\"single\"\n  changedScrollIntoView\n#if ALIPAY\n  onChange=\"demo9HandleChange\"\n#endif\n#if WECHAT\n  bindchange=\"demo9HandleChange\"\n#endif\n></ant-calendar>\n<ant-button\n  type=\"primary\"\n#if ALIPAY\n  onTap=\"demo9HandlePreviousDay\"\n#endif\n#if WECHAT\n  bindtap=\"demo9HandlePreviousDay\"\n#endif\n>\n  Last day\n</ant-button>\n<ant-button\n  type=\"primary\"\n#if ALIPAY\n  onTap=\"demo9HandleNextDay\"\n#endif\n#if WECHAT\n  bindtap=\"demo9HandleNextDay\"\n#endif\n>\n  Next day\n</ant-button>\n<ant-button\n  type=\"primary\"\n#if ALIPAY\n  onTap=\"demo9HandleScrollIntoView\"\n#endif\n#if WECHAT\n  bindtap=\"demo9HandleScrollIntoView\"\n#endif\n>\n  Scroll to specified date\n</ant-button>\n```\n\n```js\nPage({\n  data: {\n    demo9: {\n      visible: true,\n      value: nowDate,\n    },\n    demo9HandleChange(value) {\n      this.setData({\n        'demo9.value': value,\n      });\n    },\n    demo9HandlePreviousDay() {\n      this.setData({\n        'demo9.value': this.data.demo9.value - 1000 * 24 * 3600,\n      });\n    },\n    demo9HandleNextDay() {\n      this.setData({\n        'demo9.value': this.data.demo9.value + 1000 * 24 * 3600,\n      });\n    },\n    demo9HandleScrollIntoView() {\n      this.ref.scrollIntoView(nowDate);\n    },\n  },\n});\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Calendar/index' ></code>\n\n## API\n\nThe following are the properties and descriptions of the Calendar component:\n\n| Property                    | Description                                           | Type                                                        | Default Value      |\n| ----------------------- | ---------------------------------------------- | ----------------------------------------------------------- | ----------- |\n| defaultValue            | Initial value                                         | CalendarValue                                               | None          |\n| value                   | The date selected by the calendar, which is the controlled mode when passed in.             | CalendarValue                                               | None          |\n| selectionMode           | Set the selection mode, single selection or continuous interval, the default is `range` | `single` \\| `range`                                         | `range`     |\n| monthRange              | Month range, default to the last 3 months                    | `[number, number]`                                          | Last 3 months |\n| weekStartsOn            | The week column displays the day of the week as the first day. The default is `Sunday`  | `Sunday` \\| `Monday`                                        | `Sunday`    |\n| onFormatter             | Use to set custom data for cells                     | (cell: CellState, currentValue: CalendarValue) => CellState | None          |\n| onMonthFormatter        | Custom data for setting the month                       | (month: any) => CellState                                   | None          |\n| localeText              | International copywriting                                     | Partial`<LocaleText>`                                       | None          |\n| changedScrollIntoView   | Whether to scroll view after selected value changes                       | boolean                                                     | None          |\n| showSelectableDatesOnly | Show only dates in the selectable range                       | boolean                                                     | false       |\n| #if ALIPAY onChange     | Date Change Callback                                   | (date: CalendarValue) => void                               | None          |\n| #if WECHAT bindchange  | Date Change Callback                                   | (date: CalendarValue) => void                               | None          |\n\n### Type\n\n**CalendarValue** The value type of the calendar, which is a number or a tuple of numbers `number | [number,number]`, which represents a single selection or continuous date interval. The timestamp in milliseconds.\n\n**CellState** Defines the various states of the calendar cell.\n\n```typescript\ninterface CellState {\n  /**\n   * 是否禁用\n   */\n  disabled: boolean;\n  /**\n   * 日历单元格的顶部内容\n   */\n  top?: { label: string; className?: string };\n  /**\n   * 日历单元格的底部内容\n   */\n  bottom?: { label: string; className?: string };\n  /**\n   * 时间戳\n   */\n  time: number;\n  /**\n   * 日期\n   */\n  date: number;\n  /**\n   * 是否选中\n   */\n  isSelected: boolean;\n}\n```\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                           | Default Value                                                                                                                            | Dark Mode Default                                                                                                                    | Remarks                 |\n| -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | -------------------- |\n| --calendar-cell-disabled-opacity | 0.4                                                                                                                               | 0.4                                                                                                                               | Calendar cell transparency disabled |\n| --calendar-weekday-names-bg      | <div style=\"width: 150px; height: 40px; background-color: #f8f8f8; color: #333333;\">#f8f8f8</div>                                 | <div style=\"width: 150px; height: 40px; background-color: #f8f8f8; color: #333333;\">#f8f8f8</div>                                 | Calendar Week Name Background Color |\n| --calendar-default-color         | <div style=\"width: 150px; height: 40px; background-color: #333333; color: #FFFFFF;\">#333333</div>                                 | <div style=\"width: 150px; height: 40px; background-color: #c5cad1; color: #000000;\">#c5cad1</div>                                 | Calendar default color         |\n| --calendar-selected-color        | <div style=\"width: 150px; height: 40px; background-color: rgba(22, 119, 255, 0.1); color: #ffffff;\">rgba(22, 119, 255, 0.1)</div> | <div style=\"width: 150px; height: 40px; background-color: rgba(22, 119, 255, 0.1); color: #ffffff;\">rgba(22, 119, 255, 0.1)</div> | Calendar Selected Color         |\n| --calendar-assist-color          | <div style=\"width: 150px; height: 40px; background-color: #999999; color: #FFFFFF;\">#999999</div>                                 | <div style=\"width: 150px; height: 40px; background-color: #616161; color: #FFFFFF;\">#616161</div>                                 | Calendar Auxiliary Color         |\n| --calendar-selected-end-color    | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #333333;\">#ffffff</div>                                 | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #333333;\">#ffffff</div>                                 | Calendar selected end color     |\n| --calendar-selected-color        | <div style=\"width: 150px; height: 40px; background-color: #1677ff; color: #FFFFFF;\">#1677ff</div>                                 | <div style=\"width: 150px; height: 40px; background-color: #3086ff; color: #FFFFFF;\">#3086ff</div>                                 | Calendar Selected Color         |\n\n## FAQ\n\n### How do I set the default start and end times?\n\nBy `defaultValue` You can set a default time.`defaultValue` The type of is `CalendarValue`。\n\n`CalendarValue` The type of is `number | [number, number]`, representing the date of a single choice or continuous interval. It is a timestamp in milliseconds.\n\nFor example, if we want to set the default start time to today and end time to seven days later, we can `defaultValue` Pass in the following code:\n\n```ts\n[dayjs().startOf('date'), dayjs().add(7, 'days').startOf('date')];\n```\n\n### By `onFormatter` Set custom data for cells\n\nWe can pass `onFormatter` method to set the custom data for the cell,`onFormatter` The format of is `(cell: CellState, currentValue: CalendarValue) => CellState`。\n\nThis function gets the state of each cell and the current value. By returning new cell data, we can customize the state of the cell.\n\nHere are some common usage scenarios:\n\n#### How to make the time before the day not optional?\n\nIn the Alipay applet, we can set it through the method on the page, and we need to pass in a method name string in the axml file.\n\nThe axml file:\n\n```xml\n<calendar onFormatter=\"handleFormat\" />\n```\n\nts file:\n\n```ts\nimport dayjs from 'dayjs';\n\nPage({\n  handleFormat(cell: CellState) {\n    // 如果单元格代表的时间早于今天的开始时间，则禁止选择\n    return {\n      disabled: dayjs(cell.time).isBefore(dayjs().startOf('date')),\n    };\n  },\n});\n```\n\nIn the WeChat applet, we can also set it through the function in data. At this time, we need to pass in a variable name in the wxml file.\n\nwxml file:\n\n```xml\n<calendar onFormatter=\"{{handleFormat}}\" />\n```\n\nts file:\n\n```ts\nimport dayjs from 'dayjs';\n\nPage({\n  data: {\n    handleFormat: (cell: CellState) => {\n      // 如果单元格代表的时间早于今天的开始时间，则禁止选择\n      return {\n        disabled: dayjs(cell.time).isBefore(dayjs().startOf('date')),\n      };\n    },\n  },\n});\n```\n"
  },
  {
    "path": "src/Calendar/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-auto-resize\": \"../AutoResize/index\"\n  }\n}\n"
  },
  {
    "path": "src/Calendar/index.less",
    "content": "@import (reference) './variable.less';\n\n@checkboxItemPrefix: ant-calendar;\n\n.@{checkboxItemPrefix} {\n  color: @calendar-default-color;\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n\n  &-body {\n    flex: 1;\n    /// #if WECHAT\n    overflow: hidden;\n    /// #endif\n  }\n\n  &-sticky {\n    position: absolute;\n    top: 0px;\n    left: 0px;\n    max-height: @calendar-month-title-height;\n    width: 100%;\n    overflow: hidden;\n    top: @calendar-weekday-names-height;\n    z-index: @calendar-sticky-title-z-index;\n  }\n\n  &-mark {\n    height: @calendar-weekday-names-height;\n    display: flex;\n    flex-direction: row;\n    justify-content: flex-start;\n    align-items: center;\n    box-sizing: border-box;\n    font-size: @calendar-weekday-names-font-size;\n    padding: 0 @calendar-cells-padding;\n\n    & &-cell {\n      flex: 1;\n      text-align: center;\n      width: calc((100% - 6 * @calendar-cell-space-size) / 7);\n      margin-right: @calendar-cell-space-size;\n    }\n    & &-cell-last {\n      margin-right: 0;\n    }\n  }\n\n  &-title {\n    color: @calendar-default-color;\n    font-size: @font-size-title;\n    height: @calendar-month-title-height;\n    line-height: @calendar-month-title-height;\n    padding-left: @calendar-weekday-names-left-padding;\n    margin-bottom: @calendar-weekday-names-bottom-margin;\n    background: @calendar-weekday-names-background-color;\n  }\n\n  &-cells {\n    display: flex;\n    flex-direction: row;\n    flex-wrap: wrap;\n    justify-content: flex-start;\n    align-items: stretch;\n    padding: 0 @calendar-cells-padding;\n  }\n\n  &-cell-space {\n    width: @calendar-cell-space-size;\n    height: @calendar-cell-height;\n  }\n  &-cell-space-active {\n    background: @calendar-selected-color;\n  }\n\n  &-cell {\n    box-sizing: content-box;\n    width: calc((100% - 6 * @calendar-cell-space-size) / 7);\n    height: @calendar-cell-height;\n    padding-bottom: @calendar-cell-bottom-margin;\n    position: relative;\n\n    &-container {\n      box-sizing: border-box;\n      padding-top: @calendar-cell-top-padding;\n      height: 100%;\n    }\n\n    &-top {\n      color: @calendar-assist-color;\n      text-align: center;\n      font-size: @calendar-cell-top-font-size;\n      height: @calendar-cell-top-height;\n\n      &-text {\n        white-space: nowrap;\n      }\n    }\n\n    &-center {\n      text-align: center;\n      height: @calendar-cell-center-height;\n      font-size: @calendar-cell-center-font-size;\n    }\n\n    &-bottom {\n      color: @calendar-assist-color;\n      text-align: center;\n      font-size: @calendar-cell-bottom-font-size;\n      height: @calendar-cell-bottom-height;\n    }\n\n    &-selected {\n      background: @calendar-selected-color;\n    }\n\n    &-selected-begin {\n      border-top-left-radius: @corner-radius-md;\n      border-bottom-left-radius: @corner-radius-md;\n      background: @calendar-selected-color;\n    }\n\n    &-selected-end {\n      border-top-right-radius: @corner-radius-md;\n      border-bottom-right-radius: @corner-radius-md;\n      color: @calendar-selected-end-color;\n    }\n\n    &-selected-row-end {\n      border-top-right-radius: @corner-radius-md;\n      border-bottom-right-radius: @corner-radius-md;\n    }\n\n    &-selected-row-begin {\n      border-top-left-radius: @corner-radius-md;\n      border-bottom-left-radius: @corner-radius-md;\n    }\n\n    &-selected-begin &-container {\n      background: @calendar-selected-color;\n      border-radius: @corner-radius-md;\n      color: @calendar-selected-end-color;\n    }\n\n    &-selected-end &-container {\n      background: @calendar-selected-color;\n      border-radius: @corner-radius-md;\n      color: @calendar-selected-end-color;\n    }\n\n    &-selected-end &-top {\n      color: @calendar-selected-end-color;\n    }\n\n    &-selected-begin &-top {\n      color: @calendar-selected-end-color;\n    }\n\n    &-selected-end &-bottom {\n      color: @calendar-selected-end-color;\n    }\n\n    &-selected-begin &-bottom {\n      color: @calendar-selected-end-color;\n    }\n  }\n\n  &-cell-disabled {\n    opacity: @calendar-cell-disabled-opacity;\n  }\n\n  &-cell-hidden {\n    opacity: 0;\n    pointer-events: none;\n  }\n}\n"
  },
  {
    "path": "src/Calendar/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 数据展示\n  order: 8\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Calendar 日历\n\n日历组件\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-calendar\": \"antd-mini/es/Calendar/index\"\n#endif\n#if WECHAT\n  \"ant-calendar\": \"antd-mini/Calendar/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<!-- 默认多选 -->\n<ant-calendar defaultValue=\"{{defaultValue}}\"></ant-calendar>\n<!-- 单选 -->\n<ant-calendar selectionMode=\"single\" defaultValue=\"{{defaultValue}}\" changedScrollIntoView />\n```\n\n### 自定义顶部\n\n```xml\n<ant-calendar monthRange=\"{{demo3.monthRange}}\">\n  <view slot=\"calendarTitle\">自定义顶部</view>\n</ant-calendar>\n```\n\n### 自定义日期单元格\n\n```xml\n<ant-calendar\n  monthRange=\"{{monthRange}}\"\n  showSelectableDatesOnly\n  onFormatter=\"{{demoFormatter ? demoFormatter : 'demoFormatter'}}\"\n  onMonthFormatter=\"{{demoMonthFormatter ? demoMonthFormatter : 'demoMonthFormatter'}}\"\n></ant-calendar>\n```\n\n```js\nimport dayjs from 'dayjs';\nfunction demoFormatter(cell) {\n  const isOdd = dayjs(cell.time).date() % 2 === 1;\n  const isNotBeginEnd = !cell.isSelectedBegin && !cell.isSelectedEnd;\n  const isWeekend = dayjs(cell.time).day() > 4;\n  let topClassName;\n  if (isNotBeginEnd) {\n    topClassName = isOdd ? 'odd' : 'even';\n  }\n  return {\n    top: {\n      className: topClassName,\n      label: isOdd ? '奇数' : '偶数',\n    },\n    bottom: {\n      label: isWeekend ? '周末' : '',\n    },\n  };\n}\nfunction demoMonthFormatter(month) {\n  return {\n    ...month,\n  };\n}\n```\n\n### 动态控制，只允许选择前后三天\n\n```xml\n<ant-calendar\n  monthRange=\"{{monthRange}}\"\n  onFormatter=\"{{demoFormatter ? demoFormatter : 'demoFormatter'}}\"\n></ant-calendar>\n```\n\n```js\nimport dayjs from 'dayjs';\nfunction demoFormatter(cell, value) {\n  if (Array.isArray(value) && value.length == 1) {\n    const current = value[0];\n    return {\n      disabled: dayjs(cell.time).diff(dayjs(current), 'days') > 3,\n      bottom:\n        dayjs(cell.time).diff(dayjs(current), 'days') > 3\n          ? {\n              label: '不可选',\n            }\n          : undefined,\n    };\n  }\n  return {};\n}\n```\n\n### 受控模式\n\n```xml\n<ant-calendar\n  ref=\"handleRef\"\n  value=\"{{demo9.value}}\"\n  selectionMode=\"single\"\n  changedScrollIntoView\n#if ALIPAY\n  onChange=\"demo9HandleChange\"\n#endif\n#if WECHAT\n  bindchange=\"demo9HandleChange\"\n#endif\n></ant-calendar>\n<ant-button\n  type=\"primary\"\n#if ALIPAY\n  onTap=\"demo9HandlePreviousDay\"\n#endif\n#if WECHAT\n  bindtap=\"demo9HandlePreviousDay\"\n#endif\n>\n  上一天\n</ant-button>\n<ant-button\n  type=\"primary\"\n#if ALIPAY\n  onTap=\"demo9HandleNextDay\"\n#endif\n#if WECHAT\n  bindtap=\"demo9HandleNextDay\"\n#endif\n>\n  下一天\n</ant-button>\n<ant-button\n  type=\"primary\"\n#if ALIPAY\n  onTap=\"demo9HandleScrollIntoView\"\n#endif\n#if WECHAT\n  bindtap=\"demo9HandleScrollIntoView\"\n#endif\n>\n  滚动到指定日期\n</ant-button>\n```\n\n```js\nPage({\n  data: {\n    demo9: {\n      visible: true,\n      value: nowDate,\n    },\n    demo9HandleChange(value) {\n      this.setData({\n        'demo9.value': value,\n      });\n    },\n    demo9HandlePreviousDay() {\n      this.setData({\n        'demo9.value': this.data.demo9.value - 1000 * 24 * 3600,\n      });\n    },\n    demo9HandleNextDay() {\n      this.setData({\n        'demo9.value': this.data.demo9.value + 1000 * 24 * 3600,\n      });\n    },\n    demo9HandleScrollIntoView() {\n      this.ref.scrollIntoView(nowDate);\n    },\n  },\n});\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Calendar/index' ></code>\n\n## API\n\n以下为日历组件的属性及描述：\n\n| 属性                    | 说明                                           | 类型                                                        | 默认值      |\n| ----------------------- | ---------------------------------------------- | ----------------------------------------------------------- | ----------- |\n| defaultValue            | 初始值                                         | CalendarValue                                               | 无          |\n| value                   | 日历选择的日期，传入后即为受控模式             | CalendarValue                                               | 无          |\n| selectionMode           | 设置选择模式，单选或者连续区间，默认为 `range` | `single` \\| `range`                                         | `range`     |\n| monthRange              | 月份范围，默认为最近 3 个月                    | `[number, number]`                                          | 最近 3 个月 |\n| weekStartsOn            | 星期栏，以周几作为第一天显示。默认为 `Sunday`  | `Sunday` \\| `Monday`                                        | `Sunday`    |\n| onFormatter             | 用于设置单元格的自定义数据                     | (cell: CellState, currentValue: CalendarValue) => CellState | 无          |\n| onMonthFormatter        | 用于设置月份的自定义数据                       | (month: any) => CellState                                   | 无          |\n| localeText              | 国际化文案                                     | Partial`<LocaleText>`                                       | 无          |\n| changedScrollIntoView   | 选中值改变后是否滚动视图                       | boolean                                                     | 无          |\n| showSelectableDatesOnly | 只展示在可选范围内的日期                       | boolean                                                     | false       |\n| #if ALIPAY onChange     | 日期变化回调                                   | (date: CalendarValue) => void                               | 无          |\n| #if WECHAT bindchange  | 日期变化回调                                   | (date: CalendarValue) => void                               | 无          |\n\n### 类型\n\n**CalendarValue** : 日历的值类型，为数字或数字元组 `number | [number,number]`，表示单选或连续日期区间。单位为毫秒的时间戳。\n\n**CellState** : 定义了日历单元格的各种状态。\n\n```typescript\ninterface CellState {\n  /**\n   * 是否禁用\n   */\n  disabled: boolean;\n  /**\n   * 日历单元格的顶部内容\n   */\n  top?: { label: string; className?: string };\n  /**\n   * 日历单元格的底部内容\n   */\n  bottom?: { label: string; className?: string };\n  /**\n   * 时间戳\n   */\n  time: number;\n  /**\n   * 日期\n   */\n  date: number;\n  /**\n   * 是否选中\n   */\n  isSelected: boolean;\n}\n```\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                           | 默认值                                                                                                                            | 深色模式默认值                                                                                                                    | 备注                 |\n| -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | -------------------- |\n| --calendar-cell-disabled-opacity | 0.4                                                                                                                               | 0.4                                                                                                                               | 日历单元格禁用透明度 |\n| --calendar-weekday-names-bg      | <div style=\"width: 150px; height: 40px; background-color: #f8f8f8; color: #333333;\">#f8f8f8</div>                                 | <div style=\"width: 150px; height: 40px; background-color: #f8f8f8; color: #333333;\">#f8f8f8</div>                                 | 日历星期名称背景颜色 |\n| --calendar-default-color         | <div style=\"width: 150px; height: 40px; background-color: #333333; color: #FFFFFF;\">#333333</div>                                 | <div style=\"width: 150px; height: 40px; background-color: #c5cad1; color: #000000;\">#c5cad1</div>                                 | 日历默认颜色         |\n| --calendar-selected-color        | <div style=\"width: 150px; height: 40px; background-color: rgba(22, 119, 255, 0.1); color: #ffffff;\">rgba(22, 119, 255, 0.1)</div> | <div style=\"width: 150px; height: 40px; background-color: rgba(22, 119, 255, 0.1); color: #ffffff;\">rgba(22, 119, 255, 0.1)</div> | 日历选中颜色         |\n| --calendar-assist-color          | <div style=\"width: 150px; height: 40px; background-color: #999999; color: #FFFFFF;\">#999999</div>                                 | <div style=\"width: 150px; height: 40px; background-color: #616161; color: #FFFFFF;\">#616161</div>                                 | 日历辅助颜色         |\n| --calendar-selected-end-color    | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #333333;\">#ffffff</div>                                 | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #333333;\">#ffffff</div>                                 | 日历选中结束颜色     |\n| --calendar-selected-color        | <div style=\"width: 150px; height: 40px; background-color: #1677ff; color: #FFFFFF;\">#1677ff</div>                                 | <div style=\"width: 150px; height: 40px; background-color: #3086ff; color: #FFFFFF;\">#3086ff</div>                                 | 日历选中颜色         |\n\n## FAQ\n\n### 如何设置默认的开始与结束时间？\n\n通过 `defaultValue` 可以设置默认的时间。`defaultValue` 的类型是 `CalendarValue`。\n\n`CalendarValue` 的类型是 `number | [number, number]`，代表单选或者连续区间的日期。它是一个时间戳，单位是毫秒。\n\n例如，如果我们想设置默认的开始时间为今天，结束时间为七天后，我们可以在 `defaultValue` 中传入以下代码：\n\n```ts\n[dayjs().startOf('date'), dayjs().add(7, 'days').startOf('date')];\n```\n\n### 通过 `onFormatter` 设置单元格的自定义数据\n\n我们可以通过 `onFormatter` 方法设置单元格的自定义数据，`onFormatter` 的格式是 `(cell: CellState, currentValue: CalendarValue) => CellState`。\n\n这个函数会获取每个单元格的状态以及当前的值。通过返回新的单元格数据，我们可以自定义单元格的状态。\n\n以下是一些常见的使用场景：\n\n#### 如何让当天之前的时间不可选？\n\n在支付宝小程序中，我们可以通过页面上的方法设置，需要在 axml 文件中传入一个方法名字符串。\n\naxml 文件：\n\n```xml\n<calendar onFormatter=\"handleFormat\" />\n```\n\nts 文件：\n\n```ts\nimport dayjs from 'dayjs';\n\nPage({\n  handleFormat(cell: CellState) {\n    // 如果单元格代表的时间早于今天的开始时间，则禁止选择\n    return {\n      disabled: dayjs(cell.time).isBefore(dayjs().startOf('date')),\n    };\n  },\n});\n```\n\n在微信小程序，我们也可以通过 data 中的函数来设置，此时在 wxml 文件中需要传入一个变量名。\n\nwxml 文件：\n\n```xml\n<calendar onFormatter=\"{{handleFormat}}\" />\n```\n\nts 文件：\n\n```ts\nimport dayjs from 'dayjs';\n\nPage({\n  data: {\n    handleFormat: (cell: CellState) => {\n      // 如果单元格代表的时间早于今天的开始时间，则禁止选择\n      return {\n        disabled: dayjs(cell.time).isBefore(dayjs().startOf('date')),\n      };\n    },\n  },\n});\n```\n"
  },
  {
    "path": "src/Calendar/index.ts",
    "content": "import { effect } from '@preact/signals-core';\nimport dayjs from 'dayjs';\nimport equal from 'fast-deep-equal';\nimport mixinValue from '../mixins/value';\nimport { getInstanceBoundingClientRect } from '../_util/jsapi/get-instance-bounding-client-rect';\nimport {\n  ComponentWithSignalStoreImpl,\n  getValueFromProps,\n  triggerEvent,\n} from '../_util/simply';\nimport i18nController from '../_util/store';\nimport { assertAilpayNativeNotSupport } from '../_util/support';\nimport { CalendarDefaultProps, CalendarValue, CellState } from './props';\nimport {\n  getMonthListFromRange,\n  getScrollIntoViewId,\n  getSelectionModeFromValue,\n  renderCells,\n} from './utils';\n\nassertAilpayNativeNotSupport('Calendar');\n\nComponentWithSignalStoreImpl({\n  storeOptions: {\n    store: () => i18nController,\n    updateHook: effect,\n    mapState: {\n      locale: ({ store }) => store.currentLocale.value,\n    },\n  },\n  props: CalendarDefaultProps,\n  data: {\n    elementSize: null,\n    markItems: [],\n    monthList: [],\n    headerState: 0,\n    scrollIntoViewId: '',\n  },\n  methods: {\n    getInstance() {\n      if (this.$id) {\n        return my;\n      }\n      return this;\n    },\n    async getBoundingClientRect(query: string) {\n      return await getInstanceBoundingClientRect(this.getInstance(), query);\n    },\n    scrollIntoView(value) {\n      this.updateScrollIntoViewId(getScrollIntoViewId(value));\n    },\n    clickCell(e) {\n      const time = e.currentTarget.dataset.time;\n      const clickDate = dayjs(time.time);\n      if (time.disabled) {\n        return;\n      }\n      const value = this.getValue();\n      const selectionModeFromValue = getSelectionModeFromValue(value);\n      const selectionMode =\n        getValueFromProps(this, 'selectionMode') ??\n        selectionModeFromValue ??\n        'range';\n      if (selectionMode === 'range') {\n        if (Array.isArray(value)) {\n          if (value.length === 1) {\n            const current = value[0];\n            if (dayjs(clickDate.toDate().getTime()).isBefore(dayjs(current))) {\n              this.updateValue([clickDate.toDate().getTime()]);\n            } else {\n              this.updateValue([value[0], clickDate.toDate().getTime()]);\n            }\n          } else {\n            this.updateValue([clickDate.toDate().getTime()]);\n          }\n        } else {\n          this.updateValue([clickDate.toDate().getTime()]);\n        }\n      } else if (selectionMode === 'single') {\n        this.updateValue(clickDate.toDate().getTime());\n      }\n    },\n    setCurrentMonth(e) {\n      this.setData({ headerState: e.month });\n    },\n    measurement() {\n      const { elementSize } = this.data;\n      // 组件如果内嵌在 slot 里, 一定会被渲染出来, 但是此时 cellHeight 为 0\n      // 此时需要重新计算\n      if (!elementSize || elementSize.cellHeight === 0) {\n        this.measurementFn();\n      }\n    },\n    measurementFn() {\n      Promise.all([\n        this.getBoundingClientRect('.ant-calendar-body-container'),\n        this.getBoundingClientRect('.ant-calendar-cells'),\n        this.getBoundingClientRect('.ant-calendar-cell'),\n        this.getBoundingClientRect('.ant-calendar-title-container'),\n      ])\n        .then(\n          ([bodyContainer, cellsContainer, cellContainer, titleContainer]) => {\n            // 滚动的时候 top 和 bottom 等尺寸会变\n            // 所以只能依赖 height 来计算\n            const paddingHeight =\n              bodyContainer.height -\n              cellsContainer.height -\n              titleContainer.height;\n            const monthTitleHeight = titleContainer.height + paddingHeight;\n            this.setData({\n              elementSize: {\n                monthTitleHeight,\n                cellHeight: cellContainer.height,\n                paddingHeight,\n              },\n            });\n          }\n        )\n        .catch(() => {\n          this.setData({ elementSize: null });\n        });\n    },\n\n    // scroll 触发滚动之后需要重置 scrollIntoViewId\n    updateScrollIntoViewId(id) {\n      this.setData({ scrollIntoViewId: id });\n      const timer = setTimeout(() => {\n        this.setData({ scrollIntoViewId: '' });\n        clearTimeout(timer);\n      });\n    },\n\n    updateValue(newValue: CalendarValue) {\n      triggerEvent(this, 'change', newValue);\n      if (!this.isControlled()) {\n        this.update(newValue);\n      }\n    },\n    updateData() {\n      const [monthRange, pweekStartsOn, onFormatter, onMonthFormatter] =\n        getValueFromProps(this, [\n          'monthRange',\n          'weekStartsOn',\n          'onFormatter',\n          'onMonthFormatter',\n        ]);\n      const localeText = Object.assign({}, this.data.locale?.calendar);\n      const markItems = [...(localeText.weekdayNames ?? [])];\n      const weekStartsOn = pweekStartsOn;\n      if (weekStartsOn === 'Sunday') {\n        const item = markItems.pop();\n        if (item) markItems.unshift(item);\n      }\n      const value = this.getValue();\n      const start = dayjs(monthRange?.[0]).startOf('d');\n      const end = dayjs(monthRange?.[1]).startOf('d');\n      const monthRangeList = getMonthListFromRange(start, end);\n      const monthList = monthRangeList.map((p) => {\n        let cells = renderCells(\n          p,\n          weekStartsOn,\n          value,\n          localeText,\n          // 如果monthRange传入异常，用内置的时间范围\n          start.isAfter(end) || start.isSame(end)\n            ? [monthRangeList[0], dayjs(monthRangeList[1]).endOf('month')]\n            : [start, end]\n        );\n        if (onFormatter && typeof onFormatter === 'function') {\n          cells = cells.map((o): CellState => {\n            const {\n              time,\n              top,\n              bottom,\n              disabled,\n              isSelectedBegin,\n              isSelectedEnd,\n              isSelected,\n              className,\n              isRange,\n            } = o;\n            const newState =\n              onFormatter(\n                {\n                  time,\n                  top: top ? { ...top } : undefined,\n                  bottom: bottom ? { ...bottom } : undefined,\n                  disabled,\n                  isSelectedBegin,\n                  isSelectedEnd,\n                  isSelected,\n                  className,\n                  isRange,\n                },\n                value\n              ) ?? {};\n            const result = { ...o };\n            if (typeof newState === 'object') {\n              // 只允许修改的字段字段\n              ['top', 'bottom', 'disabled', 'className'].forEach((key) => {\n                if (key in newState) {\n                  result[key] = newState[key];\n                }\n              });\n            }\n            return result;\n          });\n        }\n        let month = {\n          title: p.format(localeText.format),\n          className: '',\n          cells,\n        };\n        if (onMonthFormatter && typeof onMonthFormatter === 'function') {\n          month = { ...month, ...onMonthFormatter(p) };\n        }\n        return month;\n      });\n      this.setData({ markItems, monthList });\n    },\n  },\n  mixins: [mixinValue()],\n  didMount() {\n    this.updateData();\n    this.measurementFn();\n    // 初始化默认值时，滚动到选中位置\n    const [value, defaultValue] = getValueFromProps(this, [\n      'value',\n      'defaultValue',\n    ]);\n    if (this.isControlled()) {\n      this.updateScrollIntoViewId(getScrollIntoViewId(value));\n    } else {\n      defaultValue &&\n        this.updateScrollIntoViewId(getScrollIntoViewId(defaultValue));\n    }\n  },\n  didUpdate(prevProps, prevData) {\n    if (!this.isEqualValue(prevData)) {\n      // 滚动到已选的位置\n      const changedScrollIntoView = getValueFromProps(\n        this,\n        'changedScrollIntoView'\n      );\n      changedScrollIntoView &&\n        this.updateScrollIntoViewId(getScrollIntoViewId(this.getValue()));\n    }\n    if (!equal(prevProps, this.props) || !this.isEqualValue(prevData)) {\n      this.updateData();\n    }\n  },\n  /// #if WECHAT\n  attached() {\n    this.updateData();\n    this.measurementFn();\n    // 初始化默认值时，滚动到选中位置\n    const [value, defaultValue] = getValueFromProps(this, [\n      'value',\n      'defaultValue',\n    ]);\n    if (this.isControlled()) {\n      this.updateScrollIntoViewId(getScrollIntoViewId(value));\n    } else {\n      defaultValue &&\n        this.updateScrollIntoViewId(getScrollIntoViewId(defaultValue));\n    }\n    this.triggerEvent('ref', this);\n  },\n\n  observers: {\n    '**': function (data) {\n      const prevData = this._prevData || this.data;\n      this._prevData = { ...data };\n      if (!equal(prevData, data)) {\n        this.updateData();\n      }\n    },\n    'mixin.value': function () {\n      // 滚动到已选的位置\n      const changedScrollIntoView = getValueFromProps(\n        this,\n        'changedScrollIntoView'\n      );\n      changedScrollIntoView &&\n        this.updateScrollIntoViewId(getScrollIntoViewId(this.getValue()));\n    },\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/Calendar/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\nimport { defaultMonthRange } from './utils';\n\nexport interface CalendarDate {\n  year: number;\n  month: number;\n  date: number;\n}\n\nexport interface LocaleText {\n  /**\n   * 星期的名称。从周一到周日\n   * 默认为 ['一', '二', '三', '四', '五', '六', '日']\n   */\n  weekdayNames: string[];\n  /**\n   * 月份标题的格式。 除中文/英文外默认为'MM/YYYY',\n   */\n  format: string;\n  /**\n   * 今日的文案。 默认为 '今日'\n   */\n  today: string;\n  /**\n   * 开始的文案。 默认为 '开始'\n   */\n  start: string;\n  /**\n   * 结束的文案。 默认为 '结束'\n   */\n  startAndEnd: string;\n  /**\n   * 开始/结束的文案。 默认为 '开始/结束'\n   */\n  end: string;\n}\n\nexport interface CellState {\n  /**\n   * 类名\n   */\n  className?: string;\n  /**\n   * 是否被禁止\n   */\n  disabled: boolean;\n  /**\n   * 日历单元格的顶部内容\n   */\n  top?: { label: string; className?: string };\n  /**\n   * 日历单元格的底部内容\n   */\n  bottom?: { label: string; className?: string };\n  /**\n   * 时间戳\n   */\n  time: number;\n  /**\n   * 日期\n   */\n  date: number;\n  /**\n   * 是否被选择\n   */\n  isSelected: boolean;\n  /**\n   * 是否是选择区间的开始\n   */\n  isSelectedBegin: boolean;\n  /**\n   * 是否是选择区间的结束\n   */\n  isSelectedEnd: boolean;\n  /**\n   * 是否是每一行的第一个\n   */\n  isRowBegin: boolean;\n  isRowEnd: boolean;\n  inThisMonth: boolean;\n  /**\n   * 是否在传入范围内\n   */\n  isRange: boolean;\n  index: number;\n}\n\nexport type CalendarValue = number | number[];\nexport type SelectionMode = 'single' | 'range';\n\nexport interface ICalendarProps extends IBaseProps {\n  /**\n   * 初始值\n   */\n  defaultValue?: CalendarValue;\n  /**\n   * 日历选择的日期，受控模式\n   */\n  value?: CalendarValue;\n  /**\n   * 设置选择模式，单选或者连续区间, 默认为 'range'\n   */\n  selectionMode?: SelectionMode;\n  /**\n   * 月份范围，默认为最近 3 个月\n   * 格式为时间戳\n   * @default [本月第一天的时间戳, 3个月后第一天的时间戳]\n   */\n  monthRange?: [number, number];\n  /**\n   * 星期栏，以周几作为第一天显示，默认为 'Sunday'\n   */\n  weekStartsOn?: 'Sunday' | 'Monday';\n  /**\n   * 选中值改变后滚动视图\n   */\n  changedScrollIntoView?: boolean;\n  /**\n   * 只展示在可选范围内的日期\n   */\n  showSelectableDatesOnly?: boolean;\n  /**\n   * 日期变化回调\n   */\n  onChange?: (date: CalendarValue) => void;\n  /**\n   * onFormatter 用于设置单元格的自定义数据\n   * @param cell 原始数据\n   * @param currentValue 当前的 value\n   * @returns 返回新的数据\n   */\n  onFormatter?: (\n    cell: Pick<\n      CellState,\n      | 'className'\n      | 'disabled'\n      | 'top'\n      | 'bottom'\n      | 'time'\n      | 'isSelectedBegin'\n      | 'isSelectedEnd'\n      | 'isSelected'\n    >,\n    currentValue: CalendarValue\n  ) => Pick<CellState, 'disabled' | 'top' | 'bottom'>;\n  /**\n   * onMonthFormatter 用于设置月份的自定义数据\n   * @param month 原始数据\n   * @returns 返回新的数据\n   */\n  onMonthFormatter?: (month) => { title?: string; className?: string };\n}\n\nexport const CalendarDefaultProps = {\n  defaultValue: null,\n  value: null,\n  selectionMode: 'range',\n  monthRange: defaultMonthRange(),\n  weekStartsOn: 'Sunday',\n  onFormatter: null,\n  onMonthFormatter: null,\n  changedScrollIntoView: null,\n  showSelectableDatesOnly: false,\n  onChange() {},\n};\n"
  },
  {
    "path": "src/Calendar/scroll.sjs.ts",
    "content": "let block = false;\nfunction handleScroll(event, ownerComponent) {\n  if (block) return;\n  block = true;\n  ownerComponent.setTimeout(() => {\n    block = false;\n  }, 200);\n  let currentScroll = event.detail.scrollTop;\n  const dataset = event.instance.getDataset();\n  const { elementsize: elementSize, monthlist: monthList } = dataset;\n  if (!elementSize) {\n    return;\n  }\n  // 组件如果内嵌在 slot 里, 一定会被渲染出来, 但是此时 cellHeight 为 0\n  if (elementSize.cellHeight === 0) {\n    ownerComponent.callMethod('measurement');\n    return;\n  }\n  const instance = ownerComponent.selectComponent('.ant-calendar-sticky-title');\n  const sticky = ownerComponent.selectComponent('.ant-calendar-sticky');\n  if (sticky) {\n    sticky.setStyle({\n      display: currentScroll < 0 ? 'none' : 'block',\n    });\n  }\n  const monthHeight = elementSize.monthTitleHeight;\n  const paddingHeight = elementSize.paddingHeight;\n  const cellHeight = elementSize.cellHeight;\n  const heightList = monthList.map((p) => {\n    return monthHeight + (cellHeight * p.cells.length) / 7;\n  });\n  for (let i = 0; i < heightList.length; i++) {\n    if (currentScroll < heightList[i]) {\n      let topHeight =\n        currentScroll - heightList[i] + monthHeight - paddingHeight;\n      topHeight = Math.max(topHeight, 0);\n      instance.setStyle({\n        transform: `translateY(-${topHeight}px)`,\n      });\n      ownerComponent.callMethod('setCurrentMonth', {\n        month: topHeight > monthHeight * 0.8 ? i + 1 : i,\n      });\n      break;\n    } else {\n      currentScroll = currentScroll - heightList[i];\n    }\n  }\n}\n\nexport default {\n  handleScroll,\n};\n"
  },
  {
    "path": "src/Calendar/utils.ts",
    "content": "import dayjs, { Dayjs } from 'dayjs';\nimport { isoWeekday } from '../_util/dayjs/iso-weekday';\nimport { CalendarValue, CellState, LocaleText, SelectionMode } from './props';\n\nexport function getMonthListFromRange(start: Dayjs, end: Dayjs): Dayjs[] {\n  if (start.isAfter(end))\n    throw new Error(`Start time can't be later than end time.`);\n  const result = [];\n  let current = start.date(1);\n  while (!current.isAfter(end)) {\n    result.push(current.date(1));\n    current = current.add(1, 'month');\n  }\n  return result;\n}\n\nexport function defaultMonthRange(): [number, number] {\n  const start = dayjs().startOf('date');\n  const end = dayjs().startOf('date').add(2, 'month');\n  return [start.toDate().getTime(), end.toDate().getTime()];\n}\n\n/**\n *\n * @param month 月份的某一天\n * @param weekStartsOn 日历以星期几开始\n * @returns 获取当月日历所有的日子\n */\nexport function getDate(month: Dayjs, weekStartsOn: string): Dayjs[] {\n  const startOfMonth = month.date(1);\n  const cells: Dayjs[] = [];\n  let iterator: Dayjs = startOfMonth\n    .subtract(isoWeekday(startOfMonth) % 7, 'day')\n    .startOf('day');\n  if (weekStartsOn === 'Monday') {\n    iterator = iterator.add(1, 'day');\n    if (\n      iterator.isSame(startOfMonth, 'month') &&\n      !iterator.isSame(startOfMonth.startOf('date'), 'date')\n    ) {\n      iterator = iterator.add(-7, 'days');\n    }\n  }\n  const diffDay = startOfMonth.date(1).add(1, 'month').diff(iterator, 'day');\n  const lintCount = Math.ceil(diffDay / 7);\n  while (cells.length < lintCount * 7) {\n    cells.push(iterator);\n    iterator = iterator.add(1, 'day');\n  }\n  return cells;\n}\n\nexport function renderCells(\n  cellsMonth: Dayjs,\n  weekStartsOn: string,\n  value: CalendarValue,\n  localeText: LocaleText,\n  monthRangeList: Dayjs[]\n): CellState[] {\n  const [rangeStartDate, rangeEndDate] = monthRangeList;\n\n  let rowBeginDay = 0;\n  let rowEndDay = 6;\n  if (weekStartsOn === 'Monday') {\n    rowBeginDay = 1;\n    rowEndDay = 0;\n  }\n  const dates = getDate(cellsMonth, weekStartsOn);\n  if (!value) {\n    return dates.map((d, index): CellState => {\n      const isToday = dayjs().isSame(d, 'day');\n      const isRowBegin =\n        d.isSame(cellsMonth.startOf('month'), 'date') ||\n        d.day() === rowBeginDay;\n      const isRowEnd =\n        d.isSame(cellsMonth.endOf('month'), 'date') || d.day() === rowEndDay;\n\n      let top: CellState['top'];\n      if (isToday) {\n        top = {\n          label: localeText.today,\n        };\n      }\n\n      return {\n        index,\n        disabled: false,\n        time: d.toDate().getTime(),\n        date: d.get('date'),\n        isSelected: false,\n        isSelectedBegin: false,\n        top,\n        isSelectedEnd: false,\n        inThisMonth: d.month() === cellsMonth.month(),\n        isRowBegin,\n        isRowEnd,\n        isRange:\n          (d.isSame(rangeStartDate) || d.isAfter(rangeStartDate)) &&\n          (d.isSame(rangeEndDate) || d.isBefore(rangeEndDate)),\n      };\n    });\n  }\n\n  let selectBegin: Dayjs;\n  let selectEnd: Dayjs;\n\n  if (Array.isArray(value)) {\n    selectBegin = dayjs(value[0]);\n    selectEnd = dayjs(value[1] ?? value[0]);\n  } else {\n    selectBegin = dayjs(value);\n    selectEnd = dayjs(value);\n  }\n\n  return dates.map((d, index): CellState => {\n    const isToday = dayjs().isSame(d, 'day');\n    const isRowBegin =\n      d.isSame(cellsMonth.startOf('month'), 'date') || d.day() === rowBeginDay;\n    const isRowEnd =\n      d.isSame(cellsMonth.endOf('month'), 'date') || d.day() === rowEndDay;\n\n    const isSelectedBegin = selectBegin.isSame(d, 'day');\n    const isSelectedEnd = selectEnd.isSame(d, 'day');\n    const isSelected =\n      (!!selectBegin.isBefore(d, 'day') && !!selectEnd.isAfter(d, 'day')) ||\n      isSelectedBegin ||\n      isSelectedEnd;\n    const inThisMonth = d.month() === cellsMonth.month();\n    const time = d.toDate().getTime();\n    let topLabel = isToday ? localeText.today : '';\n    if (Array.isArray(value)) {\n      if (isSelectedBegin) {\n        if (isSelectedEnd && value.length === 2) {\n          topLabel = localeText.startAndEnd;\n        } else {\n          topLabel = localeText.start;\n        }\n      } else {\n        if (isSelectedEnd) {\n          topLabel = localeText.end;\n        }\n      }\n    }\n\n    return {\n      index,\n      disabled: false,\n      time,\n      date: d.get('date'),\n      isSelected,\n      isSelectedBegin,\n      top: { label: topLabel },\n      isSelectedEnd,\n      inThisMonth,\n      isRowBegin,\n      isRowEnd,\n      isRange:\n        (d.isSame(rangeStartDate) || d.isAfter(rangeStartDate)) &&\n        (d.isSame(rangeEndDate) || d.isBefore(rangeEndDate)),\n    };\n  });\n}\n\nexport function getSelectionModeFromValue(\n  value?: CalendarValue\n): SelectionMode {\n  if (Array.isArray(value)) {\n    return 'range';\n  }\n  if (typeof value === 'number') {\n    return 'single';\n  }\n  return null;\n}\n\n// 获取滚动视图的元素id\nexport function getScrollIntoViewId(value: CalendarValue) {\n  // 已选中时间滚动到可视区域内（微信不支持id为数字开头）\n  return `id_${\n    value &&\n    dayjs(Array.isArray(value) ? value[0] : value)\n      .startOf('d')\n      .subtract(7, 'd') // 需要定位的地方往前推7天，让已选中时间定位到中间位置\n      .toDate()\n      .getTime()\n  }`;\n}\n"
  },
  {
    "path": "src/Calendar/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n/* size | 按钮内间距 */\n@calendar-cell-top-height: 25 * @rpx;\n@calendar-cell-top-font-size: 18 * @rpx;\n@calendar-cell-bottom-height: 25 * @rpx;\n@calendar-cell-bottom-font-size: 18 * @rpx;\n@calendar-cell-center-height: 45 * @rpx;\n@calendar-cell-center-font-size: 32 * @rpx;\n@calendar-cell-top-padding: 7 * @rpx;\n@calendar-cell-space-size: 10 * @rpx;\n@calendar-cell-bottom-margin: 8 * @rpx;\n@calendar-cell-height: (25 + 25 + 45 + 7 + 8) * @rpx;\n\n@calendar-cells-padding: 16 * @rpx;\n\n@calendar-sticky-title-z-index: 1000;\n@calendar-month-title-height: 82 * @rpx;\n\n@calendar-weekday-names-height: 88 * @rpx;\n@calendar-weekday-names-font-size: 28 * @rpx;\n@calendar-weekday-names-bottom-margin: 8 * @rpx;\n@calendar-weekday-names-left-padding: @size-5;\n\n@calendar-cell-disabled-opacity: var(\n  --calendar-cell-disabled-opacity,\n  @opacity-disabled\n);\n@calendar-weekday-names-background-color: var(\n  --calendar-weekday-names-bg,\n  #f8f8f8\n);\n\n@calendar-default-color: var(--calendar-default-color, @COLOR_TEXT_PRIMARY);\n\n@calendar-selected-color: var(--calendar-selected-color, @COLOR_BRAND1_FADED_1);\n\n@calendar-assist-color: var(--calendar-assist-color, @COLOR_TEXT_ASSIST);\n\n@calendar-selected-end-color: var(--calendar-selected-end-color, @COLOR_WHITE);\n\n@calendar-selected-color: var(--calendar-selected-color, @COLOR_BRAND1);\n"
  },
  {
    "path": "src/Card/index.axml",
    "content": "<view class=\"ant-card {{className ? className : ''}}\">\n  <ant-sticky\n    sticky=\"{{ headSticky }}\"\n    check=\"{{ headSticky }}\"\n    top=\"{{stickyTop}}\"\n    transparentTitle=\"{{ stickyTransparentTitle }}\"\n    onStickyChange=\"handleStickyChange\"\n  >\n    <view\n      a:if=\"{{title}}\"\n      class=\"ant-card-header\"\n      onTap=\"handleTapCardHeader\"\n    >\n      <!-- #if ALIPAY -->\n      <slot name=\"headerTitle\">\n      <!-- #endif -->\n        <view class=\"ant-card-header-title\">\n          {{title}}\n        </view>\n      <!-- #if ALIPAY -->\n      </slot>\n      <!-- #endif -->\n\n      <!-- #if ALIPAY -->\n      <slot name=\"headerRight\" class=\"ant-card-header-right\">\n      <!-- #endif -->\n        <view\n          a:if=\"{{operateText}}\"\n          class=\"ant-card-header-right-link\"\n          onTap=\"handleTapLink\"\n        >\n          {{operateText}}\n          <ant-icon type=\"RightOutline\" />\n        </view>\n\n        <view\n          class=\"ant-card-header-right-link\"\n          a:elif=\"{{ needFold }}\"\n          onTap=\"handleTapFoldBtn\"\n        >\n          <text class=\"ant-card-header-fold-btn\">{{finalFoldStatus ? '展开' : '收起'}}</text>\n          <ant-icon class=\"ant-card-header-fold-icon\" type=\"{{ finalFoldStatus ? 'DownOutline' : 'UpOutline'}}\"/>\n        </view>\n      <!-- #if ALIPAY -->\n      </slot>\n      <!-- #endif -->\n    </view>\n  </ant-sticky>\n\n  <view a:if=\"{{!finalFoldStatus}}\" class=\"ant-card-divider {{divider ? 'ant-card-divider-with-line' : ''}}\"></view>\n\n  <!-- 卡片内容插槽 -->\n  <view class=\"ant-card-content {{ finalFoldStatus ? 'ant-card-content-collapse' : '' }}\">\n    <slot></slot>\n  </view>\n</view>\n"
  },
  {
    "path": "src/Card/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Information Display\n  order: 8\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Card\n\nBase card container. When you need to carry text, lists, pictures, paragraphs and other content, use Card card containers to facilitate users to browse.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-card\": \"antd-mini/es/Card/index\"\n#endif\n#if WECHAT\n  \"ant-card\": \"antd-mini/Card/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic Usage\n\n```xml\n<ant-card\n#if ALIPAY\n  onOperateClick=\"handleLinkClick\"\n#endif\n#if WECHAT\n  bindoperateclick=\"handleLinkClick\"\n#endif\n  title=\"title\"\n  operateText=\"operate\"\n>\n  <view>\n    I am the card content\n  </view>\n</ant-card>\n```\n\n### Content Separator\n\n```xml\n<ant-card\n  divider=\"{{true}}\"\n  title=\"title\"\n  operateText=\"operate\"\n>\n  <view>\n    Title Content with Split Line\n  </view>\n</ant-card>\n```\n\n### Title ceiling\n\n```xml\n<ant-card\n  title=\"title\"\n  headSticky=\"{{true}}\"\n#if ALIPAY\n  onTitleSticky=\"handleTitleSticky\"\n#endif\n#if WECHAT\n  bindtitlesticky=\"handleLinkClick\"\n#endif\n>\n  <view style=\"height: 400px\">\n    Simulate a long card content\n  </view>\n</ant-card>\n```\n\n### Card Foldable\n\n```xml\n<ant-card\n  title=\"title\"\n  needFold=\"{{true}}\"\n>\n  <view>\n    Content area can be expanded/collapsed\n  </view>\n</ant-card>\n```\n\n### Custom Action Buttons\n\n```xml\n<ant-card\n  title=\"title\"\n  operateText=\"operateText\"\n>\n  <view slot=\"headerRight\">\n    Custom\n  </view>\n  <view>\n    I am the card content\n  </view>\n</ant-card>\n```\n\n### Demo Code\n\n<code src=\"../../demo/pages/Card/index\"></code>\n\n## Property\n\n| Property                         | Description                                                                | Type                        | Default Value |\n| ---------------------------- | ------------------------------------------------------------------- | --------------------------- | ------ |\n| className                    | Container className                                                      | string                      | -      |\n| config                       | Card Configuration                                                            | [ICardConfig](#ICardConfig) | -      |\n| title                        | Card Title                                                            | string                      | -      |\n| divider                      | Whether there is a dividing line                                                        | boolean                     | false  |\n| needFold                     | Whether a foldable card is required, the operateText needs to be empty, otherwise it needs to be manually unfolded and stowed. | boolean                     | false  |\n| foldStatus                   | Whether it is collapsed or not, passing true will cause it to be collapsed, regardless of whether the needFold is true or not.             | boolean                     | false  |\n| headSticky                   | Does the title need ceiling                                                    | boolean                     | false  |\n| stickyTransparentTitle       | Whether the ceiling is on the transparent head page, if so, the height of the transparent head will be calculated automatically.                      | boolean                     | false  |\n| stickyTop                    | How much distance should the title be from the top when it is sucked                                  | string                      | -      |\n| operateText                  | Default title bar right action button text                                          | string                      | -      |\n| #if ALIPAY onOperateClick    | Default title bar right operation button click callback                                      | () => void                  | -      |\n| #if ALIPAY onFoldChange      | Default title bar right collapse expand button click callback                                  | () => void                  | -      |\n| #if ALIPAY onTitleSticky     | Whether the title area is the callback when the ceiling changes.                                      | (status) => void            | -      |\n| #if WECHAT bindoperateclick | Default title bar right operation button click callback                                      | () => void                  | -      |\n| #if WECHAT bindfoldchange   | Default title bar right collapse expand button click callback                                  | () => void                  | -      |\n| #if WECHAT bindtitlesticky  | Whether the title area is the callback when the ceiling changes.                                      | (status) => void            | -      |\n\n### ICardConfig\n\n| Configuration Item      | Description                                  | Type   | Default Value |\n| ----------- | ------------------------------------- | ------ | ------ |\n| foldTapArea | Collapse behavior trigger area, optional`btn`、`header` | string | 'btn'  |\n\n## Slot\n\n| Name        | Description                 |\n| ----------- | -------------------- |\n| Default Slot    | Card Content             |\n| headerTitle | Custom Title Bar Left Title |\n| headerRight | Customize the right content of the title bar |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For more information, see ConfigProvider Components.\n\n| Variable name                        | Light Mode Default                                                                                    | Dark Mode Default                                                                                    | Remarks             |\n| ----------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------- |\n| --ant-card-bg                 | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | Card background color     |\n| --ant-card-header-title-color | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #000000;\">#c5cad1</div> | Card head title color |\n| --ant-card-header-link-color  | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | Card Head Link Color |\n| --ant-card-fold-btn-color     | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | Card Fold Button Color |\n"
  },
  {
    "path": "src/Card/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-sticky\": \"../Sticky/index\",\n    \"ant-icon\": \"../Icon/index\"\n  }\n}\n"
  },
  {
    "path": "src/Card/index.less",
    "content": "@import (reference) './variable.less';\n@import '../style/mixins/hairline.less';\n\n@cardPrefix: ant-card;\n\n.@{cardPrefix} {\n  border-radius: 24 * @rpx;\n  background-color: @ant-card-bg;\n\n  &-header {\n    display: flex;\n    padding: 24 * @rpx;\n    justify-content: space-between;\n    &-title {\n      color: @ant-card-header-title-color;\n      line-height: 45 * @rpx;\n      font-size: 32 * @rpx;\n    }\n    &-right {\n      &-link {\n        display: flex;\n        align-items: center;\n        font-size: 28 * @rpx;\n        color: @ant-card-link-color;\n      }\n    }\n\n    &:empty {\n      margin-bottom: 0;\n    }\n\n    &-fold {\n      &-btn {\n        font-size: 26 * @rpx;\n        color: @ant-card-fold-btn-color;\n      }\n      &-icon {\n        font-size: 26 * @rpx;\n        margin-left: 8 * @rpx;\n        color: @ant-card-fold-btn-color;\n      }\n    }\n  }\n\n  .ant-card-divider {\n    margin: 0 24 * @rpx;\n    &-with-line {\n      position: relative;\n      .hairline('top',@ant-card-divider-color);\n    }\n  }\n\n  .ant-card-content {\n    padding: 24 * @rpx;\n    transition: all 0.2s ease-in-out;\n    will-change: max-height;\n\n    &-collapse {\n      max-height: 0;\n      padding-top: 0;\n      padding-bottom: 0;\n      overflow: hidden;\n    }\n  }\n}\n"
  },
  {
    "path": "src/Card/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 数据展示\n  order: 8\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Card 卡片\n\n基础的卡片容器。当需要承载文字、列表、图片、段落等内容时，使用 Card 卡片容器以方便用户浏览。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-card\": \"antd-mini/es/Card/index\"\n#endif\n#if WECHAT\n  \"ant-card\": \"antd-mini/Card/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基础用法\n\n```xml\n<ant-card\n#if ALIPAY\n  onOperateClick=\"handleLinkClick\"\n#endif\n#if WECHAT\n  bindoperateclick=\"handleLinkClick\"\n#endif\n  title=\"title\"\n  operateText=\"operate\"\n>\n  <view>\n    我是卡片内容\n  </view>\n</ant-card>\n```\n\n### 内容分隔线\n\n```xml\n<ant-card\n  divider=\"{{true}}\"\n  title=\"title\"\n  operateText=\"operate\"\n>\n  <view>\n    标题内容间带分割线\n  </view>\n</ant-card>\n```\n\n### 标题吸顶\n\n```xml\n<ant-card\n  title=\"title\"\n  headSticky=\"{{true}}\"\n#if ALIPAY\n  onTitleSticky=\"handleTitleSticky\"\n#endif\n#if WECHAT\n  bindtitlesticky=\"handleLinkClick\"\n#endif\n>\n  <view style=\"height: 400px\">\n    模拟一个长卡片内容\n  </view>\n</ant-card>\n```\n\n### 卡片可折叠\n\n```xml\n<ant-card\n  title=\"title\"\n  needFold=\"{{true}}\"\n>\n  <view>\n    内容区域可展开/收起\n  </view>\n</ant-card>\n```\n\n### 自定义操作按钮\n\n```xml\n<ant-card\n  title=\"title\"\n  operateText=\"operateText\"\n>\n  <view slot=\"headerRight\">\n    自定义\n  </view>\n  <view>\n    我是卡片内容\n  </view>\n</ant-card>\n```\n\n### Demo 代码\n\n<code src=\"../../demo/pages/Card/index\"></code>\n\n## 属性\n\n| 属性                         | 说明                                                                | 类型                        | 默认值 |\n| ---------------------------- | ------------------------------------------------------------------- | --------------------------- | ------ |\n| className                    | 容器 className                                                      | string                      | -      |\n| config                       | 卡片配置                                                            | [ICardConfig](#ICardConfig) | -      |\n| title                        | 卡片标题                                                            | string                      | -      |\n| divider                      | 是否有分割线                                                        | boolean                     | false  |\n| needFold                     | 是否需要可折叠卡片，需要 operateText 为空，否则需要手动进行展开收起 | boolean                     | false  |\n| foldStatus                   | 是否折叠，传 true 会导致收起，不管 needFold 是否为 true             | boolean                     | false  |\n| headSticky                   | 标题是否需要吸顶                                                    | boolean                     | false  |\n| stickyTransparentTitle       | 吸顶是否在透明头页面，是的话会自动算透明头高度                      | boolean                     | false  |\n| stickyTop                    | 标题吸顶时要吸在距离顶部多少的位置                                  | string                      | -      |\n| operateText                  | 默认标题栏右侧操作按钮文本                                          | string                      | -      |\n| #if ALIPAY onOperateClick    | 默认标题栏右侧操作按钮点击回调                                      | () => void                  | -      |\n| #if ALIPAY onFoldChange      | 默认标题栏右侧折叠展开按钮点击回调                                  | () => void                  | -      |\n| #if ALIPAY onTitleSticky     | title 区域是否吸顶变化时的回调                                      | (status) => void            | -      |\n| #if WECHAT bindoperateclick | 默认标题栏右侧操作按钮点击回调                                      | () => void                  | -      |\n| #if WECHAT bindfoldchange   | 默认标题栏右侧折叠展开按钮点击回调                                  | () => void                  | -      |\n| #if WECHAT bindtitlesticky  | title 区域是否吸顶变化时的回调                                      | (status) => void            | -      |\n\n### ICardConfig\n\n| 配置项      | 说明                                  | 类型   | 默认值 |\n| ----------- | ------------------------------------- | ------ | ------ |\n| foldTapArea | 折叠行为触发区域，可选`btn`、`header` | string | 'btn'  |\n\n## 插槽\n\n| 名称        | 说明                 |\n| ----------- | -------------------- |\n| 默认插槽    | 卡片内容             |\n| headerTitle | 自定义标题栏左侧标题 |\n| headerRight | 自定义标题栏右侧内容 |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                        | 浅色模式默认值                                                                                    | 深色模式默认值                                                                                    | 备注             |\n| ----------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------- |\n| --ant-card-bg                 | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | 卡片背景颜色     |\n| --ant-card-header-title-color | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #000000;\">#c5cad1</div> | 卡片头部标题颜色 |\n| --ant-card-header-link-color  | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | 卡片头部链接颜色 |\n| --ant-card-fold-btn-color     | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | 卡片折叠按钮颜色 |\n"
  },
  {
    "path": "src/Card/index.ts",
    "content": "import {\n  Component,\n  getValueFromProps,\n  triggerEvent,\n  triggerEventOnly,\n} from '../_util/simply';\nimport { assertAilpayNativeNotSupport } from '../_util/support';\nimport { CardDefaultProps } from './props';\n\nassertAilpayNativeNotSupport('Card');\n\nComponent({\n  props: CardDefaultProps,\n  data: {\n    finalFoldStatus: false,\n  },\n  methods: {\n    // 点击展开收起按钮\n    handleTapFoldBtn(e) {\n      const { finalConfig = {}, finalFoldStatus } = this.data;\n      if (finalConfig.foldTapArea === 'btn') {\n        this.setData({\n          finalFoldStatus: !finalFoldStatus,\n        });\n        triggerEvent(this, 'foldChange', !finalFoldStatus, e);\n      }\n    },\n    // 点击标题整栏\n    handleTapCardHeader(e) {\n      const { finalConfig = {}, finalFoldStatus } = this.data;\n      if (finalConfig.foldTapArea === 'header' && this.props.needFold) {\n        this.setData({\n          finalFoldStatus: !finalFoldStatus,\n        });\n        triggerEvent(this, 'foldChange', !finalFoldStatus, e);\n      }\n    },\n    // 点击更多\n    handleTapLink(e) {\n      triggerEventOnly(this, 'operateClick', e);\n    },\n    // 处理title的sticky状态变化\n    handleStickyChange(status) {\n      triggerEvent(this, 'titleSticky', status);\n    },\n  },\n\n  /// #if ALIPAY\n  onInit() {\n    const [foldStatus, config] = getValueFromProps(this, [\n      'foldStatus',\n      'config',\n    ]);\n    this.setData({\n      finalFoldStatus: foldStatus,\n      finalConfig: {\n        ...CardDefaultProps.config,\n        ...config,\n      },\n    });\n  },\n  didUpdate(prevProps) {\n    const foldStatus = getValueFromProps(this, 'foldStatus');\n    if (prevProps.foldStatus !== foldStatus) {\n      this.setData({\n        finalFoldStatus: foldStatus,\n      });\n    }\n  },\n  /// #endif\n  /// #if WECHAT\n  attached() {\n    const [foldStatus, config] = getValueFromProps(this, [\n      'foldStatus',\n      'config',\n    ]);\n    this.setData({\n      finalFoldStatus: foldStatus,\n      finalConfig: {\n        ...CardDefaultProps.config,\n        ...config,\n      },\n    });\n  },\n  observers: {\n    '**': function (data) {\n      const prevData = this._prevData || this.data;\n      this._prevData = { ...data };\n      if (prevData.foldStatus !== data.foldStatus) {\n        this.setData({\n          finalFoldStatus: data.foldStatus,\n        });\n      }\n    },\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/Card/props.ts",
    "content": "export interface ICardProps {\n  className?: string; // 容器的 class\n  config?: ICardConfig; // 卡片的配置项\n  title?: string; // 卡片标题\n  operateText?: string; // 默认头部右侧操作按钮文本\n  needFold?: boolean; // 卡片是否可以折叠，如果为 true，还需要不传 operateText 才可以出折叠按钮，或者通过配置让折叠操作区为整个 titlebar\n  foldStatus?: boolean; // true展开 false收起态。不传就是非受控组件，传了就是受控组件\n  headSticky?: boolean; // 标题是否需要吸顶\n  stickyTransparentTitle?: boolean; // 吸顶是否在透明头页面，是的话会自动算透明头高度\n  stickyTop?: string; // 透传给sticky组件用于决定title区域的吸顶位置\n  divider?: boolean; // 是否显示分割线\n  onOperateClick?: (e) => void; // 默认头部右侧操作按钮点击回调\n  onFoldChange?: () => void; // 展开收起态发生变化时的回调\n  onTitleSticky?: (status) => void; // title区域是否吸顶变化时的回调\n}\n\nexport interface ICardConfig {\n  foldTapArea?: 'btn' | 'header'; // 折叠操作点击范围\n}\n\nexport const CardDefaultProps: ICardProps = {\n  className: '',\n  config: {\n    foldTapArea: 'btn',\n  },\n  title: '',\n  operateText:'',\n  needFold: false,\n  foldStatus: false,\n  headSticky: false,\n  stickyTransparentTitle: false,\n  stickyTop: '',\n  divider: false,\n  onOperateClick: () => {},\n  onFoldChange: () => {},\n  onTitleSticky: (status: boolean) => status,\n};\n"
  },
  {
    "path": "src/Card/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n@ant-card-bg: var(--ant-card-bg, @COLOR_WHITE);\n\n@ant-card-header-title-color: var(\n  --ant-card-header-title-color,\n  @COLOR_TEXT_PRIMARY\n);\n\n@ant-card-link-color: var(--ant-card-header-title-color, @COLOR_TEXT_ASSIST);\n\n@ant-card-fold-btn-color: var(--ant-card-fold-btn-color, @COLOR_BRAND1);\n\n@ant-card-divider-color: var(--ant-card-divider-color, #eeeeee);\n"
  },
  {
    "path": "src/Checkbox/CheckboxGroup/index.axml",
    "content": "<import-sjs\n  from=\"../index.sjs\"\n  name=\"componentUtils\" />\n\n<list\n  className=\"ant-checkbox-group {{ className ? className : '' }} ant-checkbox-group-{{ position }}\"\n  style=\"{{ style }}\">\n  <checkbox-group\n    name=\"{{ name }}\"\n    value=\"{{ mixin.value }}\">\n    <view class=\"ant-checkbox-group-body\">\n      <block a:if=\"{{ position === 'vertical' }}\">\n        <block\n          a:for=\"{{ options }}\"\n          a:for-index=\"index\"\n          a:for-item=\"item\"\n          a:key=\"value\">\n          <list-item>\n            <ant-checkbox\n              color=\"{{ color }}\"\n              checked=\"{{ componentUtils.getCheckboxChecked(item, mixin.value) }}\"\n              data-index=\"{{ index }}\"\n              value=\"{{ item.value }}\"\n              disabled=\"{{ disabled || item.disabled }}\"\n              onChange=\"onChange\">\n              <!-- #if ALIPAY -->\n              <slot\n                name=\"label\"\n                value=\"{{ item }}\"\n                index=\"{{ index }}\">\n              <!-- #endif -->\n                <view class=\"ant-checkbox-group-item-label-default\">\n                  {{ item.label }}\n                </view>\n              <!-- #if ALIPAY -->\n              </slot>\n              <!-- #endif -->\n            </ant-checkbox>\n          </list-item>\n        </block>\n      </block>\n      <block a:else>\n        <block\n          a:for=\"{{ options }}\"\n          a:for-index=\"index\"\n          a:for-item=\"item\"\n          a:key=\"value\">\n          <ant-checkbox\n            color=\"{{ color }}\"\n            checked=\"{{ componentUtils.getCheckboxChecked(item, mixin.value) }}\"\n            data-index=\"{{ index }}\"\n            value=\"{{ item.value }}\"\n            disabled=\"{{ disabled || item.disabled }}\"\n            onChange=\"onChange\">\n            <!-- #if ALIPAY -->\n            <slot\n              name=\"label\"\n              value=\"{{ item }}\"\n              index=\"{{ index }}\">\n            <!-- #endif -->\n              <view class=\"ant-checkbox-group-item-label-default\">\n                {{ item.label }}\n              </view>\n            <!-- #if ALIPAY -->\n            </slot>\n            <!-- #endif -->\n          </ant-checkbox>\n        </block>\n      </block>\n    </view>\n  </checkbox-group>\n</list>\n"
  },
  {
    "path": "src/Checkbox/CheckboxGroup/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"list\": \"../../List/index\",\n    \"list-item\": \"../../List/ListItem/index\",\n    \"ant-checkbox\": \"../index\"\n  }\n}\n"
  },
  {
    "path": "src/Checkbox/CheckboxGroup/index.less",
    "content": "@import (reference) '../variable.less';\n\n@checkGroupPrefix: ant-checkbox-group;\n\n.@{checkGroupPrefix} {\n  &-horizontal {\n    .@{checkGroupPrefix}-body {\n      display: flex;\n      flex-wrap: wrap;\n      justify-content: flex-start;\n\n      .ant-list-item-line {\n        padding-right: 0;\n      }\n\n      .ant-checkbox-item {\n        flex-flow: 0;\n      }\n\n      .ant-list-item-line::after {\n        display: none;\n      }\n    }\n  }\n\n  &-header:empty,\n  &-footer:empty {\n    display: none;\n  }\n\n  &-header,\n  &-footer {\n    display: flex;\n    align-items: center;\n    padding: @v-spacing-standard @v-spacing-large;\n    line-height: 1.4;\n    font-size: 30 * @rpx;\n    color: @checkbox-header-color;\n  }\n\n  &-body {\n    position: relative;\n    overflow: hidden;\n    .ant-checkbox-item-content {\n      .ant-checkbox-group-item-label-default:not(:nth-child(1)) {\n        display: none;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/Checkbox/CheckboxGroup/index.ts",
    "content": "import mixinValue from '../../mixins/value';\nimport { Component, getValueFromProps, triggerEvent } from '../../_util/simply';\nimport { CheckboxGroupDefaultProps } from './props';\n\nComponent({\n  props: CheckboxGroupDefaultProps,\n  methods: {\n    onChange(args, e) {\n      if (getValueFromProps(this, 'disabled')) {\n        return;\n      }\n      let event;\n      /// #if WECHAT\n      event = args;\n      /// #endif\n      /// #if ALIPAY\n      event = e;\n      /// #endif\n      let currentValue = this.getValue();\n      const { index } = event.currentTarget.dataset;\n      const selectValue = getValueFromProps(this, 'options')[index].value;\n      if (currentValue.indexOf(selectValue) > -1) {\n        currentValue = currentValue.filter((v) => v !== selectValue);\n      } else {\n        currentValue = [...currentValue, selectValue];\n      }\n      if (!this.isControlled()) {\n        this.update(currentValue);\n      }\n      triggerEvent(this, 'change', currentValue, e);\n    },\n  },\n\n  mixins: [\n    mixinValue({\n      transformValue(val) {\n        const value = val || [];\n        return {\n          needUpdate: true,\n          value,\n        };\n      },\n    }),\n  ],\n});\n"
  },
  {
    "path": "src/Checkbox/CheckboxGroup/props.ts",
    "content": "import { IBaseProps } from '../../_util/base';\n\nexport interface ICheckboxGroupProps extends IBaseProps {\n  value: string[];\n  defaultValue: string[];\n  disabled?: boolean;\n  position: 'horizontal' | 'vertical';\n  color: string;\n  options: {\n    label?: string;\n    value?: string;\n    disabled?: boolean;\n  }[];\n  onChange?: (value: string[], e: any) => void;\n}\n\nexport const CheckboxGroupDefaultProps: Partial<ICheckboxGroupProps> = {\n  value: null,\n  defaultValue: [],\n  disabled: false,\n  position: 'vertical',\n  color: '',\n  options: [],\n};\n"
  },
  {
    "path": "src/Checkbox/index.axml",
    "content": "<import-sjs\n  from=\"./index.sjs\"\n  name=\"componentUtils\" />\n\n<template name=\"checkbox\">\n  <view class=\"ant-checkbox-item-wrap\">\n    <!-- #if WECHAT -->\n    <checkbox-group bindchange=\"onChange\">\n      <checkbox\n        class=\"ant-checkbox-item-base\"\n        value=\"{{ value }}\"\n        checked=\"{{ mixin.value }}\"\n        disabled=\"{{ disabled }}\" />\n    </checkbox-group>\n    <!-- #endif -->\n    <!-- #if ALIPAY -->\n    <checkbox\n      class=\"ant-checkbox-item-base\"\n      value=\"{{ value }}\"\n      onChange=\"onChange\"\n      checked=\"{{ mixin.value }}\"\n      disabled=\"{{ disabled }}\" />\n    <!-- #endif -->\n    <view class=\"ant-checkbox-item-fake\">\n      <view\n        class=\"ant-checkbox-item-fake-{{ componentUtils.getClassName(mixin.value, disabled) }}\"\n        style=\"{{ mixin.value && !disabled && color ? 'background:' + color : '' }}\">\n        <ant-icon\n          a:if=\"{{ mixin.value }}\"\n          type=\"CheckOutline\"\n          className=\"ant-checkbox-item-fake-{{ componentUtils.getClassName(mixin.value, disabled) }}-icon\" />\n      </view>\n    </view>\n  </view>\n</template>\n\n\n<!-- #if ALIPAY -->\n<label\n  a:if=\"{{isLabelSupport}}\"\n  class=\"ant-checkbox-item {{ className || '' }}\"\n  style=\"{{ style || '' }}\">\n<!-- #endif -->\n<!-- #if WECHAT -->\n<label\n  a:if=\"{{isLabelSupport}}\"\n  class=\"ant-checkbox-item {{ className || '' }}\"\n  style=\"{{ style || '' }}\"\n  bindtap=\"onChange\">\n<!-- #endif -->\n  <view class=\"ant-checkbox-item-container\">\n    <template\n      is=\"checkbox\"\n      data=\"{{\n        value,\n        mixin,\n        disabled,\n        color\n      }}\"\n    />\n    <view class=\"ant-checkbox-item-content {{ disabled ? 'ant-checkbox-item-disabled' : '' }}\">\n      <slot />\n    </view>\n  </view>\n</label>\n<view\n  a:else\n  class=\"ant-checkbox-item {{ className || '' }}\"\n  style=\"{{ style || '' }}\"\n  catchTap=\"onChange\"\n>\n  <view class=\"ant-checkbox-item-container\">\n    <template\n      is=\"checkbox\"\n      data=\"{{\n        value,\n        mixin,\n        disabled,\n        color\n      }}\"\n    />\n    <view class=\"ant-checkbox-item-content {{ disabled ? 'ant-checkbox-item-disabled' : '' }}\">\n      <slot />\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "src/Checkbox/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Information Entry\n  order: 10\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Checkbox\n\nMake multiple selections in a set of options. When used alone, it can represent a switch between two states, and `switch` Similar. The difference is that switching `switch` will directly trigger a state change, while `checkbox` Generally used for status markers and needs to be coordinated with the submit operation.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-checkbox\": \"antd-mini/es/Checkbox/index\",\n  \"ant-checkbox-group\": \"antd-mini/es/Checkbox/CheckboxGroup/index\"\n#endif\n#if WECHAT\n  \"ant-checkbox\": \"antd-mini/Checkbox/index\",\n  \"ant-checkbox-group\": \"antd-mini/Checkbox/CheckboxGroup/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n> By `checked` Checked state of the binding check box.\n\n```xml\n#if ALIPAY\n<ant-checkbox checked=\"{{checked}}\" onChange=\"handleCheckedChange\">Basic usage</ant-checkbox>\n#endif\n#if WECHAT\n<ant-checkbox checked=\"{{checked}}\" bindchange=\"handleCheckedChange\">Basic usage</ant-checkbox>\n#endif\n```\n\n```js\nPage({\n  data: {\n    checked: false,\n  },\n  handleCheckedChange(checked) {\n#if WECHAT\n    this.setData({\n      checked: checked.detail,\n    });\n#endif\n#if ALIPAY\n    this.setData({\n      checked,\n    });\n#endif\n  },\n});\n```\n\n### Grouping\n\n```xml\n#if ALIPAY\n<ant-checkbox-group\n  value=\"{{value}}\"\n  options=\"{{options}}\"\n  onChange=\"handleValueChange\"\n/>\n#endif\n#if WECHAT\n<ant-checkbox-group\n  value=\"{{value}}\"\n  options=\"{{options}}\"\n  bindchange=\"handleValueChange\"\n/>\n#endif\n```\n\n```js\nPage({\n  data:{\n    value: ['banana'],\n     options: [\n      { value: 'apple', label: 'Apple' },\n      { value: 'orange', label: 'Orange' },\n      { value: 'banana', label: 'Banana' },\n    ],\n  },\n  handleValueChange(value) {\n#if WECHAT\n    this.setData({\n      value: value.detail,\n    });\n#endif\n#if ALIPAY\n    this.setData({\n      value,\n    });\n#endif\n  },\n});\n```\n\n### Custom Grouping\n\n> `van-checkbox` Cooperation `list` Use together to support custom grouping selection\n\n```xml\n#if ALIPAY\n<block\n  a:for=\"{{customOptions}}\"\n  a:for-index=\"index\"\n  a:for-item=\"option\"\n>\n  <ant-list header=\"{{option.title}}\">\n    <block\n      a:for=\"{{option.list}}\"\n      a:for-index=\"index\"\n      a:for-item=\"item\"\n    >\n      <ant-list-item>\n        <ant-checkbox\n          data-value=\"{{item.value}}\"\n          checked=\"{{utils.indexOf(customValue, item.value) > -1}}\"\n          onChange=\"handleCustomChange\"\n        >\n          {{item.title}}\n        </ant-checkbox>\n      </ant-list-item>\n    </block>\n  </ant-list>\n</block>\n#endif\n#if WECHAT\n<block\n  wx:for=\"{{customOptions}}\"\n  wx:for-index=\"index\"\n  wx:for-item=\"option\"\n>\n  <ant-list header=\"{{option.title}}\">\n    <block\n      wx:for=\"{{option.list}}\"\n      wx:for-index=\"index\"\n      wx:for-item=\"item\"\n    >\n      <ant-list-item>\n        <ant-checkbox\n          data-value=\"{{item.value}}\"\n          checked=\"{{utils.indexOf(customValue, item.value) > -1}}\"\n          bindchange=\"handleCustomChange\"\n        >{{item.title}}</ant-checkbox>\n      </ant-list-item>\n    </block>\n  </ant-list>\n</block>\n#endif\n```\n\n```js\nPage({\n  data: {\n    customOptions: [\n      {\n        title: 'Group one',\n        list: [\n          {\n            title: 'Option one',\n            value: '1',\n          },\n        ],\n      },\n      {\n        title: 'Group two',\n        list: [\n          {\n            title: 'Option two',\n            value: '2',\n          },\n        ],\n      },\n    ],\n    customValue: [],\n  },\n  handleCustomChange(checked, e) {\n    let value = this.data.customValue;\n\n#if WECHAT\n    const event = checked;\n    if (event.detail) {\n      value = value.concat(event.target.dataset.value);\n    } else {\n      value = value.filter((v) => v !== event.target.dataset.value);\n    }\n#endif\n\n#if ALIPAY\n    if (checked) {\n      value = value.concat(e.target.dataset.value);\n    } else {\n      value = value.filter((v) => v !== e.target.dataset.value);\n    }\n#endif\n\n    this.setData({ customValue: value });\n    console.log(value);\n  },\n});\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Checkbox/index'></code>\n\n## API\n\n#### Checkbox\n\n| Property                   | Description                    | Type                                                                                                | Default Value |\n| ---------------------- | ----------------------- | --------------------------------------------------------------------------------------------------- | ------ |\n| checked                | Whether selected                | boolean                                                                                             | -      |\n| className              | Class Name                    | string                                                                                              | -      |\n| color                  | Selected color, same as CSS color value | string                                                                                              | -      |\n| defaultChecked         | Is selected by default            | boolean                                                                                             | -      |\n| disabled               | Disable                | boolean                                                                                             | false  |\n| style                  | Style                    | string                                                                                              | -      |\n| #if ALIPAY onChange    | Trigger callback when selection status changes  | (checked: boolean, event: `Event`(https://opendocs.alipay.com/mini/framework/event-object)) => void | -      |\n| #if WECHAT bindchange | Trigger callback when selection status changes  | (checked: boolean, event: `Event`(https://opendocs.alipay.com/mini/framework/event-object)) => void | -      |\n\n#### CheckboxGroup\n\n| Property                   | Description                                                         | Type                                                                                                 | Default Value     |\n| ---------------------- | ------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------- | ---------- |\n| className              | Class Name                                                         | string                                                                                               | -          |\n| color                  | Selected color, same as CSS color value                                      | string                                                                                               | -          |\n| defaultValue           | Default selected value                                                 | `string[]`                                                                                           | -          |\n| disabled               | Disable                                                     | boolean                                                                                              | false      |\n| label                  | Label area slot, receiving value (current item optional item), index (index) | slot                                                                                                 | -          |\n| options                | Specify options                                                   | `{label: string; value: string; disabled: boolean}[]`                                                | -          |\n| position               | layout, optional `horizontal`、`vertical`                          | string                                                                                               | `vertical` |\n| style                  | Style                                                         | string                                                                                               | -          |\n| value                  | The value of the CheckboxGroup to determine whether the child element is checked.                       | `string[]`                                                                                           | -          |\n| #if ALIPAY onChange    | Check to trigger this function when status changes                                     | (value: `string[]`, event: `Event`(https://opendocs.alipay.com/mini/framework/event-object)) => void | -          |\n| #if WECHAT bindchange | Check to trigger this function when status changes                                     | (value: `string[]`, event: `Event`(https://opendocs.alipay.com/mini/framework/event-object)) => void | -          |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For more information, see ConfigProvider Components.\n\n| Variable name                                | Default Value                                                                                            | Dark Mode Default                                                                                    | Remarks                 |\n| ------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | -------------------- |\n| --checkbox-header-color               | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | Check Box Title Color       |\n| --checkbox-border-color               | <div style=\"width: 150px; height: 30px; background-color: #cccccc; color: #333333;\">#cccccc</div> | <div style=\"width: 150px; height: 30px; background-color: #474747; color: #fff;\">#474747</div> | Check Box Border Color       |\n| --checkbox-background-color           | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | Checkbox Background Color       |\n| --checkbox-disabled-background        | <div style=\"width: 150px; height: 30px; background-color: #f5f5f5; color: #333333;\">#f5f5f5</div> | <div style=\"width: 150px; height: 30px; background-color: #121212; color: #fff;\">#121212</div> | Check box Disable background color   |\n| --checkbox-text-color                 | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | Check Box Text Color       |\n| --checkbox-fake-icon-background-color | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #fff;\">#1a1a1a</div> | Check Box Fake Icon Background Color |\n"
  },
  {
    "path": "src/Checkbox/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-icon\": \"../Icon/index\"\n  }\n}\n"
  },
  {
    "path": "src/Checkbox/index.less",
    "content": "@import (reference) './variable.less';\n\n@checkboxItemPrefix: ant-checkbox-item;\n\n.@{checkboxItemPrefix} {\n  color: @checkbox-text-color;\n  margin-right: 16 * @rpx;\n\n  /// #if WECHAT\n  // 支付宝默认 label 的高度\n  height: 59.6 * @rpx;\n  line-height: 59.6 * @rpx;\n  // 在 label 内嵌一个 view, 微信会变成 block 组件\n  display: inline-block;\n  /// #endif\n\n  &-container {\n    display: flex;\n    align-items: center;\n  }\n\n  &-content {\n    padding-left: 10 * @rpx;\n    text-align: left;\n  }\n  &-wrap {\n    position: relative;\n    width: @checkbox-size;\n    height: @checkbox-size;\n    flex: 0 0 @checkbox-size;\n  }\n  &-base {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n    opacity: 0;\n  }\n\n  &-fake {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n    overflow: hidden;\n    pointer-events: none;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    &-icon {\n      background-color: @checkbox-fake-icon-background-color;\n      border: @checkbox-border-width solid @checkbox-border-color;\n      border-radius: @checkbox-corner-radius;\n      width: 100%;\n      height: 100%;\n      box-sizing: border-box;\n    }\n    &-checkedIcon {\n      border-radius: @checkbox-corner-radius;\n      background-color: @checkbox-background-color;\n      width: 100%;\n      height: 100%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      &-icon {\n        color: @COLOR_WHITE;\n        font-size: 28 * @rpx;\n      }\n    }\n    &-disbaledIcon {\n      box-sizing: border-box;\n      border: @checkbox-border-width solid @checkbox-border-color;\n      border-radius: @checkbox-corner-radius;\n      width: 100%;\n      height: 100%;\n      background-color: @checkbox-disabled-background;\n    }\n    &-disabledCheckedIcon {\n      box-sizing: border-box;\n      border: @checkbox-border-width solid @checkbox-border-color;\n      background-color: @checkbox-disabled-background;\n      border-radius: @checkbox-corner-radius;\n      width: 100%;\n      height: 100%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      &-icon {\n        color: @checkbox-border-color;\n        font-size: 28 * @rpx;\n      }\n    }\n  }\n  &-disabled {\n    opacity: @opacity-disabled;\n  }\n}\n"
  },
  {
    "path": "src/Checkbox/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 数据录入\n  order: 10\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Checkbox 复选框\n\n在一组可选项中进行多选。单独使用时可以表示两种状态之间的切换，与 `switch` 类似。区别在于，切换 `switch` 会直接触发状态改变，而 `checkbox` 一般用于状态标记，需要与提交操作配合。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-checkbox\": \"antd-mini/es/Checkbox/index\",\n  \"ant-checkbox-group\": \"antd-mini/es/Checkbox/CheckboxGroup/index\"\n#endif\n#if WECHAT\n  \"ant-checkbox\": \"antd-mini/Checkbox/index\",\n  \"ant-checkbox-group\": \"antd-mini/Checkbox/CheckboxGroup/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n> 通过 `checked` 绑定复选框的勾选状态。\n\n```xml\n#if ALIPAY\n<ant-checkbox checked=\"{{checked}}\" onChange=\"handleCheckedChange\">Basic usage</ant-checkbox>\n#endif\n#if WECHAT\n<ant-checkbox checked=\"{{checked}}\" bindchange=\"handleCheckedChange\">Basic usage</ant-checkbox>\n#endif\n```\n\n```js\nPage({\n  data: {\n    checked: false,\n  },\n  handleCheckedChange(checked) {\n#if WECHAT\n    this.setData({\n      checked: checked.detail,\n    });\n#endif\n#if ALIPAY\n    this.setData({\n      checked,\n    });\n#endif\n  },\n});\n```\n\n### 分组\n\n```xml\n#if ALIPAY\n<ant-checkbox-group\n  value=\"{{value}}\"\n  options=\"{{options}}\"\n  onChange=\"handleValueChange\"\n/>\n#endif\n#if WECHAT\n<ant-checkbox-group\n  value=\"{{value}}\"\n  options=\"{{options}}\"\n  bindchange=\"handleValueChange\"\n/>\n#endif\n```\n\n```js\nPage({\n  data:{\n    value: ['banana'],\n     options: [\n      { value: 'apple', label: 'Apple' },\n      { value: 'orange', label: 'Orange' },\n      { value: 'banana', label: 'Banana' },\n    ],\n  },\n  handleValueChange(value) {\n#if WECHAT\n    this.setData({\n      value: value.detail,\n    });\n#endif\n#if ALIPAY\n    this.setData({\n      value,\n    });\n#endif\n  },\n});\n```\n\n### 自定义分组\n\n> `van-checkbox` 配合 `list` 一起使用，即可支持自定义分组选择\n\n```xml\n#if ALIPAY\n<block\n  a:for=\"{{customOptions}}\"\n  a:for-index=\"index\"\n  a:for-item=\"option\"\n>\n  <ant-list header=\"{{option.title}}\">\n    <block\n      a:for=\"{{option.list}}\"\n      a:for-index=\"index\"\n      a:for-item=\"item\"\n    >\n      <ant-list-item>\n        <ant-checkbox\n          data-value=\"{{item.value}}\"\n          checked=\"{{utils.indexOf(customValue, item.value) > -1}}\"\n          onChange=\"handleCustomChange\"\n        >\n          {{item.title}}\n        </ant-checkbox>\n      </ant-list-item>\n    </block>\n  </ant-list>\n</block>\n#endif\n#if WECHAT\n<block\n  wx:for=\"{{customOptions}}\"\n  wx:for-index=\"index\"\n  wx:for-item=\"option\"\n>\n  <ant-list header=\"{{option.title}}\">\n    <block\n      wx:for=\"{{option.list}}\"\n      wx:for-index=\"index\"\n      wx:for-item=\"item\"\n    >\n      <ant-list-item>\n        <ant-checkbox\n          data-value=\"{{item.value}}\"\n          checked=\"{{utils.indexOf(customValue, item.value) > -1}}\"\n          bindchange=\"handleCustomChange\"\n        >{{item.title}}</ant-checkbox>\n      </ant-list-item>\n    </block>\n  </ant-list>\n</block>\n#endif\n```\n\n```js\nPage({\n  data: {\n    customOptions: [\n      {\n        title: 'Group one',\n        list: [\n          {\n            title: 'Option one',\n            value: '1',\n          },\n        ],\n      },\n      {\n        title: 'Group two',\n        list: [\n          {\n            title: 'Option two',\n            value: '2',\n          },\n        ],\n      },\n    ],\n    customValue: [],\n  },\n  handleCustomChange(checked, e) {\n    let value = this.data.customValue;\n\n#if WECHAT\n    const event = checked;\n    if (event.detail) {\n      value = value.concat(event.target.dataset.value);\n    } else {\n      value = value.filter((v) => v !== event.target.dataset.value);\n    }\n#endif\n\n#if ALIPAY\n    if (checked) {\n      value = value.concat(e.target.dataset.value);\n    } else {\n      value = value.filter((v) => v !== e.target.dataset.value);\n    }\n#endif\n\n    this.setData({ customValue: value });\n    console.log(value);\n  },\n});\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Checkbox/index'></code>\n\n## API\n\n#### Checkbox\n\n| 属性                   | 说明                    | 类型                                                                                                | 默认值 |\n| ---------------------- | ----------------------- | --------------------------------------------------------------------------------------------------- | ------ |\n| checked                | 是否选中                | boolean                                                                                             | -      |\n| className              | 类名                    | string                                                                                              | -      |\n| color                  | 选中的颜色，同 CSS 色值 | string                                                                                              | -      |\n| defaultChecked         | 默认是否选中            | boolean                                                                                             | -      |\n| disabled               | 是否禁用                | boolean                                                                                             | false  |\n| style                  | 样式                    | string                                                                                              | -      |\n| #if ALIPAY onChange    | 选中状态改变时触发回调  | (checked: boolean, event: `Event`(https://opendocs.alipay.com/mini/framework/event-object)) => void | -      |\n| #if WECHAT bindchange | 选中状态改变时触发回调  | (checked: boolean, event: `Event`(https://opendocs.alipay.com/mini/framework/event-object)) => void | -      |\n\n#### CheckboxGroup\n\n| 属性                   | 说明                                                         | 类型                                                                                                 | 默认值     |\n| ---------------------- | ------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------- | ---------- |\n| className              | 类名                                                         | string                                                                                               | -          |\n| color                  | 选中的颜色，同 CSS 色值                                      | string                                                                                               | -          |\n| defaultValue           | 默认选中的值                                                 | `string[]`                                                                                           | -          |\n| disabled               | 是否禁用                                                     | boolean                                                                                              | false      |\n| label                  | label 区插槽，接收 value（当前项可选项 item）、index（索引） | slot                                                                                                 | -          |\n| options                | 指定可选项                                                   | `{label: string; value: string; disabled: boolean}[]`                                                | -          |\n| position               | 布局，可选 `horizontal`、`vertical`                          | string                                                                                               | `vertical` |\n| style                  | 样式                                                         | string                                                                                               | -          |\n| value                  | CheckboxGroup 的值，决定子元素是否勾选                       | `string[]`                                                                                           | -          |\n| #if ALIPAY onChange    | 勾选状态变化时触发此函数                                     | (value: `string[]`, event: `Event`(https://opendocs.alipay.com/mini/framework/event-object)) => void | -          |\n| #if WECHAT bindchange | 勾选状态变化时触发此函数                                     | (value: `string[]`, event: `Event`(https://opendocs.alipay.com/mini/framework/event-object)) => void | -          |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                                | 默认值                                                                                            | 深色模式默认值                                                                                    | 备注                 |\n| ------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | -------------------- |\n| --checkbox-header-color               | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | 复选框标题颜色       |\n| --checkbox-border-color               | <div style=\"width: 150px; height: 30px; background-color: #cccccc; color: #333333;\">#cccccc</div> | <div style=\"width: 150px; height: 30px; background-color: #474747; color: #fff;\">#474747</div> | 复选框边框颜色       |\n| --checkbox-background-color           | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | 复选框背景颜色       |\n| --checkbox-disabled-background        | <div style=\"width: 150px; height: 30px; background-color: #f5f5f5; color: #333333;\">#f5f5f5</div> | <div style=\"width: 150px; height: 30px; background-color: #121212; color: #fff;\">#121212</div> | 复选框禁用背景颜色   |\n| --checkbox-text-color                 | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | 复选框文本颜色       |\n| --checkbox-fake-icon-background-color | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #fff;\">#1a1a1a</div> | 复选框假图标背景颜色 |\n"
  },
  {
    "path": "src/Checkbox/index.sjs.ts",
    "content": "function getClassName(checked, disabled) {\n  if (!checked && !disabled) {\n    return 'icon';\n  }\n  if (checked && !disabled) {\n    return 'checkedIcon';\n  }\n  if (!checked && disabled) {\n    return 'disbaledIcon';\n  }\n  if (checked && disabled) {\n    return 'disabledCheckedIcon';\n  }\n}\n\nfunction getCheckboxChecked(item, value) {\n  return (value || []).indexOf(item.value) > -1;\n}\n\nexport default { getClassName, getCheckboxChecked };\n"
  },
  {
    "path": "src/Checkbox/index.ts",
    "content": "import mixinValue from '../mixins/value';\nimport { Component, triggerEvent } from '../_util/simply';\nimport { isAilpayNative } from '../_util/support';\nimport { CheckboxDefaultProps } from './props';\n\nComponent({\n  data: {\n    isLabelSupport: true,\n  },\n  props: CheckboxDefaultProps,\n  onInit() {\n    this.setData({\n      isLabelSupport: !isAilpayNative(),\n    });\n  },\n  methods: {\n    onChange(e) {\n      const value = !this.getValue();\n      if (!this.isControlled()) {\n        this.update(value);\n      }\n      triggerEvent(this, 'change', value, e);\n    },\n  },\n  mixins: [\n    mixinValue({\n      valueKey: 'checked',\n      defaultValueKey: 'defaultChecked',\n    }),\n  ],\n});\n"
  },
  {
    "path": "src/Checkbox/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n/**\n * @description 复选框，表单组件。\n */\n\nexport interface ICheckboxProps extends IBaseProps {\n  value?: any;\n  checked: boolean;\n  defaultChecked?: boolean;\n  disabled: boolean;\n  color: string;\n  onChange?: (checked: boolean, e: any) => void;\n}\n\nexport const CheckboxDefaultProps: Partial<ICheckboxProps> = {\n  value: null,\n  checked: null,\n  defaultChecked: null,\n  disabled: false,\n  color: '',\n};\n"
  },
  {
    "path": "src/Checkbox/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n// header 颜色\n@checkbox-header-color: var(--checkbox-header-color, @COLOR_TEXT_ASSIST);\n\n/* size | 大小 */\n@checkbox-size: @icon-size-sm;\n\n/* corner-radius | 圆角 */\n@checkbox-corner-radius: @corner-radius-circle;\n\n/* border-width | 边框宽度 */\n@checkbox-border-width: @border-width-standard;\n\n/* color | 边框颜色 */\n@checkbox-border-color: var(--checkbox-border-color, @COLOR_TEXT_WEAK);\n\n/* color | check状态背景色 */\n@checkbox-background-color: var(--checkbox-background-color, @COLOR_BRAND1);\n\n/* color | disabled状态背景色 */\n@checkbox-disabled-background: var(\n  --checkbox-disabled-background,\n  @COLOR_GREY_CARD\n);\n\n// text 颜色\n@checkbox-text-color: var(--checkbox-text-color, @COLOR_TEXT_PRIMARY);\n// fake-icn 颜色\n@checkbox-fake-icon-background-color: var(\n  --checkbox-fake-icon-background-color,\n  @COLOR_CARD\n);\n"
  },
  {
    "path": "src/Checklist/ChecklistItem/index.axml",
    "content": "<view\n  class=\"ant-checklist-item\"\n  onTap=\"{{ item.disabled || item.readonly ? '' : 'onChecklistItemClick' }}\"\n  hover-class=\"{{ item.disabled || item.readonly ? '' : 'ant-checklist-item-hover' }}\"\n  hover-start-time=\"{{ 20 }}\"\n  hover-stay-time=\"{{ 40 }}\">\n  <view\n    class=\"ant-checklist-item-content {{ item.disabled ? 'ant-checklist-item-content-disabled' : '' }}\">\n    <view class=\"ant-checklist-item-content-box\">\n      <slot\n        name=\"content\"\n        item=\"{{ item }}\" />\n    </view>\n    <view\n      a:if=\"{{ checked }}\"\n      class=\"ant-checklist-item-content-icon\">\n      <slot name=\"icon\" />\n    </view>\n  </view>\n  <view class=\"ant-checklist-item-line\" />\n</view>\n"
  },
  {
    "path": "src/Checklist/ChecklistItem/index.json",
    "content": "{  \n  \"styleIsolation\": \"shared\",\n  \"component\": true\n}\n"
  },
  {
    "path": "src/Checklist/ChecklistItem/index.less",
    "content": "@import (reference) '../variable.less';\n@import (reference) '../../style/mixins/hairline.less';\n\n@checklistItemPrefix: ant-checklist-item;\n\n.@{checklistItemPrefix} {\n  background-color: @check-list-item-background-color;\n\n  &-hover {\n    background-color: @check-list-item-hover-background-color;\n  }\n\n  &-content {\n    display: flex;\n    align-items: center;\n    padding: @v-spacing-large @h-spacing-large;\n    color: @check-list-item-content-color;\n    &-disabled {\n      opacity: @opacity-disabled;\n    }\n  }\n\n  &-content-box {\n    flex: 1;\n  }\n\n  &-content-box-nut {\n    display: flex;\n    align-items: center;\n  }\n\n  &-image {\n    width: @size-9;\n    height: @size-9;\n    border-radius: @corner-radius-md;\n  }\n\n  &-text {\n    flex: 1;\n    margin-left: @h-spacing-large;\n\n    &-no-image {\n      margin-left: 0;\n    }\n\n    &-title {\n      color: @check-list-item-title-color;\n      font-size: @font-size-list;\n      line-height: 48 * @rpx;\n    }\n\n    &-description {\n      font-size: @font-size-content;\n      color: @check-list-item-description-color;\n      margin-top: 2 * @rpx;\n      line-height: 36 * @rpx;\n    }\n  }\n\n  &-checked {\n    &-disabled {\n      opacity: @opacity-disabled;\n    }\n  }\n\n  &:last-child {\n    .ant-checklist-item-line {\n      display: none;\n    }\n  }\n\n  &-line {\n    margin-left: @h-spacing-large;\n    position: relative;\n    .hairline('bottom',  @check-list-item-hover-background-color);\n  }\n}\n"
  },
  {
    "path": "src/Checklist/ChecklistItem/index.ts",
    "content": "import { Component, getValueFromProps, triggerEvent } from '../../_util/simply';\nimport { ChecklistItemDefaultProps } from './props';\n\nComponent({\n  props: ChecklistItemDefaultProps,\n  methods: {\n    onChecklistItemClick() {\n      triggerEvent(this, 'change', getValueFromProps(this, 'item'));\n    },\n  },\n});\n"
  },
  {
    "path": "src/Checklist/ChecklistItem/props.ts",
    "content": "import { IBaseProps } from '../../_util/base';\nimport { ChecklistItem } from '../props';\n\n/**\n * @description 可勾选列表单项\n */\n\nexport interface IChecklistItemProps extends IBaseProps {\n  item: ChecklistItem;\n  checked: boolean;\n  /**\n   * @description 当项选项值改变时触发\n   */\n  onChange: (item: ChecklistItem) => void;\n}\n\nexport const ChecklistItemDefaultProps: Partial<IChecklistItemProps> = {\n  item: null,\n  checked: false,\n};\n"
  },
  {
    "path": "src/Checklist/index.axml",
    "content": "<import-sjs\n  from=\"./index.sjs\"\n  name=\"utils\" />\n\n<view\n  class=\"ant-checklist {{ className || '' }}\"\n  style=\"{{ style || '' }}\">\n  <view class=\"ant-checklist-body\">\n    <block\n      a:for=\"{{ options }}\"\n      a:for-index=\"index\"\n      a:for-item=\"item\"\n      a:key=\"value\">\n      <ant-checklist-item\n        checked=\"{{ utils.getChecked(item.value, mixin.value, multiple) }}\"\n        item=\"{{ item }}\"\n        onChange=\"onChange\">\n        <view\n          slot=\"content\"\n          class=\"ant-checklist-item-content-box-nut\">\n          <!-- #if ALIPAY -->\n          <slot\n            name=\"content\"\n            item=\"{{ item }}\">\n          <!-- #endif -->\n            <image\n              a:if=\"{{ item.image }}\"\n              class=\"ant-checklist-item-image\"\n              src=\"{{ item.image }}\" />\n            <view\n              class=\"ant-checklist-item-text {{ item.image ? '' : 'ant-checklist-item-text-no-image' }}\">\n              <view\n                class=\"ant-checklist-item-text-title {{ item.disabled ? 'ant-checklist-item-text-disabled' : '' }}\">\n                {{ item.title }}\n              </view>\n              <view\n                a:if=\"{{ item.description }}\"\n                class=\"ant-checklist-item-text-description {{ item.disabled ? 'ant-checklist-item-text-disabled' : '' }}\">\n                {{ item.description }}\n              </view>\n            </view>\n          <!-- #if ALIPAY -->\n          </slot>\n          <!-- #endif -->\n        </view>\n        <view slot=\"icon\">\n          <!-- #if ALIPAY -->\n          <slot name=\"icon\">\n          <!-- #endif -->\n            <ant-icon\n              type=\"CheckOutline\"\n              className=\"ant-checklist-item-check-icon\" />\n          <!-- #if ALIPAY -->\n          </slot>\n          <!-- #endif -->\n        </view>\n      </ant-checklist-item>\n    </block>\n  </view>\n</view>\n"
  },
  {
    "path": "src/Checklist/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Information Entry\n  order: 10\ntoc: 'content'\n---\n\n# Checklist\n\nThe check operation of the list.\n\n- Select one or more in a group of list items.\n- To use a checkable list, you need to check at least one item by default to make it easier for users to understand that the list can be checked.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-checklist\": \"antd-mini/es/Checklist/index\",\n#endif\n#if WECHAT\n  \"ant-checklist\": \"antd-mini/Checklist/index\",\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<ant-checklist\n  defaultValue=\"{{[1]}}\"\n  options=\"{{options}}\"\n  data-options=\"{{options}}\"\n  onChange=\"onChange\" />\n```\n\n```js\nPage({\n  data: {\n    options: [\n      {\n        value: 1,\n        title: '可勾选列表项1',\n      },\n      {\n        value: 2,\n        title: '可勾选列表项2',\n      },\n      {\n        value: 3,\n        title: '可勾选列表项3',\n      },\n    ],\n  },\n  onChange(v, items, e) {\n    console.log('当前选中的Value为：', v, items, e);\n  },\n});\n```\n\n### Controlled and Multiple Selection\n\n> Incoming `multiple` Property supports multiple selection mode. `value` property and `onChange` Events are used together to achieve state control.\n\n```xml\n<ant-checklist\n  value=\"{{value}}\"\n  options=\"{{options}}\"\n  multiple\n  onChange=\"onChangeControlled\" />\n```\n\n```js\nPage({\n  data: {\n    value: [1, 2],\n    options: [\n      {\n        value: 1,\n        title: '可勾选列表项1',\n      },\n      {\n        value: 2,\n        title: '可勾选列表项2',\n      },\n      {\n        value: 3,\n        title: '可勾选列表项3',\n      },\n    ],\n  },\n  onChangeControlled(value) {\n#if ALIPAY\n    this.setData({ value });\n#endif\n#if WECHAT\n    this.setData({ value: value.detail[0] });\n#endif\n  },\n});\n```\n\n### Custom\n\n> You can customize the check icon and style through the slot.\n\n```xml\n<ant-checklist\n  defaultValue=\"{{[2]}}\"\n  options=\"{{options}}\"\n  multiple\n  onChange=\"onChange\">\n  <view slot=\"icon\">\n    <ant-icon\n      style=\"color: red\"\n      type=\"LikeOutline\"\n      className=\"demo-checklist-checked-icon\" />\n  </view>\n  <view\n    slot=\"content\"\n    slot-scope=\"props\">\n    title: {{props.item.title}}\n  </view>\n</ant-checklist>\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Checklist/index'></code>\n\n## API\n\n| Property                   | Description                                                 | Type                                                                                                                                                                                                             | Default Value |\n| ---------------------- | ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ |\n| className              | Class Name                                                 | string                                                                                                                                                                                                           | -      |\n| content                | CheckListItem a custom content area scope slot that receives the item parameter | slot                                                                                                                                                                                                             | -      |\n| defaultValue           | Data selected by default                                         | string \\| number \\| (string \\| number)[]                                                                                                                                                                         | -      |\n| icon                   | Customize the selected Icon slot                                 | slot                                                                                                                                                                                                             | -      |\n| multiple               | Whether multiple selection is supported                                         | boolean                                                                                                                                                                                                          | false  |\n| options                | Configure options for each column                                     | [ChecklistItem](#checklistitem)[]                                                                                                                                                                                | []     |\n| style                  | Style                                                 | string                                                                                                                                                                                                           | -      |\n| value                  | Selected data                                             | string \\| number \\| (string \\| number)[]                                                                                                                                                                         | -      |\n| #if ALIPAY onChange    | Trigger a callback when the selected item changes                           | (value: string \\| number \\| (string \\| number)[], column: [ChecklistItem](#checklistitem) \\| [ChecklistItem](#checklistitem)[], event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void |\n| #if WECHAT bindchange | Trigger a callback when the selected item changes                           | (value: string \\| number \\| (string \\| number)[], column: [ChecklistItem](#checklistitem) \\| [ChecklistItem](#checklistitem)[], event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void |\n\n### ChecklistItem\n\n| Parameters        | Description     | Type    | Default Value |\n| ----------- | -------- | ------- | ------ |\n| description | Description     | string  | -      |\n| disabled    | Disable | boolean | false  |\n| image       | Picture     | string  | -      |\n| readonly    | Read-only | boolean | false  |\n| title       | Title     | string  | -      |\n| value       | Value       | string  | -      |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For more information, see ConfigProvider Components.\n\n| Variable name                                   | Default Value                                                                                            | Dark Mode Default                                                                                    | Remarks               |\n| ---------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------ |\n| --checklist-background-color             | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | List background color       |\n| --check-list-item-background-color       | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #fff;\">#1a1a1a</div> | List Item Background Color     |\n| --check-list-item-hover-background-color | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #333333;\">#eeeeee</div> | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #fff;\">#2b2b2b</div> | List item hover background color |\n| --check-list-item-content-color          | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | List Item Content Color     |\n| --check-list-item-description-color      | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | List Item Description Color     |\n"
  },
  {
    "path": "src/Checklist/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-checklist-item\": \"./ChecklistItem/index\",\n    \"ant-icon\": \"../Icon/index\"\n  }\n}\n"
  },
  {
    "path": "src/Checklist/index.less",
    "content": "@import (reference) './variable.less';\n\n@checklistPrefix: ant-checklist;\n\n.@{checklistPrefix} {\n  &-body {\n    position: relative;\n    overflow: hidden;\n  }\n\n  &-item-check-icon {\n    font-size: @font-size-title;\n    color: @checklist-background-color;\n  }\n}\n"
  },
  {
    "path": "src/Checklist/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 数据录入\n  order: 10\ntoc: 'content'\n---\n\n# Checklist 可勾选列表\n\n列表的勾选操作。\n\n- 在一组列表项中选择一个或多个。\n- 可勾选列表的使用需要默认至少勾选一项，方便用户了解列表是可以勾选的。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-checklist\": \"antd-mini/es/Checklist/index\",\n#endif\n#if WECHAT\n  \"ant-checklist\": \"antd-mini/Checklist/index\",\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-checklist\n  defaultValue=\"{{[1]}}\"\n  options=\"{{options}}\"\n  data-options=\"{{options}}\"\n  onChange=\"onChange\" />\n```\n\n```js\nPage({\n  data: {\n    options: [\n      {\n        value: 1,\n        title: '可勾选列表项1',\n      },\n      {\n        value: 2,\n        title: '可勾选列表项2',\n      },\n      {\n        value: 3,\n        title: '可勾选列表项3',\n      },\n    ],\n  },\n  onChange(v, items, e) {\n    console.log('当前选中的值为：', v, items, e);\n  },\n});\n```\n\n### 受控和多选\n\n> 传入 `multiple` 属性支持多选模式。 `value` 属性和 `onChange` 事件配合使用实现状态受控。\n\n```xml\n<ant-checklist\n  value=\"{{value}}\"\n  options=\"{{options}}\"\n  multiple\n  onChange=\"onChangeControlled\" />\n```\n\n```js\nPage({\n  data: {\n    value: [1, 2],\n    options: [\n      {\n        value: 1,\n        title: '可勾选列表项1',\n      },\n      {\n        value: 2,\n        title: '可勾选列表项2',\n      },\n      {\n        value: 3,\n        title: '可勾选列表项3',\n      },\n    ],\n  },\n  onChangeControlled(value) {\n#if ALIPAY\n    this.setData({ value });\n#endif\n#if WECHAT\n    this.setData({ value: value.detail[0] });\n#endif\n  },\n});\n```\n\n### 自定义\n\n> 可以通过插槽，自定义勾选图标以及样式\n\n```xml\n<ant-checklist\n  defaultValue=\"{{[2]}}\"\n  options=\"{{options}}\"\n  multiple\n  onChange=\"onChange\">\n  <view slot=\"icon\">\n    <ant-icon\n      style=\"color: red\"\n      type=\"LikeOutline\"\n      className=\"demo-checklist-checked-icon\" />\n  </view>\n  <view\n    slot=\"content\"\n    slot-scope=\"props\">\n    title: {{props.item.title}}\n  </view>\n</ant-checklist>\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Checklist/index'></code>\n\n## API\n\n| 属性                   | 说明                                                 | 类型                                                                                                                                                                                                             | 默认值 |\n| ---------------------- | ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ |\n| className              | 类名                                                 | string                                                                                                                                                                                                           | -      |\n| content                | CheckListItem 自定义内容区作用域插槽，接收 item 参数 | slot                                                                                                                                                                                                             | -      |\n| defaultValue           | 默认选中数据                                         | string \\| number \\| (string \\| number)[]                                                                                                                                                                         | -      |\n| icon                   | 自定义选中 Icon 插槽                                 | slot                                                                                                                                                                                                             | -      |\n| multiple               | 是否支持多选                                         | boolean                                                                                                                                                                                                          | false  |\n| options                | 配置每一列的选项                                     | [ChecklistItem](#checklistitem)[]                                                                                                                                                                                | []     |\n| style                  | 样式                                                 | string                                                                                                                                                                                                           | -      |\n| value                  | 选中数据                                             | string \\| number \\| (string \\| number)[]                                                                                                                                                                         | -      |\n| #if ALIPAY onChange    | 选中项发生变化时，触发回调                           | (value: string \\| number \\| (string \\| number)[], column: [ChecklistItem](#checklistitem) \\| [ChecklistItem](#checklistitem)[], event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void |\n| #if WECHAT bindchange | 选中项发生变化时，触发回调                           | (value: string \\| number \\| (string \\| number)[], column: [ChecklistItem](#checklistitem) \\| [ChecklistItem](#checklistitem)[], event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void |\n\n### ChecklistItem\n\n| 参数        | 说明     | 类型    | 默认值 |\n| ----------- | -------- | ------- | ------ |\n| description | 描述     | string  | -      |\n| disabled    | 是否禁用 | boolean | false  |\n| image       | 图片     | string  | -      |\n| readonly    | 是否只读 | boolean | false  |\n| title       | 标题     | string  | -      |\n| value       | 值       | string  | -      |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                                   | 默认值                                                                                            | 深色模式默认值                                                                                    | 备注               |\n| ---------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------ |\n| --checklist-background-color             | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | 清单背景颜色       |\n| --check-list-item-background-color       | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #fff;\">#1a1a1a</div> | 清单项背景颜色     |\n| --check-list-item-hover-background-color | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #333333;\">#eeeeee</div> | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #fff;\">#2b2b2b</div> | 清单项悬停背景颜色 |\n| --check-list-item-content-color          | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | 清单项内容颜色     |\n| --check-list-item-description-color      | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | 清单项描述颜色     |\n"
  },
  {
    "path": "src/Checklist/index.sjs.ts",
    "content": "function getChecked(value, values, multiple) {\n  if (!multiple) {\n    return value === values;\n  }\n  return (values || []).indexOf(value) > -1;\n}\n\nexport default { getChecked };\n"
  },
  {
    "path": "src/Checklist/index.ts",
    "content": "import mixinValue from '../mixins/value';\nimport {\n  Component,\n  getValueFromProps,\n  triggerEventValues,\n} from '../_util/simply';\nimport { ChecklistDefaultProps } from './props';\n\nComponent({\n  props: ChecklistDefaultProps,\n  methods: {\n    onChange(item) {\n      const [multiple, options] = getValueFromProps(this, [\n        'multiple',\n        'options',\n      ]);\n      let value;\n      /// #if ALIPAY\n      value = item.value;\n      /// #endif\n      /// #if WECHAT\n      value = item.detail.value;\n      /// #endif\n      if (multiple) {\n        let currentValue = this.getValue();\n        if (currentValue.indexOf(value) > -1) {\n          currentValue = currentValue.filter((v) => v !== value);\n        } else {\n          currentValue = [...currentValue, value];\n        }\n        if (!this.isControlled()) {\n          this.update(currentValue);\n        }\n        triggerEventValues(this, 'change', [\n          currentValue,\n          options.filter((v) => currentValue.indexOf(v.value) > -1),\n        ]);\n      } else {\n        if (!this.isControlled()) {\n          this.update(value);\n        }\n        triggerEventValues(this, 'change', [\n          value,\n          options.find((v) => v.value === value),\n        ]);\n      }\n    },\n  },\n\n  mixins: [\n    mixinValue({\n      transformValue(val) {\n        const value = val || [];\n        return {\n          needUpdate: true,\n          value,\n        };\n      },\n    }),\n  ],\n});\n"
  },
  {
    "path": "src/Checklist/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\n/**\n * @description 可勾选列表\n */\n\nexport interface ChecklistItem {\n  /**\n   * @description 可勾选项的描述文案\n   */\n  description?: string;\n\n  /**\n   * @description 可勾选项的图片地址\n   */\n  image?: string;\n\n  /**\n   * @description 可勾选项的标题文案\n   */\n  title: string;\n\n  /**\n   * @description 可勾选项的值\n   */\n  value: string | number;\n\n  disabled?: boolean;\n  readonly?: boolean;\n}\n\nexport interface IChecklistProps extends IBaseProps {\n  /**\n   * @description 默认值\n   */\n  value: Array<string | number> | string | number;\n  /**\n   * @description 默认值\n   */\n  defaultValue: Array<string | number> | string | number;\n\n  /**\n   * @description 是否支持多选\n   * @default false\n   */\n  multiple: boolean;\n\n  /**\n   * @description 可勾选列表数据配置选项内容\n   */\n  options: Array<ChecklistItem>;\n\n  /**\n   * @description 可勾选列表值改变时触发\n   */\n  onChange: (\n    v: Array<string | number> | string | number,\n    item: ChecklistItem | Array<ChecklistItem>,\n    e: Record<string, any>\n  ) => void;\n}\n\nexport const ChecklistDefaultProps: Partial<IChecklistProps> = {\n  value: null,\n  defaultValue: null,\n  options: [],\n  multiple: false,\n};\n"
  },
  {
    "path": "src/Checklist/variable.less",
    "content": "@import (reference) '../style/themes/index.less';\n@import (reference) '../style/variables.less';\n\n/* check-list */\n/* background-color | 背景色 */\n@checklist-background-color: var(--checklist-background-color, @COLOR_BRAND1);\n\n@check-list-item-title-color: var(--check-list-item-title-color, @COLOR_TEXT_PRIMARY);\n\n/* check-list-item */\n/* background-color | 背景色 */\n@check-list-item-background-color: var(\n  --check-list-item-background-color,\n  @COLOR_CARD\n);\n\n@check-list-item-hover-background-color: var(\n  --check-list-item-hover-background-color,\n  @COLOR_BORDER\n);\n\n/* text-color | 字体颜色  */\n@check-list-item-content-color: var(\n  --check-list-item-content-color,\n  @COLOR_TEXT_PRIMARY\n);\n\n/* text-color | 字体颜色  */\n@check-list-item-description-color: var(\n  --check-list-item-description-color,\n  @COLOR_TEXT_ASSIST\n);\n"
  },
  {
    "path": "src/Collapse/index.axml",
    "content": "<import-sjs\n  from=\"./index.sjs\"\n  name=\"utils\" />\n\n<view\n  class=\"ant-collapse {{ className ? className : '' }}\"\n  style=\"{{ style }}\">\n  <block\n    a:for=\"{{ items }}\"\n    a:for-index=\"index\"\n    a:for-item=\"item\"\n    a:key=\"title\">\n    <view\n      class=\"ant-collapse-item {{ item.className || '' }} {{ utils.isActive(mixin.value, index, item.disabled) ? 'ant-collapse-item-active' : '' }} {{ item.disabled ? 'ant-collapse-item-disabled' : '' }}\">\n      <view\n        class=\"ant-collapse-item-title\"\n        data-active=\"{{ utils.isActive(mixin.value, index, item.disabled) }}\"\n        data-index=\"{{ index }}\"\n        data-id=\"{{ $id }}\"\n        onTap=\"onChange\">\n        <view class=\"ant-collapse-item-line\">\n          <view class=\"ant-collapse-item-title-node\">\n            <!-- #if ALIPAY -->\n            <slot\n              name=\"title\"\n              value=\"{{ item }}\"\n              index=\"{{ index }}\"\n              current=\"{{ mixin.value }}\">\n            <!-- #endif -->\n              {{ item.title }}\n            <!-- #if ALIPAY -->\n            </slot>\n            <!-- #endif -->\n          </view>\n          <view class=\"ant-collapse-item-brief-container\">\n            <view class=\"ant-collapse-item-brief-node\">\n              <!-- #if ALIPAY -->\n              <slot\n                name=\"brief\"\n                value=\"{{ item }}\"\n                index=\"{{ index }}\"\n                current=\"{{ mixin.value }}\">\n              <!-- #endif -->\n                {{ brief }}\n              <!-- #if ALIPAY -->\n              </slot>\n              <!-- #endif -->\n            </view>\n\n            <view class=\"ant-collapse-item-title-arrow\">\n              <!-- #if ALIPAY -->\n              <slot\n                name=\"icon\"\n                value=\"{{ item }}\"\n                index=\"{{ index }}\"\n                current=\"{{ mixin.value }}\">\n              <!-- #endif -->\n                <ant-icon\n                  type=\"{{ utils.isActive(mixin.value, index, item.disabled) ? 'UpOutline' : 'DownOutline' }}\" />\n              <!-- #if ALIPAY -->\n              </slot>\n              <!-- #endif -->\n            </view>\n          </view>\n        </view>\n      </view>\n      <view\n        class=\"ant-collapse-item-content-wrap {{ hasChange ? 'ant-collapse-item-content-wrap-transition' : '' }} ant-collapse-item-content-wrap{{ $id ? '-' + $id : '' }}-{{ index }}\"\n        onTransitionEnd=\"resetContentHeight\"\n        style=\"{{ utils.getStyleHeight(index, contentHeight, item.disabled) }}\"\n        data-index=\"{{ index }}\">\n        <view class=\"ant-collapse-item-content-container\">\n          <view\n            class=\"ant-collapse-item-content ant-collapse-item-content{{ $id ? '-' + $id : '' }}-{{ index }}\">\n            <!-- #if ALIPAY -->\n            <slot\n              name=\"content\"\n              value=\"{{ item }}\"\n              index=\"{{ index }}\"\n              current=\"{{ mixin.value }}\">\n            <!-- #endif -->\n              {{ item.content }}\n            <!-- #if ALIPAY -->\n            </slot>\n            <!-- #endif -->\n          </view>\n        </view>\n      </view>\n    </view>\n  </block>\n</view>\n"
  },
  {
    "path": "src/Collapse/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Information Display\n  order: 8\ntoc: 'content'\n---\n\n# Collapse\n\nA content area that can be collapsed/expanded.\n\n- Group and hide complex areas to keep the page tidy.\n- An accordion is a special type of folding panel that allows only a single content area to expand.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-collapse\": \"antd-mini/es/Collapse/index\"\n#endif\n#if WECHAT\n  \"ant-collapse\": \"antd-mini/Collapse/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Demo Code\n\n```xml\n<ant-collapse\n  items=\"{{items}}\"\n#if ALIPAY\n  onChange=\"onChange\"\n#endif\n#if WECHAT\n  bindchange=\"onChange\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    items: [\n      {\n        title: 'item1 title',\n        content: 'item1 content',\n      },\n      {\n        title: 'item2 title',\n        content: 'item2 content',\n      },\n      {\n        title: 'item3 title',\n        content: 'item3 content',\n      },\n    ],\n  },\n  onChange(current) {\n    console.log(current);\n  },\n});\n```\n\n### Accordion mode\n\n```xml\n<ant-collapse\n  accordion=\"{{true}}\"\n  items=\"{{items}}\"\n#if ALIPAY\n  onChange=\"onChange\"\n#endif\n#if WECHAT\n  bindchange=\"onChange\"\n#endif\n/>\n```\n\n### List Item Control\n\n```xml\n<ant-button\n  inline=\"{{true}}\"\n#if ALIPAY\n  onTap=\"addItems\"\n#endif\n#if WECHAT\n  bindtap=\"addItems\"\n#endif\n>\n  Add items\n</ant-button>\n\n<ant-collapse\n  items=\"{{items}}\"\n/>\n```\n\n```js\nPage({\n  data: {\n    items: [\n      {\n        title: 'item1 title',\n        content: 'item1 content',\n      },\n      {\n        title: 'item2 title',\n        content: 'item2 content',\n      },\n      {\n        title: 'item3 title',\n        content: 'item3 content',\n      },\n    ],\n  },\n  addItems() {\n    const items = [\n      ...this.data.items,\n      {\n        title: this.data.items.length,\n        content: 'dynamic item content',\n      },\n    ];\n    this.setData({\n      items,\n      current: [this.data.items.length],\n    });\n  },\n});\n```\n\n### With Checkbox\n\n```xml\n#if ALIPAY\n<ant-collapse items=\"{{items}}\">\n  <view\n    slot=\"title\"\n    slot-scope=\"item\"\n    class=\"title\"\n  >\n    <view>\n      <ant-checkbox\n        data-index=\"{{item.index}}\"\n        onChange=\"onChange\"\n      />\n    </view>\n    <view>{{item.value.title}}</view>\n  </view>\n\n  <view\n    slot=\"content\"\n    slot-scope=\"item\"\n    class=\"content\">\n    {{item.value.content}}\n  </view>\n</ant-collapse>\n\n#endif\n#if WECHAT\n由于微信小程序平台的限制, Collapse In微信暂时不支持 Slot\n#endif\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Collapse/index'></code>\n\n## API\n\n| Property                   | Description                               | Type                                                                                             | Default Value |\n| ---------------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------ | ------ |\n| accordion              | Accordion mode, only one content is expanded | boolean                                                                                          | false  |\n| className              | Class Name                               | string                                                                                           | -      |\n| content                | Content area slot, receiving value, index      | slot                                                                                             | -      |\n| current                | Current expanded index                     | number[]                                                                                         | -      |\n| defaultCurrent         | Default index for current expansion                 | number[]                                                                                         | []     |\n| items                  | Collapse Panel List                       | [CollapseItem](#collapseitem)[]                                                                  | []     |\n| style                  | Style                               | string                                                                                           | -      |\n| title                  | Header slot, receiving value, index        | slot                                                                                             | -      |\n| #if ALIPAY onChange    | Toggle Panel Callback                     | (current: number[], e: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void |\n| #if WECHAT bindchange | Toggle Panel Callback                     | (current: number[], e: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void |\n\n### CollapseItem\n\n| Property      | Description     | Type    | Default Value |\n| --------- | -------- | ------- | ------ |\n| content   | Content     | string  | -      |\n| disabled  | Disable | boolean | false  |\n| title     | Title     | string  | -      |\n| className | Class Name     | string  | -      |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For more information, see ConfigProvider Components.\n| Variable name | Default Value | Dark Mode Default | Remarks |\n| ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | -------------------- | -------------------- |\n| --collapse-title-background-color | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #fff;\">#1a1a1a</div> | Collapse Panel Title Background Color |\n| --collapse-title-color | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | Collapse Panel Title Color |\n| --collapse-title-icon-color | <div style=\"width: 150px; height: 30px; background-color: #cccccc; color: #ffffff;\">#cccccc</div> | <div style=\"width: 150px; height: 30px; background-color: #474747; color: #ffffff;\">#474747</div> | Collapse Panel Title Icon Color |\n| --collapse-content-background-color | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #fff;\">#1a1a1a</div> | Collapse Panel Content Background Color |\n| --collapse-border-color | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #333333;\">#eeeeee</div> | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #fff;\">#2b2b2b</div> | Collapse Panel Border Color |\n| --collapse-node-text-color | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | Collapse Panel Node Text Color |\n| --collapse-container-background-color | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #fff;\">#1a1a1a</div> | Folding panel container background color |\n"
  },
  {
    "path": "src/Collapse/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-icon\": \"../Icon/index\"\n  }\n}\n"
  },
  {
    "path": "src/Collapse/index.less",
    "content": "@import (reference) './variable.less';\n@import '../style/mixins/hairline.less';\n\n@collapsePrefix: ant-collapse-item;\n\n.@{collapsePrefix} {\n  &-disabled {\n    .ant-collapse-item-title-node,\n    .ant-collapse-item-brief-container {\n      opacity: 0.4;\n    }\n    .@{collapsePrefix}-title:active {\n      background: @collapse-title-background-color;\n      transition: 0s;\n    }\n  }\n  &-line {\n    display: flex;\n    flex: 1;\n    border-bottom: 1px solid @collapse-border-color;\n    padding: @collapse-title-padding;\n  }\n  &-title {\n    position: relative;\n    display: flex;\n    text-align: justify;\n    align-items: center;\n    justify-content: space-between;\n    line-height: 48 * @rpx;\n    font-size: @collapse-title-size;\n    color: @collapse-title-color;\n    background-color: @collapse-title-background-color;\n    transition: all 300ms linear;\n    box-sizing: border-box;\n    &-node {\n      display: flex;\n      flex: 1;\n      max-width: 100%;\n      font-size: 34 * @rpx;\n      color: @collapse-title-color;\n    }\n    &-arrow {\n      color: @collapse-title-icon-color;\n    }\n\n    &:active {\n      background-color: @collapse-border-color;\n      transition: 0s;\n    }\n  }\n\n  &-brief {\n    &-container {\n      display: flex;\n      .ant-icon {\n        font-size: 40 * @rpx;\n      }\n    }\n\n    &-node {\n      display: flex;\n      flex: 1;\n      font-size: 30 * @rpx;\n      color: @collapse-node-text-color;\n      margin-right: 8 * @rpx;\n    }\n  }\n\n  &-content {\n    color: @collapse-title-color;\n    border-bottom: 1px solid @collapse-border-color;\n    box-sizing: border-box;\n    padding: 24 * @rpx;\n    &-container {\n      background: @collapse-container-background-color;\n    }\n    &-wrap {\n      will-change: height;\n      overflow: hidden;\n\n      &-active {\n        animation: trigger1 0.2s;\n      }\n\n      &-non-active {\n        animation: trigger2 0.2s;\n      }\n\n      &-transition {\n        transition: height 0.2s ease-in-out;\n      }\n\n      &-first {\n        height: 0;\n      }\n    }\n  }\n}\n\n@keyframes trigger1 {\n  0% {\n    content: '';\n  }\n\n  100% {\n    content: '';\n  }\n}\n\n@keyframes trigger2 {\n  0% {\n    content: '';\n  }\n\n  100% {\n    content: '';\n  }\n}\n"
  },
  {
    "path": "src/Collapse/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 数据展示\n  order: 8\ntoc: 'content'\n---\n\n# Collapse 折叠面板\n\n可以折叠/展开的内容区域。\n\n- 对复杂区域进行分组和隐藏，保持页面的整洁。\n- 手风琴是一种特殊的折叠面板，只允许单个内容区域展开。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-collapse\": \"antd-mini/es/Collapse/index\"\n#endif\n#if WECHAT\n  \"ant-collapse\": \"antd-mini/Collapse/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### Demo 代码\n\n```xml\n<ant-collapse\n  items=\"{{items}}\"\n#if ALIPAY\n  onChange=\"onChange\"\n#endif\n#if WECHAT\n  bindchange=\"onChange\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    items: [\n      {\n        title: 'item1 title',\n        content: 'item1 content',\n      },\n      {\n        title: 'item2 title',\n        content: 'item2 content',\n      },\n      {\n        title: 'item3 title',\n        content: 'item3 content',\n      },\n    ],\n  },\n  onChange(current) {\n    console.log(current);\n  },\n});\n```\n\n### 手风琴模式\n\n```xml\n<ant-collapse\n  accordion=\"{{true}}\"\n  items=\"{{items}}\"\n#if ALIPAY\n  onChange=\"onChange\"\n#endif\n#if WECHAT\n  bindchange=\"onChange\"\n#endif\n/>\n```\n\n### 列表项控制\n\n```xml\n<ant-button\n  inline=\"{{true}}\"\n#if ALIPAY\n  onTap=\"addItems\"\n#endif\n#if WECHAT\n  bindtap=\"addItems\"\n#endif\n>\n  添加items\n</ant-button>\n\n<ant-collapse\n  items=\"{{items}}\"\n/>\n```\n\n```js\nPage({\n  data: {\n    items: [\n      {\n        title: 'item1 title',\n        content: 'item1 content',\n      },\n      {\n        title: 'item2 title',\n        content: 'item2 content',\n      },\n      {\n        title: 'item3 title',\n        content: 'item3 content',\n      },\n    ],\n  },\n  addItems() {\n    const items = [\n      ...this.data.items,\n      {\n        title: this.data.items.length,\n        content: 'dynamic item content',\n      },\n    ];\n    this.setData({\n      items,\n      current: [this.data.items.length],\n    });\n  },\n});\n```\n\n### 带 Checkbox\n\n```xml\n#if ALIPAY\n<ant-collapse items=\"{{items}}\">\n  <view\n    slot=\"title\"\n    slot-scope=\"item\"\n    class=\"title\"\n  >\n    <view>\n      <ant-checkbox\n        data-index=\"{{item.index}}\"\n        onChange=\"onChange\"\n      />\n    </view>\n    <view>{{item.value.title}}</view>\n  </view>\n\n  <view\n    slot=\"content\"\n    slot-scope=\"item\"\n    class=\"content\">\n    {{item.value.content}}\n  </view>\n</ant-collapse>\n\n#endif\n#if WECHAT\n由于微信小程序平台的限制, Collapse 在微信暂时不支持 Slot\n#endif\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Collapse/index'></code>\n\n## API\n\n| 属性                   | 说明                               | 类型                                                                                             | 默认值 |\n| ---------------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------ | ------ |\n| accordion              | 是否是手风琴模式，仅一个内容被展开 | boolean                                                                                          | false  |\n| className              | 类名                               | string                                                                                           | -      |\n| content                | 内容区插槽，接收 value、index      | slot                                                                                             | -      |\n| current                | 当前展开的索引                     | number[]                                                                                         | -      |\n| defaultCurrent         | 当前展开的默认索引                 | number[]                                                                                         | []     |\n| items                  | 折叠面板列表                       | [CollapseItem](#collapseitem)[]                                                                  | []     |\n| style                  | 样式                               | string                                                                                           | -      |\n| title                  | 标题插槽，接收 value、index        | slot                                                                                             | -      |\n| #if ALIPAY onChange    | 切换面板的回调                     | (current: number[], e: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void |\n| #if WECHAT bindchange | 切换面板的回调                     | (current: number[], e: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void |\n\n### CollapseItem\n\n| 属性      | 说明     | 类型    | 默认值 |\n| --------- | -------- | ------- | ------ |\n| content   | 内容     | string  | -      |\n| disabled  | 是否禁用 | boolean | false  |\n| title     | 标题     | string  | -      |\n| className | 类名     | string  | -      |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n| 变量名 | 默认值 | 深色模式默认值 | 备注 |\n| ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | -------------------- | -------------------- |\n| --collapse-title-background-color | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #fff;\">#1a1a1a</div> | 折叠面板标题背景颜色 |\n| --collapse-title-color | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | 折叠面板标题颜色 |\n| --collapse-title-icon-color | <div style=\"width: 150px; height: 30px; background-color: #cccccc; color: #ffffff;\">#cccccc</div> | <div style=\"width: 150px; height: 30px; background-color: #474747; color: #ffffff;\">#474747</div> | 折叠面板标题图标颜色 |\n| --collapse-content-background-color | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #fff;\">#1a1a1a</div> | 折叠面板内容背景颜色 |\n| --collapse-border-color | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #333333;\">#eeeeee</div> | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #fff;\">#2b2b2b</div> | 折叠面板边框颜色 |\n| --collapse-node-text-color | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | 折叠面板节点文本颜色 |\n| --collapse-container-background-color | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #fff;\">#1a1a1a</div> | 折叠面板容器背景颜色 |\n"
  },
  {
    "path": "src/Collapse/index.sjs.ts",
    "content": "function isActive(current, index, disabled) {\n  if (disabled) {\n    return false;\n  }\n  return (current || []).indexOf(index) >= 0;\n}\n\nfunction getStyleHeight(index, contentHeight, disabled) {\n  if (disabled) {\n    return 'height: 0px';\n  }\n  const height = contentHeight[index];\n  if (height === '') {\n    return '';\n  }\n  if (height) {\n    return `height: ${height}`;\n  }\n  return 'height: 0px';\n}\n\n\nexport default { isActive, getStyleHeight };\n"
  },
  {
    "path": "src/Collapse/index.ts",
    "content": "import createValue from '../mixins/value';\nimport { getInstanceBoundingClientRect } from '../_util/jsapi/get-instance-bounding-client-rect';\nimport { Component, getValueFromProps, triggerEvent } from '../_util/simply';\nimport { CollapseDefaultProps } from './props';\n\nComponent({\n  props: CollapseDefaultProps,\n  data: {\n    contentHeight: [],\n    hasChange: false,\n  },\n  methods: {\n    getInstance() {\n      if (this.$id) {\n        return my;\n      }\n      return this;\n    },\n    async getBoundingClientRectWithBuilder(builder: (id: string) => string) {\n      return await getInstanceBoundingClientRect(\n        this.getInstance(),\n        builder(this.$id ? `-${this.$id}` : '')\n      );\n    },\n    formatCurrent(val: number[], props) {\n      let current = [...(val || [])];\n      const items = props.items;\n      current = current.filter((item) => {\n        if (!items[item] || items[item].disabled) {\n          return false;\n        }\n        return true;\n      });\n      if (props.accordion) {\n        current = current.length > 0 ? [current[0]] : [];\n      }\n      return [...current];\n    },\n    onChange(e) {\n      const itemIndex = parseInt(e.currentTarget.dataset.index, 10);\n      const [items, accordion] = getValueFromProps(this, [\n        'items',\n        'accordion',\n      ]);\n      if (items[itemIndex] && items[itemIndex].disabled) {\n        return;\n      }\n      const arr = this.getValue();\n      let current = [...arr];\n      const index = current.indexOf(itemIndex);\n      if (index >= 0) {\n        current.splice(index, 1);\n      } else {\n        if (accordion) {\n          current = [itemIndex];\n        } else {\n          current.push(itemIndex);\n          current.sort();\n        }\n      }\n      if (!this.isControlled()) {\n        this.update(current);\n      }\n      triggerEvent(this, 'change', current, e);\n    },\n    async updateContentHeight(prevCurrent: number[], nextCurrent: number[]) {\n      const prevCurrentArray = prevCurrent;\n      const nextCurrentArray = nextCurrent;\n      const expandArray = [];\n      const closeArray = [];\n      nextCurrentArray.forEach((item) => {\n        if (prevCurrentArray.indexOf(item) < 0) {\n          expandArray.push(item);\n        }\n      });\n      prevCurrentArray.forEach((item) => {\n        if (nextCurrentArray.indexOf(item) < 0) {\n          closeArray.push(item);\n        }\n      });\n      const items = getValueFromProps(this, 'items');\n      let contentHeight = await Promise.all(\n        items.map(async (item, index) => {\n          if (\n            expandArray.indexOf(index) >= 0 ||\n            closeArray.indexOf(index) >= 0\n          ) {\n            const { height } = await this.getBoundingClientRectWithBuilder(\n              (id) => `.ant-collapse-item-content${id}-${index}`\n            );\n            return `${height}px`;\n          }\n          return this.data.contentHeight[index];\n        })\n      );\n      if (closeArray.length === 0) {\n        this.setData({\n          contentHeight,\n        });\n      } else {\n        this.setData({\n          contentHeight,\n        });\n        setTimeout(() => {\n          contentHeight = contentHeight.map((item, index) => {\n            if (closeArray.indexOf(index) >= 0) {\n              return '0px';\n            }\n            return item;\n          });\n          this.setData({\n            contentHeight,\n          });\n        }, 10);\n      }\n    },\n    resetContentHeight(e) {\n      const index = parseInt(e.currentTarget.dataset.index, 10);\n      if (this.getValue().indexOf(index) < 0) {\n        return;\n      }\n      const contentHeight = [...this.data.contentHeight];\n      contentHeight[index] = '';\n      this.setData({\n        contentHeight,\n      });\n    },\n  },\n\n  mixins: [\n    createValue({\n      valueKey: 'current',\n      defaultValueKey: 'defaultCurrent',\n      transformValue(current, extra) {\n        const value = this.formatCurrent(\n          current,\n          extra ? extra.nextProps : getValueFromProps(this)\n        );\n        return {\n          needUpdate: true,\n          value,\n        };\n      },\n    }),\n  ],\n\n  /// #if ALIPAY\n  didUpdate(prevProps, prevData) {\n    console.log(\n      prevProps.items !== this.props.items,\n      !this.isEqualValue(prevData)\n    );\n    if (prevProps.items !== this.props.items || !this.isEqualValue(prevData)) {\n      this.updateContentHeight(this.getValue(prevData), this.getValue());\n    }\n  },\n  didMount() {\n    const current = this.getValue();\n    const contentHeight = this.props.items.map((item, index) => {\n      if (current.indexOf(index) >= 0) {\n        return '';\n      }\n      return '0px';\n    });\n    this.setData({\n      hasChange: true,\n      contentHeight,\n    });\n  },\n  /// #endif\n\n  /// #if WECHAT\n  observers: {\n    '**': function (data) {\n      const prevData = this._prevData || this.data;\n      this._prevData = { ...data };\n      if (prevData.items !== data.items || !this.isEqualValue(prevData)) {\n        this.updateContentHeight(this.getValue(prevData), this.getValue());\n      }\n    },\n  },\n\n  attached() {\n    const current = this.getValue();\n    const contentHeight = this.properties.items.map((item, index) => {\n      if (current.indexOf(index) >= 0) {\n        return '';\n      }\n      return '0px';\n    });\n    this.setData({\n      hasChange: true,\n      contentHeight,\n    });\n\n    this._prevData = this.data;\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/Collapse/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\n/**\n * @description 手风琴\n */\nexport interface ICollapseProps extends IBaseProps {\n  /**\n   * @description 是否是手风琴模式，仅一个内容被展开\n   */\n\n  /**\n   * @description 选中\n   */\n  current?: number[];\n\n  /**\n   * @description 选中初始值\n   */\n  defaultCurrent?: number[];\n\n  /**\n   * @description accordion模式\n   */\n  accordion?: boolean;\n\n  /**\n   * @description 列表\n   */\n  items?: {\n    title?: string;\n    content?: string;\n    disabled?: boolean;\n    className?: string;\n  }[];\n\n  /**\n   * @description collapse 切换时的回调\n   */\n\n  onChange?: (current: number[] | undefined, e: Record<string, any>) => void;\n}\n\nexport const CollapseDefaultProps: ICollapseProps = {\n  current: null,\n  defaultCurrent: [],\n  accordion: false,\n  items: [],\n};\n"
  },
  {
    "path": "src/Collapse/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n// 每一项的高度\n@collapse-title-height: 96 * @rpx;\n// 左右边距\n@collapse-title-padding: @h-spacing-large;\n// 背景色\n@collapse-title-background-color: var(\n  --collapse-title-background-color,\n  @COLOR_CARD\n);\n// 字体颜色\n@collapse-title-color: var(--collapse-title-color, @COLOR_TEXT_PRIMARY);\n// 字体大小\n@collapse-title-size: @font-size-list;\n// 箭头大小\n@collapse-title-icon-size: 36 * @rpx;\n// 箭头颜色\n@collapse-title-icon-color: var(--collapse-title-icon-color, @COLOR_TEXT_WEAK);\n// 内容背景色\n@collapse-content-background-color: var(\n  --collapse-content-background-color,\n  @COLOR_CARD\n);\n\n// border色\n@collapse-border-color: var(--collapse-border-color, @COLOR_BORDER);\n// node字体颜色\n@collapse-node-text-color: var(--collapse-node-text-color, @COLOR_TEXT_ASSIST);\n\n// container背景颜色\n@collapse-container-background-color: var(\n  --collapse-container-background-color,\n  @COLOR_WHITE_CHANGE\n);\n"
  },
  {
    "path": "src/ConfigProvider/darkTheme.ts",
    "content": "export const cssVariables = {\n  // primary\n  'color-brand1': '#3086ff',\n  'color-border-faded': 'rgba(48, 134, 255, 0.9)',\n  'color-brand2': '#0a0a0a',\n  // secondary\n  'color-link': '#3f5980',\n  'color-wathet': '#0d2543',\n  'color-orange': '#e65a2b',\n  'color-yellow': '#ffa930',\n  'color-green': '#34b368',\n  'color-red': '#ff4a58',\n\n  // neutral\n  'color-text-primary': '#c5cad1',\n  'color-text-secondary': '#808080',\n  'color-text-assist': '#616161',\n  'color-text-weak': '#474747',\n  'color-text-weak-faded': 'rgba(71, 71, 71, 0.6)',\n  'color-border': '#2b2b2b',\n  'color-border-greycard': '#444444',\n  'color-background2': '#121212',\n  'color-background': '#121212',\n  'color-card': '#1a1a1a',\n  'color-card2': '#222222',\n  'color-white-card': '#2b2b2b',\n  'color-grey-card': '#2b2b2b',\n  'color-black-card': '#525252',\n  'color_text_secondary': '#808080',\n\n  // reverse\n  'color-white': '#ffffff',\n  'color-black': '#000000',\n  'color-black-fade': 'rgba(0, 0, 0, 1)',\n  'color-white-dynamic': '#c5cad1',\n  'color-white-change': '#000000',\n  'color-black-change': '#ffffff',\n\n  // 以下没在颜色系统中\n  'color-golden-2': '#fff3d9',\n  'color-golden-3': '#fff9ed',\n\n  'color-tangerine-1': '#ff6010',\n  'color-tangerine-2': '#ffece3',\n  'color-grey-2': '#444444',\n  'color-text-warning': '#ff3b30',\n  'color-orange-1': '#ff8f1f',\n  'color-orange-2': '#ffefdf',\n  'color-pomonagreen-1': '#00b578',\n  'color-pomonagree-2': '#d4fff1',\n\n  // radius\n  'size-radius-xs': '8rpx',\n  'size-radius-s': '16rpx',\n  'size-radius-m': '24rpx',\n  'size-radius-l': '32rpx',\n  'size-radius-xl': '40rpx',\n  'size-radius-xxl': '48rpx',\n\n  // space\n  'size-space-page-margin': '16rpx',\n  'size-space1': '4rpx',\n\n  // opacity\n  'opacity-press': '0.08',\n  'opacity-disabled': '0.4',\n  'opacity-mask': '0.55',\n  'opacity-module': '0.9',\n\n  // font-size\n  'size-font1': '22rpx',\n  'size-font2': '24rpx',\n  'size-font3': '26rpx',\n  'size-font4': '28rpx',\n  'size-font5': '30rpx',\n  'size-font6': '32rpx',\n  'size-font7': '34rpx',\n  'size-font8': '36rpx',\n  'size-font9': '40rpx',\n  'size-font10': '48rpx',\n  'size-font11': '56rpx',\n  'size-font12': '64rpx',\n\n  // popoverList\n  'popover-content-bg': 'rgba(255, 255, 255, 0.45)',\n  'popover-content-color': '#c5cad1',\n\n  // button\n  'button-disabled-opacity': '0.4',\n  'button-color': '#ff4040',\n  'button-background-color': '#000000',\n  'button-border-color': '#0a0a0a',\n  'button-primary-border-color': '#3086ff',\n  'button-primary-background-color': '#000000',\n  'button-primary-color': '#ffffff',\n  'button-primary-aide-border-color': '#0d2543',\n  'button-primary-aide-color': '#3086ff',\n  'button-default-aide-border-color': '#121212',\n  'button-default-aide-background-color': '#000000',\n  'button-default-aide-color': '#c5cad1',\n  'button-primary-danger-background-color': '#ff4a58',\n  'button-primary-danger-border-color': '#ff4a58',\n  'button-primary-danger-color': '#ffffff',\n  'button-default-danger-background-color': '#ffffff',\n  'button-default-danger-border-color': '#ff4a58',\n  'button-default-danger-color': '#ff4a58',\n  'button-text-danger-color': '#ff4a58',\n  'button-danger-default-color': '#ff4a58',\n  'button-active-bg': 'rgba(255, 255, 255, 0.08)',\n\n  // actionsheet\n  'actionsheet-danger-color': '#ff4a58',\n  'actionsheet-title-color': '#616161',\n  'actionsheet-item-color': '#c5cad1',\n  'actionsheet-item-active-bg': '#2b2b2b',\n  'activesheet-item-cancel-bg': '#121212',\n\n  // icon\n  'icon-color': '#c5cad1',\n\n  // tabbar\n  'tabbar-bg': '#1a1a1a',\n  'tabbar-item-color': '#808080',\n  'tabbar-active-color': '#3086ff',\n\n  // tabs\n  'tabs-basic-color': '#c5cad1',\n  'tabs-weaken-color': '#616161',\n  'tabs-inverse-color': '#1a1a1a',\n  'tabs-active-color': '#3086ff',\n  'tabs-active-decorate-color': '#3086ff',\n  'tabs-underline-border-color': '#2b2b2b',\n  'tabs-plus-color': '#000000',\n  'tabs-capsule-title-bg': '#121212',\n  'tabs-subtitle-color': '#ffffff',\n  'tabs-count-color': '#474747',\n  'tabs-badge-size': '28rpx',\n\n  // feedBack\n  'feedback-text-color': '#c5cad1',\n  'feedback-background-color': 'rgba(216, 216, 216, 0.42)',\n  'feedback-mask-color': 'rgba(0, 0, 0, 0.25)',\n  'feedback-content-background-color': '#ffffff',\n  'feedback-list-background-color': '#121212',\n  'feedback-list-text-color': '#c5cad1',\n\n  // calendar\n  'calendar-cell-disabled-opacity': '0.4',\n  'calendar-weekday-names-bg': '#f8f8f8',\n  'calendar-default-color': '#c5cad1',\n  'calendar-selected-color': 'rgba(22, 119, 255, 0.1)',\n  'calendar-assist-color': '#616161',\n  'calendar-selected-end-color': '#ffffff',\n\n  // collapse\n  'collapse-title-background-color': '#1a1a1a',\n  'collapse-title-color': '#c5cad1',\n  'collapse-title-icon-color': '#474747',\n  'collapse-content-background-color': '#1a1a1a',\n  'collapse-border-color': '#2b2b2b',\n  'collapse-node-text-color': '#616161',\n  'collapse-container-background-color': '#000000',\n\n  // container\n  'container-header-color': '#c5cad1',\n  'container-background-color': '#1a1a1a',\n\n  // divider\n  'divider-text-color': '#c5cad1',\n  'divider-border-color': '#444444',\n\n  // empty\n  'empty-text-color': '#c5cad1',\n  'empty-asisst-text-color': '#616161',\n\n  // grid\n  'ant-grid-title-color': '#c5cad1',\n  'ant-grid-description-color': '#616161',\n  'ant-grid-border-color': '#2b2b2b',\n\n  // guide-tour\n  'guide-tour-text-color': '#ffffff',\n  'guide-tour-clear-color': '#616161',\n  'guide-tour-dot-color': '#616161',\n  'guide-tour-border-color': '#2b2b2b',\n  'guide-tour-btn-color': '#c5cad1',\n\n  // indexbar\n  'index-bar-tip-background-color': '#474747',\n  'index-bar-text-color': '#ffffff',\n  'index-bar-assist-color': '#616161',\n  'index-bar-active-color': '#3086ff',\n\n  // input\n  'input-item-color': '#c5cad1',\n  'input-item-placeholder-color': '#474747',\n  'input-item-clear-color': '#616161',\n  'input-background-color': '#1a1a1a',\n\n  // list\n  'list-header-color': '#616161',\n  'list-footer-color': '#616161',\n  'list-background-color': '#1a1a1a',\n  'list-content-color': '#c5cad1',\n  'list-extra-brief-color': '#616161',\n  'list-item-border-color': '#2b2b2b',\n  'list-item-text-color': '#474747',\n\n  // progress\n  'progress-stroke-color': '#3086ff',\n  'progress-trail-color': '#121212',\n  'progress-success-color': '#34b368',\n  'progress-indicator-color': '#c5cad1',\n  'progress-exception-color': '#ff4a58',\n  'progress-assist-color': '#616161',\n\n  // steps\n  'steps-non-active-bg': '#444444',\n  'steps-title-color': '#c5cad1',\n  'steps-desc-color': '#616161',\n  'steps-default-bg': '#3086ff',\n  'steps-finish-bg': '#ff4a58',\n\n  // swipe-action\n  'swipe-action-color': '#ffffff',\n\n  // tag\n  'tag-primary-color': '#3086ff',\n  'tag-warning-color': '#e65a2b',\n  'tag-danger-color': '#ff4a58',\n  'tag-success-color': '#34b368',\n  'tag-primary-light-color': '#0d2543',\n  'tag-warning-light-color': '#ffefdf',\n  'tag-danger-light-color': '#ffece3',\n  'tag-success-light-color': '#d4fff1',\n  'tag-base-color': '#ffffff',\n  'tag-primary-color-faded': 'rgba(22, 119, 255, 0.3)',\n  'tag-warning-color-faded': 'rgba(255, 100, 48, 0.7)',\n  'tag-danger-color-faded': 'rgba(255, 49, 65, 0.7)',\n  'tag-success-color-faded': 'rgba(34, 179, 94, 0.7)',\n\n  // checkbox\n  'checkbox-header-color': '#616161',\n  'checkbox-border-color': '#474747',\n  'checkbox-background-color': '#3086ff',\n  'checkbox-disabled-background': '#121212',\n  'checkbox-text-color': '#c5cad1',\n  'checkbox-fake-icon-background-color': '#1a1a1a',\n\n  // checkboxList\n  'checklist-background-color': '#3086ff',\n  'check-list-item-background-color': '#1a1a1a',\n  'check-list-item-hover-background-color': '#2b2b2b',\n  'check-list-item-content-color': '#c5cad1',\n  'check-list-item-description-color': '#616161',\n\n  // data-picker\n  'range-picker-shadow-color': '#000000',\n  'range-picker-item-color': '#c5cad1',\n  'range-picker-active-color': '#3086ff',\n  'range-picker-placeholder-color': '#474747',\n  'range-picker-shadow-color-faded': 'rgba(0, 0, 0, 0.9)',\n\n  // form\n  'form-text-color': '#474747',\n  'form-item-color': '#808080',\n  'form-item-bg': '#1a1a1a',\n  'form-error-color': '#ff4a58',\n  'form-extra-color': '#616161',\n  'form-asterisk-color': '#ff3b30',\n\n  // imageUpload\n  'image-upload-wrapper-background': '#121212',\n  'image-upload-cover-background': 'rgba(0, 0, 0, 0.4)',\n  'image-upload-text-color': '#ffffff',\n  'image-upload-background-color': '#1a1a1a',\n\n  // loading\n  'loading-text-color': '#454955', //铁黑\n  'loading-icon-light-color': '#999',\n\n  // mask\n  'mask-background-color': 'rgba(0, 0, 0, 0.55)',\n\n  // numberKeyboard\n  'number-key-board-active-background-color': '#d3d3d3',\n  'number-key-board-text-color': '#c5cad1',\n  'number-key-board-none-text-color': '#616161',\n  'number-key-board-iphonex-safe-background-color': '#1a1a1a',\n  'number-key-board-background-color': '#121212',\n  'number-key-board-border-color': '#2b2b2b',\n  'number-key-board-transfer-color': '#3086ff',\n\n  // picker\n  'picker-item-color': '#c5cad1',\n  'picker-header-action-color': '#3086ff',\n  'picker-placeholder-color': '#474747',\n  'picker-header-color': '#2b2b2b',\n  'picker-content-background-color': '#1a1a1a',\n  'picker-mask-bg-faded-95': 'rgba(255, 255, 255, 0.05)',\n  'picker-mask-bg-faded-60': 'rgba(255, 255, 255, 0.4)',\n\n  // radio\n  'radio-header-color': '#616161',\n  'radio-border-color': '#474747',\n  'radio-background-color': '#3086ff',\n  'radio-disabled-background': '#121212',\n  'radio-text-color': '#c5cad1',\n  'radio-fake-icon-background-color': '#1a1a1a',\n  'radio-icon-color': '#ffffff',\n\n  // popoverList\n  'popover-list-content-bg': 'rgba(0, 0, 0, 0.93)',\n  'popover-list-content-color': '#c5cad1',\n  'popover-list-badge-color': '#ff411c',\n\n  // rare-words\n  'rare-words-bg': 'rgba(0, 0, 0, 0.45)',\n  'rare-keyboard-bg': '#4a4a4a',\n  'rare-words-keyboard-color': '#c5cad1',\n  'rare-words-border-color': '#2b2b2b',\n  'rare-words-kb-bg': '#121212',\n  'rare-words-pinyin-key-color': '#ffffff',\n  'rare-words-inner-bg': '#474747',\n  'rare-words-active-color': '#3086ff',\n  'rare-words-pinyin-color': '#121212',\n  'rare-words-keyboard-bg': '#4a4a4a',\n  'rare-words-item-tips-color': '#808080',\n\n  // selector\n  'selector-background-color': '#1a1a1a',\n  'selector-item-background': '#121212',\n  'selector-item-active-background': '#0d2543',\n  'selector-item-color': '#c5cad1',\n  'selector-item-sub-color': '#616161',\n\n  // slide\n  'slide-block-shadow': 'rgba(0, 0, 0, 0.12)',\n  'slider-default-primary-color': '#3086ff',\n  'slider-track-bg': '#1a1a1a',\n  'slider-fill-bg': '#121212',\n  'slider-number-color': '#c5cad1',\n  'slide-block-bg': '#ffffff',\n  'slide-back-bg': '#121212',\n\n  // stepper\n  'stepper-handler-tap-bg': '#ddd',\n  'stepper-handler-border-color': '#444444',\n  'stepper-border-color': '#444444',\n  'stepper-background-color': '#ffffff',\n  'stepper-hover-bg': 'rgba(0, 0, 0, 0.92)',\n\n  // switch\n  'switch-fill': '#3086ff',\n  'switch-border-color': '#2b2b2b',\n  'switch-loading-color': '#3086ff',\n  'switch-handle-bg': '#ffffff',\n  'switch-inner-color': '#616161',\n\n  // modal\n  'modal-background-color': '#1a1a1a',\n  'modal-title-color': '#c5cad1',\n  'modal-content-color': '#c5cad1',\n  'modal-close-text-color': '#616161',\n\n  // popover\n  'color-background-popover': '#404040', //popover默认底色\n  'popover-bg': '#1a1a1a',\n  'popover-text-color': '#000000',\n  'popover-inner-color': '#ff4a58',\n\n  // popup\n  'popup-background': '#1a1a1a',\n  'popup-color': '#c5cad1',\n  'popup-assit-color': '#616161',\n  'popup-mask-close-bg': 'rgba(0, 0, 0, 1)',\n\n  // rate\n  'rate-active-icon': '#ffa930',\n  'rate-icon-color': '#2b2b2b',\n\n  // result\n  'result-main-background': '#1a1a1a',\n  'result-title-color': '#000000',\n  'result-desc-color': '#c5cad1',\n  'result-success-color': '#3086ff',\n  'result-error-color': '#ff3b30',\n  'result-warning-color': '#ff8f1f',\n  'result-wait-color': '#00b578',\n\n  // skeleton\n  'skeleton-animation-25': '#2b2b2b',\n  'skeleton-animation-37': 'rgba(204, 204, 204, 0.6)',\n  'skeleton-animation-63': '#2b2b2b',\n\n  // toast\n  'toast-default-bg': 'rgba(0, 0, 0, 0.75)',\n  'toast-default-color': '#ffffff',\n  // badge\n  'badge-text-color': '#ffffff',\n  'badge-background-color': '#ff4a58',\n\n  // notice-bar\n  'notice-background-color': '#fff9ed',\n  'notice-border-color': '#fff3d9',\n  'notice-color': '#ff6010',\n  'notice-error-border-color': '#fff3d9',\n  'notice-error-color': '#ffffff',\n  'notice-error-background-color': '#ff4a58',\n  'notice-primary-border-color': 'rgba(22, 119, 255, 0.72)',\n  'notice-primary-color': '#3086ff',\n  'notice-primary-background-color': 'rgba(208, 228, 255, 1)',\n  'notice-info-text-color': '#ffffff',\n  'notice-info-background-color': '#808080',\n\n  // page-container\n  'page-container-background-color': '#121212',\n\n  // typography\n  'typography-container-color': '#c5cad1',\n\n  // table\n  'table-item-color': '#c5cad1',\n  'table-item-bg': '#1a1a1a',\n  'table-shadow-color': 'rgba(5, 5, 5, 0.06)',\n  'table-empty-bg': '#c5cad1',\n\n  // sticky\n  'sticky-check-bg': 'rgba(238, 238, 238, 0)',\n};\n"
  },
  {
    "path": "src/ConfigProvider/index.axml",
    "content": "<view class=\"ant-config-provider {{className || ''}}\" style=\"{{cssVarStyle || ''}}\">\n  <slot />\n</view>\n"
  },
  {
    "path": "src/ConfigProvider/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Other\n  order: 16\ntoc: 'content'\n---\n\n# ConfigProvider\n\nFor global configuration Ant Design Mini components, provide theme customization, internationalization support.\n\ncan pass `ConfigProvider` component to globally configure Ant Design Mini components, including:\n\n- Setting the theme globally,[CSS Variables](https://developer.mozilla.org/zh-CN/docs/Web/CSS/Using_CSS_custom_properties) To organize styles, by overwriting these CSS variables, you can customize the theme, dynamically switch the theme and other effects;\n- Global settings internationalization, through the setting of Locales to achieve multi-language support;\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-config-provider\": \"antd-mini/es/ConfigProvider/index\"\n#endif\n#if WECHAT\n  \"ant-config-provider\": \"antd-mini/ConfigProvider/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Theme customization\n\n#### Override via CSS\n\nYou can override these CSS variables directly in the code, and the style of the Button component will change accordingly:\n\n#### Covered by ConfigProvider\n\nConfigProvider components provide the ability to override CSS variables, you need to wrap a ConfigProvider component in the root node and configure some theme variables through the theme property.\n\n### Internationalization\n\nAntd-Mini provides ConfigProvider components for global configuration of internationalized copy. Currently supports the following 18 languages, does not support RTL capability;\n\n- 简体中文 | zh-CN\n- 繁体中文（中国台湾） | zh-TW\n- 繁体中文（中国香港） | zh-HK\n- 阿拉伯语（沙特阿拉伯 ）| ar-SA\n- 英语（美式） | en-US\n- 朝鲜语（韩国）| ko-KR\n- 德语（德国）| de-DE\n- 俄语（俄罗斯）| ru-RU\n- 法语（法国）| fr-FR\n- 西班牙语（西班牙）| es-ES\n- 意大利语（意大利）| it-IT\n- 马来语（马来西亚）| ms-MY\n- Indonesian | in-ID\n- 泰语（泰国）| th-TH\n- 葡萄牙语（巴西）| pt-BR\n- 日语（日本）| ja-JP\n- Turkish (Turkey) | tr-TR\n- Vietnamese | vi-VN\n\n### Code Sample\n\n<code src='../../demo/pages/ConfigProvider/index'></code>\n\n### Add Language Pack\n\nIf you can't find the language pack you need, you are welcome to create a new language pack based on the English language pack and send us a Pull Request.\n\n## API\n\nThe following is `ConfigProvider` Parameter list for the component:\n\n| Property      | Description         | Type                     | Default Value  |\n| --------- | ------------ | ------------------------ | ------- |\n| theme     | Set Theme     | `light｜dark`            | `light` |\n| themeVars | Provide Subject Variables | `Record<string, string>` | `-`     |\n| locale    | Set up a multi-language package | `BaseLang`               | `zhCN`  |\n"
  },
  {
    "path": "src/ConfigProvider/index.json",
    "content": "{  \n  \"styleIsolation\": \"shared\",\n  \"component\": true\n}\n"
  },
  {
    "path": "src/ConfigProvider/index.less",
    "content": "@import (reference) './variable.less';\n@import '../style/mixins/hairline.less';\n\n@containerPrefix: ant-container;\n\n.@{containerPrefix} {\n  border-radius: @container-radius;\n  margin-bottom: 24 * @rpx;\n}\n\n.ant-config-provider {\n  margin-top: 24px;\n}\n"
  },
  {
    "path": "src/ConfigProvider/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 实验性\n  order: 16\ntoc: 'content'\n---\n\n# ConfigProvider 全局容器\n\n用于全局配置 Ant Design Mini 组件，提供主题定制，国际化支持。\n\n可以通过 `ConfigProvider` 组件来全局配置 Ant Design Mini 组件，包括：\n\n- 全局设置主题，通过[CSS 变量](https://developer.mozilla.org/zh-CN/docs/Web/CSS/Using_CSS_custom_properties) 来组织样式，通过覆盖这些 CSS 变量，可以实现定制主题、动态切换主题等效果；\n- 全局设置国际化，通过设置 Locales 来实现多语言支持；\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-config-provider\": \"antd-mini/es/ConfigProvider/index\"\n#endif\n#if WECHAT\n  \"ant-config-provider\": \"antd-mini/ConfigProvider/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 主题定制\n\n#### 通过 CSS 覆盖\n\n你可以直接在代码中覆盖这些 CSS 变量，Button 组件的样式会随之发生改变：\n\n#### 通过 ConfigProvider 覆盖\n\nConfigProvider 组件提供了覆盖 CSS 变量的能力，你需要在根节点包裹一个 ConfigProvider 组件，并通过 theme 属性来配置一些主题变量。\n\n### 国际化\n\nAntd-Mini 提供了 ConfigProvider 组件用于全局配置国际化文案。目前支持以下 18 种语言，暂不支持 RTL 能力；\n\n- 简体中文 | zh-CN\n- 繁体中文（中国台湾） | zh-TW\n- 繁体中文（中国香港） | zh-HK\n- 阿拉伯语（沙特阿拉伯 ）| ar-SA\n- 英语（美式） | en-US\n- 朝鲜语（韩国）| ko-KR\n- 德语（德国）| de-DE\n- 俄语（俄罗斯）| ru-RU\n- 法语（法国）| fr-FR\n- 西班牙语（西班牙）| es-ES\n- 意大利语（意大利）| it-IT\n- 马来语（马来西亚）| ms-MY\n- 印尼语 ｜ in-ID\n- 泰语（泰国）| th-TH\n- 葡萄牙语（巴西）| pt-BR\n- 日语（日本）| ja-JP\n- 土耳其语（土耳其）｜ tr-TR\n- 越南语｜ vi-VN\n\n### 代码示例\n\n<code src='../../demo/pages/ConfigProvider/index'></code>\n\n### 增加语言包\n\n如果你找不到你需要的语言包，欢迎你在 英文语言包 的基础上创建一个新的语言包，并给我们发一个 Pull Request。\n\n## API\n\n以下是 `ConfigProvider` 组件的参数列表：\n\n| 属性      | 说明         | 类型                     | 默认值  |\n| --------- | ------------ | ------------------------ | ------- |\n| theme     | 设置主题     | `light｜dark`            | `light` |\n| themeVars | 提供主题变量 | `Record<string, string>` | `-`     |\n| locale    | 设置多语言包 | `BaseLang`               | `zhCN`  |\n"
  },
  {
    "path": "src/ConfigProvider/index.ts",
    "content": "import { effect } from '@preact/signals-core';\nimport kebabCase from 'lodash.kebabcase';\nimport {\n  ComponentWithSignalStoreImpl,\n  getValueFromProps,\n} from '../_util/simply';\nimport i18nController from '../_util/store';\nimport { cssVariables } from './darkTheme';\nimport { ConfigProviderDefaultProps } from './props';\n\nComponentWithSignalStoreImpl({\n  storeOptions: {\n    store: () => i18nController,\n    updateHook: effect,\n    mapState: {\n      localeState: ({ store }) => store.currentLocale.value,\n      themeState: ({ store }) => store.currentTheme.value,\n    },\n  },\n  props: ConfigProviderDefaultProps,\n  data: {\n    cssVarStyle: '',\n  },\n  methods: {\n    update() {\n      const [theme, themeVars, locale] = getValueFromProps(this, [\n        'theme',\n        'themeVars',\n        'locale',\n      ]);\n      // 初始化读取locale并更新store数据\n      i18nController.switchLocale(locale);\n      // 如果设置了主题，则切换主题，覆写themeVars\n      if (theme) {\n        i18nController.switchTheme(theme);\n      }\n      this.convertThemeVarsToCSSVars(themeVars);\n    },\n    /**\n     * 主题生成 css vars\n     * 如果写死深色主题，则覆盖掉原来的颜色\n     * @param themeVars\n     * @returns\n     */\n    convertThemeVarsToCSSVars(themeVars: Record<string, string | number>) {\n      let cssVars = '';\n      let copyThemeVars = {};\n      if (this.data.themeState === 'dark') {\n        copyThemeVars = { ...cssVariables, ...themeVars };\n      }\n      if (this.data.themeState === 'light') {\n        copyThemeVars = { ...themeVars };\n      }\n      Object.keys(copyThemeVars).forEach((key) => {\n        cssVars = `${cssVars}--${kebabCase(key)}: ${copyThemeVars[key]};`;\n      });\n      this.setData({\n        cssVarStyle: cssVars,\n      });\n    },\n  },\n  /// #if ALIPAY\n  onInit() {\n    this.update();\n  },\n  /// #endif\n  /// #if WECHAT\n  attached() {\n    this.update();\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/ConfigProvider/props.ts",
    "content": "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Locale } from '../_locale/index';\nimport zhCN from '../_locale/zh-CN';\nimport { IBaseProps } from '../_util/base';\n/**\n * @description 全局配置\n */\n\nexport interface IConfigProviderProps extends IBaseProps {\n  /**\n   * @description 类名\n   */\n  className?: string;\n  /**\n   * @description 样式\n   */\n  style?: string;\n  /**\n   * @description 主题\n   */\n  theme?: 'dark' | 'light';\n  /**\n   * @description 主题定制\n   */\n  themeVars?: Record<string, string | number>;\n  /**\n   * @description 国际化文案\n   */\n  locale?: Locale;\n}\n\nexport const ConfigProviderDefaultProps: IConfigProviderProps = {\n  className: '',\n  style: '',\n  theme: 'light',\n  themeVars: {},\n  locale: zhCN,\n};\n"
  },
  {
    "path": "src/ConfigProvider/variable.less",
    "content": "@import (reference) '../style/themes/index.less';\n\n// 字体颜色\n@container-header-color: @COLOR_TEXT_PRIMARY;\n// 字体大小\n@container-header-size: 32 * @rpx;\n// 边距\n@container-spacing: @h-spacing-large;\n// 圆角\n@container-radius: @corner-radius-lg;\n// 背景\n@container-background-color: @COLOR_CARD;\n"
  },
  {
    "path": "src/Container/index.axml",
    "content": "<view\n  class=\"ant-container {{ headerInBox ? 'ant-container-headerInBox' : 'ant-container-headerNotInBox' }} {{ className ? className : '' }}\"\n  style=\"{{ style }}\">\n  <view class=\"ant-container-header\">\n    <view class=\"ant-container-header-title\">\n      <!-- #if WECHAT -->\n      <!-- display: inline -->\n      <text wx:if=\"{{ title }}\">{{ title }}</text>\n      <slot\n        wx:else\n        name=\"title\" />\n      <!-- #endif -->\n      <!-- #if ALIPAY -->\n      <slot name=\"title\">{{ title }}</slot>\n      <!-- #endif -->\n    </view>\n    <view class=\"ant-container-header-right\">\n      <slot name=\"headerRight\" />\n    </view>\n  </view>\n  <view class=\"ant-container-content\">\n    <slot />\n  </view>\n</view>\n"
  },
  {
    "path": "src/Container/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: To Discard\n  order: 99\ntoc: 'content'\n---\n\n# Container\n\nNot recommended, this component will be obsolete. recommend use [Card](/components/card) Components with the latest design specifications and richer functionality.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-container\": \"antd-mini/es/Container/index\"\n#endif\n#if WECHAT\n  \"ant-container\": \"antd-mini/Container/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<ant-container title=\"Title\">\n  <view class=\"content\" />\n</ant-container>\n```\n\n### Custom Title\n\n```xml\n<ant-container headerInBox=\"{{false}}\">\n  <view slot=\"title\">\n    <view class=\"icon\">\n      <ant-icon\n        type=\"SmileOutline\"\n        style=\"margin-right: 8px\" />\n      Title\n    </view>\n  </view>\n  <view slot=\"headerRight\">Right Content</view>\n  <view class=\"content\" />\n</ant-container>\n```\n\n###\n\n### Demo Code\n\n<code src='../../demo/pages/Container/index'></code>\n\n## API\n\nThe following is `Container` Parameter list for the component:\n\n| Property        | Description             | Type         | Default Value |\n| ----------- | ---------------- | ------------ | ------ |\n| className   | Class Name             | string       | -      |\n| headerRight | Contents on the right side of the head     | slot         | -      |\n| headerInBox | Whether the title is in the container | boolean      | true   |\n| style       | Style             | string       | -      |\n| title       | Title             | string\\|slot | -      |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                        | Default Value                                                                                            | Dark Mode Default                                                                                    | Remarks         |\n| ----------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------ |\n| --container-header-color      | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | Container head color |\n| --container-color-text-assist | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | Secondary Text Color |\n| --container-background-color  | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #fff;\">#1a1a1a</div> | Container background color |\n"
  },
  {
    "path": "src/Container/index.json",
    "content": "{  \n  \"styleIsolation\": \"shared\",\n  \"component\": true\n}\n"
  },
  {
    "path": "src/Container/index.less",
    "content": "@import (reference) './variable.less';\n@import '../style/mixins/hairline.less';\n\n@containerPrefix: ant-container;\n\n.@{containerPrefix} {\n  border-radius: @container-radius;\n  margin-bottom: 24 * @rpx;\n  &-headerInBox {\n    background-color: @container-background-color;\n    .@{containerPrefix}-header {\n      padding: 0 @container-spacing;\n      .@{containerPrefix}-header-title,\n      .@{containerPrefix}-header-right {\n        position: relative;\n        .hairline('bottom');\n      }\n    }\n  }\n  &-content {\n    padding: @container-spacing;\n    background-color: @container-background-color;\n    border-radius: @container-radius;\n    color: @container-header-color;\n  }\n  &-header {\n    display: flex;\n    &-title {\n      font-size: @container-header-size;\n      font-weight: bold;\n      color: @container-header-color;\n      display: flex;\n      align-items: center;\n      height: 96 * @rpx;\n      flex: 1;\n      &:empty {\n        display: none;\n      }\n    }\n\n    &-right {\n      color: @container-header-right-color;\n      display: flex;\n      align-items: center;\n      height: 96 * @rpx;\n      justify-content: flex-end;\n      &:empty {\n        display: none;\n      }\n    }\n    .@{containerPrefix}-header-title:empty\n      + .@{containerPrefix}-header-right:not(:empty) {\n      flex: 1;\n    }\n  }\n}\n"
  },
  {
    "path": "src/Container/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 待废弃\n  order: 99\ntoc: 'content'\n---\n\n# Container 容器\n\n不建议使用，此组件即将废弃。推荐使用 [Card](/components/card) 组件，拥有最新设计规范和更丰富功能。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-container\": \"antd-mini/es/Container/index\"\n#endif\n#if WECHAT\n  \"ant-container\": \"antd-mini/Container/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-container title=\"标题\">\n  <view class=\"content\" />\n</ant-container>\n```\n\n### 自定义标题\n\n```xml\n<ant-container headerInBox=\"{{false}}\">\n  <view slot=\"title\">\n    <view class=\"icon\">\n      <ant-icon\n        type=\"SmileOutline\"\n        style=\"margin-right: 8px\" />\n      标题\n    </view>\n  </view>\n  <view slot=\"headerRight\">右侧内容</view>\n  <view class=\"content\" />\n</ant-container>\n```\n\n###\n\n### Demo 代码\n\n<code src='../../demo/pages/Container/index'></code>\n\n## API\n\n以下是 `Container` 组件的参数列表：\n\n| 属性        | 说明             | 类型         | 默认值 |\n| ----------- | ---------------- | ------------ | ------ |\n| className   | 类名             | string       | -      |\n| headerRight | 头部右侧内容     | slot         | -      |\n| headerInBox | 标题是否在容器中 | boolean      | true   |\n| style       | 样式             | string       | -      |\n| title       | 标题             | string\\|slot | -      |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                        | 默认值                                                                                            | 深色模式默认值                                                                                    | 备注         |\n| ----------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------ |\n| --container-header-color      | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | 容器头部颜色 |\n| --container-color-text-assist | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | 辅助文本颜色 |\n| --container-background-color  | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #fff;\">#1a1a1a</div> | 容器背景颜色 |\n"
  },
  {
    "path": "src/Container/index.ts",
    "content": "import { ContainerDefaultProps } from './props';\nimport '../_util/assert-component2';\n\nComponent({\n  /// #if WECHAT\n  properties: {\n    title: {\n      type: String,\n    },\n    className: {\n      type: String,\n    },\n    style: {\n      type: String,\n    },\n    headerInBox: {\n      value: true,\n      type: Boolean,\n    },\n  },\n  options: {\n    //@ts-ignore\n    multipleSlots: true,\n    styleIsolation: 'shared',\n  },\n  /// #endif\n\n  props: ContainerDefaultProps,\n});\n"
  },
  {
    "path": "src/Container/props.ts",
    "content": "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { IBaseProps, IconType } from '../_util/base';\n/**\n * @description 容器，依据最佳实践统一了元素的间距、圆角，并可根据具体情况选择使用 title 内容。\n */\n\nexport interface IContainerProps extends IBaseProps {\n  /**\n   * @description 标题\n   */\n  title?: string;\n  /**\n   * @description 标题是否在容器内\n   * @default true\n   */\n  headerInBox?: boolean;\n  /**\n   * @description 类名\n   */\n  className?: string;\n  /**\n   * @description 样式\n   */\n  style?: string;\n}\n\nexport const ContainerDefaultProps: IContainerProps = {\n  headerInBox: true,\n};\n"
  },
  {
    "path": "src/Container/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n// 字体颜色\n@container-header-color: var(--container-header-color, @COLOR_TEXT_PRIMARY);\n// 字体颜色\n@container-header-right-color: var(\n  --container-color-text-assist,\n  @COLOR_TEXT_ASSIST\n);\n// 字体大小\n@container-header-size: 32 * @rpx;\n// 边距\n@container-spacing: @h-spacing-large;\n// 圆角\n@container-radius: @corner-radius-lg;\n// 背景\n@container-background-color: var(--container-background-color, @COLOR_CARD);\n"
  },
  {
    "path": "src/Countdown/index.axml",
    "content": "<view class=\"ant-countdown {{className}}\">\n  <text class=\"ant-countdown-time-prefix ant-countdown-time\"><slot name=\"prefix\"></slot></text>\n  <!-- #if ALIPAY -->\n  <slot day=\"{{countdownDay}}\" hour=\"{{countdownHour}}\" min=\"{{countdownMin}}\" sec=\"{{countdownSec}}\">\n  <!-- #endif -->\n    <block  a:if=\"{{ countdownType === 'day' && showDay }}\">\n      <text class=\"ant-countdown-time-num\"><text class=\"ant-countdown-time\">{{countdownDay}}</text></text>\n      <text class=\"ant-countdown-time-day ant-countdown-time\">天</text>\n    </block>\n    <text class=\"ant-countdown-time-num\"><text class=\"ant-countdown-time\">{{countdownHour}}</text></text>\n    <text class=\"ant-countdown-time-colon\">：</text>\n    <text class=\"ant-countdown-time-num\"><text class=\"ant-countdown-time\">{{countdownMin}}</text></text>\n    <text class=\"ant-countdown-time-colon\">：</text>\n    <text class=\"ant-countdown-time-num\"><text class=\"ant-countdown-time\">{{countdownSec}}</text></text>\n  <!-- #if ALIPAY -->\n  </slot>\n  <!-- #endif -->\n  <text class=\"ant-countdown-time-suffix ant-countdown-time\"><slot name=\"suffix\"></slot></text>\n</view>\n"
  },
  {
    "path": "src/Countdown/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Bizness Components\n  order: 15\ntoc: content\n---\n\n# Countdown\n\nNeed to show the countdown scene.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-countdown\": \"antd-mini/es/Countdown/index\"\n#endif\n#if WECHAT\n  \"ant-countdown\": \"antd-mini/Countdown/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<ant-countdown\n  countdownEndTime=\"{{countdownDay}}\"\n  countdownType=\"day\"\n#if ALIPAY\n  onCountdownChange=\"handleCountdownChange\"\n  onCountdownFinish=\"handleCountdownEnd\"\n#endif\n#if WECHAT\n  bindcountdownchange=\"handleCountdownChange\"\n  bindcountdownfinish=\"handleCountdownEnd\"\n#endif\n>\n  <text slot=\"prefix\">Remaining Time</text>\n  <text slot=\"suffix\">I started buying it.</text>\n</ant-countdown>\n```\n\n```js\nPage({\n  data: {\n    countdownDay: +new Date() + 500000000,\n  },\n  handleCountdownChange(e) {\n    console.log('倒计时变化', JSON.stringify(e));\n  },\n  handleCountdownEnd() {\n    console.log('倒计时结束');\n  },\n});\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Countdown/index'></code>\n\n## Property\n\n| Property                            | Description                                 | Type                | Default Value     |\n| ------------------------------- | ------------------------------------ | ------------------- | ---------- |\n| className                       | Container className                       | `string`            | -          |\n| countdownEndTime                | End timestamp                           | `string`\\| `number` | -          |\n| countdownStartTime              | Start timestamp                           | `string`\\| `number` | Current timestamp |\n| time                            | Choose one from the countdownEndTime, in seconds | `number`            | 0          |\n| autoShowDay                     | Less than one day automatically does not show days                 | `boolean`           | true       |\n| countdownType                   | Extra-long countdown requires display days               | `string`            | -          |\n| #if ALIPAY onCountdownChange    | Callback when the countdown changes                   | `Function`          | -          |\n| #if ALIPAY onCountdownFinish    | Countdown End Callback                       | `Function`          | -          |\n| #if WECHAT bindcountdownchange | Callback when the countdown changes                   | `Function`          | -          |\n| #if WECHAT bindcountdownfinish | Countdown End Callback                       | `Function`          | -          |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                       | Default Value                                                                                            | Dark Mode Default                                                                                    | Remarks               |\n| ---------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------ |\n| --ant-countdown-color        | <div style=\"width: 150px; height: 30px; background-color: #666666; color: #ffffff;\">#666666</div> | <div style=\"width: 150px; height: 30px; background-color: #808080; color: #ffffff;\">#808080</div> | Countdown Color         |\n| --ant-countdown-number-color | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #666666;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #000000; color: #ffffff;\">#000000</div> | Countdown Digital Color     |\n| --ant-countdown-number-bg    | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | Countdown digital background color |\n\n## Slot\n\n| Name   | Description       |\n| ------ | ---------- |\n| -      | Default Slot   |\n| prefix | Countdown Head |\n| suffix | Countdown Tail |\n"
  },
  {
    "path": "src/Countdown/index.json",
    "content": "{  \n  \"styleIsolation\": \"shared\",\n  \"component\": true\n}\n"
  },
  {
    "path": "src/Countdown/index.less",
    "content": "@import (reference) './variable.less';\n\n@countdownPrefix: ant-countdown;\n\n.@{countdownPrefix} {\n  font-size: 26 * @rpx;\n  line-height: 37 * @rpx;\n  color: @ant-countdown-color;\n  display: inline-flex;\n  align-items: center;\n  &-time {\n    // 对视觉稿完美还原，需要加这个\n    transform: translateY(1 * @rpx);\n    &-prefix {\n      padding-right: 2 * @rpx;\n    }\n    &-day {\n    }\n    &-colon {\n      // 为了还原视觉稿这里使用的是中文冒号，还需要一些微调\n      margin-right: -18 * @rpx;\n      margin-left: -3 * @rpx;\n      transform: translateY(1 * @rpx);\n    }\n    &-num {\n      box-sizing: border-box;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      min-width: 40 * @rpx;\n      padding: 0 4 * @rpx;\n      height: 40 * @rpx;\n      margin: 0 6 * @rpx;\n      border-radius: 6 * @rpx;\n      font-size: 26 * @rpx;\n      line-height: 37 * @rpx;\n      color: @ant-countdown-number-color;\n      letter-spacing: 0;\n      background-color: @ant-countdown-number-bg;\n    }\n  }\n}\n\n@keyframes ds-countdown {\n  0% { content: \"9\"; }\n  10% { content: \"8\"; }\n  20% { content: \"7\"; }\n  30% { content: \"6\"; }\n  40% { content: \"5\"; }\n  50% { content: \"4\"; }\n  60% { content: \"3\"; }\n  70% { content: \"2\"; }\n  80% { content: \"1\"; }\n  90% { content: \"0\"; }\n  100% { content: \"9\"; }\n}\n\n.ds-countdown::after {\n  display: inline-block;\n  animation: ds-countdown 1s infinite;\n  content: \"9\";\n}\n"
  },
  {
    "path": "src/Countdown/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 业务组件\n  order: 15\ntoc: content\n---\n\n# Countdown 倒计时\n\n需要展示倒计时的场景。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-countdown\": \"antd-mini/es/Countdown/index\"\n#endif\n#if WECHAT\n  \"ant-countdown\": \"antd-mini/Countdown/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-countdown\n  countdownEndTime=\"{{countdownDay}}\"\n  countdownType=\"day\"\n#if ALIPAY\n  onCountdownChange=\"handleCountdownChange\"\n  onCountdownFinish=\"handleCountdownEnd\"\n#endif\n#if WECHAT\n  bindcountdownchange=\"handleCountdownChange\"\n  bindcountdownfinish=\"handleCountdownEnd\"\n#endif\n>\n  <text slot=\"prefix\">剩余时间</text>\n  <text slot=\"suffix\">就开始抢购啦</text>\n</ant-countdown>\n```\n\n```js\nPage({\n  data: {\n    countdownDay: +new Date() + 500000000,\n  },\n  handleCountdownChange(e) {\n    console.log('倒计时变化', JSON.stringify(e));\n  },\n  handleCountdownEnd() {\n    console.log('倒计时结束');\n  },\n});\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Countdown/index'></code>\n\n## 属性\n\n| 属性                            | 说明                                 | 类型                | 默认值     |\n| ------------------------------- | ------------------------------------ | ------------------- | ---------- |\n| className                       | 容器 className                       | `string`            | -          |\n| countdownEndTime                | 结束时间戳                           | `string`\\| `number` | -          |\n| countdownStartTime              | 起始时间戳                           | `string`\\| `number` | 当前时间戳 |\n| time                            | 与 countdownEndTime 二选一，单位为秒 | `number`            | 0          |\n| autoShowDay                     | 小于一天自动不展示天                 | `boolean`           | true       |\n| countdownType                   | 超长倒计时需要展示天数               | `string`            | -          |\n| #if ALIPAY onCountdownChange    | 倒计时变化时的回调                   | `Function`          | -          |\n| #if ALIPAY onCountdownFinish    | 倒计时结束回调                       | `Function`          | -          |\n| #if WECHAT bindcountdownchange | 倒计时变化时的回调                   | `Function`          | -          |\n| #if WECHAT bindcountdownfinish | 倒计时结束回调                       | `Function`          | -          |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                       | 默认值                                                                                            | 深色模式默认值                                                                                    | 备注               |\n| ---------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------ |\n| --ant-countdown-color        | <div style=\"width: 150px; height: 30px; background-color: #666666; color: #ffffff;\">#666666</div> | <div style=\"width: 150px; height: 30px; background-color: #808080; color: #ffffff;\">#808080</div> | 倒计时颜色         |\n| --ant-countdown-number-color | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #666666;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #000000; color: #ffffff;\">#000000</div> | 倒计时数字颜色     |\n| --ant-countdown-number-bg    | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | 倒计时数字背景颜色 |\n\n## 插槽\n\n| 名称   | 说明       |\n| ------ | ---------- |\n| -      | 默认插槽   |\n| prefix | 倒计时头部 |\n| suffix | 倒计时尾部 |\n"
  },
  {
    "path": "src/Countdown/index.ts",
    "content": "import dayjs from 'dayjs';\nimport duration from 'dayjs/plugin/duration';\nimport {\n  Component,\n  getValueFromProps,\n  triggerEvent,\n  triggerEventOnly,\n} from '../_util/simply';\nimport { CountdownDefaultProps } from './props';\n\ndayjs.extend(duration);\n\nComponent({\n  props: CountdownDefaultProps,\n  data: {\n    countdownDay: null, // 注意这些倒计时相关的都应该是字符串\n    countdownHour: null, // 倒计时小时 注意都用字符串，避免0被判false的问题\n    countdownMin: null, // 倒计时分钟\n    countdownSec: null, // 倒计时秒\n    showDecisecond: true, // 倒计时结束时不展示秒后一位(厘秒)\n  },\n  methods: {\n    init() {\n      const [\n        countdownStartTime,\n        countdownEndTime,\n        countdownType,\n        time,\n        autoShowDay,\n      ] = getValueFromProps(this, [\n        'countdownStartTime',\n        'countdownEndTime',\n        'countdownType',\n        'time',\n        'autoShowDay',\n      ]);\n      const timeNum = isNaN(Number(time)) ? 0 : Number(time);\n\n      const defaultEndTime = +new Date() + timeNum * 1000;\n      const currentTimeStr = `${countdownStartTime || +new Date()}`;\n      const endTimeStr = `${countdownEndTime || defaultEndTime}`;\n\n      // 如果服务端给的是秒级别的时间戳，自动补3个0转成毫秒的\n      const finalCurrentTimeStr = `${currentTimeStr}${\n        currentTimeStr.length === 10 ? '000' : ''\n      }`;\n      const finalEndTimeStr = `${endTimeStr}${\n        endTimeStr.length === 10 ? '000' : ''\n      }`;\n      const finalStartTime = parseInt(finalCurrentTimeStr, 10);\n      const finalEndTime = parseInt(finalEndTimeStr, 10);\n\n      this.setData({\n        showDay: autoShowDay ? this.data.countdownDay !== '0' : true,\n      });\n\n      this.countdown(finalStartTime, finalEndTime, (remainTime) => {\n        if (remainTime < 1) {\n          // 小于1s了，说明倒计时该结束了\n          triggerEventOnly(this, 'countdownFinish');\n          this.setData({\n            showDecisecond: false,\n          });\n        }\n\n        const durationTime = dayjs.duration(remainTime);\n\n        const day = Math.floor(durationTime.asDays()).toString();\n\n        let hour = '';\n        if (countdownType === 'day') {\n          hour = durationTime.format('HH');\n        } else {\n          const hoursNum = Math.floor(durationTime.asHours());\n          hour = `${hoursNum < 10 ? '0' : ''}${hoursNum > 0 ? hoursNum : '0'}`;\n        }\n\n        const min = durationTime.format('mm');\n        const sec = durationTime.format('ss');\n\n        this.setData({\n          countdownDay: day,\n          countdownHour: hour,\n          countdownMin: min,\n          countdownSec: sec,\n        });\n\n        triggerEvent(this, 'countdownChange', {\n          remainTime,\n          day,\n          hour,\n          min,\n          sec,\n        });\n      });\n    },\n    countdown(\n      startTimestamp: number,\n      endTimestamp: number,\n      callback: (remainingTime: number) => void\n    ) {\n      // if (isNaN(startTimestamp) || isNaN(endTimestamp)) {\n      //   return;\n      // }\n      const currentTime = Date.now(); // 当前时间戳\n      if (\n        currentTime - Math.round(startTimestamp) < 10000 &&\n        Math.round(startTimestamp) - currentTime < 10000\n      ) {\n        // 如果服务端下发的startTime时间戳和本机的时间戳相差10s以内，以本地时间戳为准\n        const getRemainingTime = (): number => {\n          // 本地时间戳与服务端时间戳差距在10s以内都属于正常的，可以直接用本地时间。\n          let remainingTime;\n          const newCurrentTime = +new Date();\n\n          // 判断是否到达结束时间\n          if (newCurrentTime >= endTimestamp) {\n            remainingTime = 0;\n          } else {\n            remainingTime = endTimestamp - newCurrentTime;\n          }\n          return remainingTime;\n        };\n\n        const updateCountdown = () => {\n          const remainingTime = getRemainingTime();\n\n          // 调用setData方法更新UI\n          callback(remainingTime);\n          if (remainingTime > 0) {\n            // 若还有剩余时间，延迟1秒后递归调用自身\n            this.timer = setTimeout(updateCountdown, 1000);\n          }\n        };\n\n        // 预先调一次\n        const remainingTime = getRemainingTime();\n        callback(remainingTime);\n\n        if (remainingTime === 0) {\n          // 如果第一次就是0，可以直接停了\n          return;\n        }\n\n        // 初始化倒计时\n        updateCountdown();\n      } else {\n        // 否则以服务端时间为准，直接算出当前剩余时间，按秒循环即可\n        const remainingTime = endTimestamp - startTimestamp;\n        const totalCount = Math.round(remainingTime / 1000);\n        let count = 0;\n\n        // 立刻调一次\n        callback(remainingTime - count * 1000);\n\n        // 每秒调一次，循环count次\n        this.intervalId = setInterval(() => {\n          if (count >= totalCount) {\n            clearInterval(this.intervalId);\n          } else {\n            count++;\n            // console.log('111111', remainingTime, count, remainingTime - count * 1000)\n            callback(remainingTime - count * 1000);\n          }\n        }, 1000);\n      }\n    },\n  },\n\n  /// #if ALIPAY\n  onInit() {\n    this.init();\n  },\n  didUnmount() {\n    clearInterval(this.intervalId);\n    clearTimeout(this.timer);\n  },\n  didUpdate(prevProps) {\n    const autoShowDay = getValueFromProps(this, 'autoShowDay');\n    if (prevProps.autoShowDay !== autoShowDay) {\n      this.setData({\n        showDay: autoShowDay ? this.data.countdownDay !== '0' : true,\n      });\n    }\n  },\n  /// #endif\n  /// #if WECHAT\n  attached() {\n    this.init();\n  },\n  detached() {\n    clearInterval(this.intervalId);\n    clearTimeout(this.timer);\n  },\n  observers: {\n    '**': function (data) {\n      const prevData = this._prevData || this.data;\n      this._prevData = { ...data };\n      if (prevData.autoShowDay !== data.autoShowDay) {\n        this.setData({\n          showDay: data.autoShowDay ? this.data.countdownDay !== '0' : true,\n        });\n      }\n    },\n  },\n\n  /// #endif\n});\n"
  },
  {
    "path": "src/Countdown/props.ts",
    "content": "export interface ICountdownProps {\n  className?: string; // 容器的 class\n  countdownEndTime?: string; // 倒计时结束时间戳\n  countdownStartTime?: string; // 倒计时开始的时间戳\n  time?: number; // 数字格式的倒计时时间长度，优先级比时间戳低\n  countdownType?: '' | 'day'; // 倒计时类型，目前支持普通的和天维度的\n  autoShowDay?: boolean; // 自动展示\"天\"\n  onCountdownChange?: () => void; // 倒计时变化时的回调\n  onCountdownFinish?: () => void; // 倒计时结束回调\n}\n\nexport const CountdownDefaultProps: ICountdownProps = {\n  className: '',\n  time: 0,\n  countdownStartTime: '',\n  countdownEndTime: '', // 倒计时结束时间戳\n  countdownType: '',\n  autoShowDay: true,\n  onCountdownChange: () => {}, // 倒计时变化时的回调\n  onCountdownFinish: () => {}, // 倒计时结束回调\n};\n"
  },
  {
    "path": "src/Countdown/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n@ant-countdown-color: var(--ant-countdown-color, @COLOR_TEXT_SECONDARY);\n@ant-countdown-number-color: var(--ant-countdown-number-color, @COLOR_WHITE_CHANGE);\n@ant-countdown-number-bg: var(--ant-countdown-number-bg, @COLOR_BRAND1);\n"
  },
  {
    "path": "src/DatePicker/RangePicker/index.axml",
    "content": "<import-sjs from=\"../../_util/isPropsEmpty.sjs\" name=\"u\" />\n\n<template name=\"selector\">\n  <view\n    class=\"ant-range-picker-selector-item {{ active ? 'ant-range-picker-selector-item-active' : '' }}\"\n    onTap=\"onChangeCurrentPickerType\"\n    data-type=\"{{ type }}\"\n  >\n    <view a:if=\"{{ value }}\" class=\"ant-range-picker-selector-item-value\">\n      {{ value }}\n    </view>\n    <view a:else class=\"ant-range-picker-selector-item-placeholder\">\n      {{ placeholder }}\n    </view>\n    <ant-icon\n      a:if=\"{{ precision === 'year' || precision === 'month' || precision === 'day' || precision === 'hour' }}\"\n      type=\"CalendarOutline\"\n      className=\"ant-range-picker-selector-item-icon\"\n    />\n  </view>\n</template>\n<ant-picker\n  formattedValueText=\"{{ formattedValueText }}\"\n  className=\"ant-range-picker {{ className || '' }}\"\n  popClassName=\"{{ !currentStartDate || !currentEndDate ? 'ant-range-picker-confirm-disabled' : '' }} {{ popClassName || '' }}\"\n  visible=\"{{ visible }}\"\n  style=\"{{ style }}\"\n  animationType=\"{{ animationType }}\"\n  options=\"{{ columns }}\"\n  value=\"{{ currentValue }}\"\n  disabled=\"{{ disabled }}\"\n  readonly=\"{{ readonly }}\"\n  title=\"{{ title }}\"\n  placeholder=\"{{ placeholder }}\"\n  okText=\"{{ okText }}\"\n  cancelText=\"{{ cancelText }}\"\n  maskStyle=\"{{ maskStyle }}\"\n  maskClassName=\"{{ maskClassName }}\"\n  indicatorStyle=\"{{ indicatorStyle }}\"\n  indicatorClassName=\"{{ indicatorClassName }}\"\n  onChange=\"onChange\"\n  onCancel=\"onCancel\"\n  onOk=\"onOk\"\n  onVisibleChange=\"onVisibleChange\"\n  maskClosable=\"{{ maskClosable }}\"\n>\n  <view slot=\"content-header\">\n    <slot name=\"content-header\"></slot>\n    <view class=\"ant-range-picker-selector\">\n      <template is=\"selector\" data=\"{{ placeholder: u.isPropsEmpty(startPlaceholder) ? locale.RangePicker.startPlaceholder : startPlaceholder, active: pickerType === 'start', type: 'start', value: currentStartValueStr, precision: precision }}\" />\n      <view class=\"ant-range-picker-selector-split\">{{ splitCharacter }}</view>\n      <template is=\"selector\" data=\"{{ placeholder: u.isPropsEmpty(endPlaceholder) ? locale.RangePicker.endPlaceholder : endPlaceholder, active: pickerType === 'end', type: 'end', value: currentEndValueStr, precision: precision }}\" />\n    </view>\n  </view>\n  <slot name=\"content\" slot=\"content\" />\n  <slot name=\"title\" slot=\"title\" />\n  <slot name=\"prefix\" slot=\"prefix\" />\n  <slot name=\"suffix\" slot=\"suffix\" />\n</ant-picker>\n"
  },
  {
    "path": "src/DatePicker/RangePicker/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-icon\": \"../../Icon/index\",\n    \"ant-picker\": \"../../Picker/index\"\n  }\n}\n"
  },
  {
    "path": "src/DatePicker/RangePicker/index.less",
    "content": "@import (reference) '../variable.less';\n@import '../../style/mixins/hairline.less';\n\n@pickerPrefix: ant-range-picker;\n.@{pickerPrefix} {\n  &-confirm-disabled {\n    .ant-picker-header-confirm {\n      pointer-events: none;\n      opacity: 0.6;\n    }\n  }\n  &-selector {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    height: 104 * @rpx;\n    padding: 24 * @rpx 24 * @rpx 0;\n    box-sizing: border-box;\n    &-item {\n      width: 310 * @rpx;\n      height: 64 * @rpx;\n      padding: 0 16 * @rpx 0 24 * @rpx;\n      box-sizing: border-box;\n      border-radius: 8 * @rpx;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      box-shadow: inset 0 1 * @rpx 6 * @rpx 0 fade(@COLOR_BLACK_CHANGE, 10);\n      color: @range-picker-item-color;\n      &-active {\n        .hairline-radius(@range-picker-active-color,16*@rpx);\n        color: @range-picker-active-color;\n        .@{pickerPrefix}-selector-item-icon {\n          color: @range-picker-active-color;\n        }\n      }\n      &-value {\n        font-size: 28 * @rpx;\n      }\n      &-placeholder {\n        font-size: 28 * @rpx;\n        color: @range-picker-placeholder-color;\n      }\n      &-icon {\n        color: @range-picker-placeholder-color;\n        font-size: 32 * @rpx;\n      }\n    }\n    &-split {\n      color: @range-picker-placeholder-color;\n    }\n  }\n}\n"
  },
  {
    "path": "src/DatePicker/RangePicker/index.ts",
    "content": "import { effect } from '@preact/signals-core';\nimport dayjs from 'dayjs';\nimport equal from 'fast-deep-equal';\nimport computed from '../../mixins/computed';\nimport mixinValue from '../../mixins/value';\nimport { resolveEventValue, resolveEventValues } from '../../_util/platform';\nimport {\n  ComponentWithSignalStoreImpl,\n  getValueFromProps,\n  triggerEvent,\n  triggerEventOnly,\n  triggerEventValues,\n} from '../../_util/simply';\nimport i18nController from '../../_util/store';\nimport {\n  getDateByValue,\n  getRangeData,\n  getValidValue,\n  getValueByDate,\n} from '../util';\nimport { DateRangePickerDefaultProps } from './props';\n\nComponentWithSignalStoreImpl({\n  storeOptions: {\n    store: () => i18nController,\n    updateHook: effect,\n    mapState: {\n      locale: ({ store }) => store.currentLocale.value,\n    },\n  },\n  props: DateRangePickerDefaultProps,\n  data: {\n    currentValue: [], // 当前picker选中值，didmount、弹窗打开、切换开始结束、picker变化时更新\n    columns: [], // 当前可选项，didmound、弹窗打开、切换开始结束、picker变化时更新\n    pickerType: 'start' as 'start' | 'end',\n    currentStartDate: null, // 展开时开始时间，date格式，有value，则取value[0]，否则取当天，需要判断当天是否在可选范围内\n    currentEndDate: null, // 展开时开始时间，date格式，有value，则取value[1]，否则取开始时间\n    forceUpdate: 0, // 强制更新picker组件，已知需处理的情况：value超限，但是需要更新format，由于picker的参数均未变化，无法触发picker的渲染\n    formattedValueText: '',\n  },\n  pickerVisible: false,\n  methods: {\n    // visible受控判断\n    isVisibleControlled() {\n      /// #if ALIPAY\n      return 'visible' in getValueFromProps(this);\n      /// #endif\n      /// #if WECHAT\n      return getValueFromProps(this, 'visible') !== null;\n      /// #endif\n    },\n    computed() {\n      const { currentStartDate, currentEndDate, pickerType } = this.data;\n      const format = getValueFromProps(this, 'format');\n\n      if (pickerType)\n        return {\n          currentStartValueStr: currentStartDate\n            ? dayjs(currentStartDate).format(format)\n            : '',\n          currentEndValueStr: currentEndDate\n            ? dayjs(currentEndDate).format(format)\n            : '',\n        };\n    },\n    getMin(min) {\n      return min ? dayjs(min as any) : dayjs().subtract(10, 'year');\n    },\n\n    getMax(max) {\n      return max ? dayjs(max as any) : dayjs().add(10, 'year');\n    },\n    // didUpdate、弹窗打开、切换pickerType触发\n    setCurrentValue(currentProps, forceUpdate = false) {\n      const { pickerVisible } = this; // 隐藏状态下从CValue触发，展开状态使用当前数据\n      const { precision } = currentProps;\n      const { pickerType, columns } = this.data;\n      const realValue = this.getValue();\n      let { currentStartDate, currentEndDate } = this.data;\n      const currentStartDateByCValue = realValue?.[0] || null;\n      const currentEndDateByCValue = realValue?.[1] || null;\n\n      // 展开状态，说明在切换pickerType或者外部value发生变化\n      if (pickerVisible) {\n        // 如果是强制更新（外部value变化）或者当前没有日期数据，则从props的value中获取\n        if (forceUpdate || (!currentStartDate && !currentEndDate)) {\n          if (currentStartDateByCValue) {\n            currentStartDate = currentStartDateByCValue;\n          }\n          if (currentEndDateByCValue) {\n            currentEndDate = currentEndDateByCValue;\n          }\n        }\n\n        // 确保日期范围的正确性：结束日期不能早于开始日期\n        if (\n          currentStartDate &&\n          currentEndDate &&\n          currentEndDate < currentStartDate\n        ) {\n          if (pickerType === 'start') {\n            // 如果当前选择开始日期，将结束日期调整为开始日期\n            currentEndDate = currentStartDate;\n          } else {\n            // 如果当前选择结束日期，将开始日期调整为结束日期\n            currentStartDate = currentEndDate;\n          }\n        }\n\n        if (pickerType === 'start') {\n          if (!currentStartDate) {\n            currentStartDate = currentEndDate;\n          }\n        } else {\n          // pickerType=end start已存在\n          // 结束时间默认选中开始\n          if (!currentEndDate) {\n            currentEndDate = currentStartDate;\n          }\n        }\n      } else {\n        // 否则是在从cValue初始化\n        currentStartDate = currentStartDateByCValue;\n        currentEndDate = currentEndDateByCValue;\n        // 开始默认取优先取当前时间，不在时间范围内取开始时间\n        if (!currentStartDate) {\n          const min = this.getMin(currentProps.min).toDate();\n          const { max } = currentProps;\n          currentStartDate = new Date();\n          if (\n            (min && dayjs(currentStartDate).isBefore(min, precision)) ||\n            (max && dayjs(currentStartDate).isAfter(max, precision)) ||\n            (currentEndDateByCValue &&\n              currentStartDate > currentEndDateByCValue)\n          ) {\n            currentStartDate = min;\n          }\n        }\n      }\n      const currentValue = getValueByDate(\n        pickerType === 'start' ? currentStartDate : currentEndDate,\n        precision\n      );\n      const newColumns = this.generateData(currentValue, currentProps);\n      if (!equal(newColumns, columns)) {\n        this.setData({ columns: newColumns }, () => {\n          this.setData({\n            currentStartDate,\n            currentEndDate,\n            currentValue,\n            formattedValueText: this.onFormat(),\n          });\n        });\n      } else {\n        this.setData({\n          currentStartDate,\n          currentEndDate,\n          currentValue,\n          formattedValueText: this.onFormat(),\n        });\n      }\n    },\n    /**\n     * 生成选项数据，didmound、picker change、打开弹窗、切换picker type触发\n     */\n    generateData(currentValue, currentProps) {\n      const { precision, min: propsMin, max: propsMax } = currentProps;\n      const min = this.getMin(propsMin);\n      const max = this.getMax(propsMax);\n      if (max < min) {\n        return [];\n      }\n      let currentPickerDay = dayjs();\n      if (currentValue.length > 0) {\n        currentPickerDay = dayjs(getDateByValue(currentValue));\n      }\n      if (currentPickerDay < min || currentPickerDay > max) {\n        currentPickerDay = min;\n      }\n\n      const newColumns = getRangeData(\n        precision,\n        min,\n        max,\n        currentPickerDay,\n        this.onFormatLabel.bind(this)\n      );\n      return newColumns;\n    },\n\n    onChange(selectedIdx) {\n      let [selectedIndex] = resolveEventValues(getValidValue(selectedIdx));\n      const [format, precision, pmax, pmin] = getValueFromProps(this, [\n        'format',\n        'precision',\n        'max',\n        'min',\n      ]);\n      let date = getDateByValue(selectedIndex);\n      const min = this.getMin(pmin);\n      const max = this.getMax(pmax);\n      if (dayjs(date).isBefore(min)) {\n        date = min.toDate();\n        selectedIndex = getValueByDate(date, precision);\n      }\n      if (dayjs(date).isAfter(max)) {\n        date = max.toDate();\n        selectedIndex = getValueByDate(date, precision);\n      }\n      const { pickerType, columns, currentEndDate, currentStartDate } =\n        this.data;\n      const newData: any = {\n        currentValue: selectedIndex,\n        formattedValueText: this.onFormat(),\n      };\n      if (pickerType === 'start') {\n        newData.currentStartDate = date;\n        if (currentEndDate && dayjs(date).isAfter(currentEndDate)) {\n          newData.currentEndDate = null;\n        }\n      } else {\n        newData.currentEndDate = date;\n        if (currentStartDate && dayjs(date).isBefore(currentStartDate)) {\n          newData.currentStartDate = null;\n        }\n      }\n      const newColumns = this.generateData(\n        selectedIndex,\n        getValueFromProps(this)\n      );\n      if (!equal(newColumns, columns)) {\n        this.setData(\n          {\n            columns: newColumns,\n          },\n          () => {\n            this.setData(newData);\n            triggerEventValues(this, 'pickerChange', [\n              pickerType,\n              date,\n              dayjs(date).format(format),\n            ]);\n          }\n        );\n      } else {\n        this.setData(newData);\n        triggerEventValues(this, 'pickerChange', [\n          pickerType,\n          date,\n          dayjs(date).format(format),\n        ]);\n      }\n    },\n\n    onCancel(e) {\n      triggerEventOnly(this, 'cancel', e);\n    },\n\n    onOk() {\n      const format = getValueFromProps(this, 'format');\n      const { currentStartDate, currentEndDate } = this.data;\n      const realValue = [currentStartDate, currentEndDate] as any;\n      if (!this.isControlled()) {\n        this.update(realValue);\n      }\n      triggerEventValues(this, 'ok', [\n        realValue,\n        realValue.map((v) => dayjs(v).format(format)),\n      ]);\n    },\n    onFormatLabel(type, value) {\n      const onFormatLabel = getValueFromProps(this, 'onFormatLabel');\n      const formatValueByProps = onFormatLabel && onFormatLabel(type, value);\n      if (formatValueByProps !== undefined && formatValueByProps !== null) {\n        return String(formatValueByProps);\n      }\n      return this.defaultFormatLabel(type, value);\n    },\n    defaultFormatLabel(type, value) {\n      const suffixMap = {\n        year: '年',\n        month: '月',\n        day: '日',\n        hour: '时',\n        minute: '分',\n        second: '秒',\n      };\n      return `${value}${suffixMap[type]}`;\n    },\n    defaultFormat(date, valueStrs) {\n      const [format, splitCharacter] = getValueFromProps(this, [\n        'format',\n        'splitCharacter',\n      ]);\n      if (format && valueStrs && valueStrs[0] && valueStrs[1]) {\n        return valueStrs.join(`${splitCharacter}`);\n      }\n      return '';\n    },\n    onFormat() {\n      const [onFormat, format] = getValueFromProps(this, [\n        'onFormat',\n        'format',\n      ]);\n      const realValue = this.getValue();\n      const formatValueByProps =\n        onFormat &&\n        onFormat(\n          realValue,\n          realValue\n            ? realValue.map((v) => (v ? dayjs(v).format(format) : null))\n            : null\n        );\n      if (formatValueByProps !== undefined && formatValueByProps !== null) {\n        return formatValueByProps;\n      }\n      return this.defaultFormat(\n        realValue,\n        realValue\n          ? realValue.map((v) => (v ? dayjs(v).format(format) : null))\n          : null\n      );\n    },\n    /**\n     * 显示/隐藏切换\n     * @param visible\n     */\n    onVisibleChange(visible) {\n      if (!this.isVisibleControlled() && visible) {\n        this.setData({ pickerType: 'start' });\n        this.setCurrentValue(getValueFromProps(this));\n        this.pickerVisible = visible;\n      }\n      triggerEvent(this, 'visibleChange', resolveEventValue(visible));\n    },\n    onChangeCurrentPickerType(e) {\n      const { type } = e.currentTarget.dataset;\n      const { pickerType } = this.data;\n      if (type !== pickerType) {\n        this.setData({\n          pickerType: type,\n        });\n        this.setCurrentValue(getValueFromProps(this));\n      }\n    },\n  },\n  mixins: [\n    mixinValue({\n      transformValue(value) {\n        return {\n          value:\n            value && value[0] && value[1]\n              ? [dayjs(value[0]).toDate(), dayjs(value[1]).toDate()]\n              : undefined,\n          needUpdate: true,\n        };\n      },\n    }),\n    computed(),\n  ],\n  /// #if ALIPAY\n  didMount() {\n    this.pickerVisible = false;\n    const [visible, defaultVisible] = getValueFromProps(this, [\n      'visible',\n      'defaultVisible',\n    ]);\n    this.setData({\n      visible: this.isVisibleControlled() ? visible : defaultVisible,\n      formattedValueText: this.onFormat(),\n    });\n  },\n\n  didUpdate(prevProps, prevData) {\n    const currentProps = getValueFromProps(this);\n    const visible = getValueFromProps(this, 'visible');\n    if (this.isVisibleControlled() && !equal(prevProps.visible, visible)) {\n      this.setData({ visible });\n      this.setCurrentValue(currentProps);\n      this.pickerVisible = visible;\n    }\n\n    if (!this.isEqualValue(prevData)) {\n      this.setData({\n        forceUpdate: this.data.forceUpdate + 1,\n        formattedValueText: this.onFormat(),\n      });\n      if (this.pickerVisible) {\n        // 展开状态才更新picker的数据，否则下次triggerVisible触发\n        this.setCurrentValue(currentProps, true);\n      }\n    }\n    if (!equal(currentProps, prevProps)) {\n      if (this.pickerVisible) {\n        this.setCurrentValue(currentProps, true);\n      }\n    }\n  },\n  /// #endif\n  /// #if WECHAT\n  created() {\n    this.pickerVisible = false;\n    const [visible, defaultVisible] = getValueFromProps(this, [\n      'visible',\n      'defaultVisible',\n    ]);\n    this.setData({\n      visible: this.isVisibleControlled() ? visible : defaultVisible,\n      formattedValueText: this.onFormat(),\n    });\n  },\n  observers: {\n    '**': function (data) {\n      const prevData = this._prevData || this.data;\n      this._prevData = { ...data };\n      if (!equal(prevData, data)) {\n        if (this.pickerVisible) {\n          this.setCurrentValue(getValueFromProps(this), true);\n        }\n      }\n    },\n    'visible': function (data) {\n      const prevVisible = this._prevVisible;\n      this._prevVisible = data;\n      const currentProps = getValueFromProps(this);\n      const visible = getValueFromProps(this, 'visible');\n      if (this.isVisibleControlled() && prevVisible !== visible) {\n        this.setData({ visible });\n        this.setCurrentValue(currentProps);\n        this.pickerVisible = visible;\n      }\n    },\n    'mixin.value': function () {\n      const currentProps = getValueFromProps(this);\n      this.setData({\n        forceUpdate: this.data.forceUpdate + 1,\n        formattedValueText: this.onFormat(),\n      });\n      if (this.pickerVisible) {\n        // 展开状态才更新picker的数据，否则下次triggerVisible触发\n        this.setCurrentValue(currentProps, true);\n      }\n    },\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/DatePicker/RangePicker/props.ts",
    "content": "import { IBaseProps } from '../../_util/base';\n\nexport type PickerValue = [Date, Date];\n/**\n * @description 对话框\n */\nexport interface IDateRangePickerProps extends IBaseProps {\n  visible?: boolean;\n  defaultVisible?: boolean;\n  /**\n   * @desciption  动画类型\n   * @default \"transform\"\n   */\n  animationType: 'transform' | 'position';\n  /**\n   * @description 时间格式化显示，例如YYYY-MM-DD\n   */\n  format: string;\n  /**\n   * @description 最小值\n   * @default 十年前\n   */\n  min: Date;\n  /**\n   * @description 最大值\n   * @default 十年后\n   */\n  max: Date;\n  /**\n   * @description 当前数据\n   */\n  value: PickerValue;\n  /**\n   * @description 默认值\n   */\n  defaultValue: PickerValue;\n  /**\n   * @description 标题\n   */\n  title: string;\n  /**\n   * @description 确定按钮文案\n   * @default \"确定\"\n   */\n  okText: string;\n  /**\n   * @description 取消文案\n   * @default \"取消\"\n   */\n  cancelText: string;\n  /**\n   * @description 提示文案\n   * @default '请选择'\n   */\n  placeholder: string;\n  /**\n   * @description 是否禁用\n   */\n  disabled?: boolean;\n  /**\n   * @description 是否只读\n   */\n  readonly?: boolean;\n  /**\n   *@description 选中框样式\n   * 版本要求： 支付宝小程序基础库 1.10.0 及以上\n   */\n  indicatorStyle?: string;\n\n  /**\n   *@description 选中框类名\n   * 版本要求： 支付宝小程序基础库 1.10.0 及以上\n   */\n  indicatorClassName?: string;\n\n  /**\n   * @description 蒙层的样式。\n   * 版本要求： 支付宝小程序基础库 1.10.0 及以上\n   */\n  maskStyle?: string;\n\n  /**\n   * @description 蒙层的类名。\n   * 版本要求： 支付宝小程序基础库 1.10.0 及以上\n   */\n  maskClassName?: string;\n  /**\n   * @description 点击确认回调\n   */\n  onOk?: (\n    date: PickerValue,\n    dateStr: [string, string],\n    e: Record<string, any>\n  ) => void;\n  /**\n   * @description 点击取消回调\n   */\n  onCancel?: (e: Record<string, any>) => void;\n  /**\n   * @description 发生滚动即触发， 与 onChange 点击 ok 后触发不同\n   */\n  onPickerChange?: (\n    type: 'start' | 'end',\n    date: Date,\n    dateStr: string,\n    e: Record<string, any>\n  ) => void;\n  /**\n   * @description 精度\n   * @default 'day'\n   */\n  precision: 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second';\n\n  /**\n   * @description 选中值的文本显示格式\n   */\n  onFormat?: (date: PickerValue, dateStr: [string, string]) => string;\n  /**\n   * @description 切换显示隐藏\n   */\n  onVisibleChange?: (visible, e: Record<string, any>) => void;\n  /**\n   * @description 显示连接符\n   * @default '-''\n   */\n  splitCharacter: string;\n  /**\n   * @description 开始时间提示文案\n   * @default '未选择'\n   */\n  startPlaceholder: string;\n  /**\n   * @description 结束时间提示文案\n   * @default '未选择'\n   */\n  endPlaceholder: string;\n  /**\n   * @description 点击蒙层是否可以关闭\n   * @default false\n   */\n  maskClosable: boolean;\n  /**\n   * @description 弹出框类名\n   */\n  popClassName: string;\n  /**\n   * @description 弹出框样式\n   */\n  popStyle: string;\n  /**\n   * 自定义每列展示的内容\n   * @param type\n   * @param value\n   */\n  onFormatLabel?(\n    type: 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second',\n    value: number\n  ): string;\n}\n\nexport const DateRangePickerDefaultProps: Partial<IDateRangePickerProps> = {\n  visible: null,\n  defaultVisible: null,\n  animationType: 'transform',\n  format: 'YYYY/MM/DD',\n  min: null,\n  max: null,\n  value: null,\n  defaultValue: null,\n  title: '',\n  okText: null,\n  cancelText: null,\n  placeholder: null,\n  precision: 'day',\n  splitCharacter: '-',\n  startPlaceholder: null,\n  endPlaceholder: null,\n  maskClosable: true,\n  popClassName: '',\n  popStyle: '',\n  disabled: false,\n  readonly: false,\n  onFormatLabel: null,\n  onFormat: null,\n};\n"
  },
  {
    "path": "src/DatePicker/index.axml",
    "content": "<ant-picker\n  className=\"ant-date-picker\"\n  popClassName=\"ant-date-picker-popup {{ popClassName || '' }}\"\n  visible=\"{{ visible }}\"\n  style=\"{{ style }}\"\n  popStyle=\"{{ popStyle }}\"\n  animationType=\"{{ animationType }}\"\n  options=\"{{ columns }}\"\n  value=\"{{ currentValue }}\"\n  disabled=\"{{ disabled }}\"\n  readonly=\"{{ readonly }}\"\n  title=\"{{ title }}\"\n  placeholder=\"{{ placeholder }}\"\n  okText=\"{{ okText }}\"\n  cancelText=\"{{ cancelText }}\"\n  maskStyle=\"{{ maskStyle }}\"\n  maskClassName=\"{{ maskClassName }}\"\n  indicatorStyle=\"{{ indicatorStyle }}\"\n  indicatorClassName=\"{{ indicatorClassName }}\"\n  onChange=\"onChange\"\n  onCancel=\"onCancel\"\n  onOk=\"onOk\"\n  formattedValueText=\"{{ formattedValueText }}\"\n  onVisibleChange=\"onVisibleChange\"\n  maskClosable=\"{{ maskClosable }}\">\n  <slot\n    name=\"content-header\"\n    slot=\"content-header\"\n  />\n  <slot\n    name=\"content\"\n    slot=\"content\" />\n  <slot\n    name=\"title\"\n    slot=\"title\" />\n  <slot\n    name=\"prefix\"\n    slot=\"prefix\" />\n  <slot\n    name=\"suffix\"\n    slot=\"suffix\" />\n</ant-picker>\n"
  },
  {
    "path": "src/DatePicker/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Information Entry\n  order: 10\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# DatePicker\n\nCompared to native `my.datePicker`, to achieve the same iOS and Android experience.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-date-picker\": \"antd-mini/es/DatePicker/index\",\n  \"ant-range-picker\": \"antd-mini/es/DatePicker/RangePicker/index\"\n#endif\n#if WECHAT\n  \"ant-date-picker\": \"antd-mini/DatePicker/index\",\n  \"ant-range-picker\": \"antd-mini/DatePicker/RangePicker/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n> `defaultValue` property is`dayjs` A timestamp or object that can be parsed.\n\n```xml\n<ant-date-picker\n  min=\"{{min}}\"\n  max=\"{{max}}\"\n  defaultValue=\"{{defaultDate}}\"\n  placeholder=\"Please select\"\n#if ALIPAY\n  onPickerChange=\"handlePickerChange\"\n  onVisibleChange=\"handleTriggerPicker\"\n  onCancel=\"handleDismiss\"\n  onOk=\"handleOk\"\n#endif\n#if WECHAT\n  bindpickerchange=\"handlePickerChange\"\n  bindvisiblechange=\"handleTriggerPicker\"\n  bindcancel=\"handleDismiss\"\n  bindok=\"handleOk\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    min: new Date('2019/01/15').getTime(),\n    max: new Date('2023/08/20').getTime(),\n    defaultDate: new Date('2019/02/02').getTime(),\n  },\n  handlePickerChange(date, dateStr, e) {\n    console.log('onPickerChange', date, dateStr, e);\n  },\n  handleTriggerPicker(visible, e) {\n    console.log('onVisibleChange', visible, e);\n  },\n  handleDismiss(e) {\n    console.log('e', e);\n  },\n  handleOk(date, format, e) {\n    console.log('onOk', date, format, e);\n  },\n});\n```\n\n### precision control\n\n> `precision` Property to control the time precision of the selection.`format` property is used to format the displayed `value` Value.\n\n```xml\n<ant-date-picker precision=\"year\" format=\"YYYY\"/>\n<ant-date-picker precision=\"month\" format=\"YYYY-MM\"/>\n<ant-date-picker precision=\"minute\" format=\"YYYY-MM-DD HH:mm\"/>\n```\n\n### Disable state\n\n> `disabled` Property is used to control the disabled state.\n\n```xml\n<ant-date-picker defaultValue=\"{{defaultDate}}\" disabled />\n```\n\n### Customize the rendering of each column in the selection panel\n\n> Incoming Function `onFormatLabel` , the return value is the data you want to render for each column in the selection panel.\n\n```xml\n<ant-date-picker onFormatLabel=\"{{handleFormatLabel ? handleFormatLabel : 'handleFormatLabel'}}\" />\n```\n\n```js\nPage({\n  data: {\n#if WECHAT\n    handleFormatLabel(type, value) {\n      return String(value);\n    },\n#endif\n  },\n  handleFormatLabel(type, value) {\n    return String(value);\n  },\n});\n```\n\n### Controlled Mode\n\n> control the selected value, which requires `value` property and `onOk` Events are used together. The control panel displays the closed state, which requires `visible` property and `onVisibleChange` Events are used together.\n\n```xml\n <ant-date-picker\n  visible=\"{{pickerVisible}}\"\n  value=\"{{pickerValue}}\"\n#if ALIPAY\n  onVisibleChange=\"handleTriggerControlledPicker\"\n  onOk=\"handleControlledOk\"\n#endif\n#if WECHAT\n  bindvisiblechange=\"handleTriggerControlledPicker\"\n  bindok=\"handleControlledOk\"\n#endif\n  />\n```\n\n```js\nPage({\n  data: {\n    pickerVisible: false,\n    pickerValue: new Date('2019/02/02').getTime(),\n  },\n\n  handlePickerChange(date, dateStr, e) {\n    console.log('onPickerChange', date, dateStr, e);\n  },\n  handleControlledOk(value) {\n#if WECHAT\n    this.setData({\n      // 微信只支持传递时间戳\n      pickerValue: value.detail.getTime(),\n    });\n#endif\n#if ALIPAY\n    this.setData({\n      pickerValue: value,\n    });\n#endif\n  },\n  handleTriggerControlledPicker(visible, e) {\n#if WECHAT\n    console.log('handleTriggerControlledPicker', visible);\n    this.setData({\n      pickerVisible: visible.detail,\n    });\n#endif\n#if ALIPAY\n    console.log('handleTriggerControlledPicker', visible, e);\n    this.setData({\n      pickerVisible: visible,\n    });\n#endif\n  },\n});\n```\n\n### Time Range Selection\n\n> Introduction `ant-range-picker` component, you can have the ability to select a time range.\n\n```xml\n<ant-range-picker\n  placeholder=\"Please select\"\n  defaultValue=\"{{defaultDateRange}}\"\n#if ALIPAY\n  onPickerChange=\"handlePickerRangeChange\"\n  onVisibleChange=\"handleTriggerPicker\"\n  onOk=\"handleRangeOk\"\n#endif\n#if WECHAT\n  bindpickerchange=\"handlePickerRangeChange\"\n  bindvisiblechange=\"handleTriggerPicker\"\n  bindok=\"handleRangeOk\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    defaultDateRange: [\n      new Date('2022/03/21').getTime(),\n      new Date('2022/05/20').getTime(),\n    ],\n  },\n  handlePickerRangeChange(type, date, dateStr, e) {\n    console.log('onPickerRangeChange', type, date, dateStr, e);\n  },\n  handleTriggerPicker(visible, e) {\n    console.log('onVisibleChange', visible, e);\n  },\n  handleRangeOk(date, format, e) {\n    console.log('onRangeOk', date, format, e);\n  },\n});\n```\n\n### Demo Code\n\n<code src='../../demo/pages/DatePicker/index'></code>\n\n## API\n\n### DatePicker\n\n| Property                         | Description                                                                                                                                                                                 | Type                                                                                                           | Default Value       |\n| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------- | ------------ |\n| animationType                | Animation type, optional `transform` `position`, the default is used `transform` Animation performance is better. Due to bug in the basic library of small programs, the pop-up window `picker-view` Shadow style may have style problems under iOS and can be temporarily switched `position` Resolve. | string                                                                                                         | `transform`  |\n| className                    | Class Name                                                                                                                                                                                 | string                                                                                                         | -            |\n| defaultValue                 | Time selected by default                                                                                                                                                                       | Date                                                                                                           | -            |\n| defaultPickerValue           | Set the default time when the user selects a date                                                                                                                                                         | Date                                                                                                           | -            |\n| disabled                     | Disable                                                                                                                                                                             | boolean                                                                                                        | false        |\n| readonly                     | Read-only                                                                                                                                                                             | boolean                                                                                                        | false        |\n| cancelText                   | Cancel Copy                                                                                                                                                                             | string                                                                                                         | \"Cancel\"       |\n| content                      | Custom Content Slots                                                                                                                                                                       | slot                                                                                                           | -            |\n| format                       | Time format display, the format is the same [dayjs](https://day.js.org/docs/zh-CN/display/format)                                                                                                         | string                                                                                                         | 'YYYY/MM/DD' |\n| indicatorStyle               | Check Box Style                                                                                                                                                                           | string                                                                                                         | -            |\n| indicatorClassName           | Class name of the check box                                                                                                                                                                         | string                                                                                                         | -            |\n| maskClassName                | Class name of the layer                                                                                                                                                                           | string                                                                                                         | -            |\n| maskClosable                 | Click whether the layer can be closed                                                                                                                                                                 | boolean                                                                                                        | true         |\n| maskStyle                    | Mating Style                                                                                                                                                                             | string                                                                                                         | -            |\n| max                          | Maximum                                                                                                                                                                               | Date                                                                                                           | Ten years later       |\n| min                          | Minimum                                                                                                                                                                               | Date                                                                                                           | Ten years ago       |\n| okText                       | Confirm Button Copy                                                                                                                                                                         | string                                                                                                         | \"OK\"       |\n| placeholder                  | Prompt Copy                                                                                                                                                                             | string                                                                                                         | \"Please select\"     |\n| popClassName                 | Popup box class name                                                                                                                                                                           | string                                                                                                         | -            |\n| popStyle                     | Pop-up Style                                                                                                                                                                           | string                                                                                                         | -            |\n| precision                    | Select precision, optional `year` `month` `day` `hour` `minute` `second`                                                                                                                         | string                                                                                                         | `day`        |\n| prefix                       | Prefix                                                                                                                                                                                 | slot                                                                                                           | -            |\n| style                        | Style                                                                                                                                                                                 | string                                                                                                         | -            |\n| suffix                       | Suffix                                                                                                                                                                                 | slot                                                                                                           | -            |\n| title                        | Pop-up Title                                                                                                                                                                           | string \\| slot                                                                                                 | -            |\n| value                        | Selected time                                                                                                                                                                           | Date                                                                                                           | -            |\n| visible                      | Whether to display                                                                                                                                                                             | boolean                                                                                                        | false        |\n| defaultVisible               | Display by default                                                                                                                                                                         | boolean                                                                                                        | false        |\n| onFormat                     | Text display format of the selected value                                                                                                                                                                 | (date: Date, dateStr: string) => string                                                                        | -            |\n| onFormatLabel                | Customize the content displayed in each column, and add the year, month, day, hour, minute, and second units by default.                                                                                                                             | (type: `year` \\| `month` \\| `day` \\| `hour` \\| `minute` \\| `second`, value: number) => string                  | -            |\n| #if ALIPAY onOk              | Click the OK button to trigger the callback                                                                                                                                                               | (date: Date, dateStr: string, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -            |\n| #if ALIPAY onCancel          | Click the cancel button/layer to trigger the callback                                                                                                                                                          | (event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                              | -            |\n| #if ALIPAY onPickerChange    | The selected item changes, triggering a callback                                                                                                                                                             | (date: Date, dateStr: string, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -            |\n| #if ALIPAY onVisibleChange   | Pop-up display/hide status change trigger                                                                                                                                                          | (visible: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void            | -            |\n| #if WECHAT bindok            | Click the OK button to trigger the callback                                                                                                                                                               | (date: Date, dateStr: string, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -            |\n| #if WECHAT bindcancel        | Click the cancel button/layer to trigger the callback                                                                                                                                                          | (event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                              | -            |\n| #if WECHAT bindpickerchange  | The selected item changes, triggering a callback                                                                                                                                                             | (date: Date, dateStr: string, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -            |\n| #if WECHAT bindvisiblechange | Pop-up display/hide status change trigger                                                                                                                                                          | (visible: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void            | -            |\n\n### RangePicker\n\n| Property                         | Description                                                                                                                                                                                 | Type                                                                                                                                   | Default Value       |\n| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | ------------ |\n| animationType                | Animation type, optional `transform` `position`, the default is used `transform` Animation performance is better. Due to bug in the basic library of small programs, the pop-up window `picker-view` Shadow style may have style problems under iOS and can be temporarily switched `position` Resolve. | string                                                                                                                                 | `transform`  |\n| className                    | Class Name                                                                                                                                                                                 | string                                                                                                                                 | -            |\n| defaultValue                 | Time range selected by default                                                                                                                                                                   | [Date, Date]                                                                                                                           | -            |\n| disabled                     | Disable                                                                                                                                                                             | boolean                                                                                                                                | false        |\n| readonly                     | Read-only                                                                                                                                                                             | boolean                                                                                                                                | false        |\n| cancelText                   | Cancel Copy                                                                                                                                                                             | string                                                                                                                                 | \"Cancel\"       |\n| content                      | Custom Content Slots                                                                                                                                                                       | slot                                                                                                                                   | -            |\n| endPlaceholder               | End Time Prompt Copy                                                                                                                                                                     | string                                                                                                                                 | \"Not selected\"     |\n| format                       | Time format display, the format is the same [dayjs](https://day.js.org/docs/zh-CN/display/format)                                                                                                         | string                                                                                                                                 | 'YYYY/MM/DD' |\n| indicatorStyle               | Check Box Style                                                                                                                                                                           | string                                                                                                                                 | -            |\n| indicatorClassName           | Class name of the check box                                                                                                                                                                         | string                                                                                                                                 | -            |\n| maskClassName                | Class name of the layer                                                                                                                                                                           | string                                                                                                                                 | -            |\n| maskClosable                 | Click whether the layer can be closed                                                                                                                                                                 | boolean                                                                                                                                | true         |\n| maskStyle                    | Mating Style                                                                                                                                                                             | string                                                                                                                                 | -            |\n| max                          | Maximum                                                                                                                                                                               | Date                                                                                                                                   | Ten years later       |\n| min                          | Minimum                                                                                                                                                                               | Date                                                                                                                                   | Ten years ago       |\n| okText                       | Confirm Button Copy                                                                                                                                                                         | string                                                                                                                                 | \"OK\"       |\n| placeholder                  | Prompt Copy                                                                                                                                                                             | string                                                                                                                                 | \"Please select\"     |\n| popClassName                 | Popup box class name                                                                                                                                                                           | string                                                                                                                                 | -            |\n| popStyle                     | Pop-up Style                                                                                                                                                                           | string                                                                                                                                 | -            |\n| precision                    | Select precision, optional `year` `month` `day` `hour` `minute`                                                                                                                                  | string                                                                                                                                 | `day`        |\n| splitCharacter               | Display Connector                                                                                                                                                                           | string                                                                                                                                 | -            |\n| startPlaceholder             | Start Time Prompt Copy                                                                                                                                                                     | string                                                                                                                                 | \"Not selected\"     |\n| prefix                       | Prefix                                                                                                                                                                                 | slot                                                                                                                                   | -            |\n| style                        | Style                                                                                                                                                                                 | string                                                                                                                                 | -            |\n| suffix                       | Suffix                                                                                                                                                                                 | slot                                                                                                                                   | -            |\n| title                        | Pop-up Title                                                                                                                                                                           | string \\| slot                                                                                                                         | -            |\n| value                        | Selected time range                                                                                                                                                                       | [Date, Date]                                                                                                                           | -            |\n| visible                      | Whether to display                                                                                                                                                                             | boolean                                                                                                                                | false        |\n| defaultVisible               | Display by default                                                                                                                                                                         | boolean                                                                                                                                | false        |\n| onFormat                     | Text display format of the selected value                                                                                                                                                                 | (date: [Date, Date], dateStr: [string, string]) => string                                                                              | -            |\n| onFormatLabel                | Customize the content displayed in each column, and add the year, month, day, hour, minute, and second units by default.                                                                                                                             | (type: `year` \\| `month` \\| `day` \\| `hour` \\| `minute`, value: number) => string                                                      | -            |\n| #if ALIPAY onOk              | Click the OK button to trigger the callback                                                                                                                                                               | (date: [Date, Date], dateStr: [string, string], event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void       | -            |\n| #if ALIPAY onCancel          | Click the cancel button/layer to trigger the callback                                                                                                                                                          | (event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                      | -            |\n| #if ALIPAY onPickerChange    | The selected item changes, triggering a callback                                                                                                                                                             | (type: `start` \\| `end`, date: Date, dateStr: string, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -            |\n| #if ALIPAY onVisibleChange   | Pop-up display/hide status change trigger                                                                                                                                                          | (visible: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                    | -            |\n| #if WECHAT bindok            | Click the OK button to trigger the callback                                                                                                                                                               | (date: [Date, Date], dateStr: [string, string], event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void       | -            |\n| #if WECHAT bindcancel        | Click the cancel button/layer to trigger the callback                                                                                                                                                          | (event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                      | -            |\n| #if WECHAT bindpickerchange  | The selected item changes, triggering a callback                                                                                                                                                             | (type: `start` \\| `end`, date: Date, dateStr: string, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -            |\n| #if WECHAT bindvisiblechange | Pop-up display/hide status change trigger                                                                                                                                                          | (visible: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                    | -            |\n\n## How to obtain `YYYY-MM-DD` Time in format\n\nThe time returned by the DatePicker component is in the format `Date` type, if you need to convert `YYYY-MM-DD` format, you can use [dayjs](https://day.js.org/docs/zh-CN/display/format) Make the conversion.\n\n```xml\n<date-picker\n#if ALIPAY\n  onOk=\"handleOk\"\n#endif\n#if WECHAT\n  bindok=\"handleOk\"\n#endif\n/>\n```\n\n```javascript\nPage({\n  handleOk(date) {\n    const dateStr = dayjs(date).format('YYYY-MM-DD');\n    console.log(dateStr);\n  },\n});\n```\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For more information, see ConfigProvider Components.\n\n| Variable name                            | Default Value                                                                                                                  | Dark Mode Default                                                                                                          | Remarks                       |\n| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | -------------------------- |\n| --range-picker-shadow-color       | <div style=\"width: 150px; height: 30px; background-color: #000000; color: #ffffff;\">#000000</div>                       | <div style=\"width: 150px; height: 30px; background-color: #000000; color: #ffffff;\">#000000</div>                       | Range Selector Shadow Color         |\n| --range-picker-item-color         | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div>                       | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div>                       | Range Selector Item Color           |\n| --range-picker-active-color       | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div>                       | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div>                       | Range Selector Activity Color       |\n| --range-picker-placeholder-color  | <div style=\"width: 150px; height: 30px; background-color: #cccccc; color: #333333;\">#cccccc</div>                       | <div style=\"width: 150px; height: 30px; background-color: #474747; color: #ffffff;\">#474747</div>                       | Range selector placeholder color       |\n| --range-picker-shadow-color-faded | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.9); color: #ffffff;\">rgba(0, 0, 0, 0.9)</div> | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.9); color: #ffffff;\">rgba(0, 0, 0, 0.9)</div> | Range Selector Shadow Color (Faded) |\n"
  },
  {
    "path": "src/DatePicker/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-picker\": \"../Picker/index\"\n  }\n}\n"
  },
  {
    "path": "src/DatePicker/index.less",
    "content": "\n"
  },
  {
    "path": "src/DatePicker/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 数据录入\n  order: 10\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# DatePicker 时间选择器\n\n相比于原生 `my.datePicker`，实现了 iOS 与 Android 端体验一致。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-date-picker\": \"antd-mini/es/DatePicker/index\",\n  \"ant-range-picker\": \"antd-mini/es/DatePicker/RangePicker/index\"\n#endif\n#if WECHAT\n  \"ant-date-picker\": \"antd-mini/DatePicker/index\",\n  \"ant-range-picker\": \"antd-mini/DatePicker/RangePicker/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n> `defaultValue` 属性为`dayjs` 能够解析的时间戳或对象。\n\n```xml\n<ant-date-picker\n  min=\"{{min}}\"\n  max=\"{{max}}\"\n  defaultValue=\"{{defaultDate}}\"\n  placeholder=\"请选择\"\n#if ALIPAY\n  onPickerChange=\"handlePickerChange\"\n  onVisibleChange=\"handleTriggerPicker\"\n  onCancel=\"handleDismiss\"\n  onOk=\"handleOk\"\n#endif\n#if WECHAT\n  bindpickerchange=\"handlePickerChange\"\n  bindvisiblechange=\"handleTriggerPicker\"\n  bindcancel=\"handleDismiss\"\n  bindok=\"handleOk\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    min: new Date('2019/01/15').getTime(),\n    max: new Date('2023/08/20').getTime(),\n    defaultDate: new Date('2019/02/02').getTime(),\n  },\n  handlePickerChange(date, dateStr, e) {\n    console.log('onPickerChange', date, dateStr, e);\n  },\n  handleTriggerPicker(visible, e) {\n    console.log('onVisibleChange', visible, e);\n  },\n  handleDismiss(e) {\n    console.log('e', e);\n  },\n  handleOk(date, format, e) {\n    console.log('onOk', date, format, e);\n  },\n});\n```\n\n### 精度控制\n\n> `precision` 属性可以控制选择的时间精度。`format` 属性用来格式化展示的 `value` 值。\n\n```xml\n<ant-date-picker precision=\"year\" format=\"YYYY\"/>\n<ant-date-picker precision=\"month\" format=\"YYYY-MM\"/>\n<ant-date-picker precision=\"minute\" format=\"YYYY-MM-DD HH:mm\"/>\n```\n\n### 禁用状态\n\n> `disabled` 属性用来控制禁用状态。\n\n```xml\n<ant-date-picker defaultValue=\"{{defaultDate}}\" disabled />\n```\n\n### 自定义选择面板中每列的渲染\n\n> 传入函数 `onFormatLabel` ，返回值则是选择面板中每列想要渲染的数据\n\n```xml\n<ant-date-picker onFormatLabel=\"{{handleFormatLabel ? handleFormatLabel : 'handleFormatLabel'}}\" />\n```\n\n```js\nPage({\n  data: {\n#if WECHAT\n    handleFormatLabel(type, value) {\n      return String(value);\n    },\n#endif\n  },\n  handleFormatLabel(type, value) {\n    return String(value);\n  },\n});\n```\n\n### 受控模式\n\n> 控制选择的值，需要 `value` 属性和 `onOk` 事件配合使用。控制面板显示关闭状态，需要 `visible` 属性和 `onVisibleChange` 事件配合使用。\n\n```xml\n <ant-date-picker\n  visible=\"{{pickerVisible}}\"\n  value=\"{{pickerValue}}\"\n#if ALIPAY\n  onVisibleChange=\"handleTriggerControlledPicker\"\n  onOk=\"handleControlledOk\"\n#endif\n#if WECHAT\n  bindvisiblechange=\"handleTriggerControlledPicker\"\n  bindok=\"handleControlledOk\"\n#endif\n  />\n```\n\n```js\nPage({\n  data: {\n    pickerVisible: false,\n    pickerValue: new Date('2019/02/02').getTime(),\n  },\n\n  handlePickerChange(date, dateStr, e) {\n    console.log('onPickerChange', date, dateStr, e);\n  },\n  handleControlledOk(value) {\n#if WECHAT\n    this.setData({\n      // 微信只支持传递时间戳\n      pickerValue: value.detail.getTime(),\n    });\n#endif\n#if ALIPAY\n    this.setData({\n      pickerValue: value,\n    });\n#endif\n  },\n  handleTriggerControlledPicker(visible, e) {\n#if WECHAT\n    console.log('handleTriggerControlledPicker', visible);\n    this.setData({\n      pickerVisible: visible.detail,\n    });\n#endif\n#if ALIPAY\n    console.log('handleTriggerControlledPicker', visible, e);\n    this.setData({\n      pickerVisible: visible,\n    });\n#endif\n  },\n});\n```\n\n### 时间范围选择\n\n> 引入 `ant-range-picker` 组件，即可拥有时间范围选择能力。\n\n```xml\n<ant-range-picker\n  placeholder=\"请选择\"\n  defaultValue=\"{{defaultDateRange}}\"\n#if ALIPAY\n  onPickerChange=\"handlePickerRangeChange\"\n  onVisibleChange=\"handleTriggerPicker\"\n  onOk=\"handleRangeOk\"\n#endif\n#if WECHAT\n  bindpickerchange=\"handlePickerRangeChange\"\n  bindvisiblechange=\"handleTriggerPicker\"\n  bindok=\"handleRangeOk\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    defaultDateRange: [\n      new Date('2022/03/21').getTime(),\n      new Date('2022/05/20').getTime(),\n    ],\n  },\n  handlePickerRangeChange(type, date, dateStr, e) {\n    console.log('onPickerRangeChange', type, date, dateStr, e);\n  },\n  handleTriggerPicker(visible, e) {\n    console.log('onVisibleChange', visible, e);\n  },\n  handleRangeOk(date, format, e) {\n    console.log('onRangeOk', date, format, e);\n  },\n});\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/DatePicker/index'></code>\n\n## API\n\n### DatePicker\n\n| 属性                         | 说明                                                                                                                                                                                 | 类型                                                                                                           | 默认值       |\n| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------- | ------------ |\n| animationType                | 动画类型，可选 `transform` `position`，默认使用 `transform` 动画性能更好。由于小程序基础库 bug，弹窗内 `picker-view` 阴影样式在 iOS 下可能存在样式问题，可暂切换为 `position` 解决。 | string                                                                                                         | `transform`  |\n| className                    | 类名                                                                                                                                                                                 | string                                                                                                         | -            |\n| defaultValue                 | 默认选中的时间                                                                                                                                                                       | Date                                                                                                           | -            |\n| defaultPickerValue           | 设置用户选择日期时默认的时间                                                                                                                                                         | Date                                                                                                           | -            |\n| disabled                     | 是否禁用                                                                                                                                                                             | boolean                                                                                                        | false        |\n| readonly                     | 是否只读                                                                                                                                                                             | boolean                                                                                                        | false        |\n| cancelText                   | 取消文案                                                                                                                                                                             | string                                                                                                         | \"取消\"       |\n| content                      | 自定义内容插槽                                                                                                                                                                       | slot                                                                                                           | -            |\n| format                       | 时间格式化显示，格式同 [dayjs](https://day.js.org/docs/zh-CN/display/format)                                                                                                         | string                                                                                                         | 'YYYY/MM/DD' |\n| indicatorStyle               | 选中框样式                                                                                                                                                                           | string                                                                                                         | -            |\n| indicatorClassName           | 选中框的类名                                                                                                                                                                         | string                                                                                                         | -            |\n| maskClassName                | 蒙层的类名                                                                                                                                                                           | string                                                                                                         | -            |\n| maskClosable                 | 点击蒙层是否可以关闭                                                                                                                                                                 | boolean                                                                                                        | true         |\n| maskStyle                    | 蒙层样式                                                                                                                                                                             | string                                                                                                         | -            |\n| max                          | 最大值                                                                                                                                                                               | Date                                                                                                           | 十年后       |\n| min                          | 最小值                                                                                                                                                                               | Date                                                                                                           | 十年前       |\n| okText                       | 确认按钮文案                                                                                                                                                                         | string                                                                                                         | \"确定\"       |\n| placeholder                  | 提示文案                                                                                                                                                                             | string                                                                                                         | \"请选择\"     |\n| popClassName                 | 弹出框类名                                                                                                                                                                           | string                                                                                                         | -            |\n| popStyle                     | 弹出框样式                                                                                                                                                                           | string                                                                                                         | -            |\n| precision                    | 选择精度，可选 `year` `month` `day` `hour` `minute` `second`                                                                                                                         | string                                                                                                         | `day`        |\n| content-header                       | 弹窗内容顶部                                                                                                                                                                                 | slot                                                                                                                                   | -            |\n| style                        | 样式                                                                                                                                                                                 | string                                                                                                                                 | -            |\n| prefix                       | 前缀                                                                                                                                                                                 | slot                                                                                                           | -            |\n| style                        | 样式                                                                                                                                                                                 | string                                                                                                         | -            |\n| suffix                       | 后缀                                                                                                                                                                                 | slot                                                                                                           | -            |\n| title                        | 弹出框标题                                                                                                                                                                           | string \\| slot                                                                                                 | -            |\n| value                        | 选中的时间                                                                                                                                                                           | Date                                                                                                           | -            |\n| visible                      | 是否显示                                                                                                                                                                             | boolean                                                                                                        | false        |\n| defaultVisible               | 默认是否显示                                                                                                                                                                         | boolean                                                                                                        | false        |\n| onFormat                     | 选中值的文本显示格式                                                                                                                                                                 | (date: Date, dateStr: string) => string                                                                        | -            |\n| onFormatLabel                | 自定义每列展示的内容，默认添加年、月、日、时、分、秒单位                                                                                                                             | (type: `year` \\| `month` \\| `day` \\| `hour` \\| `minute` \\| `second`, value: number) => string                  | -            |\n| #if ALIPAY onOk              | 点击确定按钮，触发回调                                                                                                                                                               | (date: Date, dateStr: string, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -            |\n| #if ALIPAY onCancel          | 点击取消按钮/蒙层，触发回调                                                                                                                                                          | (event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                              | -            |\n| #if ALIPAY onPickerChange    | 选中项发生变化，触发回调                                                                                                                                                             | (date: Date, dateStr: string, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -            |\n| #if ALIPAY onVisibleChange   | 弹出框显示/隐藏状态变化触发                                                                                                                                                          | (visible: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void            | -            |\n| #if WECHAT bindok            | 点击确定按钮，触发回调                                                                                                                                                               | (date: Date, dateStr: string, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -            |\n| #if WECHAT bindcancel        | 点击取消按钮/蒙层，触发回调                                                                                                                                                          | (event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                              | -            |\n| #if WECHAT bindpickerchange  | 选中项发生变化，触发回调                                                                                                                                                             | (date: Date, dateStr: string, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -            |\n| #if WECHAT bindvisiblechange | 弹出框显示/隐藏状态变化触发                                                                                                                                                          | (visible: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void            | -            |\n\n### RangePicker\n\n| 属性                         | 说明                                                                                                                                                                                 | 类型                                                                                                                                   | 默认值       |\n| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | ------------ |\n| animationType                | 动画类型，可选 `transform` `position`，默认使用 `transform` 动画性能更好。由于小程序基础库 bug，弹窗内 `picker-view` 阴影样式在 iOS 下可能存在样式问题，可暂切换为 `position` 解决。 | string                                                                                                                                 | `transform`  |\n| className                    | 类名                                                                                                                                                                                 | string                                                                                                                                 | -            |\n| defaultValue                 | 默认选中的时间范围                                                                                                                                                                   | [Date, Date]                                                                                                                           | -            |\n| disabled                     | 是否禁用                                                                                                                                                                             | boolean                                                                                                                                | false        |\n| readonly                     | 是否只读                                                                                                                                                                             | boolean                                                                                                                                | false        |\n| cancelText                   | 取消文案                                                                                                                                                                             | string                                                                                                                                 | \"取消\"       |\n| content                      | 自定义内容插槽                                                                                                                                                                       | slot                                                                                                                                   | -            |\n| endPlaceholder               | 结束时间提示文案                                                                                                                                                                     | string                                                                                                                                 | \"未选择\"     |\n| format                       | 时间格式化显示，格式同 [dayjs](https://day.js.org/docs/zh-CN/display/format)                                                                                                         | string                                                                                                                                 | 'YYYY/MM/DD' |\n| indicatorStyle               | 选中框样式                                                                                                                                                                           | string                                                                                                                                 | -            |\n| indicatorClassName           | 选中框的类名                                                                                                                                                                         | string                                                                                                                                 | -            |\n| maskClassName                | 蒙层的类名                                                                                                                                                                           | string                                                                                                                                 | -            |\n| maskClosable                 | 点击蒙层是否可以关闭                                                                                                                                                                 | boolean                                                                                                                                | true         |\n| maskStyle                    | 蒙层样式                                                                                                                                                                             | string                                                                                                                                 | -            |\n| max                          | 最大值                                                                                                                                                                               | Date                                                                                                                                   | 十年后       |\n| min                          | 最小值                                                                                                                                                                               | Date                                                                                                                                   | 十年前       |\n| okText                       | 确认按钮文案                                                                                                                                                                         | string                                                                                                                                 | \"确定\"       |\n| placeholder                  | 提示文案                                                                                                                                                                             | string                                                                                                                                 | \"请选择\"     |\n| popClassName                 | 弹出框类名                                                                                                                                                                           | string                                                                                                                                 | -            |\n| popStyle                     | 弹出框样式                                                                                                                                                                           | string                                                                                                                                 | -            |\n| precision                    | 选择精度，可选 `year` `month` `day` `hour` `minute`                                                                                                                                  | string                                                                                                                                 | `day`        |\n| splitCharacter               | 显示连接符                                                                                                                                                                           | string                                                                                                                                 | -            |\n| startPlaceholder             | 开始时间提示文案                                                                                                                                                                     | string                                                                                                                                 | \"未选择\"     |\n| content-header                       | 弹窗内容顶部                                                                                                                                                                                 | slot                                                                                                                                   | -            |\n| style                        | 样式                                                                                                                                                                                 | string                                                                                                                                 | -            |\n| prefix                       | 前缀                                                                                                                                                                                 | slot                                                                                                                                   | -            |\n| style                        | 样式                                                                                                                                                                                 | string                                                                                                                                 | -            |\n| suffix                       | 后缀                                                                                                                                                                                 | slot                                                                                                                                   | -            |\n| title                        | 弹出框标题                                                                                                                                                                           | string \\| slot                                                                                                                         | -            |\n| value                        | 选中的时间范围                                                                                                                                                                       | [Date, Date]                                                                                                                           | -            |\n| visible                      | 是否显示                                                                                                                                                                             | boolean                                                                                                                                | false        |\n| defaultVisible               | 默认是否显示                                                                                                                                                                         | boolean                                                                                                                                | false        |\n| onFormat                     | 选中值的文本显示格式                                                                                                                                                                 | (date: [Date, Date], dateStr: [string, string]) => string                                                                              | -            |\n| onFormatLabel                | 自定义每列展示的内容，默认添加年、月、日、时、分、秒单位                                                                                                                             | (type: `year` \\| `month` \\| `day` \\| `hour` \\| `minute`, value: number) => string                                                      | -            |\n| #if ALIPAY onOk              | 点击确定按钮，触发回调                                                                                                                                                               | (date: [Date, Date], dateStr: [string, string], event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void       | -            |\n| #if ALIPAY onCancel          | 点击取消按钮/蒙层，触发回调                                                                                                                                                          | (event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                      | -            |\n| #if ALIPAY onPickerChange    | 选中项发生变化，触发回调                                                                                                                                                             | (type: `start` \\| `end`, date: Date, dateStr: string, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -            |\n| #if ALIPAY onVisibleChange   | 弹出框显示/隐藏状态变化触发                                                                                                                                                          | (visible: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                    | -            |\n| #if WECHAT bindok            | 点击确定按钮，触发回调                                                                                                                                                               | (date: [Date, Date], dateStr: [string, string], event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void       | -            |\n| #if WECHAT bindcancel        | 点击取消按钮/蒙层，触发回调                                                                                                                                                          | (event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                      | -            |\n| #if WECHAT bindpickerchange  | 选中项发生变化，触发回调                                                                                                                                                             | (type: `start` \\| `end`, date: Date, dateStr: string, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -            |\n| #if WECHAT bindvisiblechange | 弹出框显示/隐藏状态变化触发                                                                                                                                                          | (visible: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                    | -            |\n\n## 如何获取 `YYYY-MM-DD` 格式的时间\n\nDatePicker 组件返回的时间格式为 `Date` 类型，如果需要转换为 `YYYY-MM-DD` 格式，可以使用 [dayjs](https://day.js.org/docs/zh-CN/display/format) 进行转换。\n\n```xml\n<date-picker\n#if ALIPAY\n  onOk=\"handleOk\"\n#endif\n#if WECHAT\n  bindok=\"handleOk\"\n#endif\n/>\n```\n\n```javascript\nPage({\n  handleOk(date) {\n    const dateStr = dayjs(date).format('YYYY-MM-DD');\n    console.log(dateStr);\n  },\n});\n```\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                            | 默认值                                                                                                                  | 深色模式默认值                                                                                                          | 备注                       |\n| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | -------------------------- |\n| --range-picker-shadow-color       | <div style=\"width: 150px; height: 30px; background-color: #000000; color: #ffffff;\">#000000</div>                       | <div style=\"width: 150px; height: 30px; background-color: #000000; color: #ffffff;\">#000000</div>                       | 范围选择器阴影颜色         |\n| --range-picker-item-color         | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div>                       | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div>                       | 范围选择器项颜色           |\n| --range-picker-active-color       | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div>                       | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div>                       | 范围选择器活动项颜色       |\n| --range-picker-placeholder-color  | <div style=\"width: 150px; height: 30px; background-color: #cccccc; color: #333333;\">#cccccc</div>                       | <div style=\"width: 150px; height: 30px; background-color: #474747; color: #ffffff;\">#474747</div>                       | 范围选择器占位符颜色       |\n| --range-picker-shadow-color-faded | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.9); color: #ffffff;\">rgba(0, 0, 0, 0.9)</div> | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.9); color: #ffffff;\">rgba(0, 0, 0, 0.9)</div> | 范围选择器阴影颜色（褪色） |\n"
  },
  {
    "path": "src/DatePicker/index.ts",
    "content": "import dayjs from 'dayjs';\nimport equal from 'fast-deep-equal';\nimport mixinValue from '../mixins/value';\nimport { resolveEventValue, resolveEventValues } from '../_util/platform';\nimport {\n  Component,\n  getValueFromProps,\n  triggerEvent,\n  triggerEventOnly,\n  triggerEventValues,\n} from '../_util/simply';\nimport { assertAilpayNativeNotSupport } from '../_util/support';\nimport { DatePickerDefaultProps } from './props';\nimport {\n  getDateByValue,\n  getRangeData,\n  getValidValue,\n  getValueByDate,\n} from './util';\n\nassertAilpayNativeNotSupport('DatePicker');\n\nComponent({\n  props: DatePickerDefaultProps,\n  data: {\n    currentValue: [], // 当前picker选中值，didmount、弹窗打开、picker变化时更新\n    formattedValueText: '',\n    columns: [], // 可选项，didmound、弹窗打开、picker变化时更新\n    forceUpdate: 0, // 强制更新picker组件，已知需处理的情况：value超限，但是需要更新format，由于picker的参数均未变化，无法触发picker的渲染\n    visible: null,\n  },\n  pickerVisible: false,\n  methods: {\n    // visible受控判断\n    isVisibleControlled() {\n      /// #if ALIPAY\n      return 'visible' in getValueFromProps(this);\n      /// #endif\n      /// #if WECHAT\n      return getValueFromProps(this, 'visible') !== null;\n      /// #endif\n    },\n    // 当前选中的picker值，处理无cValue时的情况，优先取当前时间，不在时间范围内取开始时间\n    getCurrentValueWithCValue(currentProps) {\n      const realValue = this.getValue();\n      const { min, max, precision, defaultPickerValue } = currentProps;\n      if (realValue) {\n        return getValueByDate(realValue, precision);\n      }\n      // 处理默认值\n      let baseDate: Date | null = null;\n      if (defaultPickerValue) {\n        try {\n          // 判断defaultPickerValue用户配置格式\n          let defaultDate = dayjs(defaultPickerValue, [\n            'YYYY-MM-DD',\n            'YYYY/MM/DD',\n            'HH:mm:ss',\n            'HH:mm',\n            'HH',\n          ]);\n          if (\n            !defaultDate.isValid() &&\n            typeof defaultPickerValue === 'string' &&\n            defaultPickerValue.includes(':')\n          ) {\n            const [hours, minutes, seconds] = defaultPickerValue\n              .split(':')\n              .map(Number);\n            const now = dayjs();\n            defaultDate = now\n              .set('hour', hours || 0)\n              .set('minute', minutes || 0)\n              .set('second', seconds || 0);\n          }\n          baseDate = defaultDate.isValid() ? defaultDate.toDate() : new Date();\n        } catch (e) {\n          baseDate = new Date();\n        }\n      } else {\n        // 没有 defaultPickerValue 时，回退原逻辑\n        const now = new Date();\n        const minDayjs = this.getMin(min);\n        const maxDayjs = this.getMax(max);\n        if (dayjs(now).isBefore(minDayjs) || dayjs(now).isAfter(maxDayjs)) {\n          baseDate = minDayjs.toDate();\n        } else {\n          baseDate = now;\n        }\n      }\n\n      // 获取最大最小日期\n      const minDayjs = this.getMin(min);\n      const maxDayjs = this.getMax(max);\n\n      // 校验日期\n      let adjustedDate = dayjs(baseDate);\n      // 强制对齐\n      if (adjustedDate.isBefore(minDayjs)) {\n        adjustedDate = minDayjs;\n      } else if (adjustedDate.isAfter(maxDayjs)) {\n        adjustedDate = maxDayjs;\n      }\n\n      return getValueByDate(adjustedDate.toDate(), precision);\n    },\n\n    getMin(min) {\n      return min ? dayjs(min as any) : dayjs().subtract(10, 'year');\n    },\n\n    getMax(max) {\n      return max ? dayjs(max as any) : dayjs().add(10, 'year');\n    },\n    /**\n     * didUpdate、弹窗打开触发\n     */\n    setCurrentValue(currentProps) {\n      const currentValue = this.getCurrentValueWithCValue(currentProps);\n      const newColumns = this.generateData(currentValue, currentProps);\n      if (!equal(newColumns, this.data.columns)) {\n        this.setData(\n          {\n            columns: newColumns,\n          },\n          () => {\n            this.setData({\n              currentValue,\n              formattedValueText: this.onFormat(),\n            });\n          }\n        );\n        return;\n      }\n      this.setData({\n        currentValue,\n        formattedValueText: this.onFormat(),\n      });\n    },\n\n    // 生成选项数据，didmound、picker change、打开弹窗触发\n    generateData(currentValue, currentProps) {\n      const { precision, min: propsMin, max: propsMax } = currentProps;\n      const min = this.getMin(propsMin);\n      const max = this.getMax(propsMax);\n      if (max < min) {\n        return [];\n      }\n      let currentPickerDay = dayjs();\n      if (currentValue.length > 0) {\n        currentPickerDay = dayjs(getDateByValue(currentValue));\n      }\n      if (currentPickerDay < min || currentPickerDay > max) {\n        currentPickerDay = min;\n      }\n      const newColumns = getRangeData(\n        precision,\n        min,\n        max,\n        currentPickerDay,\n        this.onFormatLabel.bind(this)\n      );\n      return newColumns;\n    },\n    onFormatLabel(type, value) {\n      const onFormatLabel = getValueFromProps(this, 'onFormatLabel');\n      const formatValueByProps = onFormatLabel && onFormatLabel(type, value);\n      if (formatValueByProps !== undefined && formatValueByProps !== null) {\n        return String(formatValueByProps);\n      }\n      return this.defaultFormatLabel(type, value);\n    },\n    defaultFormatLabel(type, value) {\n      const suffixMap = {\n        year: '年',\n        month: '月',\n        day: '日',\n        hour: '时',\n        minute: '分',\n        second: '秒',\n      };\n      return `${value}${suffixMap[type]}`;\n    },\n    onChange(selectedIdx) {\n      const [pmin, pmax, format, precision] = getValueFromProps(this, [\n        'min',\n        'max',\n        'format',\n        'precision',\n      ]);\n      let [selectedIndex] = resolveEventValues(getValidValue(selectedIdx));\n      let date = getDateByValue(selectedIndex);\n      const min = this.getMin(pmin);\n      const max = this.getMax(pmax);\n      if (dayjs(date).isBefore(min)) {\n        date = min.toDate();\n        selectedIndex = getValueByDate(date, precision);\n      }\n      if (dayjs(date).isAfter(max)) {\n        date = max.toDate();\n        selectedIndex = getValueByDate(date, precision);\n      }\n      const newColumns = this.generateData(\n        selectedIndex,\n        getValueFromProps(this)\n      );\n\n      if (!equal(newColumns, this.data.columns)) {\n        this.setData(\n          {\n            columns: newColumns,\n          },\n          () => {\n            this.setData({ currentValue: selectedIndex });\n            const date = getDateByValue(selectedIndex);\n            triggerEventValues(this, 'pickerChange', [\n              date,\n              dayjs(date).format(format),\n            ]);\n          }\n        );\n      } else {\n        this.setData({ currentValue: selectedIndex });\n        const date = getDateByValue(selectedIndex);\n\n        triggerEventValues(this, 'pickerChange', [\n          date,\n          dayjs(date).format(format),\n        ]);\n      }\n    },\n\n    onCancel(e) {\n      triggerEventOnly(this, 'cancel', e);\n    },\n\n    onOk() {\n      const { currentValue } = this.data;\n      const format = getValueFromProps(this, 'format');\n      const date = getDateByValue(currentValue);\n      if (!this.isControlled()) {\n        this.update(date);\n      }\n      triggerEventValues(this, 'ok', [date, dayjs(date).format(format)]);\n    },\n    defaultFormat(value, valueStr) {\n      const format = getValueFromProps(this, 'format');\n      if (format && valueStr) {\n        return valueStr;\n      }\n      return '';\n    },\n    onFormat() {\n      const [format, onFormat] = getValueFromProps(this, [\n        'format',\n        'onFormat',\n      ]);\n      const realValue = this.getValue();\n      const formatValueByProps =\n        onFormat &&\n        onFormat(realValue, realValue ? dayjs(realValue).format(format) : null);\n      if (formatValueByProps !== undefined && formatValueByProps !== null) {\n        return formatValueByProps;\n      }\n      return this.defaultFormat(\n        realValue,\n        realValue ? dayjs(realValue).format(format) : null\n      );\n    },\n\n    onVisibleChange(visible) {\n      this.pickerVisible = visible;\n      if (!this.isVisibleControlled() && visible) {\n        this.setCurrentValue(getValueFromProps(this));\n      }\n      triggerEvent(this, 'visibleChange', resolveEventValue(visible));\n    },\n  },\n\n  mixins: [\n    mixinValue({\n      transformValue(value) {\n        return {\n          value: value ? dayjs(value).toDate() : undefined,\n          needUpdate: true,\n        };\n      },\n    }),\n  ],\n\n  /// #if ALIPAY\n  onInit() {\n    this.pickerVisible = false;\n    const [visible, defaultVisible] = getValueFromProps(this, [\n      'visible',\n      'defaultVisible',\n    ]);\n    this.setData({\n      visible: this.isVisibleControlled() ? visible : defaultVisible,\n      formattedValueText: this.onFormat(),\n    });\n  },\n  didUpdate(prevProps, prevData) {\n    const currentProps = getValueFromProps(this);\n    const visible = getValueFromProps(this, 'visible');\n    if (this.isVisibleControlled() && !equal(prevProps.visible, visible)) {\n      this.pickerVisible = visible;\n      this.setData({ visible });\n      if (this.pickerVisible) {\n        this.setCurrentValue(currentProps);\n      }\n    }\n    if (!this.isEqualValue(prevData)) {\n      this.setData({\n        forceUpdate: this.data.forceUpdate + 1,\n        formattedValueText: this.onFormat(),\n      });\n      // 展开状态才更新picker的数据，否则下次triggerVisible触发\n      if (this.pickerVisible) {\n        this.setCurrentValue(currentProps);\n      }\n    }\n    if (!equal(currentProps, prevProps)) {\n      if (this.pickerVisible) {\n        this.setCurrentValue(currentProps);\n      }\n    }\n  },\n  /// #endif\n  /// #if WECHAT\n  created() {\n    this.pickerVisible = false;\n    const [visible, defaultVisible] = getValueFromProps(this, [\n      'visible',\n      'defaultVisible',\n    ]);\n    this.setData({\n      visible: this.isVisibleControlled() ? visible : defaultVisible,\n      formattedValueText: this.onFormat(),\n    });\n  },\n  observers: {\n    '**': function (data) {\n      const prevData = this._prevData || this.data;\n      this._prevData = { ...data };\n      if (!equal(prevData, data)) {\n        if (this.pickerVisible) {\n          this.setCurrentValue(getValueFromProps(this));\n        }\n      }\n    },\n    'mixin.value': function () {\n      this.setData({\n        forceUpdate: this.data.forceUpdate + 1,\n        formattedValueText: this.onFormat(),\n      });\n      // 展开状态才更新picker的数据，否则下次triggerVisible触发\n      if (this.pickerVisible) {\n        this.setCurrentValue(getValueFromProps(this));\n      }\n    },\n    'visible': function (data) {\n      const prevVisible = this._prevVisible;\n      this._prevVisible = data;\n      const currentProps = getValueFromProps(this);\n      const visible = getValueFromProps(this, 'visible');\n      if (this.isVisibleControlled() && prevVisible !== visible) {\n        this.pickerVisible = visible;\n        this.setData({\n          visible,\n        });\n        if (this.pickerVisible) {\n          this.setCurrentValue(currentProps);\n        }\n      }\n    },\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/DatePicker/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\nexport type PickerValue = Date | string | number;\n/**\n * @description 对话框\n */\nexport interface IDatePickerProps extends IBaseProps {\n  visible?: boolean;\n  defaultVisible?: boolean;\n  /**\n   * @desciption  动画类型\n   * @default \"transform\"\n   */\n  animationType?: 'transform' | 'position';\n  /**\n   * @description 时间格式化显示，例如YYYY-MM-DD\n   */\n  format?: string;\n  /**\n   * @description 最小值\n   * @default 十年前\n   */\n  min?: PickerValue;\n  /**\n   * @description 最大值\n   * @default 十年后\n   */\n  max?: PickerValue;\n  /**\n   * @description 当前数据\n   */\n  value?: PickerValue;\n  /**\n   * @description 默认值\n   */\n  defaultValue?: PickerValue;\n  /**\n   * @description 标题\n   */\n  title?: string;\n  /**\n   * @description 确定按钮文案\n   * @default \"确定\"\n   */\n  okText?: string;\n  /**\n   * @description 取消文案\n   * @default \"取消\"\n   */\n  cancelText?: string;\n  /**\n   * @description 提示文案\n   * @default '请选择'\n   */\n  placeholder?: string;\n  /**\n   * @description 精度\n   * @default 'day'\n   */\n  precision: 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second';\n  // | 'week'\n  // | 'week-day';\n\n  /**\n   * @description 点击蒙层是否可以关闭\n   * @default false\n   */\n  maskClosable?: boolean;\n  /**\n   * @description 弹出框类名\n   */\n  popClassName?: string;\n\n  /**\n   * @description 弹出框样式\n   */\n  popStyle?: string;\n  /**\n   * @description 是否禁用\n   */\n  disabled?: boolean;\n  /**\n   * @description 是否只读\n   */\n  readonly?: boolean;\n  /**\n   *@description 选中框样式\n   * 版本要求： 支付宝小程序基础库 1.10.0 及以上\n   */\n  indicatorStyle?: string;\n\n  /**\n   *@description 选中框类名\n   * 版本要求： 支付宝小程序基础库 1.10.0 及以上\n   */\n  indicatorClassName?: string;\n\n  /**\n   * @description 蒙层的样式。\n   * 版本要求： 支付宝小程序基础库 1.10.0 及以上\n   */\n  maskStyle?: string;\n\n  /**\n   * @description 蒙层的类名。\n   * 版本要求： 支付宝小程序基础库 1.10.0 及以上\n   */\n  maskClassName?: string;\n  /**\n   * @description 点击确认回调\n   */\n  onOk?: (date: PickerValue, dateStr: string, e: Record<string, any>) => void;\n  /**\n   * @description 点击取消回调\n   */\n  onCancel?: (e: Record<string, any>) => void;\n  /**\n   * @description 发生滚动即触发， 与 onChange 点击 ok 后触发不同\n   */\n  onPickerChange?: (\n    date: PickerValue,\n    dateStr: string,\n    e: Record<string, any>\n  ) => void;\n  /**\n   * @description 选中值的文本显示格式\n   */\n  onFormat?: (date: PickerValue, dateStr: string) => string;\n  /**\n   * @description 切换显示隐藏\n   */\n  onVisibleChange?: (visible, e: Record<string, any>) => void;\n  /**\n   * 自定义每列展示的内容\n   * @param type\n   * @param value\n   */\n  onFormatLabel?(\n    type: 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second',\n    value: number\n  ): string;\n  /**\n   * @description 用户选择日期时的默认时分秒\n   */\n  defaultPickerValue?: PickerValue;\n}\n\nexport const DatePickerDefaultProps: IDatePickerProps = {\n  visible: null,\n  defaultVisible: null,\n  animationType: 'transform',\n  format: 'YYYY/MM/DD',\n  min: null,\n  max: null,\n  value: null,\n  defaultValue: null,\n  title: '',\n  okText: undefined,\n  cancelText: undefined,\n  placeholder: undefined,\n  precision: 'day',\n  maskClosable: true,\n  popClassName: '',\n  popStyle: '',\n  disabled: false,\n  readonly: false,\n  onFormatLabel: null,\n  onFormat: null,\n  defaultPickerValue: null,\n};\n"
  },
  {
    "path": "src/DatePicker/util.ts",
    "content": "import dayjs, { Dayjs } from 'dayjs';\n\nfunction getArray(start, end, format) {\n  const res = [];\n  for (let i = 0; i < end - start + 1; i++) {\n    res.push({ label: format(start + i), value: start + i });\n  }\n  return res;\n}\n\nconst precisionLengthRecord = {\n  year: 1,\n  month: 2,\n  day: 3,\n  hour: 4,\n  minute: 5,\n  second: 6,\n};\n\nfunction getYears(min: Dayjs, max: Dayjs, format) {\n  return getArray(min.year(), max.year(), format.bind(this, 'year'));\n}\n\nfunction getMonths(min: Dayjs, max: Dayjs, currentPicker: Dayjs, format) {\n  let start = 1;\n  let end = 12;\n  if (\n    currentPicker\n      .clone()\n      .set('month', start - 1)\n      .isBefore(min)\n  ) {\n    start = min.month() + 1;\n  }\n  if (\n    currentPicker\n      .clone()\n      .set('month', end - 1)\n      .isAfter(max)\n  ) {\n    end = max.month() + 1;\n  }\n\n  return getArray(start, end, format.bind(this, 'month'));\n}\n\nfunction getDates(min: Dayjs, max: Dayjs, currentPicker: Dayjs, format) {\n  let start = 1;\n  let end = currentPicker.daysInMonth();\n  if (currentPicker.clone().set('date', start).isBefore(min)) {\n    start = min.date();\n  }\n  if (currentPicker.clone().set('date', end).isAfter(max)) {\n    end = max.date();\n  }\n  return getArray(start, end, format.bind(this, 'day'));\n}\n\nfunction getHours(min: Dayjs, max: Dayjs, currentPicker: Dayjs, format) {\n  let start = 0;\n  let end = 23;\n  if (currentPicker.clone().set('hour', start).isBefore(min)) {\n    start = min.hour();\n  }\n  if (currentPicker.clone().set('hour', end).isAfter(max)) {\n    end = max.hour();\n  }\n  return getArray(start, end, format.bind(this, 'hour'));\n}\nfunction getMinutes(min: Dayjs, max: Dayjs, currentPicker: Dayjs, format) {\n  let start = 0;\n  let end = 59;\n  if (currentPicker.clone().set('minute', start).isBefore(min)) {\n    start = min.minute();\n  }\n  if (currentPicker.clone().set('minute', end).isAfter(max)) {\n    end = max.minute();\n  }\n  return getArray(start, end, format.bind(this, 'minute'));\n}\nfunction getSeconds(min: Dayjs, max: Dayjs, currentPicker: Dayjs, format) {\n  let start = 0;\n  let end = 59;\n  if (currentPicker.clone().set('second', start).isBefore(min)) {\n    start = min.second();\n  }\n  if (currentPicker.clone().set('second', end).isAfter(max)) {\n    end = max.second();\n  }\n  return getArray(start, end, format.bind(this, 'second'));\n}\nexport function getRangeData(\n  precision: keyof typeof precisionLengthRecord,\n  min: Dayjs,\n  max: Dayjs,\n  currentPickerDay: Dayjs,\n  format: (\n    precision: keyof typeof precisionLengthRecord,\n    value: number\n  ) => string\n) {\n  const data = [];\n  const len = precisionLengthRecord[precision];\n  if (!len) return [];\n  for (let i = 0; i < len; i++) {\n    switch (i) {\n      case 0:\n        data.push(getYears(min, max, format));\n        break;\n      case 1:\n        data.push(getMonths(min, max, currentPickerDay, format));\n        break;\n      case 2:\n        data.push(getDates(min, max, currentPickerDay, format));\n        break;\n      case 3:\n        data.push(getHours(min, max, currentPickerDay, format));\n        break;\n      case 4:\n        data.push(getMinutes(min, max, currentPickerDay, format));\n        break;\n      case 5:\n        data.push(getSeconds(min, max, currentPickerDay, format));\n        break;\n    }\n  }\n  return data;\n}\n\n/**\n * 选中的值转换为时间类型，主要处理month从0开始的情况\n * @param value\n * @returns\n */\nexport function getDateByValue(value) {\n  //@ts-ignore\n  return new Date(...value.map((v, i) => String(i === 1 ? v - 1 : v)));\n}\n\n/**\n * date转换为value数组\n * @param value\n * @returns\n */\nexport function getValueByDate(\n  date,\n  precision: keyof typeof precisionLengthRecord\n) {\n  const fields = [\n    'getFullYear',\n    'getMonth',\n    'getDate',\n    'getHours',\n    'getMinutes',\n    'getSeconds',\n  ];\n  const value = [];\n  if (!date) return value;\n  for (let i = 0; i < precisionLengthRecord[precision]; i++) {\n    value.push(date[fields[i]]());\n    if (i === 1) {\n      value[1] = value[1] + 1;\n    }\n  }\n  return value;\n}\n\n/**\n * 是否有效日期，主要处理月份对应可选日期，避免当前时间日期超出当月最后一天\n * @param value\n */\nexport function getValidValue(value) {\n  if (value.length > 2) {\n    const maxDate = new Date(value[0], value[1], 0).getDate();\n    if (value[2] > maxDate) {\n      value = value.slice();\n      value[2] = maxDate;\n    }\n  }\n  return value;\n}\n\n/**\n * 比较两个date是否是同一时间\n * @param date1\n * @param date2\n */\nexport function isEqualDate(date1, date2) {\n  if (date1 instanceof Date && date2 instanceof Date) {\n    return dayjs(date1).isSame(date2);\n  }\n  return date1 === date2;\n}\n"
  },
  {
    "path": "src/DatePicker/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n// range-picker| shadow color\n@range-picker-shadow-color: var(\n  --range-picker-shadow-color,\n  @COLOR_BLACK_CHANGE\n);\n// item的字体颜色\n@range-picker-item-color: var(--range-picker-item-color, @COLOR_TEXT_PRIMARY);\n// active 的字体颜色\n@range-picker-active-color: var(--range-picker-active-color, @COLOR_BRAND1);\n// placeholder 的字体颜色\n@range-picker-placeholder-color: var(\n  --range-picker-placeholder-color,\n  @COLOR_TEXT_WEAK\n);\n\n@range-picker-shadow-color-faded: var(\n  --range-picker-shadow-color-faded,\n  @COLOR_BLACK_FADED_10\n);\n"
  },
  {
    "path": "src/Dialog/index.axml",
    "content": "<import-sjs\n  from=\"./index.sjs\"\n  name=\"utils\" />\n\n<ant-popup\n  className=\"ant-dialog {{ className || '' }}\"\n  style=\"{{ style || '' }}\"\n  maskClassName=\"{{ maskClassName }}\"\n  maskStyle=\"{{ maskStyle }}\"\n  visible=\"{{ visible }}\"\n  duration=\"{{ duration }}\"\n  position=\"center\"\n  animation=\"{{ animation }}\"\n  zIndex=\"{{ zIndex }}\"\n  destroyOnClose=\"{{ destroyOnClose }}\"\n  onClose=\"onMaskClose\">\n  <slot name=\"dialog-top\" />\n  <!-- #if ALIPAY -->\n  <slot>\n  <!-- #endif -->\n    <view\n      class=\"ant-dialog-body {{ bodyClassName || '' }}\"\n      style=\"{{ bodyStyle || '' }}\">\n      <slot name=\"header\" />\n      <image a:if=\"{{ headerImage }}\" class=\"ant-dialog-body-header\" mode=\"widthFix\" src=\"{{ headerImage }}\" />\n      <!-- #if WECHAT -->\n      <view\n        wx:if=\"{{ title }}\"\n        class=\"ant-dialog-body-title\">\n        {{ title }}\n      </view>\n      <slot\n        wx:else\n        name=\"title\" />\n      <!-- #endif -->\n      <!-- #if ALIPAY -->\n      <slot name=\"title\">\n        <view\n          a:if=\"{{ title }}\"\n          class=\"ant-dialog-body-title\">\n          {{ title }}\n        </view>\n      </slot>\n      <!-- #endif -->\n\n      <!-- #if WECHAT -->\n      <view\n        wx:if=\"{{ content }}\"\n        class=\"ant-dialog-body-content\">\n        {{ content }}\n      </view>\n      <slot\n        wx:else\n        name=\"content\" />\n      <!-- #endif -->\n      <!-- #if ALIPAY -->\n      <slot name=\"content\">\n        <view\n          a:if=\"{{ content }}\"\n          class=\"ant-dialog-body-content\">\n          {{ content }}\n        </view>\n      </slot>\n      <slot name=\"content-extra\" />\n      <!-- #endif -->\n      <!-- #if ALIPAY -->\n      <slot name=\"footer\">\n      <!-- #endif -->\n        <view class=\"ant-dialog-body-footer ant-dialog-body-footer-{{ footer.layout || 'vertical' }}\">\n          <view\n            a:for=\"{{ footer.buttons }}\"\n            a:key=\"id\"\n            data-item=\"{{ item }}\"\n            onTap=\"onButtonTap\"\n            class=\"ant-dialog-body-footer-button\"\n            style=\"flex: 1;\"\n          >\n            <ant-button\n              disabled=\"{{ item.disabled }}\"\n              danger=\"{{ item.danger }}\"\n              icon=\"{{ item.icon }}\"\n              size=\"{{ item.size }}\"\n              style=\"{{ item.style }}\"\n              activeClassName=\"{{ item.activeClassName }}\"\n              className=\"{{ item.className }}\"\n              type=\"{{ item.type || 'primary' }}\"\n            >\n              {{ item.text }}\n            </ant-button>\n          </view>\n        </view>\n      <!-- #if ALIPAY -->\n      </slot>\n      <!-- #endif -->\n    </view>\n  <!-- #if ALIPAY -->\n  </slot>\n  <!-- #endif -->\n\n  <ant-icon\n    a:if=\"{{ closable }}\"\n    type=\"CloseCircleOutline\"\n    onTap=\"onClose\"\n    className=\"ant-dialog-close\" />\n</ant-popup>\n"
  },
  {
    "path": "src/Dialog/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Feedback\n  order: 12\ntoc: 'content'\n---\n\n# Dialog\n\nWhen the application needs to alert or remind the current operation behavior of the user, the dialog box may be used. The user needs to operate on the dialog box before ending.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-dialog\": \"antd-mini/es/Dialog/index\"\n#endif\n#if WECHAT\n  \"ant-dialog\": \"antd-mini/Dialog/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<ant-dialog\n  content=\"人In天边月上明\"\n  visible=\"{{visible}}\"\n  closable=\"{{false}}\"\n  footer=\"{{footer}}\"\n  primaryButtonText=\"我知道了\"\n#if ALIPAY\n  onButtonTap=\"onButtonTap\"\n  onClose=\"handleClose\"\n#endif\n#if WECHAT\n  bindbuttontap=\"onButtonTap\"\n  bindclose=\"handleClose\"\n#endif\n  />\n```\n\n```js\nPage({\n  data: {\n    visible: false,\n    footer: {\n      buttons: [{ text: '我知道了' }],\n    },\n  },\n  onButtonTap(buttonItem) {\n    console.log('点击的按钮: ', buttonItem);\n#if ALIPAY\n    my.showToast({ content: `点击了${buttonItem.text}`, duration: 1000 });\n#endif\n#if WECHAT\n    wx.showToast({ title: `点击了${buttonItem.text}` });\n#endif\n    this.handleClose();\n  },\n  handleClose() {\n    this.setData({\n      visible: false,\n    });\n  },\n});\n```\n\n### Multiple Action Points\n\n> `footer` property supports the passing in of multiple action points, and you can specify `layout` For `vertical`or`horizontal`That is, the horizontal and vertical layout of the action point.\n\n```xml\n<ant-dialog\n  title=\"确定删除吗？\"\n  content=\"删除后无法恢复\"\n  visible=\"{{true}}\"\n  footer=\"{{horizontalFooter}}\"\n/>\n```\n\n```js\nPage({\n  data: {\n    // 横向布局\n    horizontalFooter: {\n      buttons: [\n        { text: '取消', type: 'default' },\n        { text: '确定', type: 'primary' },\n      ],\n      layout: 'horizontal',\n    },\n    // 纵向布局\n    verticalFooter: {\n      buttons: [\n        { text: '主按钮', type: 'primary' },\n        { text: '更多', type: 'default' },\n        { text: '取消', type: 'text' },\n      ],\n    },\n  },\n});\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Dialog/index'></code>\n\n## API\n\n| Property                         | Description                                              | Type         | Default Value |\n| ---------------------------- | ------------------------------------------------- | ------------ | ------ |\n| bodyClassName                | body class name                                         | string       | -      |\n| bodyStyle                    | body style                                         | string       | -      |\n| cancelButtonStyle            | Cancel Button Style                                      | string       | -      |\n| cancelButtonText             | Cancel Button Text                                      | string       | -      |\n| className                    | Class Name                                              | string       | -      |\n| closable                     | Whether to display the close button in the upper right corner. Effective only when type is focus | boolean      | -      |\n| content                      | Content                                              | string\\|slot | -      |\n| destroyOnClose               | Whether to unload content when invisible                              | boolean      | false  |\n| footer                       | Custom Button Area                                      | slot         | -      |\n| maskClosable                 | Click whether the mask triggers onClose                          | boolean      | true   |\n| maskClassName                | Class name of the layer                                        | string       | -      |\n| maskStyle                    | Mask Style                                        | string       | -      |\n| style                        | Style                                              | string       | -      |\n| title                        | Title                                              | string\\|slot | -      |\n| visible                      | Whether to display                                          | boolean      | false  |\n| #if ALIPAY onCancelButtonTap | Cancel button click event                                  | ()=>void     | -      |\n| #if ALIPAY onClose           | Click the close button in the upper right corner in the layer or emphasis mode to trigger the callback  | ()=>void     | -      |\n| #if ALIPAY onButtonTap       | Behavior button click event                                  | ()=>void     | -      |\n| #if WECHAT bindclose        | Click the close button in the upper right corner in the layer or emphasis mode to trigger the callback  | ()=>void     | -      |\n| #if WECHAT bindbuttontap    | Behavior button click event                                  | ()=>void     | -      |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For more information, see ConfigProvider Components.\n\n| Variable name                    | Default Value                                                                                            | Dark Mode Default                                                                                    | Remarks                   |\n| ------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------------- |\n| --dialog-background-color | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | Modal Box Background Color         |\n| --dialog-title-color      | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | Modal Box Title Color         |\n| --dialog-content-color    | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | Modal Box Content Color         |\n| --dialog-close-text-color | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | Modal Box Close Button Text Color |\n"
  },
  {
    "path": "src/Dialog/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-button\": \"../Button/index\",\n    \"ant-icon\": \"../Icon/index\",\n    \"ant-popup\": \"../Popup/index\"\n  }\n}\n"
  },
  {
    "path": "src/Dialog/index.less",
    "content": "@import (reference) './variable.less';\n@import (reference) '../style/mixins/hairline.less';\n\n@modalPrefix: ant-dialog;\n\n.@{modalPrefix} {\n  &-body {\n    width: 560 * @rpx;\n    background-color: @dialog-background-color;\n    padding: 48 * @rpx 44 * @rpx;\n    display: flex;\n    flex-direction: column;\n    border-radius: 48 * @rpx;\n    &-header {\n      display: block;\n      width: calc(100% + @dialog-header-padding);\n      border-top-left-radius: 48 * @rpx;\n      border-top-right-radius: 48 * @rpx;\n      margin: -48 * @rpx -44 * @rpx 36 * @rpx -44 * @rpx;\n      /// #if ALIPAY\n      margin: -64 * @rpx -44 * @rpx 24 * @rpx -44 * @rpx;\n      /// #endif\n    }\n    &-title {\n      line-height: 56 * @rpx;\n      text-align: center;\n      color: @dialog-title-color;\n      padding-bottom: 32 * @rpx;\n\n      font-weight: 500;\n      font-size: 40 * @rpx;\n    }\n\n    &-content {\n      line-height: 42 * @rpx;\n      padding-bottom: 24 * @rpx;\n      font-size: 32 * @rpx;\n      color: @dialog-content-color;\n      text-align: center;\n    }\n    &-footer {\n      padding: 48 * @rpx 4 * @rpx 0 4 * @rpx;\n      &-vertical {\n        display: flex;\n        justify-content: flex-start;\n        align-items: center;\n        flex-direction: column;\n        .ant-dialog-body-footer-button {\n          width: 100%;\n          margin-bottom: 24 * @rpx;\n          &:last-child {\n            margin-bottom: 0;\n          }\n        }\n      }\n      &-horizontal {\n        display: flex;\n        justify-content: flex-start;\n        align-items: center;\n        flex-direction: row;\n        .ant-dialog-body-footer-button {\n          flex: 1;\n          margin-right: 24 * @rpx;\n          &:last-child {\n            margin-right: 0;\n          }\n        }\n      }\n    }\n  }\n  &-close {\n    top: 72rpx;\n    position: relative;\n    left: 50%;\n    margin-left: -30 * @rpx;\n    z-index: 3;\n    width: 60 * @rpx;\n    height: 60 * @rpx;\n    font-size: 72 * @rpx;\n    color: @dialog-close-text-color;\n  }\n  .ant-popup-content.ant-popup-center {\n    min-height: 0;\n    padding: 0;\n  }\n}\n"
  },
  {
    "path": "src/Dialog/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 反馈引导\n  order: 12\ntoc: 'content'\n---\n\n# Dialog 对话框\n\n当应用中需要比较明显的对用户当前的操作行为进行警示或提醒时，可以使用对话框。用户需要针对对话框进行操作后方可结束。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-dialog\": \"antd-mini/es/Dialog/index\"\n#endif\n#if WECHAT\n  \"ant-dialog\": \"antd-mini/Dialog/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-dialog\n  content=\"人在天边月上明\"\n  visible=\"{{visible}}\"\n  closable=\"{{false}}\"\n  footer=\"{{footer}}\"\n  primaryButtonText=\"我知道了\"\n#if ALIPAY\n  onButtonTap=\"onButtonTap\"\n  onClose=\"handleClose\"\n#endif\n#if WECHAT\n  bindbuttontap=\"onButtonTap\"\n  bindclose=\"handleClose\"\n#endif\n  />\n```\n\n```js\nPage({\n  data: {\n    visible: false,\n    footer: {\n      buttons: [{ text: '我知道了' }],\n    },\n  },\n  onButtonTap(buttonItem) {\n    console.log('点击的按钮: ', buttonItem);\n#if ALIPAY\n    my.showToast({ content: `点击了${buttonItem.text}`, duration: 1000 });\n#endif\n#if WECHAT\n    wx.showToast({ title: `点击了${buttonItem.text}` });\n#endif\n    this.handleClose();\n  },\n  handleClose() {\n    this.setData({\n      visible: false,\n    });\n  },\n});\n```\n\n### 多行动点\n\n> `footer` 属性支持传入多个行动点，并且可以指定 `layout` 为 `vertical`或`horizontal`，即行动点横向、纵向布局。\n\n```xml\n<ant-dialog\n  title=\"确定删除吗？\"\n  content=\"删除后无法恢复\"\n  visible=\"{{true}}\"\n  footer=\"{{horizontalFooter}}\"\n/>\n```\n\n```js\nPage({\n  data: {\n    // 横向布局\n    horizontalFooter: {\n      buttons: [\n        { text: '取消', type: 'default' },\n        { text: '确定', type: 'primary' },\n      ],\n      layout: 'horizontal',\n    },\n    // 纵向布局\n    verticalFooter: {\n      buttons: [\n        { text: '主按钮', type: 'primary' },\n        { text: '更多', type: 'default' },\n        { text: '取消', type: 'text' },\n      ],\n    },\n  },\n});\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Dialog/index'></code>\n\n## API\n\n| 属性                         | 说明                                              | 类型         | 默认值 |\n| ---------------------------- | ------------------------------------------------- | ------------ | ------ |\n| bodyClassName                | body 类名                                         | string       | -      |\n| bodyStyle                    | body 样式                                         | string       | -      |\n| cancelButtonStyle            | 取消按钮样式                                      | string       | -      |\n| cancelButtonText             | 取消按钮文本                                      | string       | -      |\n| className                    | 类名                                              | string       | -      |\n| closable                     | 是否显示右上角的关闭按钮。仅在 type 为 focus 生效 | boolean      | -      |\n| content                      | 内容                                              | string\\|slot | -      |\n| destroyOnClose               | 不可见时是否卸载内容                              | boolean      | false  |\n| footer                       | 自定义按钮区                                      | slot         | -      |\n| maskClosable                 | 点击蒙层是否触发 onClose                          | boolean      | true   |\n| maskClassName                | 蒙层的类名                                        | string       | -      |\n| maskStyle                    | 蒙层的样式                                        | string       | -      |\n| style                        | 样式                                              | string       | -      |\n| title                        | 标题                                              | string\\|slot | -      |\n| visible                      | 是否显示                                          | boolean      | false  |\n| #if ALIPAY onCancelButtonTap | 取消按钮点击事件                                  | ()=>void     | -      |\n| #if ALIPAY onClose           | 点击蒙层或强调模式下点击右上角关闭按钮，触发回调  | ()=>void     | -      |\n| #if ALIPAY onButtonTap       | 行为按钮点击事件                                  | ()=>void     | -      |\n| #if WECHAT bindclose        | 点击蒙层或强调模式下点击右上角关闭按钮，触发回调  | ()=>void     | -      |\n| #if WECHAT bindbuttontap    | 行为按钮点击事件                                  | ()=>void     | -      |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                    | 默认值                                                                                            | 深色模式默认值                                                                                    | 备注                   |\n| ------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------------- |\n| --dialog-background-color | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | 模态框背景颜色         |\n| --dialog-title-color      | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | 模态框标题颜色         |\n| --dialog-content-color    | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | 模态框内容颜色         |\n| --dialog-close-text-color | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | 模态框关闭按钮文字颜色 |\n"
  },
  {
    "path": "src/Dialog/index.sjs.ts",
    "content": "function getDirection(\n  primaryButtonText,\n  secondaryButtonText,\n  cancelButtonText,\n  type\n) {\n  // 不显示按钮区域\n  if (!primaryButtonText && !secondaryButtonText && !cancelButtonText) {\n    return '';\n  }\n  // 1个按钮，当纵向处理\n  if (\n    [primaryButtonText, secondaryButtonText, cancelButtonText].filter(\n      (v) => !!v\n    ).length === 1\n  ) {\n    return 'vertical';\n  }\n  // 三个按钮，必是纵向\n  if (primaryButtonText && secondaryButtonText && cancelButtonText) {\n    return 'vertical';\n  }\n  // 两个按钮，在 “标准模式” 是横向；在“强调模式”是纵向\n  return type === 'focus' ? 'vertical' : 'horizontal';\n}\n\nexport default { getDirection };\n"
  },
  {
    "path": "src/Dialog/index.ts",
    "content": "import {\n  Component,\n  getValueFromProps,\n  triggerEvent,\n  triggerEventOnly,\n} from '../_util/simply';\nimport { ModalFunctionalProps } from './props';\n\nComponent({\n  props: ModalFunctionalProps,\n  methods: {\n    onClose() {\n      triggerEventOnly(this, 'close');\n    },\n    onMaskClose() {\n      const maskClosable = getValueFromProps(this, 'maskClosable');\n      if (maskClosable) {\n        triggerEventOnly(this, 'close');\n      }\n    },\n    onButtonTap(e) {\n      const onButtonTap = getValueFromProps(this, 'onButtonTap');\n      /// #if ALIPAY\n      // 按钮点击没有回调的场景直接关闭弹框\n      if (!onButtonTap) {\n        return this.onClose();\n      }\n      /// #endif\n      const { item } = e.currentTarget.dataset;\n      triggerEvent(this, 'buttonTap', item, e);\n    },\n    onPrimaryButtonTap() {\n      triggerEventOnly(this, 'primaryButtonTap');\n    },\n    onSecondaryButtonTap() {\n      triggerEventOnly(this, 'secondaryButtonTap');\n    },\n    onCancelButtonTap() {\n      triggerEventOnly(this, 'cancelButtonTap');\n    },\n  },\n});\n"
  },
  {
    "path": "src/Dialog/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\n/**\n * @description 对话框，当应用中需要比较明显的对用户当前的操作行为进行警示或提醒时，可以使用对话框。用户需要针对对话框进行操作后方可结束。\n */\n\nexport interface Button {\n  /**\n   * @description 按钮名称\n   */\n  text: string;\n  /**\n   * @description 按钮样式\n   * @default primary\n   */\n  type: string;\n  /**\n   * @description 按钮置灰\n   * @default false\n   */\n  disabled: boolean;\n  /**\n   * @description 按钮唯一标识\n   */\n  id: string;\n}\nexport interface Footer {\n  /**\n   * @description 按钮列表\n   */\n  buttons: Button[];\n  /**\n   * @description 按钮布局方式\n   */\n  layout: 'vertical' | 'horizontal';\n}\nexport interface IDialogProps extends IBaseProps {\n  /**\n   * @description Modal body类名\n   */\n  bodyClassName: string;\n  /**\n   * @description Modal body样式\n   */\n  bodyStyle: string;\n  /**\n   * @description 遮罩层类名\n   */\n  maskClassName: string;\n  /**\n   * @description 遮罩层样式\n   */\n  maskStyle: string;\n  /**\n   * @description 是否可点击蒙层关闭\n   * @default true\n   */\n  maskClosable: boolean;\n  /**\n   * @description 是否显示右上角的关闭按钮。只有在 type 为 focus 生效\n   */\n  closable: boolean;\n  /**\n   * @description 过渡动画时长，单位毫秒\n   */\n  duration: number;\n  /**\n   * @description 是否开启过渡动画\n   */\n  animation: boolean;\n  /**\n   * @description 弹窗层级\n   */\n  zIndex: number;\n  /**\n   * @description 标题\n   */\n  title: string;\n  /**\n   * @description 内容\n   */\n  content: string;\n  /**\n   * @description 是否可见，受控模式\n   * @default false\n   */\n  visible: boolean;\n  /**\n   * @description 是否关闭后销毁内部元素\n   * @default false\n   */\n  destroyOnClose?: boolean;\n  /**\n   * @description 底部按钮列表\n   */\n  footer: Footer;\n  /**\n   * @description 正常模式下 弹框头图, 氛围弹框场景下此图片不展示\n   */\n  headerImage: string;\n  /**\n   * @description 触发关闭时回调\n   */\n  onClose: () => void;\n  /**\n   * @description 按钮点击事件\n   */\n  onButtonTap?: (buttonItem) => void;\n}\n\nexport const ModalDefaultProps: Partial<IDialogProps> = {\n  visible: false,\n  maskClosable: true,\n  closable: true,\n  duration: 200,\n  animation: true,\n  zIndex: 998,\n};\n\nexport const ModalFunctionalProps: Partial<IDialogProps> = {\n  bodyClassName: '',\n  bodyStyle: '',\n  maskClassName: '',\n  maskStyle: '',\n  maskClosable: true,\n  closable: true,\n  duration: 200,\n  animation: true,\n  zIndex: 998,\n  title: '',\n  content: '',\n  visible: false,\n  destroyOnClose: false,\n  footer: {\n    buttons: [],\n    layout: 'vertical',\n  },\n};\n"
  },
  {
    "path": "src/Dialog/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n// dialog 背景色\n@dialog-background-color: var(--dialog-background-color, @COLOR_CARD);\n// dialog 圆角\n@dialog-radius: @corner-radius-lg;\n// 标题颜色\n@dialog-title-color: var(--dialog-title-color, @COLOR_TEXT_PRIMARY);\n// 内容大小\n@dialog-content-size: @font-size-subtitle;\n// 内容颜色\n@dialog-content-color: var(--dialog-content-color, @COLOR_TEXT_PRIMARY);\n// 关闭图标尺寸\n@dialog-close-icon-size: 36 * @rpx;\n\n@dialog-close-text-color: var(--dialog-close-text-color, @COLOR_TEXT_ASSIST);\n\n@dialog-header-padding: 44 * 2 * @rpx;\n"
  },
  {
    "path": "src/Divider/index.axml",
    "content": "<import-sjs\n  from=\"./index.sjs\"\n  name=\"divider\" />\n\n<view\n  a:if=\"{{ direction === 'horizontal' }}\"\n  class=\"ant-divider ant-divider-horizontal {{ className || '' }}\"\n  style=\"{{ style || '' }}\">\n  <view\n    class=\"ant-divider-horizontal-left\"\n    style=\"flex: {{ divider.getLineWidthFlex(textPosition, text)[0] }};{{ lineHeight ? 'border-bottom-width:' + lineHeight + 'px;' : '' }}{{ lineType ? 'border-bottom-style:' + lineType + ';' : '' }}{{ lineColor ? 'border-bottom-color:' + lineColor + ';' : '' }}\" />\n  <!-- #if WECHAT -->\n  <view\n    wx:if=\"{{ text }}\"\n    class=\"ant-divider-horizontal-text {{ textClassName || '' }}\"\n    style=\"{{ textStyle || '' }}\">\n    {{ text }}\n  </view>\n  <slot\n    wx:else\n    name=\"text\" />\n  <!-- #endif -->\n  <!-- #if ALIPAY -->\n  <slot name=\"text\">\n    <view\n      a:if=\"{{ text }}\"\n      class=\"ant-divider-horizontal-text {{ textClassName || '' }}\"\n      style=\"{{ textStyle || '' }}\">\n      {{ text }}\n    </view>\n  </slot>\n  <!-- #endif -->\n  <view\n    class=\"ant-divider-horizontal-right\"\n    style=\"flex: {{ divider.getLineWidthFlex(textPosition, text)[1] }};{{ lineHeight ? 'border-bottom-width:' + lineHeight + 'px;' : '' }}{{ lineType ? 'border-bottom-style:' + lineType + ';' : '' }}{{ lineColor ? 'border-bottom-color:' + lineColor + ';' : '' }}\" />\n</view>\n\n<view\n  a:if=\"{{ direction === 'vertical' }}\"\n  class=\"ant-divider ant-divider-vertical {{ className || '' }}\"\n  style=\"{{ style || '' }};{{ lineWidth ? 'border-right-width:' + lineWidth + 'px;' : '' }}{{ lineType ? 'border-right-style:' + lineType + ';' : '' }}{{ lineColor ? 'border-right-color:' + lineColor + ';' : '' }}\" />\n"
  },
  {
    "path": "src/Divider/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Layout\n  order: 1\ntoc: 'content'\n---\n\n# Divider\n\nThe dividing line that separates the content. Segmentation of text paragraphs in different sections. Split inline text/links, such as the action column of a table.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-divider\": \"antd-mini/es/Divider/index\"\n#endif\n#if WECHAT\n  \"ant-divider\": \"antd-mini/Divider/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<ant-divider />\n```\n\n### Split Line with Text\n\n```xml\n<ant-divider text=\"center content\" />\n<ant-divider text=\"left content\" textPosition=\"left\" />\n<ant-divider text=\"right content\" textPosition=\"right\" />\n```\n\n### Custom Style\n\n```xml\n <ant-divider\n  text=\"custom styles\"\n  textStyle=\"color:#1677ff; fontWeight:600\"\n  lineHeight=\"{{2}}\"\n  lineType=\"dashed\"\n  lineColor=\"#1677ff\"\n/>\n```\n\n### Vertical Split Line\n\n```xml\n<view class=\"divider-vertical\">\n  <view>100m</view>\n  <ant-divider direction=\"vertical\" />\n  <view>detail address</view>\n</view>\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Divider/index'></code>\n\n## API\n\n| Property          | Description                                                             | Type           | Default Value       |\n| ------------- | ---------------------------------------------------------------- | -------------- | ------------ |\n| className     | Root node class name                                                       | string         | -            |\n| direction     | Split line direction, optional `horizontal` `vertical`                         | string         | `horizontal` |\n| lineColor     | Split line color                                                       | string         | -            |\n| lineHeight    | Split line height, only if `direction` For `horizontal` Effective at the time, in units `px` | number         | -            |\n| lineType      | Split line type, optional `solid` `dashed` `dotted`                       | string         | -            |\n| lineWidth     | Split line width, only if `direction` For `vertical` Effective at the time, in units `px`   | number         | -            |\n| style         | Style                                                             | string         | -            |\n| textClassName | Split Line Text Class Name                                                   | string         | -            |\n| textPosition  | Split line text position, optional `left` `center` `right`                     | string         | `center`     |\n| textStyle     | Split Line Text Style                                                   | string         | -            |\n| text          | Split Line Text                                                       | string \\| slot | -            |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For more information, see ConfigProvider Components.\n\n| Variable name                 | Default Value                                                                                            | Dark Mode Default                                                                                    | Remarks           |\n| ---------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | -------------- |\n| --divider-text-color   | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | Split line text color |\n| --divider-border-color | <div style=\"width: 150px; height: 30px; background-color: #e5e5e5; color: #333333;\">#e5e5e5</div> | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #fff;\">#2b2b2b2</div> | Split Line Border Color |\n"
  },
  {
    "path": "src/Divider/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n  }\n}\n"
  },
  {
    "path": "src/Divider/index.less",
    "content": "@import (reference) './variable.less';\n@import '../style/mixins/hairline.less';\n\n@dividerPrefix: ant-divider;\n\n.@{dividerPrefix}-horizontal {\n  display: flex;\n  flex-direction: row;\n  flex-wrap: wrap;\n  align-items: center;\n  padding: @v-spacing-standard 0;\n\n  &-text {\n    font-size: @font-size-subtitle;\n    color: @divider-text-color;\n    margin: 0 32 * @rpx;\n  }\n\n  &-left,\n  &-right {\n    border-bottom: @border-width-standard solid @divider-border-color;\n  }\n}\n\n.@{dividerPrefix}-vertical {\n  margin: 0 16 * @rpx;\n  height: 32 * @rpx;\n  border-right: @border-width-standard solid @divider-border-color;\n}\n"
  },
  {
    "path": "src/Divider/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 布局\n  order: 1\ntoc: 'content'\n---\n\n# Divider 分割线\n\n区隔内容的分割线。对不同章节的文本段落进行分割。对行内文字/链接进行分割，例如表格的操作列。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-divider\": \"antd-mini/es/Divider/index\"\n#endif\n#if WECHAT\n  \"ant-divider\": \"antd-mini/Divider/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-divider />\n```\n\n### 分割线带文字\n\n```xml\n<ant-divider text=\"center content\" />\n<ant-divider text=\"left content\" textPosition=\"left\" />\n<ant-divider text=\"right content\" textPosition=\"right\" />\n```\n\n### 自定义样式\n\n```xml\n <ant-divider\n  text=\"custom styles\"\n  textStyle=\"color:#1677ff; fontWeight:600\"\n  lineHeight=\"{{2}}\"\n  lineType=\"dashed\"\n  lineColor=\"#1677ff\"\n/>\n```\n\n### 垂直分割线\n\n```xml\n<view class=\"divider-vertical\">\n  <view>100m</view>\n  <ant-divider direction=\"vertical\" />\n  <view>detail address</view>\n</view>\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Divider/index'></code>\n\n## API\n\n| 属性          | 说明                                                             | 类型           | 默认值       |\n| ------------- | ---------------------------------------------------------------- | -------------- | ------------ |\n| className     | 根节点类名                                                       | string         | -            |\n| direction     | 分割线方向，可选 `horizontal` `vertical`                         | string         | `horizontal` |\n| lineColor     | 分割线颜色                                                       | string         | -            |\n| lineHeight    | 分割线高度，仅当 `direction` 为 `horizontal` 时生效，单位为 `px` | number         | -            |\n| lineType      | 分割线类型，可选 `solid` `dashed` `dotted`                       | string         | -            |\n| lineWidth     | 分割线宽度，仅当 `direction` 为 `vertical` 时生效，单位为 `px`   | number         | -            |\n| style         | 样式                                                             | string         | -            |\n| textClassName | 分割线文字类名                                                   | string         | -            |\n| textPosition  | 分割线文字位置，可选 `left` `center` `right`                     | string         | `center`     |\n| textStyle     | 分割线文字样式                                                   | string         | -            |\n| text          | 分割线文字                                                       | string \\| slot | -            |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                 | 默认值                                                                                            | 深色模式默认值                                                                                    | 备注           |\n| ---------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | -------------- |\n| --divider-text-color   | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | 分割线文本颜色 |\n| --divider-border-color | <div style=\"width: 150px; height: 30px; background-color: #e5e5e5; color: #333333;\">#e5e5e5</div> | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #fff;\">#2b2b2b2</div> | 分割线边框颜色 |\n"
  },
  {
    "path": "src/Divider/index.sjs.ts",
    "content": "const getLineWidthFlex = (textPosition, text) => {\n  if (!text) {\n    return [1, 0];\n  }\n  if (textPosition === 'left') {\n    return [1, 5];\n  }\n\n  if (textPosition === 'right') {\n    return [5, 1];\n  }\n  return [1, 1];\n}\n\nexport default {\n  getLineWidthFlex\n}"
  },
  {
    "path": "src/Divider/index.ts",
    "content": "import { Component } from '../_util/simply';\nimport { DividerFunctionalProps } from './props';\n\nComponent({ props: DividerFunctionalProps });\n"
  },
  {
    "path": "src/Divider/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\nexport interface IDividerProps extends IBaseProps {\n  lineColor: string;\n  lineHeight: number;\n  lineType: 'solid' | 'dashed' | 'dotted';\n  lineWidth: number;\n  text: string;\n  textStyle: string;\n  textClassName: string;\n  textPosition: 'left' | 'center' | 'right';\n  direction: 'horizontal' | 'vertical';\n}\n\nexport const DividerDefaultProps: Partial<IDividerProps> = {\n  textPosition: 'center',\n  direction: 'horizontal',\n  lineType: 'solid',\n};\n\nexport const DividerFunctionalProps: Partial<IDividerProps> = {\n  lineColor: '',\n  lineHeight: 0,\n  lineType: 'solid',\n  lineWidth: 0,\n  text: '',\n  textStyle: '',\n  textClassName: '',\n  textPosition: 'center',\n  direction: 'horizontal',\n};\n"
  },
  {
    "path": "src/Divider/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n// text 颜色\n@divider-text-color: var(--divider-text-color, @COLOR_TEXT_PRIMARY);\n\n// border 颜色\n@divider-border-color: var(--divider-border-color, @COLOR_BORDER_GREYCARD);\n"
  },
  {
    "path": "src/Empty/index.axml",
    "content": "<view\n  class=\"ant-empty {{ className || '' }}\"\n  style=\"{{ style || '' }}\">\n  <view class=\"ant-empty-{{size}}\">\n    <view class=\"ant-empty-image\">\n      <!-- #if ALIPAY -->\n      <slot name=\"image\">\n      <!-- #endif -->\n        <image\n          class=\"ant-empty-image-element\"\n          mode=\"{{imageMode}}\"\n          src=\"{{ image || 'https://mdn.alipayobjects.com/huamei_mnxlps/afts/img/A*J9z7RqVm1soAAAAAAAAAAAAADkqGAQ/original' }}\" />\n      <!-- #if ALIPAY -->\n      </slot>\n      <!-- #endif -->\n    </view>\n    <view class=\"ant-empty-text\">\n      <view class=\"ant-empty-text-main\">\n        <!-- #if WECHAT -->\n        <ant-auto-resize wx:if=\"{{ title }}\" text=\"{{ title }}\" minFontSize=\"24\" maxFontSize=\"40\">\n          <block>{{ title }}</block>\n        </ant-auto-resize>\n        <ant-auto-resize wx:else text=\"{{ title }}\" minFontSize=\"24\" maxFontSize=\"40\">\n          <block>\n            <slot name=\"title\">{{ title }}</slot>\n          </block>\n        </ant-auto-resize>\n        <!-- #endif -->\n        <!-- #if ALIPAY -->\n          <ant-auto-resize text=\"{{ title }}\" minFontSize=\"24\" maxFontSize=\"40\">\n            <slot name=\"title\">{{ title }}</slot>\n          </ant-auto-resize>\n        <!-- #endif -->\n      </view>\n      <view class=\"ant-empty-text-sub\">\n        <!-- #if WECHAT -->\n        <ant-auto-resize wx:if=\"{{ message }}\" text=\"{{ message }}\" minFontSize=\"24\" maxFontSize=\"40\">\n          <block>{{ message }}</block>\n        </ant-auto-resize>\n        <ant-auto-resize wx:else text=\"{{ message }}\" minFontSize=\"24\" maxFontSize=\"40\">\n          <block>\n            <slot name=\"message\">{{ message }}</slot>\n          </block>\n        </ant-auto-resize>\n        <!-- #endif -->\n        <!-- #if ALIPAY -->\n        <ant-auto-resize text=\"{{ message }}\" minFontSize=\"24\" maxFontSize=\"40\">\n          <slot name=\"message\">{{ message }}</slot>\n        </ant-auto-resize>\n        <!-- #endif -->\n      </view>\n    </view>\n    <view a:if=\"{{ buttonInfo.list.length > 0 }}\" class=\"ant-empty-button ant-empty-button-layout-{{ buttonInfo.layout }}\">\n      <ant-button\n        a:for=\"{{ buttonInfo.list }}\"\n        a:key=\"text\"\n        type=\"{{item.type}}\"\n        data-item=\"{{ item }}\"\n        onTap=\"onClickButton\"\n        size=\"{{ buttonInfo.layout === 'horizontal' ? 'small' : '' }}\"\n        inline=\"{{ buttonInfo.layout === 'horizontal' }}\"\n      >\n        {{ item.text }}\n      </ant-button>\n    </view>\n    <view class=\"ant-empty-extra\">\n      <slot name=\"extra\" />\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "src/Empty/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Information Display\n  order: 9\ntoc: 'content'\n---\n\n# Empty\n\nUse the scene illustration as a feedback prompt for the empty state scene, when you need to display the empty state page or local empty state block.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-empty\": \"antd-mini/es/Empty/index\"\n#endif\n#if WECHAT\n  \"ant-empty\": \"antd-mini/Empty/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<ant-empty\n  size=\"small\"\n  title=\"Nothing Here\"\n  message=\"See Others\"\n/>\n```\n\n### Custom Picture\n\n```xml\n<ant-empty\n  title=\"Nothing Here\"\n  message=\"See Others\"\n  image=\"{{imageUrl}}\"\n/>\n```\n\n### Add Action Point\n\n```xml\n<ant-empty\n  title=\"Nothing Here\"\n  message=\"See Others\"\n  buttonInfo=\"{{horizontalButtonInfo}}\"\n#if ALIPAY\n  onClickButton=\"onClickButton\"\n#endif\n#if WECHAT\n  bindclickbutton=\"onClickButton\"\n#endif\n/>\n```\n\n```js\nconst BUTTON_LIST = [\n  {\n    type: 'primary',\n    text: 'refresh',\n  },\n  {\n    type: 'default',\n    text: 'checkout internet',\n  },\n];\n\nPage({\n  data: {\n    // 水平按钮布局\n    horizontalButtonInfo: {\n      layout: 'horizontal',\n      list: BUTTON_LIST,\n    },\n    // 垂直按钮布局\n    verticalButtonInfo: {\n      layout: 'vertical',\n      list: BUTTON_LIST,\n    },\n  },\n});\n```\n\n### Use Slot\n\n```xml\n<ant-empty\n  title=\"Nothing Here\"\n  message=\"See Others\"\n>\n  <view slot=\"extra\">\n    <ant-button\n      size=\"small\"\n      inline\n    >\n      Custom Action Buttons\n    </ant-button>\n  </view>\n</ant-empty>\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Empty/index'></code>\n\n## API\n\n| Property                        | Description                              | Type                                              | Default Value   |\n| --------------------------- | --------------------------------- | ------------------------------------------------- | -------- |\n| className                   | Root node class name                        | string                                            | -        |\n| title                       | Title Copy                          | string \\| slot                                    | -        |\n| image                       | Picture, string can be passed in as picture address    | string \\| slot                                    |\n| message                     | Description Copy                          | string \\| slot                                    | -        |\n| style                       | Style                              | string                                            | -        |\n| size                        | Empty status size, optional `normal` `small` | string                                            | `normal` |\n| buttonInfo                  | Custom Button                        | [ButtonInfo](#buttoninfo)                         | `normal` |\n| #if ALIPAY onClickButton    | Click button callback                      | (item: [ButtonInfoItem](#buttoninfoitem)) => void | -        |\n| #if WECHAT bindclickbutton | Click button callback                      | (item: [ButtonInfoItem](#buttoninfoitem)) => void | -        |\n\n### ButtonInfo\n\n| Property   | Description                                   | Type                                | Default Value       |\n| ------ | -------------------------------------- | ----------------------------------- | ------------ |\n| layout | Layout mode, optional `horizontal` `vertical` | string                              | `horizontal` |\n| list   | Layout button configuration                           | [ButtonInfoItem](#buttoninfoitem)[] | -            |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                    | Default Value                                                                                            | Dark Mode Default                                                                                    | Remarks               |\n| ------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------ |\n| --empty-text-color        | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | Empty status text color     |\n| --empty-asisst-text-color | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | Empty state secondary text color |\n"
  },
  {
    "path": "src/Empty/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-button\": \"../Button/index\",\n    \"ant-auto-resize\": \"../AutoResize/index\"\n  }\n}\n"
  },
  {
    "path": "src/Empty/index.less",
    "content": "@import (reference) './variable.less';\n\n@emptyPrefix: ant-empty;\n\n.@{emptyPrefix} {\n  text-align: center;\n  &-normal {\n    .ant-empty-image-element {\n      width: @empty-normal-width;\n      height: @empty-normal-height;\n    }\n    .ant-empty-text {\n      &-main {\n        color: @empty-text-color;\n        font-size: @sizeFont8;\n        margin-top: @empty-margin-large;\n      }\n      &-sub {\n        margin-top: 12 * @rpx;\n        color: @empty-asisst-text-color;\n      }\n    }\n    .ant-empty-button {\n      padding-top: 80 * @rpx;\n    }\n  }\n\n  &-small {\n    .ant-empty-image-element {\n      width: @empty-small-width;\n      height: @empty-small-height;\n    }\n    .ant-empty-text {\n      &-main {\n        color: @empty-asisst-text-color;\n        font-size: @sizeFont6;\n        margin-top: @empty-margin-large;\n      }\n      &-sub {\n        color: @COLOR_TEXT_WEAK;\n        margin-top: 8 * @rpx;\n      }\n    }\n    .ant-empty-button {\n      padding-top: @empty-margin-middle;\n    }\n  }\n\n  &-image {\n    display: flex;\n    justify-content: center;\n  }\n\n  &-text {\n    margin-top: @v-spacing-large;\n    line-height: @empty-text-line-height;\n\n    &-main {\n      color: @COLOR_TEXT_PRIMARY;\n      font-size: @empty-font-size-large;\n    }\n\n    &-sub {\n      font-size: @empty-font-size-common;\n      margin-top: @empty-margin-middle;\n      line-height: @empty-sub-line-height;\n    }\n  }\n\n  &-button {\n    &-layout-horizontal {\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      .ant-button {\n        margin-right: @empty-horizontal-button-gap;\n        &:last-child {\n          margin-right: 0;\n        }\n      }\n    }\n    &-layout-vertical {\n      display: flex;\n      flex-direction: column;\n      justify-content: flex-start;\n      align-items: center;\n      .ant-button {\n        min-width: @empty-vertical-button-width;\n        margin-bottom: @empty-vertical-button-gap;\n        &:last-child {\n          margin-bottom: 0;\n        }\n      }\n    }\n  }\n\n  &-extra {\n    padding-top: @empty-margin-middle;\n  }\n}\n"
  },
  {
    "path": "src/Empty/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 数据展示\n  order: 9\ntoc: 'content'\n---\n\n# Empty 空状态\n\n使用场景插画来作为空状态场景的反馈提示，在需要展示空状态页面或者局部空状态区块时使用。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-empty\": \"antd-mini/es/Empty/index\"\n#endif\n#if WECHAT\n  \"ant-empty\": \"antd-mini/Empty/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-empty\n  size=\"small\"\n  title=\"Nothing Here\"\n  message=\"See Others\"\n/>\n```\n\n### 自定义图片\n\n```xml\n<ant-empty\n  title=\"Nothing Here\"\n  message=\"See Others\"\n  image=\"{{imageUrl}}\"\n/>\n```\n\n### 添加行动点\n\n```xml\n<ant-empty\n  title=\"Nothing Here\"\n  message=\"See Others\"\n  buttonInfo=\"{{horizontalButtonInfo}}\"\n#if ALIPAY\n  onClickButton=\"onClickButton\"\n#endif\n#if WECHAT\n  bindclickbutton=\"onClickButton\"\n#endif\n/>\n```\n\n```js\nconst BUTTON_LIST = [\n  {\n    type: 'primary',\n    text: 'refresh',\n  },\n  {\n    type: 'default',\n    text: 'checkout internet',\n  },\n];\n\nPage({\n  data: {\n    // 水平按钮布局\n    horizontalButtonInfo: {\n      layout: 'horizontal',\n      list: BUTTON_LIST,\n    },\n    // 垂直按钮布局\n    verticalButtonInfo: {\n      layout: 'vertical',\n      list: BUTTON_LIST,\n    },\n  },\n});\n```\n\n### 使用插槽\n\n```xml\n<ant-empty\n  title=\"Nothing Here\"\n  message=\"See Others\"\n>\n  <view slot=\"extra\">\n    <ant-button\n      size=\"small\"\n      inline\n    >\n      自定义操作按钮\n    </ant-button>\n  </view>\n</ant-empty>\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Empty/index'></code>\n\n## API\n\n| 属性                        | 说明                              | 类型                                              | 默认值   |\n| --------------------------- | --------------------------------- | ------------------------------------------------- | -------- |\n| className                   | 根节点类名                        | string                                            | -        |\n| title                       | 标题文案                          | string \\| slot                                    | -        |\n| image                       | 图片，可传入字符串作为图片地址    | string \\| slot                                    |\n| message                     | 描述文案                          | string \\| slot                                    | -        |\n| style                       | 样式                              | string                                            | -        |\n| size                        | 空状态尺寸，可选 `normal` `small` | string                                            | `normal` |\n| buttonInfo                  | 自定义按钮                        | [ButtonInfo](#buttoninfo)                         | `normal` |\n| #if ALIPAY onClickButton    | 点击按钮回调                      | (item: [ButtonInfoItem](#buttoninfoitem)) => void | -        |\n| #if WECHAT bindclickbutton | 点击按钮回调                      | (item: [ButtonInfoItem](#buttoninfoitem)) => void | -        |\n\n### ButtonInfo\n\n| 属性   | 说明                                   | 类型                                | 默认值       |\n| ------ | -------------------------------------- | ----------------------------------- | ------------ |\n| layout | 布局方式，可选 `horizontal` `vertical` | string                              | `horizontal` |\n| list   | 布局按钮配置                           | [ButtonInfoItem](#buttoninfoitem)[] | -            |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                    | 默认值                                                                                            | 深色模式默认值                                                                                    | 备注               |\n| ------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------ |\n| --empty-text-color        | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | 空状态文本颜色     |\n| --empty-asisst-text-color | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | 空状态辅助文本颜色 |\n"
  },
  {
    "path": "src/Empty/index.ts",
    "content": "import { Component, IPlatformEvent, triggerEvent } from '../_util/simply';\nimport { EmptyFunctionalProps } from './props';\n\nComponent({\n  props: EmptyFunctionalProps,\n  methods: {\n    onClickButton(e: IPlatformEvent) {\n      const { item } = e.currentTarget.dataset;\n      triggerEvent(this, 'clickButton', item);\n    },\n  },\n});\n"
  },
  {
    "path": "src/Empty/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\n/**\n * @description 空状态\n */\n\ninterface Button {\n  /**\n   * @description 按钮文案\n   */\n  text: string;\n  /**\n   * @description 按钮类型\n   */\n  type: string;\n}\n\nexport interface IEmptyProps extends IBaseProps {\n  /**\n   * @description 主文案\n   */\n  title: string;\n\n  /**\n   * @description 副文案\n   */\n  message: string;\n\n  /**\n   * @description 图片路径\n   */\n  image: string;\n  /**\n   * @description 图片模式\n   */\n  imageMode: string;\n  /**\n   * @description 按钮信息\n   */\n  buttonInfo: {\n    /**\n     * @description 按钮信息\n     * @default horizontal\n     */\n    layout: 'vertical' | 'horizontal';\n    list: Button[];\n  };\n  /**\n   * @description 空状态尺寸\n   * @default normal\n   */\n  size: 'small' | 'normal';\n  /**\n   * @description 按钮点击事件\n   */\n  onClickButton: (button: Button) => void;\n}\n\nexport const EmptyDefaultProps: Partial<IEmptyProps> = {};\n\nexport const EmptyFunctionalProps: IEmptyProps = {\n  title: '',\n  message: '',\n  image: '',\n  imageMode: 'scaleToFill',\n  buttonInfo: {\n    list: [],\n    layout: 'horizontal',\n  },\n  size: 'normal',\n  onClickButton: () => {},\n};\n"
  },
  {
    "path": "src/Empty/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n// text 颜色\n@empty-text-color: var(--empty-text-color, @COLOR_TEXT_PRIMARY);\n// asisst-text 颜色\n@empty-asisst-text-color: var(--empty-asisst-text-color, @COLOR_TEXT_ASSIST);\n@empty-normal-width: 510 * @rpx;\n@empty-small-width: 416 * @rpx;\n@empty-normal-height: 282 * @rpx;\n@empty-small-height: 230 * @rpx;\n\n@empty-font-size-common: 24 * @rpx;\n@empty-font-size-large: 36 * @rpx;\n\n@empty-margin-x-small: 12 * @rpx;\n@empty-margin-small: 24 * @rpx;\n@empty-margin-middle: 32 * @rpx;\n@empty-margin-large: 24 * @rpx;\n\n@empty-vertical-button-width: 368 * @rpx;\n\n@empty-vertical-button-gap: 32 * @rpx;\n@empty-horizontal-button-gap: 24 * @rpx;\n\n@empty-sub-line-height: 37 * @rpx;\n@empty-text-line-height: 50 * @rpx;\n\n@empty-image-url: 'https://mdn.alipayobjects.com/huamei_mnxlps/afts/img/A*J9z7RqVm1soAAAAAAAAAAAAADkqGAQ/original';\n"
  },
  {
    "path": "src/Feedback/index.axml",
    "content": "<popover\n  a:if=\"{{ type === 'popover' }}\"\n  visible=\"{{ visible }}\"\n  className=\"ant-feedback {{ className || '' }} {{ visible ? 'ant-feedback-show' : '' }} ant-feedback-popoverType-{{ popoverType }}\"\n  mode=\"light\"\n  placement=\"{{ placement }}\"\n  showMask=\"{{ false }}\"\n  autoAdjustOverflow=\"{{ autoAdjustOverflow }}\"\n  style=\"display: inline-block; margin: 20px\"\n  onVisibleChange=\"handleVisibleChange\"\n>\n  <view\n    class=\"ant-feedback-trigger \"\n    id=\"ant-feedback-trigger{{ $id }}\"\n  >\n    <view style=\"{{ !visible || popoverType === 'circle' ? 'z-index: 0;' : 'z-index: 3; position: relative;' }}\">\n      <slot></slot>\n    </view>\n    <view\n      a:if=\"{{ !!visible && popoverType === 'circle' }}\"\n      class=\"ant-feedback-guide\">\n      <view class=\"ant-feedback-guide-content\" />\n    </view>\n    <ant-mask\n      className=\"ant-feedback-mask\"\n      show=\"{{ !!visible }}\"\n      style=\"z-index: 2;\"\n      onMaskTap=\"maskClick\"/>\n  </view>\n  <view\n    class=\"ant-feedback-content ant-feedback-content-{{ type }}\"\n    slot=\"content\"\n    a:if=\"{{ list.length > 0 }}\">\n    <view a:if=\"{{ title }}\" class=\"ant-feedback-content-title\">\n      {{ title }}\n    </view>\n    <view class=\"ant-feedback-content-list\">\n      <view\n        class=\"ant-feedback-content-list-item\"\n        a:for=\"{{ list }}\"\n        a:key=\"id\"\n        data-item=\"{{ item }}\"\n        onTap=\"onTapFeedItem\"\n      >\n        <ant-icon a:if=\"{{ item.icon }}\" type=\"{{ item.icon }}\" />\n        <image\n          a:elif=\"{{ item.image }}\"\n          class=\"ant-feedback-content-list-item-image\"\n          mode=\"widthFix\"\n          src=\"{{ item.image }}\" />\n        <view class=\"ant-feedback-content-list-item-text\">{{ item.text }}</view>\n      </view>\n    </view>\n  </view>\n  <slot slot=\"content\" name=\"popover-content\"></slot>\n</popover>\n\n<view a:else class=\"ant-feedback\">\n  <view\n    class=\"ant-feedback-content ant-feedback-content-{{ type }}\"\n    slot=\"content\"\n    a:if=\"{{ list.length > 0 }}\">\n    <view a:if=\"{{ title }}\" class=\"ant-feedback-content-title\">\n      {{ title }}\n    </view>\n    <view class=\"ant-feedback-content-list\">\n      <view\n        onTap=\"onTapFeedItem\"\n        class=\"ant-feedback-content-list-item\"\n        a:for=\"{{ list }}\"\n        a:key=\"id\"\n        data-item=\"{{ item }}\">\n        <ant-icon a:if=\"{{ item.icon }}\" type=\"{{ item.icon }}\" />\n        <image\n          a:elif=\"{{ item.image }}\"\n          class=\"ant-feedback-content-list-item-image\"\n          mode=\"widthFix\"\n          src=\"{{ item.image }}\" />\n        <view class=\"ant-feedback-content-list-item-text\">{{ item.text }}</view>\n      </view>\n    </view>\n  </view>\n  <slot a:else name=\"content\"></slot>\n</view>\n"
  },
  {
    "path": "src/Feedback/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Feedback\n  order: 15\ntoc: content\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Feedback\n\nFeedback mostly acts on distribution scenarios.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-feedback\": \"antd-mini/es/Feedback/index\"\n#endif\n#if WECHAT\n  \"ant-feedback\": \"antd-mini/Feedback/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<ant-feedback\n  visible=\"{{visible}}\"\n  type=\"popover\"\n  popoverType=\"default\"\n  placement=\"bottom-right\"\n#if ALIPAY\n  onVisibleChange=\"onVisibleChange\"\n#endif\n#if WECHAT\n  bindvisiblechange=\"onVisibleChange\"\n#endif\n>\n  <view class=\"feedback-demo-target\">\n    <ant-icon style=\"font-size: 40px\" type=\"MoreOutline\" />\n  </view>\n  <view slot=\"popover-content\" class=\"feedback-content\">\n    Here is the popover content\n  </view>\n</ant-feedback>\n```\n\n```js\nPage({\n  data: {\n    visible: true,\n  },\n  onVisibleChange(value) {\n#if ALIPAY\n    this.setData({ visible: value });\n#endif\n#if WECHAT\n    this.setData({ visible: value.detail });\n#endif\n  },\n});\n```\n\n### Point Guide Feedback\n\n```xml\n<ant-feedback\n  type=\"popover\"\n  list=\"{{feedList}}\"\n  visible=\"{{visible}}\"\n  popoverType=\"circle\"\n  title=\"点引导反馈\"\n  placement=\"bottom\"\n#if ALIPAY\n  onVisibleChange=\"onVisibleChange\"\n  onTapFeedItem=\"onTapFeedItem\"\n#endif\n#if WECHAT\n  bindvisiblechange=\"onVisibleChange\"\n  bindtapfeeditem=\"onTapFeedItem\"\n#endif\n>\n  <image mode=\"widthFix\" style=\"width: 345rpx;\" src=\"https://mdn.alipayobjects.com/huamei_mnxlps/afts/img/A*yhbvR5XObugAAAAAAAAAAAAADkqGAQ/original\" />\n</ant-feedback>\n```\n\n```js\nPage({\n  data: {\n    visible: true,\n    feedList: [\n      { icon: 'HeartOutline', text: '喜欢推荐内容', id: '1', },\n      { icon: 'FrownOutline', text: '我不感兴趣', id: '2', },\n      { image: 'https://gw.alipayobjects.com/mdn/rms_ce4c6f/afts/img/A*XMCgSYx3f50AAAAAAAAAAABkARQnAQ', text: '看过类似内容', id: '3', },\n    ],\n  },\n  onVisibleChange(value) {\n#if ALIPAY\n    this.setData({ visible: value });\n#endif\n#if WECHAT\n    this.setData({ visible: value.detail });\n#endif\n  },\n  onTapFeedItem(feedItem) {\n#if ALIPAY\n    my.showToast({ content: `点击了反馈项${feedItem.text}`, });\n#endif\n#if WECHAT\n    wx.showToast({ title: `点击了反馈项${feedItem.text}`, });\n#endif\n  },\n});\n```\n\n### Feedback Card\n\n```xml\n<ant-feedback\n  a:if=\"{{visible}}\"\n  list=\"{{feedList}}\"\n  type=\"card\"\n  title=\"喜欢推荐的内容吗？\"\n#if ALIPAY\n  onVisibleChange=\"onVisibleChange\"\n  onTapFeedItem=\"onTapFeedItem\"\n#endif\n#if WECHAT\n  bindvisiblechange=\"onVisibleChange\"\n  bindtapfeeditem=\"onTapFeedItem\"\n#endif\n/>\n<ant-button\n  a:else\n  size=\"small\"\n  inline\n#if ALIPAY\n  onTap=\"onShowFeedback\"\n#endif\n#if WECHAT\n  bindtap=\"onShowFeedback\"\n#endif\n>\n  Click to show feedback card\n</ant-button>\n```\n\n```js\nPage({\n  data: {\n    visible: true,\n    feedList: [\n      { icon: 'HeartOutline', text: '喜欢推荐内容', id: '1', },\n      { icon: 'FrownOutline', text: '我不感兴趣', id: '2', },\n      { image: 'https://gw.alipayobjects.com/mdn/rms_ce4c6f/afts/img/A*XMCgSYx3f50AAAAAAAAAAABkARQnAQ', text: '看过类似内容', id: '3', },\n    ],\n  },\n  onVisibleChange(value) {\n#if ALIPAY\n    this.setData({ visible: value });\n#endif\n#if WECHAT\n    this.setData({ visible: value.detail });\n#endif\n  },\n  onTapFeedItem(feedItem) {\n#if ALIPAY\n    my.showToast({ content: `点击了反馈项${feedItem.text}`, });\n#endif\n#if WECHAT\n    wx.showToast({ title: `点击了反馈项${feedItem.text}`, });\n#endif\n  },\n  onShowFeedback() {\n    this.setData({\n      visible: true,\n    });\n  },\n});\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Feedback/index'></code>\n\n## API\n\n| Property                          | Description                                                                                                                                                                | Type                                 | Default Value       |\n| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ | ------------ |\n| visible                       | Whether visible                                                                                                                                                            | boolean                              | false        |\n| type                          | Type of feedback                                                                                                                                                            | 'popover' \\| 'card' \\| 'float'       | card         |\n| title                         | Title of the feedback                                                                                                                                                          | string                               | -            |\n| placement                     | Bubble box position, optional `top`、`top-right`、`top-left`、`bottom`、`bottom-left`、`bottom-right`、`left`、`left-top`、`left-bottom`、`right`、`right-top` or `right-bottom` | string                               | bottom-right |\n| list                          | List of Feedback                                                                                                                                                          | [FeedItem](#feeditem)[]              | -            |\n| className                     | outermost style name                                                                                                                                                      | string                               | -            |\n| style                         | outermost style string                                                                                                                                                  | string                               | -            |\n| popoverType                   | Bootstrap style for bubble feedback                                                                                                                                                  | 'circle' \\| 'default'                | -            |\n| autoAdjustOverflow            | Whether bubble position is adaptive                                                                                                                                                  | boolean                              | true         |\n| #if ALIPAY onVisibleChange    | Hook showing state change                                                                                                                                                  | (visible: boolean) => void           | -            |\n| #if ALIPAY onTapFeedItem      | Feedback Item Click Callback                                                                                                                                                      | (item: any) => void                  | -            |\n| #if WECHAT bindvisiblechange | Hook showing state change                                                                                                                                                  | (visible: boolean) => void           | -            |\n| #if WECHAT bindtapfeeditem   | Feedback Item Click Callback                                                                                                                                                      | ([FeedItem](#feeditem): any) => void | -            |\n\n### FeedItem\n\n| Property  | Description                                     | Type   | Default Value |\n| ----- | ---------------------------------------- | ------ | ------ |\n| icon  | Icons for feedback items                             | string | -      |\n| text  | Copy of the feedback item                             | string | -      |\n| image | The image and the icon of the feedback item are mutually exclusive, and the icon is displayed first. | string | -      |\n| id    | Unique identification of the feedback item                         | string | -      |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                              | Default Value                                                                                                                                | Dark Mode Default                                                                                                                        | Remarks             |\n| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ---------------- |\n| --feedback-text-color               | <div style=\"width: 150px; height: 40px; background-color: #333333; color: #FFFFFF;\">#333333</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #c5cad1; color: #FFFFFF;\">#c5cad1</div>                                     | Feedback Text Color     |\n| --feedback-background-color         | <div style=\"width: 150px; height: 40px; background-color: rgba(216, 216, 216, 0.42); color: #333333;\">rgba(216, 216, 216, 0.42)</div> | <div style=\"width: 150px; height: 40px; background-color: rgba(216, 216, 216, 0.42); color: #333333;\">rgba(216, 216, 216, 0.42)</div> | Feedback Background Color     |\n| --feedback-mask-color               | <div style=\"width: 150px; height: 40px; background-color: rgba(0, 0, 0, 0.25); color: #FFFFFF;\">rgba(0, 0, 0, 0.25)</div>             | <div style=\"width: 150px; height: 40px; background-color: rgba(0, 0, 0, 0.25); color: #FFFFFF;\">rgba(0, 0, 0, 0.25)</div>             | Feedback Mask Color     |\n| --feedback-content-background-color | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #333333;\">#ffffff</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #1a1a1a; color: #fff;\">#1a1a1a</div>                                     | Feedback Content Background Color |\n| --feedback-list-background-color    | <div style=\"width: 150px; height: 40px; background-color: #f5f5f5; color: #333333;\">#f5f5f5</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #121212; color: #fff;\">#121212</div>                                     | Feedback List Background Color |\n| --feedback-list-text-color          | <div style=\"width: 150px; height: 40px; background-color: #333333; color: #FFFFFF;\">#333333</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #c5cad1; color: #FFFFFF;\">#c5cad1</div>                                     | Feedback List Text Color |\n"
  },
  {
    "path": "src/Feedback/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-mask\": \"../Mask/index\",\n    \"ant-icon\": \"../Icon/index\",\n    \"popover\": \"../Popover/index\"\n  }\n}\n"
  },
  {
    "path": "src/Feedback/index.less",
    "content": "@import (reference) './variable.less';\n\n@avatarPrefix: ant-feedback;\n\n.@{avatarPrefix} {\n  .ant-popover-inner {\n    max-width: 100%;\n    color: @feedback-text-color;\n    background: @feedback-content-background-color;\n  }\n  .ant-popover-arrow {\n    border-bottom-color: @feedback-content-background-color;\n  }\n  &-popoverType-default {\n    .ant-popover-content {\n      width: 568 * @rpx;\n    }\n  }\n  &-popoverType-circle {\n    .ant-popover-content {\n      width: max-content;\n      transform: translate(-50%, 60 * @rpx);\n      left: 50% !important;\n      top: 50% !important;\n      bottom: 50% !important;\n      right: 50% !important;\n    }\n  }\n  &-show {\n    z-index: 9;\n    position: relative;\n  }\n  &-mask {\n    z-index: 2;\n    background: @feedback-mask-color;\n  }\n  &-trigger {\n    position: relative;\n  }\n  &-guide {\n    position: absolute;\n    background: @feedback-background-color;\n    border-radius: 50vh;\n    width: 48 * @rpx;\n    height: 48 * @rpx;\n    z-index: 999;\n    top: 50%;\n    left: 50%;\n    transform: translate(-50%, -50%);\n\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    &-content {\n      background: @feedback-content-background-color;\n      border-radius: 50vh;\n      width: 24 * @rpx;\n      height: 24 * @rpx;\n    }\n  }\n  &-content {\n    background: @feedback-content-background-color;\n    border-radius: 24 * @rpx;\n    &-card {\n      display: flex;\n      flex-direction: column;\n      padding: 24 * @rpx;\n      background: @feedback-content-background-color;\n      .ant-feedback-content-list {\n        flex-direction: column;\n        gap: 16 * @rpx;\n      }\n      .ant-feedback-content-list-item {\n        background: @feedback-list-background-color;\n        border-radius: 50vh;\n        padding: 18 * @rpx 24 * @rpx;\n      }\n    }\n    &-popover {\n      padding: 24 * @rpx;\n      .ant-feedback-content-list {\n        flex-direction: column;\n        gap: 16 * @rpx;\n      }\n      .ant-feedback-content-list-item {\n        background: @feedback-list-background-color;\n        border-radius: 50vh;\n        padding: 18 * @rpx 24 * @rpx;\n      }\n    }\n    &-title {\n      font-weight: 500;\n      font-size: 28 * @rpx;\n      color: @feedback-list-text-color;\n      letter-spacing: 0;\n      padding-bottom: 20 * @rpx;\n      padding-top: 4 * @rpx;\n    }\n    &-list {\n      display: flex;\n      flex-direction: column;\n      &-item {\n        display: flex;\n        flex-direction: row;\n        justify-content: flex-start;\n        align-items: center;\n        .ant-icon,\n        &-image {\n          font-size: 36 * @rpx;\n          width: 36 * @rpx;\n          height: 36 * @rpx;\n          margin-right: 16 * @rpx;\n        }\n        &-text {\n          font-weight: 400;\n          font-size: 26 * @rpx;\n          color: @feedback-list-text-color;\n          line-height: 37 * @rpx;\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/Feedback/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 反馈引导\n  order: 15\ntoc: content\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Feedback 信息反馈\n\n反馈多作用于分发场景。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-feedback\": \"antd-mini/es/Feedback/index\"\n#endif\n#if WECHAT\n  \"ant-feedback\": \"antd-mini/Feedback/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-feedback\n  visible=\"{{visible}}\"\n  type=\"popover\"\n  popoverType=\"default\"\n  placement=\"bottom-right\"\n#if ALIPAY\n  onVisibleChange=\"onVisibleChange\"\n#endif\n#if WECHAT\n  bindvisiblechange=\"onVisibleChange\"\n#endif\n>\n  <view class=\"feedback-demo-target\">\n    <ant-icon style=\"font-size: 40px\" type=\"MoreOutline\" />\n  </view>\n  <view slot=\"popover-content\" class=\"feedback-content\">\n    这里是 popover 内容\n  </view>\n</ant-feedback>\n```\n\n```js\nPage({\n  data: {\n    visible: true,\n  },\n  onVisibleChange(value) {\n#if ALIPAY\n    this.setData({ visible: value });\n#endif\n#if WECHAT\n    this.setData({ visible: value.detail });\n#endif\n  },\n});\n```\n\n### 点状引导反馈\n\n```xml\n<ant-feedback\n  type=\"popover\"\n  list=\"{{feedList}}\"\n  visible=\"{{visible}}\"\n  popoverType=\"circle\"\n  title=\"点引导反馈\"\n  placement=\"bottom\"\n#if ALIPAY\n  onVisibleChange=\"onVisibleChange\"\n  onTapFeedItem=\"onTapFeedItem\"\n#endif\n#if WECHAT\n  bindvisiblechange=\"onVisibleChange\"\n  bindtapfeeditem=\"onTapFeedItem\"\n#endif\n>\n  <image mode=\"widthFix\" style=\"width: 345rpx;\" src=\"https://mdn.alipayobjects.com/huamei_mnxlps/afts/img/A*yhbvR5XObugAAAAAAAAAAAAADkqGAQ/original\" />\n</ant-feedback>\n```\n\n```js\nPage({\n  data: {\n    visible: true,\n    feedList: [\n      { icon: 'HeartOutline', text: '喜欢推荐内容', id: '1', },\n      { icon: 'FrownOutline', text: '我不感兴趣', id: '2', },\n      { image: 'https://gw.alipayobjects.com/mdn/rms_ce4c6f/afts/img/A*XMCgSYx3f50AAAAAAAAAAABkARQnAQ', text: '看过类似内容', id: '3', },\n    ],\n  },\n  onVisibleChange(value) {\n#if ALIPAY\n    this.setData({ visible: value });\n#endif\n#if WECHAT\n    this.setData({ visible: value.detail });\n#endif\n  },\n  onTapFeedItem(feedItem) {\n#if ALIPAY\n    my.showToast({ content: `点击了反馈项${feedItem.text}`, });\n#endif\n#if WECHAT\n    wx.showToast({ title: `点击了反馈项${feedItem.text}`, });\n#endif\n  },\n});\n```\n\n### 反馈卡片\n\n```xml\n<ant-feedback\n  a:if=\"{{visible}}\"\n  list=\"{{feedList}}\"\n  type=\"card\"\n  title=\"喜欢推荐的内容吗？\"\n#if ALIPAY\n  onVisibleChange=\"onVisibleChange\"\n  onTapFeedItem=\"onTapFeedItem\"\n#endif\n#if WECHAT\n  bindvisiblechange=\"onVisibleChange\"\n  bindtapfeeditem=\"onTapFeedItem\"\n#endif\n/>\n<ant-button\n  a:else\n  size=\"small\"\n  inline\n#if ALIPAY\n  onTap=\"onShowFeedback\"\n#endif\n#if WECHAT\n  bindtap=\"onShowFeedback\"\n#endif\n>\n  点击 展示反馈卡片\n</ant-button>\n```\n\n```js\nPage({\n  data: {\n    visible: true,\n    feedList: [\n      { icon: 'HeartOutline', text: '喜欢推荐内容', id: '1', },\n      { icon: 'FrownOutline', text: '我不感兴趣', id: '2', },\n      { image: 'https://gw.alipayobjects.com/mdn/rms_ce4c6f/afts/img/A*XMCgSYx3f50AAAAAAAAAAABkARQnAQ', text: '看过类似内容', id: '3', },\n    ],\n  },\n  onVisibleChange(value) {\n#if ALIPAY\n    this.setData({ visible: value });\n#endif\n#if WECHAT\n    this.setData({ visible: value.detail });\n#endif\n  },\n  onTapFeedItem(feedItem) {\n#if ALIPAY\n    my.showToast({ content: `点击了反馈项${feedItem.text}`, });\n#endif\n#if WECHAT\n    wx.showToast({ title: `点击了反馈项${feedItem.text}`, });\n#endif\n  },\n  onShowFeedback() {\n    this.setData({\n      visible: true,\n    });\n  },\n});\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Feedback/index'></code>\n\n## API\n\n| 属性                          | 说明                                                                                                                                                                | 类型                                 | 默认值       |\n| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ | ------------ |\n| visible                       | 是否可见                                                                                                                                                            | boolean                              | false        |\n| type                          | 反馈类型                                                                                                                                                            | 'popover' \\| 'card' \\| 'float'       | card         |\n| title                         | 反馈的标题                                                                                                                                                          | string                               | -            |\n| placement                     | 气泡框位置，可选 `top`、`top-right`、`top-left`、`bottom`、`bottom-left`、`bottom-right`、`left`、`left-top`、`left-bottom`、`right`、`right-top` 或 `right-bottom` | string                               | bottom-right |\n| list                          | 反馈的列表                                                                                                                                                          | [FeedItem](#feeditem)[]              | -            |\n| className                     | 最外层的样式名                                                                                                                                                      | string                               | -            |\n| style                         | 最外层的样式字符串                                                                                                                                                  | string                               | -            |\n| popoverType                   | 气泡反馈的引导样式                                                                                                                                                  | 'circle' \\| 'default'                | -            |\n| autoAdjustOverflow            | 气泡位置是否自适应                                                                                                                                                  | boolean                              | true         |\n| #if ALIPAY onVisibleChange    | 展示状态改变的勾子                                                                                                                                                  | (visible: boolean) => void           | -            |\n| #if ALIPAY onTapFeedItem      | 反馈项点击回调                                                                                                                                                      | (item: any) => void                  | -            |\n| #if WECHAT bindvisiblechange | 展示状态改变的勾子                                                                                                                                                  | (visible: boolean) => void           | -            |\n| #if WECHAT bindtapfeeditem   | 反馈项点击回调                                                                                                                                                      | ([FeedItem](#feeditem): any) => void | -            |\n\n### FeedItem\n\n| 属性  | 说明                                     | 类型   | 默认值 |\n| ----- | ---------------------------------------- | ------ | ------ |\n| icon  | 反馈项的图标                             | string | -      |\n| text  | 反馈项的文案                             | string | -      |\n| image | 反馈项的图片 和 icon 互斥，优先展示 icon | string | -      |\n| id    | 反馈项的唯一标识                         | string | -      |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                              | 默认值                                                                                                                                | 深色模式默认值                                                                                                                        | 备注             |\n| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ---------------- |\n| --feedback-text-color               | <div style=\"width: 150px; height: 40px; background-color: #333333; color: #FFFFFF;\">#333333</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #c5cad1; color: #FFFFFF;\">#c5cad1</div>                                     | 反馈文本颜色     |\n| --feedback-background-color         | <div style=\"width: 150px; height: 40px; background-color: rgba(216, 216, 216, 0.42); color: #333333;\">rgba(216, 216, 216, 0.42)</div> | <div style=\"width: 150px; height: 40px; background-color: rgba(216, 216, 216, 0.42); color: #333333;\">rgba(216, 216, 216, 0.42)</div> | 反馈背景颜色     |\n| --feedback-mask-color               | <div style=\"width: 150px; height: 40px; background-color: rgba(0, 0, 0, 0.25); color: #FFFFFF;\">rgba(0, 0, 0, 0.25)</div>             | <div style=\"width: 150px; height: 40px; background-color: rgba(0, 0, 0, 0.25); color: #FFFFFF;\">rgba(0, 0, 0, 0.25)</div>             | 反馈遮罩颜色     |\n| --feedback-content-background-color | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #333333;\">#ffffff</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #1a1a1a; color: #fff;\">#1a1a1a</div>                                     | 反馈内容背景颜色 |\n| --feedback-list-background-color    | <div style=\"width: 150px; height: 40px; background-color: #f5f5f5; color: #333333;\">#f5f5f5</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #121212; color: #fff;\">#121212</div>                                     | 反馈列表背景颜色 |\n| --feedback-list-text-color          | <div style=\"width: 150px; height: 40px; background-color: #333333; color: #FFFFFF;\">#333333</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #c5cad1; color: #FFFFFF;\">#c5cad1</div>                                     | 反馈列表文本颜色 |\n"
  },
  {
    "path": "src/Feedback/index.ts",
    "content": "import { resolveEventValue } from '../_util/platform';\nimport { Component, triggerEvent } from '../_util/simply';\nimport { assertAilpayNativeNotSupport } from '../_util/support';\nimport { FeedbackDefaultProps } from './props';\n\nassertAilpayNativeNotSupport('Feedback');\n\nComponent({\n  props: FeedbackDefaultProps,\n  methods: {\n    handleVisibleChange(visible, e) {\n      triggerEvent(this, 'visibleChange', resolveEventValue(visible), e);\n    },\n    onTapFeedItem(e) {\n      const { item } = e.currentTarget.dataset;\n      triggerEvent(this, 'tapFeedItem', item, e);\n    },\n    maskClick(e) {\n      triggerEvent(this, 'visibleChange', true, e);\n    },\n  },\n});\n"
  },
  {
    "path": "src/Feedback/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\n/**\n * @description 反馈，通过气泡和卡片的形式展示反馈的内容\n */\n\nexport interface FeedItem {\n  /**\n   * @description 反馈项的图标\n   */\n  icon?: string;\n  /**\n   * @description 反馈项的文案\n   */\n  text: string;\n  /**\n   * @description 反馈项的图片 和icon互斥 优先展示icon\n   */\n  image?: string;\n  /**\n   * @description 反馈项的唯一标识\n   */\n  id?: string;\n}\nexport interface IFeedbackProps extends IBaseProps {\n  /**\n   * @description 是否可见\n   * @default false\n   */\n  visible: boolean;\n  /**\n   * @description 反馈类型\n   * @default card\n   */\n  type: 'popover' | 'card' | 'float';\n  /**\n   * @description 反馈的标题\n   */\n  title?: string;\n  /**\n   * @description 反馈气泡的位置\n   * @default bottom-right\n   */\n  placement: string;\n  /**\n   * @description 反馈的列表\n   */\n  list?: FeedItem[];\n  /**\n   * @description 最外层的样式名\n   */\n  className: string;\n  /**\n   * @description 最外层的样式字符串\n   */\n  style: string;\n  /**\n   * @description 气泡反馈的引导样式\n   */\n  popoverType: 'circle' | 'default';\n  /**\n   * @description 气泡位置是否自适应\n   * @default true\n   */\n  autoAdjustOverflow;\n  /**\n   * 展示状态改变的勾子\n   * @param visible 反馈内容展示状态\n   */\n  onVisibleChange: (visible) => void;\n  /**\n   * 反馈项点击回调\n   * @param item 点击的反馈项内容\n   */\n  onTapFeedItem: (item) => void;\n}\n\nexport const FeedbackDefaultProps: Partial<IFeedbackProps> = {\n  className: '',\n  title: '',\n  list: [],\n  type: 'card',\n  placement: 'bottom-right',\n  visible: null,\n  style: '',\n  popoverType: 'default',\n  autoAdjustOverflow: true,\n  onVisibleChange: () => {},\n  onTapFeedItem: () => {},\n};\n"
  },
  {
    "path": "src/Feedback/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n// 字体颜色\n@feedback-text-color: var(--feedback-text-color, @COLOR_TEXT_PRIMARY);\n\n// 背景颜色\n@feedback-background-color: var(\n  --feedback-background-color,\n  rgba(216, 216, 216, 0.42)\n);\n// mask颜色\n@feedback-mask-color: var(--feedback-mask-color, rgba(0, 0, 0, 0.25));\n\n// content颜色\n@feedback-content-background-color: var(\n  --feedback-content-background-color,\n  @COLOR_CARD_DEFAULT\n);\n\n// list背景色\n@feedback-list-background-color: var(\n  --feedback-list-background-color,\n  @COLOR_BACKGROUND_DEFAULT\n);\n// list字体颜色\n@feedback-list-text-color: var(--feedback-list-text-color @COLOR_TEXT_PRIMARY);\n"
  },
  {
    "path": "src/Footer/index.axml",
    "content": "\n<view class=\"ant-footer {{className}}\">\n  <ant-divider a:if=\"{{label && !noLabelDivider }}\" className=\"ant-footer-label\">\n    <text slot=\"text\" class=\"ant-footer-label-text\">\n      <!-- #if ALIPAY -->\n      <slot name=\"label\">\n      <!-- #endif -->\n        {{label}}\n      <!-- #if ALIPAY -->\n      </slot>\n      <!-- #endif -->\n    </text>\n  </ant-divider>\n\n  <text a:if=\"{{label && noLabelDivider }}\" slot=\"text\" class=\"ant-footer-label-text\">\n    <!-- #if ALIPAY -->\n    <slot name=\"label\">\n    <!-- #endif -->\n      {{label}}\n    <!-- #if ALIPAY -->\n    </slot>\n    <!-- #endif -->\n  </text>\n\n  <view class=\"ant-footer-links\" a:if=\"{{links}}\">\n    <view\n      class=\"ant-footer-links-item\"\n      a:for=\"{{links}}\"\n      a:key=\"key\"\n      data-item=\"{{item}}\"\n      onTap=\"onTapLink\"\n    >\n      <view\n        hover-start-time=\"20\"\n        hover-stay-time=\"50\"\n        hover-class=\"hover\"\n      >\n        {{item.text}}\n      </view>\n      <ant-divider direction=\"vertical\" a:if=\"{{index !== links.length - 1}}\" />\n    </view>\n  </view>\n\n  <view a:if=\"{{content}}\" class=\"ant-footer-content\">\n    <!-- #if ALIPAY -->\n    <slot name=\"content\">\n    <!-- #endif -->\n      <text>{{content}}</text>\n    <!-- #if ALIPAY -->\n    </slot>\n    <!-- #endif -->\n  </view>\n\n  <view class=\"ant-footer-chips\" a:if=\"{{chips}}\">\n    <view\n      class=\"ant-footer-chips-item {{index === 0 ? 'first' : ''}} {{item.disabled ? 'disabled' : ''}}\"\n      a:for=\"{{chips}}\"\n      a:key=\"key\"\n      hover-start-time=\"20\"\n      hover-stay-time=\"50\"\n      hover-class=\"hover\"\n      data-item=\"{{item}}\"\n      onTap=\"onTapChip\"\n    >\n      <view>{{item.text}}</view>\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "src/Footer/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Navigation\n  order: 6\ntoc: 'content'\n---\n\n# Footer\n\nappears at the bottom of the page and provides the user with additional instructions or assistance beyond the content of the page\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-footer\": \"antd-mini/es/Footer/index\"\n#endif\n#if WECHAT\n  \"ant-footer\": \"antd-mini/Footer/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n> If no split line is needed, pass in `noLabelDivider` property.\n\n```xml\n<ant-footer label=\"没有更多了\" />\n\n<ant-footer label=\"没有更多了\" noLabelDivider />\n\n#if ALIPAY\n<!-- 支持插槽自定义 label。 -->\n<ant-footer label=\"placeholder\">\n  <view slot=\"label\">\n    Ant Wealth\n  </view>\n</ant-footer>\n#endif\n```\n\n### Footer with Content\n\n```xml\n<ant-footer content=\"@ 2004-2020 Alipay.com All rights reserved\" />\n\n#if ALIPAY\n<!-- 支持插槽自定义 label。 -->\n<ant-footer content=\"placeholder\">\n  <view slot=\"content\">\n    ©Ant Technology Group Co., Ltd.\n  </view>\n</ant-footer>\n#endif\n```\n\n### with link footer\n\n```xml\n<ant-footer\n  links=\"{{links}}\"\n#if ALIPAY\n  onLinkTap=\"handleLinkTap\"\n#endif\n#if WECHAT\n  bindlinktap=\"handleLinkTap\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    links: [\n      { key: 'alicloud', text: '阿里云' },\n      { key: 'alipay', text: '支付宝' }\n    ],\n  },\n  handleLinkTap(item) {\n#if ALIPAY\n    if (item.disabled) return;\n    my.showToast({ content: item.key });\n#endif\n#if WECHAT\n    if (item.detail.disabled) return;\n    wx.showToast({\n      title: item.detail.key,\n    });\n#endif\n  },\n});\n```\n\n### Tagged Footer\n\n```xml\n<ant-footer\n  chips=\"{{chips}}\"\n#if ALIPAY\n  onChipTap=\"handleChipTap\"\n#endif\n#if WECHAT\n  bindchiptap=\"handleLinkTap\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    chips: [\n      { key: 'jiebei', text: '蚂蚁借呗' },\n      { key: 'beiyongjin', text: '备用金' },\n      { key: 'huabei', text: '花呗收钱', disabled: true }\n    ],\n  },\n  handleChipTap(item) {\n#if ALIPAY\n    if (item.disabled) return;\n    my.showToast({ content: item.key });\n#endif\n#if WECHAT\n    if (item.detail.disabled) return;\n    wx.showToast({\n      title: item.detail.key,\n    });\n#endif\n  },\n});\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Footer/index'></code>\n\n## API\n\n| Property                    | Description                 | Type                                                 | Default Value  |\n| ----------------------- | -------------------- | ---------------------------------------------------- | ------- |\n| label                   | Top content with dividing line   | `string`                                             | -       |\n| content                 | Common Content Section       | `string`                                             | -       |\n| links                   | Link                 | `Array<`[ActionItem](#actionitem)`>`                 | -       |\n| chips                   | Bottom Label             | `Array<`[ActionItem](#actionitem)`>`                 | -       |\n| noLabelDivider          | No dividing line with label  | `boolean`                                            | `false` |\n| #if ALIPAY onLinkTap    | Callback after link click     | `(actionItem?: `[ActionItem](#actionitem)`) => void` | -       |\n| #if ALIPAY onChipTap    | Callback after bottom tab click | `(actionItem?: `[ActionItem](#actionitem)`) => void` | -       |\n| #if WECHAT bindlinktap | Callback after link click     | `(actionItem?: `[ActionItem](#actionitem)`) => void` | -       |\n| #if WECHAT bindchiptap | Callback after bottom tab click | `(actionItem?: `[ActionItem](#actionitem)`) => void` | -       |\n\n### ActionItem\n\n| Property | Description     | Type   | Default Value |\n| ---- | -------- | ------ | ------ |\n| text | Show copy | string | -      |\n| key  | Unique identification | string | -      |\n"
  },
  {
    "path": "src/Footer/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-divider\": \"../Divider\"\n  }\n}\n"
  },
  {
    "path": "src/Footer/index.less",
    "content": "@import (reference) './variable.less';\n\n.ant-footer {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  .hover {\n    opacity: 0.4;\n  }\n  &-label {\n    width: 100%;\n    margin: 20 * @rpx 0;\n    padding: 0;\n    &-text {\n      margin: 0 24 * @rpx;\n      font-size: 28 * @rpx;\n      line-height: 40 * @rpx;\n      color: @footer-color;\n    }\n    .ant-divider-horizontal-left,\n    .ant-divider-horizontal-right {\n      flex: 1 !important;\n      border-color: @footer-divider-color;\n    }\n  }\n\n  &-links {\n    display: flex;\n    align-items: center;\n    margin: 8 * @rpx 0;\n    &-item {\n      display: flex;\n      align-items: center;\n      font-size: 26 * @rpx;\n      line-height: 37 * @rpx;\n      color: @footer-link-color;\n      .ant-divider-vertical {\n        height: 24 * @rpx;\n      }\n    }\n  }\n\n  &-content {\n    font-size: 26 * @rpx;\n    line-height: 37 * @rpx;\n    color: @footer-color;\n    margin: 8 * @rpx 0;\n  }\n\n  &-chips {\n    display: flex;\n    align-items: center;\n    margin: 12 * @rpx 0;\n    &-item {\n      box-sizing: border-box;\n      height: 49 * @rpx;\n      padding: 8 * @rpx 24 * @rpx;\n      border-radius: 25 * @rpx;\n      font-size: 24 * @rpx;\n      line-height: 33 * @rpx;\n      background: @footer-chip-background-color;\n      color: @footer-link-color;\n      margin-left: 40 * @rpx;\n      &.first {\n        margin-left: 0;\n      }\n\n      &.disabled {\n        background: @footer-chip-disabled-background-color;\n        color: @footer-chip-disabled-color;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/Footer/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 导航\n  order: 6\ntoc: 'content'\n---\n\n# Footer 页脚\n\n出现在页面底部，为用户提供页面内容外的额外说明或辅助操作\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-footer\": \"antd-mini/es/Footer/index\"\n#endif\n#if WECHAT\n  \"ant-footer\": \"antd-mini/Footer/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n> 如果不需要分割线，传入 `noLabelDivider` 属性。\n\n```xml\n<ant-footer label=\"没有更多了\" />\n\n<ant-footer label=\"没有更多了\" noLabelDivider />\n\n#if ALIPAY\n<!-- 支持插槽自定义 label。 -->\n<ant-footer label=\"placeholder\">\n  <view slot=\"label\">\n    蚂蚁财富\n  </view>\n</ant-footer>\n#endif\n```\n\n### 带内容页脚\n\n```xml\n<ant-footer content=\"@ 2004-2020 Alipay.com All rights reserved\" />\n\n#if ALIPAY\n<!-- 支持插槽自定义 label。 -->\n<ant-footer content=\"placeholder\">\n  <view slot=\"content\">\n    © 蚂蚁科技集团股份有限公司\n  </view>\n</ant-footer>\n#endif\n```\n\n### 带链接页脚\n\n```xml\n<ant-footer\n  links=\"{{links}}\"\n#if ALIPAY\n  onLinkTap=\"handleLinkTap\"\n#endif\n#if WECHAT\n  bindlinktap=\"handleLinkTap\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    links: [\n      { key: 'alicloud', text: '阿里云' },\n      { key: 'alipay', text: '支付宝' }\n    ],\n  },\n  handleLinkTap(item) {\n#if ALIPAY\n    if (item.disabled) return;\n    my.showToast({ content: item.key });\n#endif\n#if WECHAT\n    if (item.detail.disabled) return;\n    wx.showToast({\n      title: item.detail.key,\n    });\n#endif\n  },\n});\n```\n\n### 带标签页脚\n\n```xml\n<ant-footer\n  chips=\"{{chips}}\"\n#if ALIPAY\n  onChipTap=\"handleChipTap\"\n#endif\n#if WECHAT\n  bindchiptap=\"handleLinkTap\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    chips: [\n      { key: 'jiebei', text: '蚂蚁借呗' },\n      { key: 'beiyongjin', text: '备用金' },\n      { key: 'huabei', text: '花呗收钱', disabled: true }\n    ],\n  },\n  handleChipTap(item) {\n#if ALIPAY\n    if (item.disabled) return;\n    my.showToast({ content: item.key });\n#endif\n#if WECHAT\n    if (item.detail.disabled) return;\n    wx.showToast({\n      title: item.detail.key,\n    });\n#endif\n  },\n});\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Footer/index'></code>\n\n## API\n\n| 属性                    | 说明                 | 类型                                                 | 默认值  |\n| ----------------------- | -------------------- | ---------------------------------------------------- | ------- |\n| label                   | 带分割线的顶部内容   | `string`                                             | -       |\n| content                 | 普通的内容部分       | `string`                                             | -       |\n| links                   | 链接                 | `Array<`[ActionItem](#actionitem)`>`                 | -       |\n| chips                   | 底部标签             | `Array<`[ActionItem](#actionitem)`>`                 | -       |\n| noLabelDivider          | 没有 label 的分割线  | `boolean`                                            | `false` |\n| #if ALIPAY onLinkTap    | 链接点击后的回调     | `(actionItem?: `[ActionItem](#actionitem)`) => void` | -       |\n| #if ALIPAY onChipTap    | 底部标签点击后的回调 | `(actionItem?: `[ActionItem](#actionitem)`) => void` | -       |\n| #if WECHAT bindlinktap | 链接点击后的回调     | `(actionItem?: `[ActionItem](#actionitem)`) => void` | -       |\n| #if WECHAT bindchiptap | 底部标签点击后的回调 | `(actionItem?: `[ActionItem](#actionitem)`) => void` | -       |\n\n### ActionItem\n\n| 属性 | 说明     | 类型   | 默认值 |\n| ---- | -------- | ------ | ------ |\n| text | 展示文案 | string | -      |\n| key  | 唯一标识 | string | -      |\n"
  },
  {
    "path": "src/Footer/index.ts",
    "content": "import { Component, triggerEvent } from '../_util/simply';\nimport { DefaultProps } from './props';\n\nComponent({\n  props: DefaultProps,\n  methods: {\n    onTapLink(e) {\n      const { item } = e.currentTarget.dataset;\n      triggerEvent(this, 'linkTap', item, e);\n    },\n    onTapChip(e) {\n      const { item } = e.currentTarget.dataset;\n      triggerEvent(this, 'chipTap', item, e);\n    },\n  },\n});\n"
  },
  {
    "path": "src/Footer/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\nexport type ActionItem = {\n  key?: string;\n  text: string;\n};\n\nexport interface IProps extends IBaseProps {\n  /**\n   * @description 带分割线的顶部内容\n   * @default ''\n   */\n  label?: string;\n  /**\n   * @description 普通的内容部分\n   * @default ''\n   */\n  content?: string;\n  /**\n   * @description 链接\n   * @default undefined\n   */\n  links?: Array<ActionItem>;\n  /**\n   * @description 底部标签\n   * @default undefined\n   */\n  chips?: Array<ActionItem>;\n  /**\n   * @description 没有label的分割线\n   * @default false\n   */\n  noLabelDivider?: boolean;\n  /**\n   * @description 链接点击后的回调\n   */\n  onLinkTap?: (actionItem?: ActionItem) => void;\n  /**\n   * @description 底部标签点击后的回调\n   */\n  onChipTap?: (actionItem?: ActionItem) => void;\n}\n\nexport const DefaultProps: Partial<IProps> = {\n  className: null,\n  label: null,\n  content: null,\n  links: null,\n  chips: null,\n  noLabelDivider: false,\n  onLinkTap() {},\n  onChipTap() {},\n};\n"
  },
  {
    "path": "src/Footer/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n@footer-color: var(--footer-color, #cccccc);\n\n@footer-divider-color: var(--footer-divider-color, #eeeeee);\n\n@footer-link-color: var(--footer-link-color, #1677ff);\n\n@footer-chip-background-color: var(--footer-chip-background-color, #f0f3f7);\n\n@footer-chip-disabled-background-color: var(\n  --footer-chip-disabled-background-color,\n  #f5f5f5\n);\n\n@footer-chip-disabled-color: var(--footer-chip-disabled-color, #999999);\n"
  },
  {
    "path": "src/Form/FormCascaderPicker/index.axml",
    "content": "<import-sjs from=\"../../_util/arrow.sjs\" name=\"arrowUtil\" />\n<import-sjs from=\"../../_util/isPropsEmpty.sjs\" name=\"u\" />\n\n<form-item\n  className=\"{{ className }}\"\n  style=\"{{ style }}\"\n  position=\"{{ position }}\"\n  label=\"{{ label }}\"\n  labelWidth=\"{{ labelWidth }}\"\n  status=\"{{ formData.status }}\"\n  errors=\"{{ formData.errors }}\"\n  tooltip=\"{{ tooltip }}\"\n  required=\"{{ formData.required }}\"\n  requiredMark=\"{{ requiredMark }}\"\n  validateStatus=\"{{ validateStatus }}\"\n  help=\"{{ help }}\"\n>\n  <view>\n    <block a:if=\"{{readonly && !(formData.value && formData.value.length)}}\">\n      <!-- #if ALIPAY -->\n      <slot name=\"readonly\" formData=\"{{formData}}\">\n      <!-- #endif -->\n        -\n      <!-- #if ALIPAY -->\n      </slot>\n      <!-- #endif -->\n    </block>\n    <ant-cascader-picker\n      style=\"{{readonly && !(formData.value && formData.value.length) ? 'display:none' : ''}};{{ cascaderPickerStyle }}\"\n      options=\"{{ options }}\"\n      cancelText=\"{{ u.isPropsEmpty(cancelText) ? locale.global.cancelText : cancelText }}\"\n      okText=\"{{ u.isPropsEmpty(okText) ? locale.global.okText : okText }}\"\n      placeholder=\"{{ u.isPropsEmpty(placeholder) ? locale.global.placeholder : placeholder  }}\"\n      animationType=\"{{ animationType }}\"\n      maskClosable=\"{{ maskClosable }}\"\n      maskStyle=\"{{ maskStyle }}\"\n      popClassName=\"{{ popClassName }}\"\n      popStyle=\"{{ popStyle }}\"\n      disabled=\"{{ disabled }}\"\n      readonly=\"{{ readonly }}\"\n      title=\"{{ title }}\"\n      maskClassName=\"{{ maskClassName }}\"\n      indicatorStyle=\"{{ indicatorStyle }}\"\n      indicatorClassName=\"{{ indicatorClassName }}\"\n      value=\"{{ formData.value }}\"\n      onOk=\"onOk\"\n      onChange=\"onChange\"\n      onCancel=\"onDismissPicker\"\n      onVisibleChange=\"onVisibleChange\"\n      onFormat=\"{{ handleFormat ? handleFormat : 'handleFormat' }}\"\n    >\n      <slot name=\"content\" slot=\"content\" />\n      <slot name=\"title\" slot=\"title\" />\n\n      <ant-icon\n        a:if=\"{{!readonly && arrowUtil.getArrow(arrow) }}\"\n        className=\"ant-form-cascader-picker-arrow\"\n        type=\"{{ arrowUtil.getArrow(arrow) }}\"\n        slot=\"suffix\"\n      />\n    </ant-cascader-picker>\n  </view>\n\n  <view a:if=\"{{ !tooltip }}\" slot=\"tooltip\">\n    <slot name=\"tooltip\" />\n  </view>\n\n  <view slot=\"extra\">\n    <slot name=\"extra\">{{ extra }}</slot>\n  </view>\n\n  <view slot=\"header\" slot-scope=\"item\">\n    <slot name=\"header\" errors=\"{{ item.errors }}\" status=\"{{ item.status }}\" />\n  </view>\n\n  <view slot=\"footer\" slot-scope=\"item\">\n    <slot name=\"footer\" errors=\"{{ item.errors }}\" status=\"{{ item.status }}\" />\n  </view>\n</form-item>\n"
  },
  {
    "path": "src/Form/FormCascaderPicker/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"form-item\": \"../FormItem/index\",\n    \"ant-cascader-picker\": \"../../Picker/CascaderPicker/index\",\n    \"ant-icon\": \"../../Icon/index\"\n  }\n}\n"
  },
  {
    "path": "src/Form/FormCascaderPicker/index.less",
    "content": "@import (reference) '../variable.less';\n.ant-form-cascader-picker {\n  &-arrow {\n    margin-left: 8 * @rpx;\n    color: @form-text-color;\n    font-size: 36 * @rpx;\n  }\n}\n"
  },
  {
    "path": "src/Form/FormCascaderPicker/index.ts",
    "content": "import { effect } from '@preact/signals-core';\nimport { resolveEventValue, resolveEventValues } from '../../_util/platform';\nimport {\n  ComponentWithSignalStoreImpl,\n  getValueFromProps,\n  triggerEvent,\n  triggerEventOnly,\n  triggerEventValues,\n} from '../../_util/simply';\nimport i18nController from '../../_util/store';\nimport { createForm } from '../form';\nimport { FormCascaderPickerDefaultProps } from './props';\n\nComponentWithSignalStoreImpl({\n  storeOptions: {\n    store: () => i18nController,\n    updateHook: effect,\n    mapState: {\n      locale: ({ store }) => store.currentLocale.value,\n    },\n  },\n  props: FormCascaderPickerDefaultProps,\n  methods: {\n    onOk(value, option, e) {\n      const v = resolveEventValues(value, option);\n      this.emit('onChange', v[0]);\n      triggerEventValues(this, 'ok', v, e);\n    },\n    onPickerChange(value, option, e) {\n      triggerEventValues(\n        this,\n        'pickerChange',\n        resolveEventValues(value, option),\n        e\n      );\n    },\n    onVisibleChange(visible, e) {\n      triggerEvent(this, 'visibleChange', resolveEventValue(visible), e);\n    },\n    onDismissPicker(e) {\n      triggerEventOnly(this, 'cancel', e);\n    },\n    onChange(value, options, e) {\n      triggerEventValues(this, 'change', resolveEventValues(value, options), e);\n    },\n    handleFormat(value, option) {\n      const onFormat = getValueFromProps(this, 'onFormat');\n      if (onFormat) {\n        return onFormat(value, option);\n      }\n    },\n  },\n  mixins: [createForm()],\n  /// #if WECHAT\n  attached() {\n    this.setData({\n      handleFormat: this.handleFormat.bind(this),\n    });\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/Form/FormCascaderPicker/props.ts",
    "content": "import {\n  CascaderDefaultProps,\n  ICascaderProps,\n} from '../../Picker/CascaderPicker/props';\nimport { FormItemDefaultProps, FormItemProps } from '../FormItem/props';\n\nexport interface FormCascaderPickerProps extends ICascaderProps, FormItemProps {\n  /**\n   * @description 箭头方向，不传表示没有箭头\n   */\n  arrow: boolean | 'right' | 'up' | 'down';\n}\n\nexport const FormCascaderPickerDefaultProps: Partial<FormCascaderPickerProps> =\n  {\n    ...FormItemDefaultProps,\n    ...CascaderDefaultProps,\n    arrow: false,\n  };\n"
  },
  {
    "path": "src/Form/FormCheckboxGroup/index.axml",
    "content": "<form-item\n  className=\"{{ className }}\"\n  style=\"{{ style }}\"\n  position=\"{{ position }}\"\n  label=\"{{ label }}\"\n  labelWidth=\"{{ labelWidth }}\"\n  status=\"{{ formData.status }}\"\n  errors=\"{{ formData.errors }}\"\n  tooltip=\"{{ tooltip }}\"\n  required=\"{{ formData.required }}\"\n  requiredMark=\"{{ requiredMark }}\"\n  validateStatus=\"{{ validateStatus }}\"\n  help=\"{{ help }}\">\n  <view>\n    <view a:if=\"{{readonly}}\">\n      <!-- #if ALIPAY -->\n      <slot name=\"readonly\"formData=\"{{formData}}\">\n      <!-- #endif -->\n        <text a:if=\"{{formData.value.length > 0}}\">{{formData.value}}</text>\n        <text a:else>-</text>\n      <!-- #if ALIPAY -->\n      </slot>\n      <!-- #endif -->\n    </view>\n    <checkbox-group\n      style=\"{{readonly ? 'display:none' : ''}};{{ checkboxGroupStyle }}\"\n      options=\"{{ options }}\"\n      value=\"{{ formData.value }}\"\n      onChange=\"onChange\"\n      color=\"{{ color }}\"\n      disabled=\"{{ disabled }}\"\n      position=\"{{ checkboxPosition }}\">\n      <slot\n        name=\"checkboxLabel\"\n        slot=\"label\"\n        slot-scope=\"props\"\n        value=\"{{ props.value }}\"\n        index=\"{{ props.index }}\" />\n    </checkbox-group>\n  </view>\n  <view\n    a:if=\"{{ !tooltip }}\"\n    slot=\"tooltip\">\n    <slot name=\"tooltip\" />\n  </view>\n  <view slot=\"extra\">\n    <slot name=\"extra\">{{ extra }}</slot>\n  </view>\n  <view\n    slot=\"header\"\n    slot-scope=\"item\">\n    <slot\n      name=\"header\"\n      errors=\"{{ item.errors }}\"\n      status=\"{{ item.status }}\" />\n  </view>\n  <view\n    slot=\"footer\"\n    slot-scope=\"item\">\n    <slot\n      name=\"footer\"\n      errors=\"{{ item.errors }}\"\n      status=\"{{ item.status }}\" />\n  </view>\n</form-item>\n"
  },
  {
    "path": "src/Form/FormCheckboxGroup/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"form-item\": \"../FormItem/index\",\n    \"checkbox-group\": \"../../Checkbox/CheckboxGroup/index\"\n  }\n}\n"
  },
  {
    "path": "src/Form/FormCheckboxGroup/index.ts",
    "content": "import { resolveEventValue } from '../../_util/platform';\nimport { Component, triggerEvent } from '../../_util/simply';\nimport { createForm } from '../form';\nimport { FormCheckboxGroupDefaultProps } from './props';\n\nComponent({\n  props: FormCheckboxGroupDefaultProps,\n  methods: {\n    onChange(value, e) {\n      this.emit('onChange', resolveEventValue(value));\n      triggerEvent(this, 'change', resolveEventValue(value), e);\n    },\n  },\n  mixins: [createForm()],\n});\n"
  },
  {
    "path": "src/Form/FormCheckboxGroup/props.ts",
    "content": "import { FormItemDefaultProps, FormItemProps } from '../FormItem/props';\nimport {\n  CheckboxGroupDefaultProps,\n  ICheckboxGroupProps,\n} from '../../Checkbox/CheckboxGroup/props';\n\nexport interface FormCheckboxGroupProps\n  extends Omit<ICheckboxGroupProps, 'position'>,\n    FormItemProps {\n  checkboxPosition?: ICheckboxGroupProps['position'];\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst { position, ...rest } = CheckboxGroupDefaultProps;\nexport const FormCheckboxGroupDefaultProps: Partial<FormCheckboxGroupProps> = {\n  ...FormItemDefaultProps,\n  ...rest,\n  checkboxPosition: 'horizontal',\n};\n"
  },
  {
    "path": "src/Form/FormDatePicker/index.axml",
    "content": "<import-sjs from=\"../../_util/arrow.sjs\" name=\"arrowUtil\" />\n<import-sjs from=\"../../_util/isPropsEmpty.sjs\" name=\"u\" />\n\n<form-item\n  className=\"{{ className }}\"\n  style=\"{{ style }}\"\n  position=\"{{ position }}\"\n  label=\"{{ label }}\"\n  labelWidth=\"{{ labelWidth }}\"\n  status=\"{{ formData.status }}\"\n  errors=\"{{ formData.errors }}\"\n  tooltip=\"{{ tooltip }}\"\n  required=\"{{ formData.required }}\"\n  requiredMark=\"{{ requiredMark }}\"\n  validateStatus=\"{{ validateStatus }}\"\n  help=\"{{ help }}\"\n>\n  <view>\n    <block a:if=\"{{readonly && !formData.value}}\">\n      <!-- #if ALIPAY -->\n      <slot name=\"readonly\" formData=\"{{formData}}\">\n      <!-- #endif -->\n        -\n      <!-- #if ALIPAY -->\n      </slot>\n      <!-- #endif -->\n    </block>\n    <ant-date-picker\n      style=\"{{readonly && !formData.value ? 'display:none' : ''}};{{ datePickerStyle }}\"\n      min=\"{{ min }}\"\n      max=\"{{ max }}\"\n      format=\"{{ format }}\"\n      precision=\"{{ precision }}\"\n      cancelText=\"{{ u.isPropsEmpty(cancelText) ? locale.global.cancelText : cancelText }}\"\n      okText=\"{{ u.isPropsEmpty(okText) ? locale.global.okText : okText }}\"\n      placeholder=\"{{ u.isPropsEmpty(placeholder) ? locale.global.placeholder : placeholder  }}\"\n      animationType=\"{{ animationType }}\"\n      maskClosable=\"{{ maskClosable }}\"\n      maskStyle=\"{{ maskStyle }}\"\n      popClassName=\"{{ popClassName }}\"\n      popStyle=\"{{ popStyle }}\"\n      disabled=\"{{ disabled }}\"\n      readonly=\"{{ readonly }}\"\n      title=\"{{ title }}\"\n      maskClassName=\"{{ maskClassName }}\"\n      indicatorStyle=\"{{ indicatorStyle }}\"\n      indicatorClassName=\"{{ indicatorClassName }}\"\n      value=\"{{ formData.value }}\"\n      defaultPickerValue=\"{{ defaultPickerValue }}\"\n      onOk=\"onOk\"\n      onPickerChange=\"onPickerChange\"\n      onCancel=\"onDismissPicker\"\n      onVisibleChange=\"onVisibleChange\"\n      onFormatLabel=\"{{ handleFormatLabel ? handleFormatLabel : 'handleFormatLabel' }}\"\n      onFormat=\"{{ handleFormat ? handleFormat : 'handleFormat' }}\"\n    >\n      <slot name=\"content\" slot=\"content\" />\n      <slot name=\"title\" slot=\"title\" />\n      <ant-icon\n        a:if=\"{{!readonly && arrowUtil.getArrow(arrow) }}\"\n        className=\"ant-form-date-picker-arrow\"\n        type=\"{{ arrowUtil.getArrow(arrow) }}\"\n        slot=\"suffix\"\n      />\n    </ant-date-picker>\n  </view>\n  <view a:if=\"{{ !tooltip }}\" slot=\"tooltip\">\n    <slot name=\"tooltip\" />\n  </view>\n  <view slot=\"extra\">\n    <!-- #if ALIPAY -->\n    <slot name=\"extra\">\n      <!-- #endif -->\n      {{ extra }}\n      <!-- #if ALIPAY -->\n    </slot>\n    <!-- #endif -->\n  </view>\n  <view slot=\"header\" slot-scope=\"item\">\n    <slot name=\"header\" errors=\"{{ item.errors }}\" status=\"{{ item.status }}\" />\n  </view>\n  <view slot=\"footer\" slot-scope=\"item\">\n    <slot name=\"footer\" errors=\"{{ item.errors }}\" status=\"{{ item.status }}\" />\n  </view>\n</form-item>\n"
  },
  {
    "path": "src/Form/FormDatePicker/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"form-item\": \"../FormItem/index\",\n    \"ant-date-picker\": \"../../DatePicker/index\",\n    \"ant-icon\": \"../../Icon/index\"\n  }\n}\n"
  },
  {
    "path": "src/Form/FormDatePicker/index.less",
    "content": "@import (reference) '../variable.less';\n.ant-form-date-picker {\n  &-arrow {\n    margin-left: 8 * @rpx;\n    color: @form-text-color;\n    font-size: 36 * @rpx;\n  }\n}\n"
  },
  {
    "path": "src/Form/FormDatePicker/index.ts",
    "content": "import { effect } from '@preact/signals-core';\nimport { resolveEventValue, resolveEventValues } from '../../_util/platform';\nimport {\n  ComponentWithSignalStoreImpl,\n  getValueFromProps,\n  triggerEvent,\n  triggerEventOnly,\n  triggerEventValues,\n} from '../../_util/simply';\nimport i18nController from '../../_util/store';\nimport { createForm } from '../form';\nimport { FormDatePickerDefaultProps } from './props';\n\nComponentWithSignalStoreImpl({\n  storeOptions: {\n    store: () => i18nController,\n    updateHook: effect,\n    mapState: {\n      locale: ({ store }) => store.currentLocale.value,\n    },\n  },\n  props: FormDatePickerDefaultProps,\n  methods: {\n    onOk(date, dateStr, e) {\n      const v = resolveEventValues(date, dateStr);\n      /// #if ALIPAY\n      this.emit('onChange', v[0]);\n      /// #endif\n      /// #if WECHAT\n      this.emit('onChange', v[1]);\n      /// #endif\n      triggerEventValues(this, 'ok', v, e);\n    },\n    onPickerChange(date, dateStr, e) {\n      triggerEventValues(\n        this,\n        'pickerChange',\n        resolveEventValues(date, dateStr),\n        e\n      );\n    },\n    onVisibleChange(visible, e) {\n      triggerEvent(this, 'visibleChange', resolveEventValue(visible), e);\n    },\n    onDismissPicker(e) {\n      triggerEventOnly(this, 'dismissPicker', e);\n    },\n\n    handleFormat(date, dateStr) {\n      const onFormat = getValueFromProps(this, 'onFormat');\n      if (onFormat) {\n        return onFormat(date, dateStr);\n      }\n    },\n    handleFormatLabel(type, value) {\n      const onFormatLabel = getValueFromProps(this, 'onFormatLabel');\n      if (onFormatLabel) {\n        return onFormatLabel(type, value);\n      }\n    },\n  },\n  mixins: [createForm()],\n  /// #if WECHAT\n  attached() {\n    this.setData({\n      handleFormat: this.handleFormat.bind(this),\n      handleFormatLabel: this.handleFormatLabel.bind(this),\n    });\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/Form/FormDatePicker/props.ts",
    "content": "import {\n  DatePickerDefaultProps,\n  IDatePickerProps,\n} from '../../DatePicker/props';\nimport { FormItemDefaultProps, FormItemProps } from '../FormItem/props';\n\nexport interface FormDatePickerProps extends IDatePickerProps, FormItemProps {\n  /**\n   * @description 箭头方向，不传表示没有箭头\n   */\n  arrow: boolean | 'right' | 'up' | 'down';\n}\n\nexport const FormDatePickerDefaultProps: Partial<FormDatePickerProps> = {\n  ...FormItemDefaultProps,\n  ...DatePickerDefaultProps,\n  arrow: false,\n};\n"
  },
  {
    "path": "src/Form/FormImageUpload/index.axml",
    "content": "<form-item\n  className=\"{{ className }}\"\n  style=\"{{ style }}\"\n  position=\"{{ position }}\"\n  label=\"{{ label }}\"\n  labelWidth=\"{{ labelWidth }}\"\n  status=\"{{ formData.status }}\"\n  errors=\"{{ formData.errors }}\"\n  tooltip=\"{{ tooltip }}\"\n  required=\"{{ formData.required }}\"\n  requiredMark=\"{{ requiredMark }}\"\n  validateStatus=\"{{ validateStatus }}\"\n  help=\"{{ help }}\">\n  <view a:if=\"{{readonly}}\">\n    <!-- #if ALIPAY -->\n    <slot name=\"readonly\" formData=\"{{formData}}\">\n    <!-- #endif -->\n      <image\n        a:if=\"{{formData.value.length > 0}}\"\n        class=\"ant-image-upload-image\"\n        a:for=\"{{formData.value}}\"\n        mode=\"{{ imageMode }}\"\n        src=\"{{ item.url || item.path }}\"\n      />\n      <text a:if=\"{{formData.value.length <= 0}}\">-</text>\n    <!-- #if ALIPAY -->\n    </slot>\n    <!-- #endif -->\n  </view>\n  <image-upload\n    style=\"{{readonly ? 'display:none' : ''}};{{ imageUploadStyle }}\"\n    ref=\"handleRef\"\n    defaultFileList=\"{{ formData.value }}\"\n    maxCount=\"{{ maxCount }}\"\n    imageMode=\"{{ imageMode }}\"\n    sourceType=\"{{ sourceType }}\"\n    onChange=\"onChange\"\n    onUpload=\"{{ handleUpload ? handleUpload : 'handleUpload' }}\"\n    onRemove=\"{{ handleRemove ? handleRemove : 'handleRemove' }}\"\n    onPreview=\"onPreview\"\n    onBeforeUpload=\"{{ handleBeforeUpload ? handleBeforeUpload : 'handleBeforeUpload' }}\"\n    onChooseImageError=\"onChooseImageError\" />\n  <view\n    a:if=\"{{ !tooltip }}\"\n    slot=\"tooltip\">\n    <slot name=\"tooltip\" />\n  </view>\n  <view slot=\"extra\">\n    <!-- #if ALIPAY -->\n    <slot name=\"extra\">\n    <!-- #endif -->\n      {{ extra }}\n    <!-- #if ALIPAY -->\n    </slot>\n    <!-- #endif -->\n  </view>\n  <view\n    slot=\"header\"\n    slot-scope=\"item\">\n    <slot\n      name=\"header\"\n      errors=\"{{ item.errors }}\"\n      status=\"{{ item.status }}\" />\n  </view>\n  <view\n    slot=\"footer\"\n    slot-scope=\"item\">\n    <slot\n      name=\"footer\"\n      errors=\"{{ item.errors }}\"\n      status=\"{{ item.status }}\" />\n  </view>\n</form-item>\n"
  },
  {
    "path": "src/Form/FormImageUpload/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"form-item\": \"../FormItem/index\",\n    \"image-upload\": \"../../ImageUpload/index\"\n  }\n}"
  },
  {
    "path": "src/Form/FormImageUpload/index.less",
    "content": ""
  },
  {
    "path": "src/Form/FormImageUpload/index.ts",
    "content": "import { resolveEventValue } from '../../_util/platform';\nimport { Component, getValueFromProps, triggerEvent } from '../../_util/simply';\nimport { createForm } from '../form';\nimport { FormImageUploadDefaultProps } from './props';\n\nComponent({\n  props: FormImageUploadDefaultProps,\n  methods: {\n    handleRef(imageUpload) {\n      /// #if ALIPAY\n      this.imageUpload = imageUpload;\n      /// #endif\n      /// #if WECHAT\n      this.imageUpload = imageUpload.detail;\n      /// #endif\n    },\n    onChange(value) {\n      this.emit('onChange', resolveEventValue(value));\n      triggerEvent(this, 'change', resolveEventValue(value));\n    },\n    onPreview(file) {\n      triggerEvent(this, 'preview', resolveEventValue(file));\n    },\n    onChooseImageError(err) {\n      triggerEvent(this, 'chooseImageError', resolveEventValue(err));\n    },\n\n    handleUpload(localFile) {\n      const onUpload = getValueFromProps(this, 'onUpload');\n      if (!onUpload) {\n        throw new Error('need props onUpload');\n      }\n      return onUpload(localFile);\n    },\n    handleRemove(file) {\n      const onRemove = getValueFromProps(this, 'onRemove');\n      if (onRemove) {\n        return onRemove(file);\n      }\n    },\n    handleBeforeUpload(localFileList) {\n      const onBeforeUpload = getValueFromProps(this, 'onBeforeUpload');\n      if (onBeforeUpload) {\n        return onBeforeUpload(localFileList);\n      }\n    },\n  },\n\n  mixins: [\n    createForm({\n      methods: {\n        setFormData(this: any, values) {\n          this.setData({\n            ...this.data,\n            formData: {\n              ...this.data.formData,\n              ...values,\n            },\n          });\n          this.imageUpload && this.imageUpload.update(this.data.formData.value);\n        },\n      },\n    }),\n  ],\n\n  /// #if WECHAT\n  attached() {\n    this.setData({\n      handleUpload: this.handleUpload.bind(this),\n      handleRemove: this.handleRemove.bind(this),\n      handleBeforeUpload: this.handleBeforeUpload.bind(this),\n    });\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/Form/FormImageUpload/props.ts",
    "content": "import { FormItemDefaultProps, FormItemProps } from '../FormItem/props';\nimport {\n  IUploaderProps,\n  UploaderDefaultProps,\n} from '../../ImageUpload/props';\n\nexport interface FormImageUploadProps\n  extends Omit<IUploaderProps, 'defaultFileList'>,\n    FormItemProps {}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst { defaultFileList, ...rest } = UploaderDefaultProps;\nexport const FormImageUploadDefaultProps: Partial<FormImageUploadProps> = {\n  ...FormItemDefaultProps,\n  ...rest,\n};\n"
  },
  {
    "path": "src/Form/FormInput/index.axml",
    "content": "<form-item\n  className=\"{{ className }}\"\n  style=\"{{ style }}\"\n  position=\"{{ position }}\"\n  label=\"{{ label }}\"\n  labelWidth=\"{{ labelWidth }}\"\n  status=\"{{ formData.status }}\"\n  errors=\"{{ formData.errors }}\"\n  tooltip=\"{{ tooltip }}\"\n  required=\"{{ formData.required }}\"\n  requiredMark=\"{{ requiredMark }}\"\n  validateStatus=\"{{ validateStatus }}\"\n  help=\"{{ help }}\">\n  <view a:if=\"{{readonly}}\">\n    <!-- #if ALIPAY -->\n    <slot name=\"readonly\" formData=\"{{formData}}\">\n    <!-- #endif -->\n    <text a:if=\"{{formData.value}}\">{{formData.value}}</text>\n    <text a:else>-</text>\n    <!-- #if ALIPAY -->\n    </slot>\n    <!-- #endif -->\n  </view>\n  <ant-input\n    style=\"{{readonly ? 'display:none' : ''}};{{ inputStyle }}\"\n    ref=\"handleRef\"\n    allowClear=\"{{ allowClear }}\"\n    enableNative=\"{{ enableNative }}\"\n    className=\"{{ inputClassName }}\"\n    disabled=\"{{ disabled }}\"\n    type=\"{{ type }}\"\n    password=\"{{ password }}\"\n    placeholder=\"{{ placeholder }}\"\n    alwaysSystem=\"{{ alwaysSystem }}\"\n    placeholderClassName=\"{{ placeholderClassName }}\"\n    placeholderStyle=\"{{ placeholderStyle }}\"\n    maxLength=\"{{ maxLength }}\"\n    confirmType=\"{{ confirmType }}\"\n    confirmHold=\"{{ confirmHold }}\"\n    cursor=\"{{ cursor }}\"\n    selectionStart=\"{{ selectionStart }}\"\n    selectionEnd=\"{{ selectionEnd }}\"\n    randomNumber=\"{{ randomNumber }}\"\n    max=\"{{ max }}\"\n    min=\"{{ min }}\"\n    precision=\"{{ precision }}\"\n    onChange=\"onChange\"\n    onBlur=\"onBlur\"\n    onFocus=\"onFocus\"\n    onConfirm=\"onConfirm\">\n    <slot\n      slot=\"prefix\"\n      name=\"prefix\" />\n    <slot\n      slot=\"suffix\"\n      name=\"suffix\" />\n  </ant-input>\n  <view\n    a:if=\"{{ !tooltip }}\"\n    slot=\"tooltip\">\n    <slot name=\"tooltip\" />\n  </view>\n  <view slot=\"extra\">\n    <!-- #if WECHAT -->\n    <block wx:if=\"{{ extra }}\">{{ extra }}</block>\n    <slot\n      wx:else\n      name=\"extra\" />\n    <!-- #endif -->\n    <!-- #if ALIPAY -->\n    <slot name=\"extra\">{{ extra }}</slot>\n    <!-- #endif -->\n  </view>\n  <view\n    slot=\"header\"\n    slot-scope=\"item\">\n    <slot\n      name=\"header\"\n      errors=\"{{ item.errors }}\"\n      status=\"{{ item.status }}\" />\n  </view>\n  <view\n    slot=\"footer\"\n    slot-scope=\"item\">\n    <slot\n      name=\"footer\"\n      errors=\"{{ item.errors }}\"\n      status=\"{{ item.status }}\" />\n  </view>\n</form-item>\n"
  },
  {
    "path": "src/Form/FormInput/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"form-item\": \"../FormItem/index\",\n    \"ant-input\": \"../../Input/index\"\n  }\n}\n"
  },
  {
    "path": "src/Form/FormInput/index.less",
    "content": ""
  },
  {
    "path": "src/Form/FormInput/index.ts",
    "content": "import { resolveEventValue } from '../../_util/platform';\nimport { Component, triggerEvent } from '../../_util/simply';\nimport { createForm } from '../form';\nimport { FormInputDefaultProps } from './props';\n\nComponent({\n  props: FormInputDefaultProps,\n  methods: {\n    handleRef(input) {\n      /// #if ALIPAY\n      this.input = input;\n      /// #endif\n      /// #if WECHAT\n      this.input = input.detail;\n      /// #endif\n    },\n    onChange(value, e) {\n      this.emit('onChange', resolveEventValue(value));\n      triggerEvent(this, 'change', resolveEventValue(value), e);\n    },\n    onBlur(value, e) {\n      this.emit('onChange', resolveEventValue(value));\n      triggerEvent(this, 'blur', resolveEventValue(value), e);\n    },\n    onFocus(value, e) {\n      triggerEvent(this, 'focus', resolveEventValue(value), e);\n    },\n    onConfirm(value, e) {\n      triggerEvent(this, 'confirm', resolveEventValue(value), e);\n    },\n  },\n  mixins: [\n    createForm({\n      methods: {\n        setFormData(this: any, values) {\n          this.setData({\n            ...this.data,\n            formData: {\n              ...this.data.formData,\n              ...values,\n            },\n          });\n          this.input && this.input.update(this.data.formData.value);\n        },\n      },\n    }),\n  ],\n});\n"
  },
  {
    "path": "src/Form/FormInput/props.ts",
    "content": "import { FormItemProps, FormItemDefaultProps } from '../FormItem/props';\nimport { InputProps, InputDefaultProps } from '../../Input/props';\n\nexport interface FormInputProps\n  extends Omit<InputProps, 'value' | 'defaultValue' | 'name'>,\n    FormItemProps {\n  inputClassName: string;\n  inputClassStyle: string;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst { value, defaultValue, name, ...rest } = InputDefaultProps;\nexport const FormInputDefaultProps: FormInputProps = {\n  ...FormItemDefaultProps,\n  ...rest,\n  inputClassName: '',\n  inputClassStyle: ' ',\n};\n"
  },
  {
    "path": "src/Form/FormInput/variable.less",
    "content": "@import (reference) '../../style/themes/index.less';\n\n// input 字体颜色\n@input-item-color: @COLOR_TEXT_PRIMARY;\n// input 字体大小\n@input-item-size: @font-size-content;\n// input placeholder 颜色\n@input-item-placeholder-color: @COLOR_TEXT_WEAK;\n// input 清除 颜色\n@input-item-clear-color: @COLOR_TEXT_ASSIST;\n"
  },
  {
    "path": "src/Form/FormItem/index.axml",
    "content": "<view\n  class=\"ant-form-item {{ className ? className : '' }} ant-form-item-{{ requiredMark }}\">\n  <slot\n    name=\"header\"\n    errors=\"{{ errors }}\"\n    status=\"{{ status }}\" />\n  <view\n    class=\"ant-form-item-line ant-form-item-line-{{ position }} {{ errorInfo ? 'noLine' : '' }}\">\n    <view class=\"ant-form-item-content ant-form-item-content-{{ position }}\">\n      <view\n        a:if=\"{{ label }}\"\n        style=\"{{ labelWidth ? 'width: ' + labelWidth : '' }}\"\n        class=\"ant-form-item-label {{ disabled ? 'ant-form-item-label-disabled' : '' }} ant-form-item-label-{{ position }} {{ required ? 'ant-form-item-label-required' : '' }}\">\n        <view class=\"ant-form-item-label-text\">{{ label }}</view>\n        <popover a:if=\"{{ tooltip }}\">\n          <view\n            slot=\"content\"\n            class=\"ant-form-item-label-help-content\">\n            {{ tooltip }}\n          </view>\n          <ant-icon type=\"QuestionCircleOutline\" />\n        </popover>\n        <slot\n          a:else\n          name=\"tooltip\" />\n      </view>\n      <view class=\"ant-form-item-field ant-form-item-field-{{ position }}\">\n        <slot />\n        <view\n          a:if=\"{{ help || ((validateStatus === 'error' || !validateStatus) && status === 'error') }}\"\n          class=\"{{ validateStatus === 'error' || !validateStatus && status === 'error' ? 'ant-form-item-error-info' : 'ant-form-item-help-info' }} ant-form-item-error-info-{{ position }}\">\n          <view>{{ help || errors[0] }}</view>\n        </view>\n      </view>\n    </view>\n    <view class=\"ant-form-item-extra\">\n      <slot name=\"extra\" />\n    </view>\n  </view>\n  <slot\n    name=\"footer\"\n    errors=\"{{ errors }}\"\n    status=\"{{ status }}\" />\n</view>\n"
  },
  {
    "path": "src/Form/FormItem/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"popover\": \"../../Popover/index\",\n    \"ant-icon\": \"../../Icon/index\"\n  }\n}\n"
  },
  {
    "path": "src/Form/FormItem/index.less",
    "content": "@import (reference) '../variable.less';\n@import '../../style/mixins/hairline.less';\n\n.formItemLabelHorizontal() {\n  width: 170 * @rpx;\n  margin-right: 24 * @rpx;\n  color: @form-item-color;\n  font-size: 34 * @rpx;\n  line-height: 48 * @rpx;\n}\n\n.formItemLabelVertical() {\n  font-size: 34 * @rpx;\n  line-height: 42 * @rpx;\n  color: @form-item-color;\n  margin-bottom: 8 * @rpx;\n}\n\n.formItemContentHorizontal() {\n  display: flex;\n  align-items: center;\n}\n\n.formItemFieldHorizontal() {\n  text-align: right;\n}\n\n@formItemPrefix: ant-form-item;\n\n.@{formItemPrefix} {\n  background-color: @form-item-bg;\n  padding: 24 * @rpx 24 * @rpx 24 * @rpx 32 * @rpx;\n  position: relative;\n  .hairline('bottom');\n\n  &-line {\n    display: flex;\n    flex: 1;\n    align-items: center;\n    align-self: stretch;\n    max-width: 100%;\n    position: relative;\n  }\n\n  &-content {\n    flex: 1;\n\n    &-horizontal {\n      .formItemContentHorizontal();\n    }\n  }\n\n  &-error-info {\n    font-size: 13px;\n    color: @form-error-color;\n    line-height: 37 * @rpx;\n    text-align: left;\n    margin-top: 8 * @rpx;\n  }\n\n  &-help-info {\n    font-size: 13px;\n    color: @form-item-color;\n    line-height: 37 * @rpx;\n    text-align: left;\n    margin-top: 8 * @rpx;\n  }\n\n  &-label {\n    display: flex;\n    align-items: center;\n    font-size: 34 * @rpx;\n    line-height: 48 * @rpx;\n    overflow: visible;\n    position: relative;\n\n    &-text {\n      display: flex;\n      align-items: center;\n      position: relative;\n    }\n\n    &-help-content {\n      font-size: 30 * @rpx;\n      text-align: center;\n      white-space: nowrap;\n    }\n\n    &-horizontal {\n      .formItemLabelHorizontal();\n    }\n\n    &-vertical {\n      .formItemLabelVertical();\n    }\n  }\n\n  &-field {\n    flex: 1;\n\n    &-horizontal {\n      .formItemFieldHorizontal();\n\n      .ant-picker {\n        width: 100%;\n        justify-content: flex-end;\n      }\n    }\n\n    &-vertical {\n      .ant-picker {\n        width: 100%;\n        justify-content: space-between;\n      }\n    }\n\n\n\n\n  }\n\n  // &-other {\n  //   display: flex;\n  //   align-items: center;\n  // }\n\n  &-extra {\n    display: flex;\n    align-items: center;\n    font-size: 32 * @rpx;\n    color: @form-extra-color;\n  }\n\n  &-asterisk {\n    .@{formItemPrefix}-label-required .@{formItemPrefix}-label-text {\n      &::before {\n        content: '*';\n        position: absolute;\n        left: -18 * @rpx;\n        font-size: 30 * @rpx;\n        color: @form-asterisk-color;\n      }\n    }\n  }\n\n  &-text-required {\n    .@{formItemPrefix}-label-required .@{formItemPrefix}-label-text {\n      &::after {\n        padding-left: 4 * @rpx;\n        content: '(必填)';\n        display: block;\n        left: -18 * @rpx;\n        font-size: 30 * @rpx;\n        color: @form-text-color;\n      }\n    }\n  }\n\n  &-text-optional {\n    .@{formItemPrefix}-label .@{formItemPrefix}-label-text {\n      &::after {\n        padding-left: 4 * @rpx;\n        content: '(选填)';\n        display: block;\n        left: -18 * @rpx;\n        font-size: 30 * @rpx;\n        color: @form-text-color;\n      }\n    }\n\n    .@{formItemPrefix}-label-required .@{formItemPrefix}-label-text {\n      &::after {\n        content: none;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/Form/FormItem/index.ts",
    "content": "import { Component } from '../../_util/simply';\nimport { FormItemDefaultProps } from './props';\n\nComponent({\n  props: FormItemDefaultProps,\n  /// #if WECHAT\n  attached() {\n    this.triggerEvent('ref', this);\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/Form/FormItem/props.ts",
    "content": "import { IBaseProps } from '../../_util/base';\nimport { ValidateStatus } from '../form';\n\nexport interface FormItemProps extends IBaseProps {\n  name: string;\n  label: string;\n  labelWidth: number;\n  position: 'horizontal' | 'vertical';\n  validateStatus: ValidateStatus;\n  help: string;\n  requiredMark: 'asterisk' | 'text-required' | 'text-optional';\n  status: 'default' | 'success' | 'error' | 'validating';\n  errors: string[];\n  tooltip?: string;\n  required?: boolean;\n  disabled?: boolean;\n  extra?: string;\n  message?: string;\n  dependencies?: string[];\n  readonly?: boolean;\n}\n\nexport const FormItemDefaultProps: FormItemProps = {\n  name: null,\n  label: null,\n  labelWidth: null,\n  position: 'horizontal',\n  validateStatus: null,\n  help: null,\n  requiredMark: 'asterisk',\n  status: null,\n  errors: null,\n  tooltip: '',\n  required: false,\n  disabled: false,\n  readonly: false,\n  extra: '',\n  message: null,\n  dependencies: null,\n};\n"
  },
  {
    "path": "src/Form/FormPicker/index.axml",
    "content": "<import-sjs from=\"../../_util/arrow.sjs\" name=\"arrowUtil\" />\n<import-sjs from=\"../../_util/isPropsEmpty.sjs\" name=\"u\" />\n\n<form-item\n  className=\"{{ className }}\"\n  style=\"{{ style }}\"\n  position=\"{{ position }}\"\n  label=\"{{ label }}\"\n  labelWidth=\"{{ labelWidth }}\"\n  status=\"{{ formData.status }}\"\n  errors=\"{{ formData.errors }}\"\n  tooltip=\"{{ tooltip }}\"\n  required=\"{{ formData.required }}\"\n  requiredMark=\"{{ requiredMark }}\"\n  validateStatus=\"{{ validateStatus }}\"\n  help=\"{{ help }}\"\n>\n  <view>\n    <block a:if=\"{{readonly && !formData.value}}\">\n      <!-- #if ALIPAY -->\n      <slot name=\"readonly\" formData=\"{{formData}}\">\n      <!-- #endif -->\n        -\n      <!-- #if ALIPAY -->\n      </slot>\n      <!-- #endif -->\n    </block>\n    <ant-picker\n      style=\"{{readonly && !formData.value ? 'display:none' : ''}};{{ pickerStyle }}\"\n      cancelText=\"{{ u.isPropsEmpty(cancelText) ? locale.global.cancelText : cancelText }}\"\n      okText=\"{{ u.isPropsEmpty(okText) ? locale.global.okText : okText }}\"\n      placeholder=\"{{ u.isPropsEmpty(placeholder) ? locale.global.placeholder : placeholder  }}\"\n      maskClosable=\"{{ maskClosable }}\"\n      maskStyle=\"{{ maskStyle }}\"\n      popClassName=\"{{ popClassName }}\"\n      popStyle=\"{{ popStyle }}\"\n      animationType=\"{{ animationType }}\"\n      disabled=\"{{ disabled }}\"\n      readonly=\"{{ readonly }}\"\n      title=\"{{ title }}\"\n      maskClassName=\"{{ maskClassName }}\"\n      indicatorStyle=\"{{ indicatorStyle }}\"\n      indicatorClassName=\"{{ indicatorClassName }}\"\n      options=\"{{ options }}\"\n      value=\"{{ formData.value }}\"\n      onOk=\"onOk\"\n      onChange=\"onChange\"\n      onCancel=\"onDismissPicker\"\n      onVisibleChange=\"onVisibleChange\"\n      onFormat=\"{{ handleFormat ? handleFormat : 'handleFormat' }}\"\n    >\n      <slot name=\"title\" slot=\"title\" />\n      <slot name=\"content\" slot=\"content\" />\n      <ant-icon\n        a:if=\"{{!readonly && arrowUtil.getArrow(arrow) }}\"\n        className=\"ant-form-picker-arrow\"\n        type=\"{{ arrowUtil.getArrow(arrow) }}\"\n        slot=\"suffix\"\n      />\n    </ant-picker>\n  </view>\n  <view a:if=\"{{ !tooltip }}\" slot=\"tooltip\">\n    <slot name=\"tooltip\" />\n  </view>\n  <view slot=\"extra\">\n    <!-- #if ALIPAY -->\n    <slot name=\"extra\">\n      <!-- #endif -->\n      {{ extra }}\n      <!-- #if ALIPAY -->\n    </slot>\n    <!-- #endif -->\n  </view>\n  <view slot=\"header\" slot-scope=\"item\">\n    <slot name=\"header\" errors=\"{{ item.errors }}\" status=\"{{ item.status }}\" />\n  </view>\n  <view slot=\"footer\" slot-scope=\"item\">\n    <slot name=\"footer\" errors=\"{{ item.errors }}\" status=\"{{ item.status }}\" />\n  </view>\n</form-item>\n"
  },
  {
    "path": "src/Form/FormPicker/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"form-item\": \"../FormItem/index\",\n    \"ant-picker\": \"../../Picker/index\",\n    \"ant-icon\": \"../../Icon/index\"\n  }\n}\n"
  },
  {
    "path": "src/Form/FormPicker/index.less",
    "content": "@import (reference) '../variable.less';\n.ant-form-picker {\n  &-arrow {\n    margin-left: 8 * @rpx;\n    color: @form-text-color;\n    font-size: 36 * @rpx;\n  }\n}\n"
  },
  {
    "path": "src/Form/FormPicker/index.ts",
    "content": "import { effect } from '@preact/signals-core';\nimport { resolveEventValue, resolveEventValues } from '../../_util/platform';\nimport {\n  ComponentWithSignalStoreImpl,\n  getValueFromProps,\n  triggerEvent,\n  triggerEventOnly,\n  triggerEventValues,\n} from '../../_util/simply';\nimport i18nController from '../../_util/store';\nimport { createForm } from '../form';\nimport { FormPickerDefaultProps } from './props';\n\nComponentWithSignalStoreImpl({\n  storeOptions: {\n    store: () => i18nController,\n    updateHook: effect,\n    mapState: {\n      locale: ({ store }) => store.currentLocale.value,\n    },\n  },\n  props: FormPickerDefaultProps,\n  methods: {\n    onOk(value, column, e) {\n      const v = resolveEventValues(value, column);\n      this.emit('onChange', v[0]);\n      triggerEventValues(this, 'ok', v, e);\n    },\n    onChange(value, column, e) {\n      triggerEventValues(this, 'change', resolveEventValues(value, column), e);\n    },\n    onVisibleChange(visible, e) {\n      triggerEvent(this, 'visibleChange', resolveEventValue(visible), e);\n    },\n    onDismissPicker(e) {\n      triggerEventOnly(this, 'cancel', e);\n    },\n\n    handleFormat(value, column) {\n      const onFormat = getValueFromProps(this, 'onFormat');\n      if (onFormat) {\n        return onFormat(value, column);\n      }\n    },\n  },\n  mixins: [createForm()],\n  /// #if WECHAT\n  attached() {\n    this.setData({\n      handleFormat: this.handleFormat.bind(this),\n    });\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/Form/FormPicker/props.ts",
    "content": "import { IPickerProps, PickerDefaultProps } from '../../Picker/props';\nimport { FormItemDefaultProps, FormItemProps } from '../FormItem/props';\n\nexport interface FormPickerProps extends IPickerProps, FormItemProps {\n  /**\n   * @description 箭头方向，不传表示没有箭头\n   */\n  arrow: boolean | 'right' | 'up' | 'down';\n}\n\nexport const FormPickerDefaultProps: Partial<FormPickerProps> = {\n  ...FormItemDefaultProps,\n  ...PickerDefaultProps,\n  arrow: false,\n};\n"
  },
  {
    "path": "src/Form/FormRadioGroup/index.axml",
    "content": "<form-item\n  className=\"{{ className }}\"\n  style=\"{{ style }}\"\n  position=\"{{ position }}\"\n  label=\"{{ label }}\"\n  labelWidth=\"{{ labelWidth }}\"\n  status=\"{{ formData.status }}\"\n  errors=\"{{ formData.errors }}\"\n  tooltip=\"{{ tooltip }}\"\n  required=\"{{ formData.required }}\"\n  requiredMark=\"{{ requiredMark }}\"\n  validateStatus=\"{{ validateStatus }}\"\n  help=\"{{ help }}\">\n  <view>\n    <view a:if=\"{{readonly}}\">\n      <!-- #if ALIPAY -->\n      <slot name=\"readonly\" formData=\"{{formData}}\">\n      <!-- #endif -->\n      <text a:if=\"{{formData.value}}\">{{formData.value}}</text>\n      <text a:else>-</text>\n      <!-- #if ALIPAY -->\n      </slot>\n      <!-- #endif -->\n    </view>\n    <ant-radio-group\n      style=\"{{readonly ? 'display:none' : ''}};{{ radioGroupStyle }}\"\n      options=\"{{ options }}\"\n      value=\"{{ formData.value }}\"\n      onChange=\"onChange\"\n      color=\"{{ color }}\"\n      disabled=\"{{ disabled }}\"\n      position=\"{{ radioPosition }}\">\n      <slot\n        name=\"radioLabel\"\n        slot=\"label\"\n        slot-scope=\"props\"\n        value=\"{{props.value}}\"\n        index=\"{{props.index}}\" />\n    </ant-radio-group>\n  </view>\n\n  <view\n    a:if=\"{{ !tooltip }}\"\n    slot=\"tooltip\">\n    <slot name=\"tooltip\" />\n  </view>\n\n  <view slot=\"extra\">\n    <slot name=\"extra\">{{ extra }}</slot>\n  </view>\n\n  <view\n    slot=\"header\"\n    slot-scope=\"item\">\n    <slot\n      name=\"header\"\n      errors=\"{{item.errors}}\"\n      status=\"{{item.status}}\" />\n  </view>\n\n  <view\n    slot=\"footer\"\n    slot-scope=\"item\">\n    <slot\n      name=\"footer\"\n      errors=\"{{item.errors}}\"\n      status=\"{{item.status}}\" />\n  </view>\n</form-item>\n"
  },
  {
    "path": "src/Form/FormRadioGroup/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"form-item\": \"../FormItem/index\",\n    \"ant-radio-group\": \"../../Radio/RadioGroup/index\"\n  }\n}\n"
  },
  {
    "path": "src/Form/FormRadioGroup/index.ts",
    "content": "import { resolveEventValue } from '../../_util/platform';\nimport { Component, triggerEvent } from '../../_util/simply';\nimport { createForm } from '../form';\nimport { FormRadioGroupDefaultProps } from './props';\n\nComponent({\n  props: FormRadioGroupDefaultProps,\n  methods: {\n    onChange(value, e) {\n      this.emit('onChange', resolveEventValue(value));\n      triggerEvent(this, 'change', resolveEventValue(value), e);\n    },\n  },\n  mixins: [createForm()],\n});\n"
  },
  {
    "path": "src/Form/FormRadioGroup/props.ts",
    "content": "import { FormItemDefaultProps, FormItemProps } from '../FormItem/props';\nimport {\n  IRadioGroupProps,\n  RadioGroupDefaultProps,\n} from '../../Radio/RadioGroup/props';\n\nexport interface FormRadioGroupProps\n  extends Omit<\n      IRadioGroupProps,\n      'value' | 'defaultValue' | 'position' | 'name'\n    >,\n    FormItemProps {\n  radioPosition: IRadioGroupProps['position'];\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst { value, defaultValue, position, name, ...rest } =\nRadioGroupDefaultProps;\n\nexport const FormRadioGroupDefaultProps: Partial<FormRadioGroupProps> = {\n  ...FormItemDefaultProps,\n  ...rest,\n  radioPosition: 'horizontal',\n};\n"
  },
  {
    "path": "src/Form/FormRangePicker/index.axml",
    "content": "<import-sjs from=\"../../_util/arrow.sjs\" name=\"arrowUtil\" />\n<import-sjs from=\"../../_util/isPropsEmpty.sjs\" name=\"u\" />\n\n<form-item\n  className=\"{{ className }}\"\n  style=\"{{ style }}\"\n  position=\"{{ position }}\"\n  label=\"{{ label }}\"\n  labelWidth=\"{{ labelWidth }}\"\n  status=\"{{ formData.status }}\"\n  errors=\"{{ formData.errors }}\"\n  tooltip=\"{{ tooltip }}\"\n  required=\"{{ formData.required }}\"\n  requiredMark=\"{{ requiredMark }}\"\n  validateStatus=\"{{ validateStatus }}\"\n  help=\"{{ help }}\"\n>\n  <view>\n    <block a:if=\"{{readonly && !(formData.value && formData.value.length)}}\">\n      <!-- #if ALIPAY -->\n      <slot name=\"readonly\" formData=\"{{formData}}\">\n      <!-- #endif -->\n        -\n      <!-- #if ALIPAY -->\n      </slot>\n      <!-- #endif -->\n    </block>\n    <ant-range-picker\n      style=\"{{readonly && !(formData.value && formData.value.length) ? 'display:none' : ''}};{{ rangePickerStyle }}\"\n      endPlaceholder=\"{{ u.isPropsEmpty(cancelText) ? locale.rangePicker.endPlaceholder : cancelText }}\"\n      startPlaceholder=\"{{ u.isPropsEmpty(cancelText) ? locale.rangePicker.startPlaceholder : cancelText }}\"\n      splitCharacter=\"{{ splitCharacter }}\"\n      min=\"{{ min }}\"\n      max=\"{{ max }}\"\n      format=\"{{ format }}\"\n      precision=\"{{ precision }}\"\n      animationType=\"{{ animationType }}\"\n      cancelText=\"{{ u.isPropsEmpty(cancelText) ? locale.global.cancelText : cancelText }}\"\n      okText=\"{{ u.isPropsEmpty(okText) ? locale.global.okText : okText }}\"\n      placeholder=\"{{ u.isPropsEmpty(placeholder) ? locale.global.placeholder : placeholder  }}\"\n      maskClosable=\"{{ maskClosable }}\"\n      maskStyle=\"{{ maskStyle }}\"\n      popClassName=\"{{ popClassName }}\"\n      popStyle=\"{{ popStyle }}\"\n      disabled=\"{{ disabled }}\"\n      readonly=\"{{ readonly }}\"\n      title=\"{{ title }}\"\n      maskClassName=\"{{ maskClassName }}\"\n      indicatorStyle=\"{{ indicatorStyle }}\"\n      indicatorClassName=\"{{ indicatorClassName }}\"\n      value=\"{{ formData.value }}\"\n      onOk=\"onOk\"\n      onPickerChange=\"onPickerChange\"\n      onCancel=\"onDismissPicker\"\n      onVisibleChange=\"onVisibleChange\"\n      onFormatLabel=\"{{ handleFormatLabel ? handleFormatLabel : 'handleFormatLabel' }}\"\n      onFormat=\"{{ handleFormat ? handleFormat : 'handleFormat' }}\"\n    >\n      <slot name=\"content\" slot=\"content\" />\n      <slot name=\"title\" slot=\"title\" />\n      <ant-icon\n        a:if=\"{{!readonly && arrowUtil.getArrow(arrow) }}\"\n        className=\"ant-form-range-picker-arrow\"\n        type=\"{{ arrowUtil.getArrow(arrow) }}\"\n        slot=\"suffix\"\n      />\n    </ant-range-picker>\n  </view>\n  <view a:if=\"{{ !tooltip }}\" slot=\"tooltip\">\n    <slot name=\"tooltip\" />\n  </view>\n  <view slot=\"extra\">\n    <!-- #if ALIPAY -->\n    <slot name=\"extra\">\n      <!-- #endif -->\n      {{ extra }}\n      <!-- #if ALIPAY -->\n    </slot>\n    <!-- #endif -->\n  </view>\n  <view slot=\"header\" slot-scope=\"item\">\n    <slot name=\"header\" errors=\"{{ item.errors }}\" status=\"{{ item.status }}\" />\n  </view>\n  <view slot=\"footer\" slot-scope=\"item\">\n    <slot name=\"footer\" errors=\"{{ item.errors }}\" status=\"{{ item.status }}\" />\n  </view>\n</form-item>\n"
  },
  {
    "path": "src/Form/FormRangePicker/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"form-item\": \"../FormItem/index\",\n    \"ant-range-picker\": \"../../DatePicker/RangePicker/index\",\n    \"ant-icon\": \"../../Icon/index\"\n  }\n}\n"
  },
  {
    "path": "src/Form/FormRangePicker/index.less",
    "content": "@import (reference) '../variable.less';\n.ant-form-range-picker {\n  &-arrow {\n    margin-left: 8 * @rpx;\n    color: @form-text-color;\n    font-size: 36 * @rpx;\n  }\n}\n"
  },
  {
    "path": "src/Form/FormRangePicker/index.ts",
    "content": "import { effect } from '@preact/signals-core';\nimport { resolveEventValue, resolveEventValues } from '../../_util/platform';\nimport {\n  ComponentWithSignalStoreImpl,\n  getValueFromProps,\n  triggerEvent,\n  triggerEventOnly,\n  triggerEventValues,\n} from '../../_util/simply';\nimport i18nController from '../../_util/store';\nimport { createForm } from '../form';\nimport { FormRangePickerDefaultProps } from './props';\n\nComponentWithSignalStoreImpl({\n  storeOptions: {\n    store: () => i18nController,\n    updateHook: effect,\n    mapState: {\n      locale: ({ store }) => store.currentLocale.value,\n    },\n  },\n  props: FormRangePickerDefaultProps,\n  methods: {\n    onOk(date, dateStr, e) {\n      const v = resolveEventValues(date, dateStr);\n      /// #if ALIPAY\n      this.emit('onChange', v[0]);\n      /// #endif\n      /// #if WECHAT\n      this.emit('onChange', v[1]);\n      /// #endif\n      triggerEventValues(this, 'ok', v, e);\n    },\n    onPickerChange(type, date, dateStr, e) {\n      triggerEventValues(\n        this,\n        'pickerChange',\n        resolveEventValues(type, date, dateStr),\n        e\n      );\n    },\n    onVisibleChange(visible, e) {\n      triggerEvent(this, 'visibleChange', resolveEventValue(visible), e);\n    },\n    onDismissPicker(e) {\n      triggerEventOnly(this, 'dismissPicker', e);\n    },\n\n    handleFormat(date, dateStr) {\n      const onFormat = getValueFromProps(this, 'onFormat');\n      if (onFormat) {\n        return onFormat(date, dateStr);\n      }\n    },\n    handleFormatLabel(type, value) {\n      const onFormatLabel = getValueFromProps(this, 'onFormatLabel');\n      if (onFormatLabel) {\n        return onFormatLabel(type, value);\n      }\n    },\n  },\n  mixins: [createForm()],\n  /// #if WECHAT\n  attached() {\n    this.setData({\n      handleFormat: this.handleFormat.bind(this),\n      handleFormatLabel: this.handleFormatLabel.bind(this),\n    });\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/Form/FormRangePicker/props.ts",
    "content": "import { FormItemDefaultProps, FormItemProps } from '../FormItem/props';\nimport { IDateRangePickerProps } from '../../DatePicker/RangePicker/props';\nimport { DateRangePickerDefaultProps } from '../../DatePicker/RangePicker/props';\n\nexport interface FormRangePickerProps\n  extends IDateRangePickerProps,\n    FormItemProps {\n  /**\n   * @description 箭头方向，不传表示没有箭头\n   */\n  arrow: boolean | 'right' | 'up' | 'down';\n}\n\nexport const FormRangePickerDefaultProps: Partial<FormRangePickerProps> = {\n  ...FormItemDefaultProps,\n  ...DateRangePickerDefaultProps,\n  arrow: false,\n};\n"
  },
  {
    "path": "src/Form/FormRate/index.axml",
    "content": "<form-item\n  className=\"{{ className }}\"\n  style=\"{{ style }}\"\n  position=\"{{ position }}\"\n  label=\"{{ label }}\"\n  labelWidth=\"{{ labelWidth }}\"\n  status=\"{{ formData.status }}\"\n  errors=\"{{ formData.errors }}\"\n  tooltip=\"{{ tooltip }}\"\n  required=\"{{ formData.required }}\"\n  requiredMark=\"{{ requiredMark }}\"\n  validateStatus=\"{{ validateStatus }}\"\n  help=\"{{ help }}\">\n  <block a:if=\"{{readonly && !formData.value && formData.value!==0}}\">\n    <!-- #if ALIPAY -->\n    <slot name=\"readonly\" formData=\"{{formData}}\">\n    <!-- #endif -->\n      -\n    <!-- #if ALIPAY -->\n    </slot>\n    <!-- #endif -->\n  </block>\n  <rate\n    style=\"{{readonly && !formData.value && formData.value!==0 ? 'display:none' : ''}};{{ rateStyle }}\"\n    value=\"{{ formData.value }}\"\n    count=\"{{ count }}\"\n    gutter=\"{{ gutter }}\"\n    readonly=\"{{ readonly }}\"\n    allowHalf=\"{{ allowHalf }}\"\n    allowClear=\"{{ allowClear }}\"\n    className=\"{{ rateClassName }}\"\n    characterActiveClassName=\"{{ characterActiveClassName }}\"\n    characterClassName=\"{{ characterClassName }}\"\n    onChange=\"onChange\">\n    <view slot=\"character\">\n      <!-- #if ALIPAY -->\n      <slot name=\"character\">\n      <!-- #endif -->\n        <ant-icon type=\"StarFill\" />\n      <!-- #if ALIPAY -->\n      </slot>\n      <!-- #endif -->\n    </view>\n  </rate>\n  <view\n    a:if=\"{{ !tooltip }}\"\n    slot=\"tooltip\">\n    <slot name=\"tooltip\" />\n  </view>\n  <view slot=\"extra\">\n    <!-- #if ALIPAY -->\n    <slot name=\"extra\">\n    <!-- #endif -->\n      {{ extra }}\n    <!-- #if ALIPAY -->\n    </slot>\n    <!-- #endif -->\n  </view>\n  <view\n    slot=\"header\"\n    slot-scope=\"item\">\n    <slot\n      name=\"header\"\n      errors=\"{{ item.errors }}\"\n      status=\"{{ item.status }}\" />\n  </view>\n  <view\n    slot=\"footer\"\n    slot-scope=\"item\">\n    <slot\n      name=\"footer\"\n      errors=\"{{ item.errors }}\"\n      status=\"{{ item.status }}\" />\n  </view>\n</form-item>\n"
  },
  {
    "path": "src/Form/FormRate/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"form-item\": \"../FormItem/index\",\n    \"ant-icon\": \"../../Icon/index\",\n    \"rate\": \"../../Rate/index\"\n  }\n}\n"
  },
  {
    "path": "src/Form/FormRate/index.less",
    "content": ""
  },
  {
    "path": "src/Form/FormRate/index.ts",
    "content": "import { resolveEventValue } from '../../_util/platform';\nimport { Component, triggerEvent } from '../../_util/simply';\nimport { createForm } from '../form';\nimport { FormRateDefaultProps } from './props';\n\nComponent({\n  props: FormRateDefaultProps,\n  methods: {\n    onChange(value, e) {\n      this.emit('onChange', resolveEventValue(value));\n      triggerEvent(this, 'change', resolveEventValue(value), e);\n    },\n  },\n  mixins: [createForm()],\n});\n"
  },
  {
    "path": "src/Form/FormRate/props.ts",
    "content": "import { IRateProps, RateDefaultProps } from '../../Rate/props';\nimport { FormItemDefaultProps, FormItemProps } from '../FormItem/props';\n\nexport interface FormRateProps\n  extends Omit<IRateProps, 'defaultValue'>,\n    Omit<FormItemProps, 'readonly'> {\n  rateClassName?: string;\n  rateStyle?: string;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst { defaultValue, ...rest } = RateDefaultProps;\n\nexport const FormRateDefaultProps: Partial<FormRateProps> = {\n  ...FormItemDefaultProps,\n  ...rest,\n  rateClassName: '',\n  rateStyle: '',\n};\n"
  },
  {
    "path": "src/Form/FormSelector/index.axml",
    "content": "<form-item\n  className=\"{{ className }}\"\n  style=\"{{ style }}\"\n  position=\"{{ position }}\"\n  label=\"{{ label }}\"\n  labelWidth=\"{{ labelWidth }}\"\n  status=\"{{ formData.status }}\"\n  errors=\"{{ formData.errors }}\"\n  tooltip=\"{{ tooltip }}\"\n  required=\"{{ formData.required }}\"\n  requiredMark=\"{{ requiredMark }}\"\n  validateStatus=\"{{ validateStatus }}\"\n  help=\"{{ help }}\">\n  <view>\n    <view a:if=\"{{readonly}}\">\n      <!-- #if ALIPAY -->\n      <slot name=\"readonly\" formData=\"{{formData}}\">\n      <!-- #endif -->\n      <text a:if=\"{{formData.value}}\">{{formData.value}}</text>\n      <text a:else>-</text>\n      <!-- #if ALIPAY -->\n      </slot>\n      <!-- #endif -->\n    </view>\n    <selector\n      style=\"{{readonly ? 'display:none' : ''}};{{ selectorStyle }}\"\n      value=\"{{ formData.value }}\"\n      options=\"{{ options }}\"\n      multiple=\"{{ multiple }}\"\n      disabled=\"{{ disabled }}\"\n      minSelectedCount=\"{{ minSelectedCount }}\"\n      maxSelectedCount=\"{{ maxSelectedCount }}\"\n      activeItemClassName=\"{{ activeItemClassName }}\"\n      activeItemStyle=\"{{ activeItemStyle }}\"\n      onSelectMax=\"onSelectMax\"\n      onSelectMin=\"onSelectMin\"\n      onChange=\"onChange\" />\n  </view>\n  <view\n    a:if=\"{{ !tooltip }}\"\n    slot=\"tooltip\">\n    <slot name=\"tooltip\" />\n  </view>\n  <view slot=\"extra\">\n    <!-- #if ALIPAY -->\n    <slot name=\"extra\">\n    <!-- #endif -->\n      {{ extra }}\n    <!-- #if ALIPAY -->\n    </slot>\n    <!-- #endif -->\n  </view>\n  <view\n    slot=\"header\"\n    slot-scope=\"item\">\n    <slot\n      name=\"header\"\n      errors=\"{{ item.errors }}\"\n      status=\"{{ item.status }}\" />\n  </view>\n  <view\n    slot=\"footer\"\n    slot-scope=\"item\">\n    <slot\n      name=\"footer\"\n      errors=\"{{ item.errors }}\"\n      status=\"{{ item.status }}\" />\n  </view>\n</form-item>\n"
  },
  {
    "path": "src/Form/FormSelector/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"form-item\": \"../FormItem/index\",\n    \"selector\": \"../../Selector/index\"\n  }\n}\n"
  },
  {
    "path": "src/Form/FormSelector/index.ts",
    "content": "import { resolveEventValues } from '../../_util/platform';\nimport { Component, triggerEventValues } from '../../_util/simply';\nimport { createForm } from '../form';\nimport { FormSelectorDefaultProps } from './props';\n\nComponent({\n  props: FormSelectorDefaultProps,\n  methods: {\n    onChange(value, item, e) {\n      const v = resolveEventValues(value, item);\n      this.emit('onChange', v[0]);\n      triggerEventValues(this, 'change', v, e);\n    },\n    onSelectMax(value, item, e) {\n      triggerEventValues(this, 'selectMax', resolveEventValues(value, item), e);\n    },\n    onSelectMin(value, item, e) {\n      triggerEventValues(this, 'selectMin', resolveEventValues(value, item), e);\n    },\n  },\n  mixins: [createForm()],\n});\n"
  },
  {
    "path": "src/Form/FormSelector/props.ts",
    "content": "import { FormItemDefaultProps, FormItemProps } from '../FormItem/props';\nimport { ISelectorProps, SelectorDefaultProps } from '../../Selector/props';\n\nexport interface FormSelectorProps extends ISelectorProps, FormItemProps {}\n\nexport const FormSelectorDefaultProps: Partial<FormSelectorProps> = {\n  ...FormItemDefaultProps,\n  ...SelectorDefaultProps,\n};\n"
  },
  {
    "path": "src/Form/FormSlider/index.axml",
    "content": "<form-item\n  className=\"{{ className }}\"\n  style=\"{{ style }}\"\n  position=\"{{ position }}\"\n  label=\"{{ label }}\"\n  labelWidth=\"{{ labelWidth }}\"\n  status=\"{{ formData.status }}\"\n  errors=\"{{ formData.errors }}\"\n  tooltip=\"{{ tooltip }}\"\n  required=\"{{ formData.required }}\"\n  requiredMark=\"{{ requiredMark }}\"\n  validateStatus=\"{{ validateStatus }}\"\n  help=\"{{ help }}\">\n  <view>\n    <view a:if=\"{{readonly}}\">\n      <!-- #if ALIPAY -->\n      <slot name=\"readonly\" formData=\"{{formData}}\">\n      <!-- #endif -->\n      <text a:if=\"{{formData.value}}\">{{formData.value}}</text>\n      <text a:else>-</text>\n      <!-- #if ALIPAY -->\n      </slot>\n      <!-- #endif -->\n    </view>\n    <slider\n      style=\"{{readonly ? 'display:none' : ''}};{{ sliderStyle }}\"\n      value=\"{{ formData.value }}\"\n      className=\"{{ sliderClassName }}\"\n      activeLineClassName=\"{{ activeLineClassName }}\"\n      activeLineStyle=\"{{ activeLineStyle }}\"\n      activeDotClassName=\"{{ activeDotClassName }}\"\n      activeDotStyle=\"{{ activeDotStyle }}\"\n      min=\"{{ min }}\"\n      max=\"{{ max }}\"\n      range=\"{{ range }}\"\n      showNumber=\"{{ showNumber }}\"\n      step=\"{{ step }}\"\n      showTicks=\"{{ showTicks }}\"\n      showTooltip=\"{{ showTooltip }}\"\n      disabled=\"{{ disabled }}\"\n      onChange=\"onChange\"\n      onAfterChange=\"onAfterChange\" />\n  </view>\n  <view\n    a:if=\"{{ !tooltip }}\"\n    slot=\"tooltip\">\n    <slot name=\"tooltip\" />\n  </view>\n  <view slot=\"extra\">\n    <!-- #if ALIPAY -->\n    <slot name=\"extra\">\n    <!-- #endif -->\n      {{ extra }}\n    <!-- #if ALIPAY -->\n    </slot>\n    <!-- #endif -->\n  </view>\n  <view\n    slot=\"header\"\n    slot-scope=\"item\">\n    <slot\n      name=\"header\"\n      errors=\"{{ item.errors }}\"\n      status=\"{{ item.status }}\" />\n  </view>\n  <view\n    slot=\"footer\"\n    slot-scope=\"item\">\n    <slot\n      name=\"footer\"\n      errors=\"{{ item.errors }}\"\n      status=\"{{ item.status }}\" />\n  </view>\n</form-item>\n"
  },
  {
    "path": "src/Form/FormSlider/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"form-item\": \"../FormItem/index\",\n    \"slider\": \"../../Slider/index\"\n  }\n}"
  },
  {
    "path": "src/Form/FormSlider/index.less",
    "content": ""
  },
  {
    "path": "src/Form/FormSlider/index.ts",
    "content": "import { resolveEventValue } from '../../_util/platform';\nimport { Component, triggerEvent } from '../../_util/simply';\nimport { createForm } from '../form';\nimport { FormSliderDefaultProps } from './props';\n\nComponent({\n  props: FormSliderDefaultProps,\n  methods: {\n    onChange(value, e) {\n      this.emit('onChange', resolveEventValue(value));\n      triggerEvent(this, 'change', resolveEventValue(value), e);\n    },\n    onAfterChange(value, e) {\n      triggerEvent(this, 'afterChange', resolveEventValue(value), e);\n    },\n  },\n  mixins: [createForm()],\n});\n"
  },
  {
    "path": "src/Form/FormSlider/props.ts",
    "content": "import { FormItemDefaultProps, FormItemProps } from '../FormItem/props';\nimport { ISliderProps, sliderDefaultProps } from '../../Slider/props';\n\nexport interface FormSliderProps\n  extends Omit<ISliderProps, 'value' | 'defaultValue'>,\n    FormItemProps {\n  sliderClassName: string;\n  sliderStyle: string;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst { value, defaultValue, ...rest } = sliderDefaultProps;\n\nexport const FormSliderDefaultProps: Partial<FormSliderProps> = {\n  ...FormItemDefaultProps,\n  ...rest,\n  sliderClassName: '',\n  sliderStyle: '',\n};\n"
  },
  {
    "path": "src/Form/FormSlider/variable.less",
    "content": ""
  },
  {
    "path": "src/Form/FormStepper/index.axml",
    "content": "<form-item\n  className=\"{{ className }}\"\n  style=\"{{ style }}\"\n  position=\"{{ position }}\"\n  label=\"{{ label }}\"\n  labelWidth=\"{{ labelWidth }}\"\n  status=\"{{ formData.status }}\"\n  errors=\"{{ formData.errors }}\"\n  tooltip=\"{{ tooltip }}\"\n  required=\"{{ formData.required }}\"\n  requiredMark=\"{{ requiredMark }}\"\n  validateStatus=\"{{ validateStatus }}\"\n  help=\"{{ help }}\">\n  <view>\n    <view a:if=\"{{readonly}}\">\n      <!-- #if ALIPAY -->\n      <slot name=\"readonly\" formData=\"{{formData}}\">\n      <!-- #endif -->\n      <text a:if=\"{{formData.value}}\">{{formData.value}}</text>\n      <text a:else>-</text>\n      <!-- #if ALIPAY -->\n      </slot>\n      <!-- #endif -->\n    </view>\n    <stepper\n      style=\"{{readonly ? 'display:none' : ''}};{{ stepperStyle }}\"\n      value=\"{{ formData.value }}\"\n      onChange=\"onChange\"\n      className=\"{{ stepperClassName }}\"\n      min=\"{{ min }}\"\n      max=\"{{ max }}\"\n      type=\"{{ type }}\"\n      disabled=\"{{ disabled }}\"\n      focus=\"{{ focus }}\"\n      inputClassName=\"{{ inputClassName }}\"\n      inputStyle=\"{{ inputStyle }}\"\n      precision=\"{{ precision }}\"\n      onBlur=\"onBlur\"\n      onConfirm=\"onConfirm\"\n      onFocus=\"onFocus\" />\n  </view>\n  <view\n    a:if=\"{{ !tooltip }}\"\n    slot=\"tooltip\">\n    <slot name=\"tooltip\" />\n  </view>\n  <view slot=\"extra\">\n    <!-- #if ALIPAY -->\n    <slot name=\"extra\">\n    <!-- #endif -->\n      {{ extra }}\n    <!-- #if ALIPAY -->\n    </slot>\n    <!-- #endif -->\n  </view>\n  <view\n    slot=\"header\"\n    slot-scope=\"item\">\n    <slot\n      name=\"header\"\n      errors=\"{{ item.errors }}\"\n      status=\"{{ item.status }}\" />\n  </view>\n  <view\n    slot=\"footer\"\n    slot-scope=\"item\">\n    <slot\n      name=\"footer\"\n      errors=\"{{ item.errors }}\"\n      status=\"{{ item.status }}\" />\n  </view>\n</form-item>\n"
  },
  {
    "path": "src/Form/FormStepper/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"form-item\": \"../FormItem/index\",\n    \"stepper\": \"../../Stepper/index\"\n  }\n}"
  },
  {
    "path": "src/Form/FormStepper/index.less",
    "content": ""
  },
  {
    "path": "src/Form/FormStepper/index.ts",
    "content": "import { resolveEventValue } from '../../_util/platform';\nimport { Component, triggerEvent, triggerEventOnly } from '../../_util/simply';\nimport { createForm } from '../form';\nimport { FormStepperDefaultProps } from './props';\n\nComponent({\n  props: FormStepperDefaultProps,\n  methods: {\n    onChange(value, e) {\n      this.emit('onChange', resolveEventValue(value));\n      triggerEvent(this, 'change', resolveEventValue(value), e);\n    },\n    onBlur(e) {\n      triggerEventOnly(this, 'blur', e);\n    },\n    onFocus(e) {\n      triggerEventOnly(this, 'focus', e);\n    },\n    onConfirm(value, e) {\n      triggerEvent(this, 'confirm', resolveEventValue(value), e);\n    },\n  },\n  mixins: [createForm()],\n});\n"
  },
  {
    "path": "src/Form/FormStepper/props.ts",
    "content": "import { FormItemDefaultProps, FormItemProps } from '../FormItem/props';\nimport { IStepperProps, StepperDefaultProps } from '../../Stepper/props';\n\nexport interface FormStepperProps\n  extends Omit<IStepperProps, 'value' | 'defaultValue'>,\n    FormItemProps {\n  stepperClassName: string;\n  stepperStyle: string;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst { value, defaultValue, ...rest } = StepperDefaultProps;\n\nexport const FormStepperDefaultProps: Partial<FormStepperProps> = {\n  ...FormItemDefaultProps,\n  ...rest,\n  stepperClassName: '',\n  stepperStyle: '',\n};\n"
  },
  {
    "path": "src/Form/FormStepper/variable.less",
    "content": ""
  },
  {
    "path": "src/Form/FormSwitch/index.axml",
    "content": "<form-item\n  className=\"{{ className }}\"\n  style=\"{{ style }}\"\n  position=\"{{ position }}\"\n  label=\"{{ label }}\"\n  labelWidth=\"{{ labelWidth }}\"\n  status=\"{{ formData.status }}\"\n  errors=\"{{ formData.errors }}\"\n  tooltip=\"{{ tooltip }}\"\n  required=\"{{ formData.required }}\"\n  requiredMark=\"{{ requiredMark }}\"\n  validateStatus=\"{{ validateStatus }}\"\n  help=\"{{ help }}\">\n  <view>\n    <block a:if=\"{{readonly && !formData.value && formData.value!==false}}\">\n      <!-- #if ALIPAY -->\n      <slot name=\"readonly\" formData=\"{{formData}}\">\n      <!-- #endif -->\n        -\n      <!-- #if ALIPAY -->\n      </slot>\n      <!-- #endif -->\n    </block>\n    <switch\n      style=\"{{readonly && !formData.value && formData.value!==false ? 'display:none' : ''}};{{ switchStyle }}\"\n      className=\"{{ switchClassName }}\"\n      checked=\"{{ formData.value }}\"\n      checkedText=\"{{ checkedText }}\"\n      color=\"{{ color }}\"\n      disabled=\"{{ disabled }}\"\n      readonly=\"{{ readonly }}\"\n      uncheckedText=\"{{ uncheckedText }}\"\n      size=\"{{ size }}\"\n      onChange=\"onChange\" />\n  </view>\n\n  <view\n    a:if=\"{{ !tooltip }}\"\n    slot=\"tooltip\">\n    <slot name=\"tooltip\" />\n  </view>\n\n  <view slot=\"extra\">\n    <slot name=\"extra\">{{ extra }}</slot>\n  </view>\n\n  <view slot=\"header\">\n    <slot name=\"header\" />\n  </view>\n\n  <view slot=\"footer\">\n    <slot name=\"footer\" />\n  </view>\n</form-item>\n"
  },
  {
    "path": "src/Form/FormSwitch/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"form-item\": \"../FormItem/index\",\n    \"switch\": \"../../Switch/index\"\n  }\n}"
  },
  {
    "path": "src/Form/FormSwitch/index.less",
    "content": ""
  },
  {
    "path": "src/Form/FormSwitch/index.ts",
    "content": "import { resolveEventValue } from '../../_util/platform';\nimport { Component, triggerEvent } from '../../_util/simply';\nimport { createForm } from '../form';\nimport { FormSwitchDefaultProps } from './props';\n\nComponent({\n  props: FormSwitchDefaultProps,\n  methods: {\n    onChange(value, e) {\n      this.emit('onChange', resolveEventValue(value));\n      triggerEvent(this, 'change', resolveEventValue(value), e);\n    },\n  },\n  mixins: [createForm()],\n});\n"
  },
  {
    "path": "src/Form/FormSwitch/props.ts",
    "content": "import { ISwitchProps, SwitchDefaultProps } from '../../Switch/props';\nimport { FormItemDefaultProps, FormItemProps } from '../FormItem/props';\n\nexport interface FormSwitchProps\n  extends Omit<ISwitchProps, 'checked' | 'defaultChecked'>,\n    Omit<FormItemProps, 'readonly'> {\n  switchClassName: string;\n  switchStyle: string;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst { checked, defaultChecked, ...rest } = SwitchDefaultProps;\nexport const FormSwitchDefaultProps: Partial<FormSwitchProps> = {\n  ...FormItemDefaultProps,\n  ...rest,\n  switchClassName: '',\n  switchStyle: '',\n};\n"
  },
  {
    "path": "src/Form/FormSwitch/variable.less",
    "content": "@import (reference) '../../style/themes/index.less';\n\n// input 字体颜色\n@input-item-color: @COLOR_TEXT_PRIMARY;\n// input 字体大小\n@input-item-size: @font-size-content;\n// input placeholder 颜色\n@input-item-placeholder-color: @COLOR_TEXT_WEAK;\n// input 清除 颜色\n@input-item-clear-color: @COLOR_TEXT_ASSIST;\n"
  },
  {
    "path": "src/Form/FormTextarea/index.axml",
    "content": "<import-sjs from=\"../../_util/isPropsEmpty.sjs\" name=\"u\" />\n\n<form-item\n  className=\"{{ className }}\"\n  style=\"{{ style }}\"\n  position=\"{{ position }}\"\n  label=\"{{ label }}\"\n  labelWidth=\"{{ labelWidth }}\"\n  status=\"{{ formData.status }}\"\n  errors=\"{{ formData.errors }}\"\n  tooltip=\"{{ tooltip }}\"\n  required=\"{{ formData.required }}\"\n  requiredMark=\"{{ requiredMark }}\"\n  validateStatus=\"{{ validateStatus }}\"\n  help=\"{{ help }}\"\n>\n  <view a:if=\"{{readonly}}\">\n    <!-- #if ALIPAY -->\n    <slot name=\"readonly\" formData=\"{{formData}}\">\n    <!-- #endif -->\n      <text a:if=\"{{formData.value}}\">{{formData.value}}</text>\n      <text a:else>-</text>\n    <!-- #if ALIPAY -->\n    </slot>\n    <!-- #endif -->\n  </view>\n  <ant-textarea\n    style=\"{{readonly ? 'display:none' : ''}};{{ textareaStyle }}\"\n    ref=\"handleRef\"\n    allowClear=\"{{ allowClear }}\"\n    enableNative=\"{{ enableNative }}\"\n    disabled=\"{{ disabled }}\"\n    placeholder=\"{{ u.isPropsEmpty(placeholder) ? locale.global.placeholder : placeholder  }}\"\n    placeholderClassName=\"{{ placeholderClassName }}\"\n    placeholderStyle=\"{{ placeholderStyle }}\"\n    maxLength=\"{{ maxLength }}\"\n    autoHeight=\"{{ autoHeight }}\"\n    showCount=\"{{ showCount }}\"\n    onChange=\"onChange\"\n    onBlur=\"onBlur\"\n    onFocus=\"onFocus\"\n    onConfirm=\"onConfirm\"\n  />\n  <view a:if=\"{{ !tooltip }}\" slot=\"tooltip\">\n    <slot name=\"tooltip\" />\n  </view>\n  <view slot=\"extra\">\n    <!-- #if ALIPAY -->\n    <slot name=\"extra\">\n      <!-- #endif -->\n      {{ extra }}\n      <!-- #if ALIPAY -->\n    </slot>\n    <!-- #endif -->\n  </view>\n  <view slot=\"header\" slot-scope=\"item\">\n    <slot name=\"header\" errors=\"{{ item.errors }}\" status=\"{{ item.status }}\" />\n  </view>\n  <view slot=\"footer\" slot-scope=\"item\">\n    <slot name=\"footer\" errors=\"{{ item.errors }}\" status=\"{{ item.status }}\" />\n  </view>\n</form-item>\n"
  },
  {
    "path": "src/Form/FormTextarea/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"form-item\": \"../FormItem/index\",\n    \"ant-textarea\": \"../../Input/Textarea/index\"\n  }\n}\n"
  },
  {
    "path": "src/Form/FormTextarea/index.less",
    "content": ""
  },
  {
    "path": "src/Form/FormTextarea/index.ts",
    "content": "import { effect } from '@preact/signals-core';\nimport { resolveEventValue } from '../../_util/platform';\nimport { ComponentWithSignalStoreImpl, triggerEvent } from '../../_util/simply';\nimport i18nController from '../../_util/store';\nimport { createForm } from '../form';\nimport { FormTextareaDefaultProps } from './props';\n\nComponentWithSignalStoreImpl({\n  storeOptions: {\n    store: () => i18nController,\n    updateHook: effect,\n    mapState: {\n      locale: ({ store }) => store.currentLocale.value,\n    },\n  },\n  props: FormTextareaDefaultProps,\n  methods: {\n    handleRef(input) {\n      /// #if ALIPAY\n      this.input = input;\n      /// #endif\n      /// #if WECHAT\n      this.input = input.detail;\n      /// #endif\n    },\n    onChange(value, e) {\n      this.emit('onChange', resolveEventValue(value));\n      triggerEvent(this, 'change', resolveEventValue(value), e);\n    },\n    onBlur(value, e) {\n      triggerEvent(this, 'blur', resolveEventValue(value), e);\n    },\n    onFocus(value, e) {\n      triggerEvent(this, 'focus', resolveEventValue(value), e);\n    },\n    onConfirm(value, e) {\n      triggerEvent(this, 'confirm', resolveEventValue(value), e);\n    },\n    onClear(value, e) {\n      this.emit('onChange', '');\n      triggerEvent(this, 'change', resolveEventValue(value), e);\n    },\n  },\n  mixins: [\n    createForm({\n      methods: {\n        setFormData(this: any, values) {\n          this.setData({\n            ...this.data,\n            formData: {\n              ...this.data.formData,\n              ...values,\n            },\n          });\n          this.input && this.input.update(this.data.formData.value);\n        },\n      },\n    }),\n  ],\n});\n"
  },
  {
    "path": "src/Form/FormTextarea/props.ts",
    "content": "import { FormItemDefaultProps } from './../FormItem/props';\nimport { FormItemProps } from '../FormItem/props';\nimport {\n  TextareaDefaultProps,\n  TextareaProps,\n} from '../../Input/Textarea/props';\n\nexport interface FormTextareaProps\n  extends Omit<TextareaProps, 'value' | 'defaultValue' | 'name'>,\n    FormItemProps {}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst { value, defaultValue, name, ...rest } = TextareaDefaultProps;\nexport const FormTextareaDefaultProps: Partial<TextareaProps> = {\n  ...FormItemDefaultProps,\n  ...rest,\n};\n"
  },
  {
    "path": "src/Form/form.ts",
    "content": "import AsyncValidator, {\n  InternalRuleItem,\n  Rule as RawRule,\n  RuleItem,\n  Rules as RawRules,\n  ValidateError,\n  ValidateMessages,\n  Value,\n  Values,\n} from 'async-validator';\n\nimport { IMixin4Legacy } from '@mini-types/alipay';\nimport flattenObject from '../_util/flattenObject';\nimport get from '../_util/get';\nimport set from '../_util/set';\nimport { getValueFromProps } from '../_util/simply';\n\nexport { Value, Values };\nexport type Validator = (\n  rule: Omit<InternalRuleItem, 'validator' | 'asyncValidator'>,\n  value: Value\n) => void | Promise<void>;\nexport type ValidatorRender = (form: Form) => {\n  validator: Validator;\n};\nexport type FormRuleItem = Omit<RuleItem, 'asyncValidator'> | ValidatorRender;\nexport type Rule = FormRuleItem | FormRuleItem[];\nexport type Rules = Record<string, Rule>;\nexport type FormConfig = {\n  rules?: Rules;\n  initialValues?: Values;\n  validateMessages?: ValidateMessages;\n};\nexport type ValidateStatus = 'default' | 'success' | 'error' | 'validating';\nexport interface ValidatorStatus {\n  status: ValidateStatus;\n  errors: string[];\n}\nexport interface FromItemRef {\n  setFormData: (values: Values) => void;\n  getFormData: () => Values;\n  getProps: () => Record<string, Value>;\n  on: (callback: (trigger: EventTrigger, value?: Value) => void) => void;\n}\nexport type ValidateTrigger = 'onChange' | 'onBlur' | 'onFocus';\nexport type EventTrigger =\n  | ValidateTrigger\n  | 'didUnmount'\n  | 'deriveDataFromProps';\n\nclass EventEmitter {\n  public listenders: Record<string, ((...args: any) => void)[]> = {};\n\n  on(event: string, listener: (...args: any) => void) {\n    this.listenders[event] = this.listenders[event] || [];\n    this.listenders[event].push(listener);\n    return this;\n  }\n\n  emit(event: string, ...args: any) {\n    const arr = this.listenders[event];\n    if (arr) {\n      arr.forEach((listener) => listener(...args));\n    }\n  }\n}\n\nclass Field extends EventEmitter {\n  /**\n   * Field ref对象\n   */\n  private ref: FromItemRef;\n\n  /**\n   * Field 名称\n   */\n  public name: string;\n\n  /**\n   * 校验器\n   */\n  private validator: AsyncValidator;\n\n  /**\n   * 是否被用户操作过\n   */\n  private touched: boolean;\n\n  /**\n   * required\n   */\n  private required: boolean;\n\n  /**\n   * 触发验证的时机，submit不需要设置也会触发校验器\n   */\n  private validateTrigger: ValidateTrigger[];\n\n  private formRules: RawRule;\n\n  /**\n   * Field构建\n   * @param ref field ref对象\n   * @param initialValue 初始值\n   */\n  constructor(\n    ref: FromItemRef,\n    name: string,\n    initialValues: Values,\n    rules: RawRules,\n    validateMessages: ValidateMessages,\n    required: boolean,\n    label: string,\n    message: string,\n    validateTrigger: ValidateTrigger\n  ) {\n    super();\n    this.ref = ref;\n    this.formRules = rules;\n    this.create(\n      name,\n      get(initialValues, name),\n      rules[name],\n      validateMessages,\n      required,\n      label,\n      message,\n      validateTrigger\n    );\n    this.ref.on(async (trigger, value, extraInfo?: any) => {\n      if (trigger === 'onChange') {\n        this.setValue(value);\n        this.touched = true;\n        // 触发校验，需要在 onValueChange 之前执行\n        await Promise.all(\n          this.validateTrigger.map((item) => {\n            if (item === trigger) {\n              return this.validate();\n            }\n          })\n        );\n        this.emit('valueChange', value);\n        return;\n      } else if (trigger === 'didUnmount') {\n        this.emit('didUnmount');\n      } else if (trigger === 'deriveDataFromProps') {\n        const props = extraInfo ? extraInfo : this.ref.getProps();\n        if (\n          (value.name && value.name !== props.name) ||\n          value.required !== props.required ||\n          value.label !== props.label ||\n          value.message !== props.message ||\n          value.validateTrigger !== props.validateTrigger\n        ) {\n          this.create(\n            value.name,\n            get(initialValues, value.name),\n            this.formRules[value.name],\n            validateMessages,\n            value.required,\n            value.message,\n            value.label,\n            value.validateTrigger,\n            true\n          );\n        }\n        if (value.name !== props.name) {\n          this.emit('replaceName', value.name);\n        }\n      }\n      this.validateTrigger.forEach((item) => {\n        if (item === trigger) {\n          this.validate();\n        }\n      });\n    });\n  }\n\n  create(\n    name: string,\n    initialValue: Value,\n    rule: RawRule,\n    validateMessages: ValidateMessages,\n    required: boolean,\n    label: string,\n    message: string,\n    validateTrigger: ValidateTrigger,\n    update?: boolean\n  ) {\n    this.name = name;\n    this.required = this.transformValidatorRules(\n      name,\n      rule,\n      required,\n      label,\n      message,\n      validateMessages\n    );\n    if (!update) {\n      this.reset(initialValue);\n    } else {\n      this.ref.setFormData({\n        required: this.required,\n      });\n    }\n    let validateTriggerList: ValidateTrigger[] | ValidateTrigger =\n      validateTrigger || 'onChange';\n    if (!Array.isArray(validateTriggerList)) {\n      validateTriggerList = [validateTriggerList];\n    }\n    this.validateTrigger = validateTriggerList;\n  }\n\n  updateFieldRules(rules: RawRule, validateMessages: ValidateMessages) {\n    const props = this.ref.getProps();\n    this.formRules = rules;\n    this.create(\n      props.name,\n      null,\n      rules[props.name],\n      validateMessages,\n      props.required,\n      props.label,\n      props.message,\n      props.validateTrigger,\n      true\n    );\n  }\n\n  /**\n   *\n   * @param rule 修改 Validator\n   * @param name\n   * @param required\n   * @param message\n   * @param validateMessages\n   * @returns\n   */\n  private transformValidatorRules(\n    name: string,\n    rule: RawRule,\n    required: boolean,\n    label: string,\n    message: string,\n    validateMessages: ValidateMessages\n  ) {\n    let requiredRule = false;\n    let validator: AsyncValidator;\n    if (rule) {\n      const ruleList = Array.isArray(rule) ? rule : [rule];\n      const result = ruleList.find((item) => item.required);\n      if (result) {\n        if (message) {\n          result.message = message;\n        }\n        requiredRule = true;\n      } else if (required) {\n        ruleList.push({\n          required,\n          // message 不允许为 null\n          message: message ?? undefined,\n        });\n        requiredRule = true;\n      }\n      validator = new AsyncValidator({\n        [name]: ruleList,\n      });\n    } else if (required) {\n      validator = new AsyncValidator({\n        [name]: {\n          required,\n          // message 不允许为 null\n          message: message ?? undefined,\n        },\n      });\n      requiredRule = true;\n    }\n    if (validator) {\n      const obj = {\n        label,\n      };\n      Object.keys(validator.rules).forEach((name) => {\n        validator.rules[name].forEach((item) => {\n          if (typeof item.len !== 'undefined') {\n            obj['len'] = item.len;\n          }\n          if (typeof item.min !== 'undefined') {\n            obj['min'] = item.min;\n          }\n          if (typeof item.max !== 'undefined') {\n            obj['max'] = item.max;\n          }\n          if (typeof item.pattern !== 'undefined') {\n            obj['pattern'] = item.pattern;\n          }\n        });\n      });\n      validator.messages(this.transformValidateMessages(validateMessages, obj));\n    }\n    this.validator = validator;\n    return requiredRule;\n  }\n\n  private transformValidateMessages(\n    validateMessages: ValidateMessages,\n    obj: Partial<{\n      label: string;\n      len: number;\n      min: number;\n      max: number;\n      pattern: RegExp | string;\n    }>\n  ) {\n    if (!validateMessages) {\n      return;\n    }\n    function replaceLabel(\n      validateMessages: ValidateMessages,\n      target: ValidateMessages\n    ) {\n      Object.keys(validateMessages).forEach((item) => {\n        if (typeof validateMessages[item] === 'string') {\n          target[item] = validateMessages[item].replace(\n            '${label}',\n            obj.label || ''\n          );\n          if (typeof obj.len !== 'undefined') {\n            target[item] = target[item].replace('${len}', obj.len);\n          }\n          if (typeof obj.min !== 'undefined') {\n            target[item] = target[item].replace('${min}', obj.min);\n          }\n          if (typeof obj.max !== 'undefined') {\n            target[item] = target[item].replace('${max}', obj.max);\n          }\n          if (typeof obj.pattern !== 'undefined') {\n            target[item] = target[item].replace('${pattern}', obj.pattern);\n          }\n          return;\n        }\n        if (typeof validateMessages[item] === 'object') {\n          const val = (target[item] = {});\n          replaceLabel(validateMessages[item], val);\n          return;\n        }\n        target[item] = validateMessages[item];\n      });\n    }\n    const messages: ValidateMessages = {};\n    replaceLabel(validateMessages, messages);\n    return messages;\n  }\n\n  /**\n   * 设置 Field 值\n   * @param value Field 值\n   */\n  setValue(value: Value) {\n    this.ref.setFormData({\n      value,\n    });\n  }\n\n  /**\n   * 得到 Field 值\n   */\n  getValue() {\n    const value = this.ref.getFormData().value;\n    return value;\n  }\n\n  /**\n   * 设置 Field 校验器状态\n   * @param validatorStatue\n   */\n  setValidatorStatus(validatorStatue: ValidatorStatus) {\n    this.ref.setFormData(validatorStatue);\n  }\n\n  /**\n   * 得到 Field 校验器状态\n   * @returns\n   */\n  getValidatorStatus(): ValidatorStatus {\n    const { status, errors } = this.ref.getFormData();\n    return {\n      status,\n      errors,\n    };\n  }\n\n  /**\n   * 校验 Field\n   */\n  async validate() {\n    const validatorStatusSuccess: ValidatorStatus = {\n      status: 'success',\n      errors: [] as string[],\n    };\n    const value = this.getValue();\n    if (!this.validator) {\n      this.setValidatorStatus(validatorStatusSuccess);\n      return {\n        validatorStatus: validatorStatusSuccess,\n        value,\n      };\n    }\n    const validator = this.validator;\n    try {\n      let needUpdateStatus = true;\n      Promise.resolve().then(() => {\n        Promise.resolve().then(() => {\n          if (needUpdateStatus) {\n            this.setValidatorStatus({\n              status: 'validating',\n              errors: [],\n            });\n          }\n        });\n      });\n      await this.validator.validate(\n        {\n          [this.name]: value,\n        },\n        () => {\n          needUpdateStatus = false;\n        }\n      );\n      if (validator !== this.validator) {\n        return;\n      }\n      this.setValidatorStatus(validatorStatusSuccess);\n      return {\n        validatorStatus: validatorStatusSuccess,\n        value,\n      };\n    } catch (err) {\n      if (validator !== this.validator) {\n        return;\n      }\n      const errors: ValidateError[] = err.errors;\n      const validatorStatus: ValidatorStatus = {\n        status: 'error',\n        errors: errors.map(({ message = '' }) => message),\n      };\n      this.setValidatorStatus(validatorStatus);\n      return {\n        validatorStatus,\n        value,\n      };\n    }\n  }\n\n  /**\n   * 重置 Field\n   * @param initialValue\n   */\n  reset(initialValue: Value) {\n    this.touched = false;\n    this.ref.setFormData({\n      value: initialValue,\n      required: this.required,\n      status: 'default',\n      errors: [],\n    });\n  }\n\n  /**\n   * Field 是否被操作\n   */\n  isTouched() {\n    return this.touched;\n  }\n}\n\nexport class Form {\n  /**\n   * 表单初始值\n   */\n  private initialValues: Values;\n\n  /**\n   * 原始规则，用户传入的跟之前的规则区别在于validator\n   */\n  private rules: RawRules;\n\n  /**\n   * 表单ref组件对象\n   */\n  private fields: Record<string, Field> = {};\n\n  /**\n   * 验证提示模板\n   */\n  private validateMessages: ValidateMessages;\n\n  /**\n   * 表单字段 change侦听\n   */\n  private changeListeners: ((\n    changedValues: Values,\n    allValues: Values\n  ) => void)[] = [];\n\n  /**\n   * 依赖表\n   */\n  private dependenciesMap: Record<string, string[]> = {};\n  /**\n   * Form构建\n   * @param formConfig 表单配置项\n   */\n  constructor(formConfig: FormConfig = {}) {\n    this.setInitialValues(formConfig.initialValues || {});\n    this.setRules(formConfig.rules || {});\n    this.validateMessages = formConfig.validateMessages;\n  }\n\n  /**\n   * 用户传入的rules转换成async-validator rules\n   * @param rules 校验规则\n   */\n  private transformRules(rules: Rules) {\n    const result: RawRules = {};\n    Object.keys(rules).forEach((name) => {\n      const rule = rules[name];\n      const list = (result[name] = []);\n      const arr = Array.isArray(rule) ? rule : [rule];\n      arr.forEach((item) => {\n        if (typeof item === 'function') {\n          list.push(item(this).validator);\n        } else {\n          list.push({\n            ...item,\n          });\n        }\n      });\n    });\n    return result;\n  }\n\n  /**\n   * 遍历表单field对象\n   * @param callback\n   */\n  private eachField(callback: (field: Field, name: string) => void) {\n    const fields = this.fields;\n    Object.keys(fields).forEach((name) => {\n      const field = fields[name];\n      callback(field, name);\n    });\n  }\n\n  /**\n   * 更新 rules\n   * @param rules\n   */\n  updateRules(rules: Rules) {\n    const rawRules = this.transformRules(rules);\n    this.rules = rawRules;\n    Object.keys(this.fields).forEach((name) => {\n      this.fields[name].updateFieldRules(rawRules, this.validateMessages);\n    });\n  }\n\n  /**\n   * 设置 rules\n   * @param rules\n   */\n  private setRules(rules: Rules) {\n    this.rules = this.transformRules(rules);\n  }\n\n  /**\n   * 添加表单对象\n   * @param ref 表单ref对象\n   */\n  addItem(ref: FromItemRef, customName?: string) {\n    const props = ref.getProps();\n    let name = customName || props.name;\n    if (!name) {\n      ref.on((trigger, value) => {\n        if (trigger === 'deriveDataFromProps') {\n          if (value.name) {\n            this.addItem(ref, value.name);\n          }\n        }\n      });\n      return;\n    }\n    if (this.fields[name]) {\n      throw new Error(`Form \"addItem\" same name: \"${name}\"`);\n    }\n    const field = new Field(\n      ref,\n      name,\n      this.initialValues,\n      this.rules,\n      this.validateMessages,\n      props.required,\n      props.label,\n      props.message,\n      props.validateTrigger\n    );\n    if (props.dependencies) {\n      props.dependencies.forEach((item) => {\n        this.dependenciesMap[item] = this.dependenciesMap[item] || [];\n        if (this.dependenciesMap[item].indexOf(name) < 0) {\n          this.dependenciesMap[item].push(name);\n        }\n      });\n    }\n    field\n      .on('valueChange', (value) => {\n        if (name) {\n          const arr = this.dependenciesMap[name];\n          if (arr) {\n            arr.forEach((item) => {\n              if (this.fields[item]) {\n                this.fields[item].validate();\n              }\n            });\n          }\n          this.changeListeners.forEach((item) =>\n            item(set({}, name, value), this.getFieldsValue())\n          );\n        }\n      })\n      .on('didUnmount', () => {\n        delete this.fields[name];\n      })\n      .on('replaceName', (newName) => {\n        if (!newName) {\n          delete this.fields[name];\n          return;\n        }\n        if (this.fields[newName]) {\n          throw new Error(`Form \"addItem\" same name: \"${newName}\"`);\n        }\n        this.fields[newName] = field;\n        delete this.fields[name];\n        name = newName;\n      });\n    if (name) {\n      this.fields[name] = field;\n    }\n  }\n\n  /**\n   * 设置表单值\n   * @param name 表单名称\n   * @param value 表单初始值\n   */\n  setFieldValue(name: string, value: Value) {\n    const field = this.fields[name];\n    if (field) {\n      field.setValue(value);\n      field.setValidatorStatus({\n        status: 'success',\n        errors: [],\n      });\n    }\n  }\n\n  /**\n   * 设置表单值\n   * @param name 表单名称\n   * @param value 表单初始值\n   */\n  setFieldsValue(values: Values) {\n    Object.keys(flattenObject(values)).forEach((name) => {\n      this.setFieldValue(name, get(values, name));\n    });\n  }\n\n  /**\n   * 设置 initialValues，这个操作不会对页面进行修改，要是需要重置表单可跟上 reset 方法；\n   * 这样是对于表单已经在编辑，但是需要重新initialValues的场景\n   *\n   * eg:\n   *    this.setInitialValues(initialValues);\n   *    this.reset();\n   *\n   * @param initialValues\n   */\n  setInitialValues(initialValues: Values) {\n    this.initialValues = initialValues;\n  }\n\n  /**\n   * 获取对应字段名的值\n   * @param name\n   * @returns\n   */\n  getFieldValue(name: string) {\n    const field = this.fields[name];\n    if (!field) {\n      return;\n    }\n    return field.getValue();\n  }\n\n  /**\n   * 获取一组字段名对应的值\n   * @param nameList\n   * @returns\n   */\n  getFieldsValue(nameList?: string[]) {\n    const fieldsValue: Values = {};\n    nameList = nameList || Object.keys(this.fields);\n    nameList.forEach((name) => {\n      set(fieldsValue, name, this.getFieldValue(name));\n    });\n    return fieldsValue;\n  }\n\n  /**\n   * 获取对应字段名的校验器状态\n   * @param name\n   * @returns\n   */\n  getFieldValidatorStatus(name: string) {\n    const field = this.fields[name];\n    if (!field) {\n      return;\n    }\n    return field.getValidatorStatus();\n  }\n\n  /**\n   * 获取一组字段名的校验器状态\n   * @param nameList\n   * @returns\n   */\n  getFieldsValidatorStatus(nameList?: string[]) {\n    const fieldsValidatorStatus: Record<string, ValidatorStatus> = {};\n    nameList = nameList || Object.keys(this.fields);\n    nameList.forEach((name) => {\n      fieldsValidatorStatus[name] = this.getFieldValidatorStatus(name);\n    });\n    return fieldsValidatorStatus;\n  }\n\n  /**\n   * 设置对应字段名的校验器状态\n   * @param name 表单名称\n   * @param validatorStatus 校验状态\n   * @returns\n   */\n  setFieldValidatorStatus(name: string, validatorStatus: ValidatorStatus) {\n    const field = this.fields[name];\n    if (!field) {\n      return;\n    }\n    return field.setValidatorStatus(validatorStatus);\n  }\n\n  /**\n   * 设置一组字段名的校验器状态\n   * @param fieldsValidatorStatus 表单校验状态\n   * @returns\n   */\n  setFieldsValidatorStatus(\n    fieldsValidatorStatus: Record<string, ValidatorStatus>\n  ) {\n    Object.keys(fieldsValidatorStatus).forEach((name) => {\n      this.setFieldValidatorStatus(name, fieldsValidatorStatus[name]);\n    });\n  }\n\n  /**\n   * 检查对应字段是否被用户操作过\n   * @param name 字段名称\n   * @returns\n   */\n  isFieldTouched(name: string) {\n    const field = this.fields[name];\n    if (!field) {\n      return false;\n    }\n    return field.isTouched();\n  }\n\n  /**\n   * 指定表单字段值更新时触发回调方法\n   * @param name 表单字段名称\n   * @param callback 回调方法\n   */\n  onValueChange(\n    name: string,\n    callback: (value: Value, allValues: Values) => void\n  ) {\n    this.changeListeners.push((changedValues: Values, allValues: Values) => {\n      if (get(changedValues, name)) {\n        callback(get(changedValues, name), allValues);\n      }\n    });\n  }\n\n  /**\n   * 表单字段值更新时触发回调方法\n   * @param name 表单字段名称\n   * @param callback 回调方法\n   */\n  onValuesChange(callback: (changedValues: Values, allValues: Values) => void) {\n    this.changeListeners.push((changedValues: Values, allValues: Values) => {\n      callback(changedValues, allValues);\n    });\n  }\n\n  /**\n   * 表单提交\n   */\n  async submit() {\n    const values: Values = {};\n    const arr: Promise<{\n      validatorStatus: ValidatorStatus;\n      value: Value;\n      name: string;\n    }>[] = [];\n    this.eachField((field, name) => {\n      arr.push(\n        (async () => {\n          return {\n            ...(await field.validate()),\n            name,\n          };\n        })()\n      );\n    });\n    const result = await Promise.all(arr);\n    const errorFields: {\n      name: string;\n      errors: string[];\n    }[] = [];\n    result.forEach((obj) => {\n      if (!obj) {\n        return;\n      }\n      const { name, value, validatorStatus } = obj;\n      if (validatorStatus.status === 'error') {\n        errorFields.push({\n          name,\n          errors: validatorStatus.errors,\n        });\n      }\n      set(values, name, value);\n    });\n    if (errorFields.length > 0) {\n      throw {\n        values,\n        errorFields,\n      };\n    }\n    return values;\n  }\n\n  /**\n   * 表单重置\n   */\n  reset() {\n    this.eachField((field, name) => {\n      const initialValue = get(this.initialValues, name);\n      field.reset(initialValue);\n    });\n  }\n}\n\nexport function createForm({ methods = {} } = {}) {\n  let mixin = {\n    data: {\n      formData: {\n        value: undefined,\n        status: 'default',\n        errors: [],\n      },\n    },\n\n    /// #if ALIPAY\n    didUnmount() {\n      this.emit('didUnmount');\n    },\n    deriveDataFromProps(nextProps) {\n      this.emit('deriveDataFromProps', nextProps);\n    },\n    /// #endif\n    /// #if WECHAT\n    attached() {\n      this.triggerEvent('ref', this);\n    },\n    detached() {\n      this.emit('didUnmount');\n    },\n    observers: {\n      '**': function (nextProps) {\n        this.emit('deriveDataFromProps', nextProps);\n      },\n    },\n    /// #endif\n    methods: {\n      emit(trigger: EventTrigger, value?: Value) {},\n      setFormData(values: Values) {\n        this.setData({\n          ...this.data,\n          formData: {\n            ...this.data.formData,\n            ...values,\n          },\n        });\n      },\n      getFormData() {\n        return this.data.formData;\n      },\n      on(callback: (trigger: EventTrigger, value?: Value) => void) {\n        this.emit = callback;\n      },\n      getProps() {\n        return getValueFromProps(this);\n      },\n      ...methods,\n    },\n  } as IMixin4Legacy<\n    {\n      formData: {\n        value: Value;\n      } & ValidatorStatus;\n    },\n    Record<string, any>,\n    {\n      emit(trigger: EventTrigger, value?: Value): void;\n      setFormData(values: Values): void;\n      getFormData(): {\n        value: Value;\n      } & ValidatorStatus;\n      on(callback: (trigger: EventTrigger, value?: Value) => void): void;\n      getProps: Record<string, any>;\n    }\n  >;\n  /// #if WECHAT\n  // @ts-ignore\n  mixin = Behavior(mixin);\n  /// #endif\n\n  return mixin;\n}\n"
  },
  {
    "path": "src/Form/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Information Entry\n  order: 12\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Form\n\nThe Form form contains data entry, validation, and corresponding styles. The Form component requires [component2](https://opendocs.alipay.com/mini/framework/custom-component-overview) Support.\n\n- Used to create entities or collect information.\n- When the input data type needs to be verified.\n\n## Introduction\n\n> Take the input box as an example\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"form-input\": \"antd-mini/es/Form/FormInput/index\"\n#endif\n#if WECHAT\n  \"form-input\": \"antd-mini/Form/FormInput/index\"\n#endif\n}\n```\n\nThe logic layer registers the input box component ref into the Form\n\n```xml\n<form-input\n  label=\"用户名\"\n  name=\"account\"\n  placeholder=\"请输入用户名\"\n  tooltip=\"用户名Description\"\n  allowClear\n  ref=\"handleRef\"\n/>\n```\n\n```js\n#if ALIPAY\nimport { Form } from 'antd-mini/es/Form/form';\n#endif\n#if WECHAT\nimport { Form } from 'antd-mini/Form/form';\n#endif\n\nPage({\n  handleRef(ref) {\n#if ALIPAY\n    this.form.addItem(ref);\n#endif\n#if WECHAT\n    if (!this.formRefList) {\n      this.formRefList = [];\n    }\n    this.formRefList.push(ref.detail);\n#endif\n  },\n});\n```\n\n## Code Sample\n\n### Basic use\n\n<code src='../../demo/pages/Form/FormBasic/index'></code>\n\n### Layout\n\n<code src='../../demo/pages/Form/FormLayout/index'></code>\n\n### Initial value\n\n<code src='../../demo/pages/Form/FormInitialValues/index'></code>\n\n### Initial value asynchronous loading\n\n<code src='../../demo/pages/Form/FormInitialValuesAsync/index'></code>\n\n### Form listening\n\n<code src='../../demo/pages/Form/FormWatch/index'></code>\n\n### Calibration\n\n<code src='../../demo/pages/Form/FormRules/index'></code>\n\n### Add Delete Form Item\n\n<code src='../../demo/pages/Form/FormDynamic/index'></code>\n\n### Form Item Linkage\n\n<code src='../../demo/pages/Form/FormDependency/index'></code>\n\n### Custom Form Item Validation\n\n<code src='../../demo/pages/Form/FormValidate/index'></code>\n\n### Custom Form Validation Message\n\n<code src='../../demo/pages/Form/FormValidateMessages/index'></code>\n\n### Multiple Forms\n\n<code src='../../demo/pages/Form/FormMultiple/index'></code>\n\n### Form Item Read Only\n\n<code src='../../demo/pages/Form/FormReadonly/index'></code>\n\n### Picture verification\n\n<code src='../../demo/pages/Form/FormImageUploadRules/index'></code>\n\n### JSON Generate Form\n\n<code src='../../demo/pages/Form/FormJSON/index'></code>\n\n### Custom Error Styles\n\nUse `validateStatus: success` and `footer slot` Customize the error style.\n\n<code src='../../demo/pages/Form/FormCustomError/index'></code>\n\n### Custom Form Item\n\nby using [FormItem](#formitem)、[createForm](#createform) Customizable form items. In the example `form-checklist`、`form-location` For custom form item components.\n\n<code src='../../demo/pages/Form/FormCustom/index'></code>\n\n### Demo Code\n\n<code src='../../demo/pages/Form/index'></code>\n\n## API\n\n### FormItem\n\nProperties Included in All Form Components\n| Property | Description | Type | Default Value |\n| -----|-----|-----|-----|\n| dependencies | Set Dependent Fields, View[Detailed Description](#dependencies) | string[] | - |\n| footer | Bottom slot, receiving errors, status | slot | - |\n| name | Name | string | - |\n| label | Text | string | - |\n| labelWidth | Text Width | string | - |\n| position | layout, optional `horizontal` `vertical` | string | horizontal |\n| validateStatus | The verification status. If it is not set, it will be automatically generated according to the verification rules. Optional `default` `success` `error` `validating` | string | - |\n| help | Prompt information, if not set, will be automatically generated according to the verification rules | string | - |\n| header | Top slot, receiving errors, status | slot | - |\n| tooltip | Form Item Prompt Information | string\\|slot | - |\n| required | Required style settings. If it is not set, it will be automatically generated according to the verification rules. | boolean | false |\n| message | Verify the error message. If it is not set, it will be automatically generated according to the verification rules. | string | false |\n| requiredMark | Required optional tag style, optional `asterisk` `text-required` `text-optional` | string | asterisk |\n\n### Form\n\n| Property             | Description           | Type                                      |\n| ---------------- | -------------- | ----------------------------------------- |\n| rules            | Optional, Validation Rules | View[rules](#rules)                       |\n| initialValues    | Optional, initial value   | Record<string, any>                       |\n| validateMessages | Optional, Verify Message | View[validateMessages](#validatemessages) |\n\n### Form instance method\n\n| Property                     | Description                                                                 | Type                                                                                   |\n| ------------------------ | -------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |\n| addItem                  | Add Form Item                                                           | (formItem: Ref) => void                                                                |\n| updateRules              | To update the verification rules of the form, you need to pass in the full number of rules each time.                     | (rules: Rules) => void, the type of Rules can be viewed[rules](#rules)                            |\n| getFieldValue            | Get the value of a form item                                                       | (name: string) => any                                                                  |\n| getFieldsValue           | Gets the value for a set of field names. If no nameList is passed, all fields pairs are returned.           | (nameList?: string[]) => Record<string, any>                                           |\n| getFieldValidatorStatus  | Get form check status                                                     | (name: string) => [ValidatorStatus](#validatorstatus)                                  |\n| getFieldsValidatorStatus | Get a set of form validation states. If no nameList is passed, all fields pairs are returned.             | (nameList?: string[]) => Record<string, [ValidatorStatus](#validatorstatus)>           |\n| reset                    | Reset form to initial value                                                     | () => void                                                                             |\n| isFieldTouched           | Determine whether a form item has been modified                                               | () => boolean                                                                          |\n| onValueChange            | Listen for the value modification of the specified form item, view[Detailed Description](#onvaluechangeonvalueschange) | (name: string, (changedValue: any, allValues: Record<string, any>) => void) => void    |\n| onValuesChange           | Listen for the value modification of a form item, view[Detailed Description](#onvaluechangeonvalueschange)     | ((changedValues: Record<string, any>, allValues: Record<string, any>) => void) => void |\n| setFieldValue            | Set the value of a form item                                                       | (name: string, value: any) => void;                                                    |\n| setFieldsValue           | Set the value of a form item                                                       | (values: Record<string, any>) => void;                                                 |\n| setFieldValidatorStatus  | Set Form Verification Status                                                     | (name: string, validatorStatus: [ValidatorStatus](#validatorstatus)) => void           |\n| setFieldsValidatorStatus | Set a set of form validation states                                                 | (fieldsValidatorStatus: Record<string, [ValidatorStatus](#validatorstatus)>) => void   |\n| setInitialValues         | Set Form Initial Values                                                       | (initialValues: Record<string, any>) => void                                           |\n| submit                   | Submit the form, return the promise form value, and the verification error will be thrown.                        | () => Promise<Record<string, any>>                                                     |\n\n### dependencies\n\nUsed when there is a dependency between fields. For example, the \"Password\" and \"Confirm Password\" fields of the registered user form, where the \"Confirm Password\" verification depends on the \"Password\" field. Setup `dependencies` After that, the \"Password\" field update will automatically trigger the \"Confirm Password\" verification.\n\n### rules\n\nExample:\n\n```javascript\n{\n  account: [\n    {\n      required: true,\n      message: '需要输入用户名'\n    },\n  ],\n  password: [\n    {\n      required: true,\n    },\n  ],\n  confirm: [\n    {\n      required: true,\n      message: '需要输入确认密码'\n    },\n    (form) => ({\n      async validator(_, value) {\n        if (!value || form.getFieldValue('password') === value) {\n          return;\n        }\n        throw new Error('两次密码需一致');\n      },\n    }),\n  ]\n}\n```\n\n`rules` can be in `new Form` can also be set in `FormItem` By `required` or `message` Property settings.\n\n```html\n<form-input\n  label=\"用户名\"\n  name=\"account\"\n  required\n  message=\"请输入用户名\"\n  ref=\"handleRef\"\n></form-input>\n```\n\n### validateMessages\n\ncan refer [Asynchronous validator](https://github.com/yiminghe/async-validator/blob/master/src/messages.ts#L4-L55) message,antd-mini added on this basis. `${label}`,`${len}`,`${min}`,`${max}`,`${pattern}`。\n\nExample:\n\n```javascript\n{\n  required: '需要输入${label}',\n  string: {\n    min: '${label}最少${min}个字符',\n  },\n  pattern: {\n    mismatch: '${label}需要满足${pattern}模式',\n  },\n}\n```\n\n### onValueChange and onValuesChange\n\n`setFieldValue` and `setFieldsValue` Will not trigger `onValueChange` and `onValuesChange`。`onValueChange` and `onValuesChange` It is only triggered when a user action is taken. If in `setFieldValue` or `setFieldsValue` then want to trigger `onValueChange` or `onValuesChange`you need to call these methods manually.\n\n**Example**：\n\n```js\nconst onValuesChangeCallback = (changedValues) => {\n  console.log(changedValues);\n};\nthis.form.onValuesChange(onValuesChangeCallback);\nthis.form.setFieldValue(name, value);\nonValuesChangeCallback({\n  [name]: value,\n});\n```\n\n### ValidatorStatus\n\n```js\ntype ValidatorStatus = {\n  status: 'default' | 'success' | 'error' | 'validating',\n  errors: string[],\n};\n```\n\n### submit checksum throws error\n\n```js\n{\n  values: Record<string, any>,\n  errorFields: {\n    name: string;\n    errors: string[];\n  }[]\n}\n```\n\n### FormInput\n\nwith `Input` Same.\n\n### FormTextarea\n\nwith `Textarea` Same.\n\n### FormSwitch\n\nwith `Switch` Same.\n\n### FormStepper\n\nwith `Stepper` Same, but with the following added attributes:\n\n| Property             | Description                              | Type   | Default Value |\n| ---------------- | --------------------------------- | ------ | ------ |\n| stepperClassName | Corresponding `Stepper` Components `className` | string | -      |\n| stepperStyle     | Corresponding `Stepper` Components `style`     | string | -      |\n\n### FormCheckGroup\n\nwith `CheckGroup` Same, but with the following added attributes:\n\n| Property             | Description                                | Type   | Default Value |\n| ---------------- | ----------------------------------- | ------ | ------ |\n| checkboxLabel    | Corresponding `CheckGroup` Components `label`    | slot   | -      |\n| checkboxPosition | Corresponding `CheckGroup` Components `position` | string | -      |\n\n### FormRadioGroup\n\nwith `RadioGroup` Same, but with the following added attributes:\n\n| Property          | Description                                | Type   | Default Value |\n| ------------- | ----------------------------------- | ------ | ------ |\n| radioLabel    | Corresponding `RadioGroup` Components `label`    | slot   | -      |\n| radioPosition | Corresponding `RadioGroup` Components `position` | string | -      |\n\n### FormPicker\n\nwith `Picker` Same, but with the following added attributes:\n\n| Property  | Description                                                     | Type              | Default Value |\n| ----- | -------------------------------------------------------- | ----------------- | ------ |\n| arrow | right arrow, optional `right`、`up`、`down`, pass true `right` | string \\| boolean | -      |\n\n### FormDatePicker\n\nwith `DatePicker` Same, but with the following added attributes:\n\n| Property  | Description                                                     | Type              | Default Value |\n| ----- | -------------------------------------------------------- | ----------------- | ------ |\n| arrow | right arrow, optional `right`、`up`、`down`, pass true `right` | string \\| boolean | -      |\n\n### FormRangePicker\n\nwith `RangePicker` Same, but with the following added attributes:\n\n| Property  | Description                                                     | Type              | Default Value |\n| ----- | -------------------------------------------------------- | ----------------- | ------ |\n| arrow | right arrow, optional `right`、`up`、`down`, pass true `right` | string \\| boolean | -      |\n\n### FormCascaderPicker\n\nwith `CascaderPicker` Same, but with the following added attributes:\n\n| Property  | Description                                                     | Type              | Default Value |\n| ----- | -------------------------------------------------------- | ----------------- | ------ |\n| arrow | right arrow, optional `right`、`up`、`down`, pass true `right` | string \\| boolean | -      |\n\n### FormSlider\n\nwith `Slider` Same.\n\n### FormSelector\n\nwith `Selector` Same.\n\n### FormImageUpload\n\nwith `ImageUpload` Same.\n\n### createForm\n\n`createForm` is a `mixin`for custom form items.\n\n```js\nimport { createForm } from 'antd-mini/es/Form/form';\n\nComponent({\n  mixins: [createForm()],\n  methods: {\n    onChange(value) {\n      this.emit('onChange', value);\n    },\n  },\n});\n```\n\n`createForm` The following is added to the component:\n\n- `data`\n\n```js\n{\n  formData: {\n    value: undefined, // 表单项的值\n    status: 'default', // 表单项的Calibration状态，包括 `default`、`success`、`error`、`validating`\n    errors: [], // 错误信息\n  },\n}\n```\n\n- `methods`\n\n```js\n// 修改表单项时，需调用 `emit` 方法。Custom Form Item组件In值改变时，应该调用此方法。\nfunction emit(trigger: 'onChange' | 'onBlur' | 'onFocus', value: any): void;\n```\n\nFor more methods, please refer `createForm` Method-related documentation. Use `formData` and `emit` The implementation of the custom form item is complete.\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                | Default Value                                                                                            | Dark Mode Default                                                                                    | Remarks             |\n| --------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------- |\n| --form-text-color     | <div style=\"width: 150px; height: 30px; background-color: #cccccc; color: #333333;\">#cccccc</div> | <div style=\"width: 150px; height: 30px; background-color: #474747; color: #ffffff;\">#474747</div> | Form text color     |\n| --form-item-color     | <div style=\"width: 150px; height: 30px; background-color: #666666; color: #ffffff;\">#666666</div> | <div style=\"width: 150px; height: 30px; background-color: #808080; color: #ffffff;\">#808080</div> | Form Item Color       |\n| --form-item-bg        | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #fff;\">#1a1a1a</div>    | Form Item Background Color   |\n| --form-error-color    | <div style=\"width: 150px; height: 30px; background-color: #ff3141; color: #ffffff;\">#ff3141</div> | <div style=\"width: 150px; height: 30px; background-color: #ff4a58; color: #ffffff;\">#ff4a58</div> | Form Error Color     |\n| --form-extra-color    | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | Form extra information color |\n| --form-asterisk-color | <div style=\"width: 150px; height: 30px; background-color: #ff3b30; color: #ffffff;\">#ff3b30</div> | <div style=\"width: 150px; height: 30px; background-color: #ff3b30; color: #ffffff;\">#ff3b30</div> | Form asterisk color     |\n"
  },
  {
    "path": "src/Form/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 数据录入\n  order: 12\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Form 表单\n\nForm 表单包含数据录入、校验以及相应的样式。Form 组件需要 [component2](https://opendocs.alipay.com/mini/framework/custom-component-overview) 支持。\n\n- 用于创建实体或收集信息。\n- 需要对输入的数据类型进行校验时。\n\n## 引入\n\n> 以输入框为例\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"form-input\": \"antd-mini/es/Form/FormInput/index\"\n#endif\n#if WECHAT\n  \"form-input\": \"antd-mini/Form/FormInput/index\"\n#endif\n}\n```\n\n逻辑层将输入框组件 ref 注册到 Form 中\n\n```xml\n<form-input\n  label=\"用户名\"\n  name=\"account\"\n  placeholder=\"请输入用户名\"\n  tooltip=\"用户名说明\"\n  allowClear\n  ref=\"handleRef\"\n/>\n```\n\n```js\n#if ALIPAY\nimport { Form } from 'antd-mini/es/Form/form';\n#endif\n#if WECHAT\nimport { Form } from 'antd-mini/Form/form';\n#endif\n\nPage({\n  handleRef(ref) {\n#if ALIPAY\n    this.form.addItem(ref);\n#endif\n#if WECHAT\n    if (!this.formRefList) {\n      this.formRefList = [];\n    }\n    this.formRefList.push(ref.detail);\n#endif\n  },\n});\n```\n\n## 代码示例\n\n### 基本使用\n\n<code src='../../demo/pages/Form/FormBasic/index'></code>\n\n### 布局\n\n<code src='../../demo/pages/Form/FormLayout/index'></code>\n\n### 初始值\n\n<code src='../../demo/pages/Form/FormInitialValues/index'></code>\n\n### 初始值异步加载\n\n<code src='../../demo/pages/Form/FormInitialValuesAsync/index'></code>\n\n### 表单侦听\n\n<code src='../../demo/pages/Form/FormWatch/index'></code>\n\n### 校验\n\n<code src='../../demo/pages/Form/FormRules/index'></code>\n\n### 增加删除表单项\n\n<code src='../../demo/pages/Form/FormDynamic/index'></code>\n\n### 表单项联动\n\n<code src='../../demo/pages/Form/FormDependency/index'></code>\n\n### 自定义表单项校验\n\n<code src='../../demo/pages/Form/FormValidate/index'></code>\n\n### 自定义表单校验消息\n\n<code src='../../demo/pages/Form/FormValidateMessages/index'></code>\n\n### 多个表单\n\n<code src='../../demo/pages/Form/FormMultiple/index'></code>\n\n### 表单项只读\n\n<code src='../../demo/pages/Form/FormReadonly/index'></code>\n\n### 图片校验\n\n<code src='../../demo/pages/Form/FormImageUploadRules/index'></code>\n\n### JSON 生成表单\n\n<code src='../../demo/pages/Form/FormJSON/index'></code>\n\n### 自定义错误样式\n\n使用 `validateStatus: success` 及 `footer slot` 来自定义错误样式。\n\n<code src='../../demo/pages/Form/FormCustomError/index'></code>\n\n### 自定义表单项\n\n通过使用 [FormItem](#formitem)、[createForm](#createform) 可自定义表单项。示例里 `form-checklist`、`form-location` 为自定义表单项组件。\n\n<code src='../../demo/pages/Form/FormCustom/index'></code>\n\n### Demo 代码\n\n<code src='../../demo/pages/Form/index'></code>\n\n## API\n\n### FormItem\n\n所有 Form 组件都包括的属性\n| 属性 | 说明 | 类型 | 默认值 |\n| -----|-----|-----|-----|\n| dependencies | 设置依赖字段，查看[详细说明](#dependencies) | string[] | - |\n| footer | 底部 slot，接收 errors、status | slot | - |\n| name | 名称 | string | - |\n| label | 文本 | string | - |\n| labelWidth | 文本宽度 | string | - |\n| position | 布局，可选 `horizontal` `vertical` | string | horizontal |\n| validateStatus | 校验状态，如不设置，则会根据校验规则自动生成，可选 `default` `success` `error` `validating` | string | - |\n| help | 提示信息，如不设置，则会根据校验规则自动生成 | string | - |\n| header | 顶部 slot，接收 errors、status | slot | - |\n| tooltip | 表单项提示信息 | string\\|slot | - |\n| required | 必填样式设置。如不设置，则会根据校验规则自动生成 | boolean | false |\n| message | 校验错误信息。如不设置，则会根据校验规则自动生成 | string | false |\n| requiredMark | 必填选填的标记样式，可选 `asterisk` `text-required` `text-optional` | string | asterisk |\n\n### Form\n\n| 属性             | 说明           | 类型                                      |\n| ---------------- | -------------- | ----------------------------------------- |\n| rules            | 可选，校验规则 | 查看[rules](#rules)                       |\n| initialValues    | 可选，初始值   | Record<string, any>                       |\n| validateMessages | 可选，校验消息 | 查看[validateMessages](#validatemessages) |\n\n### Form 实例方法\n\n| 属性                     | 说明                                                                 | 类型                                                                                   |\n| ------------------------ | -------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |\n| addItem                  | 添加表单项                                                           | (formItem: Ref) => void                                                                |\n| updateRules              | 更新 form 的校验规则，每次都需要传入全量的 rules                     | (rules: Rules) => void, Rules 的类型可以查看[rules](#rules)                            |\n| getFieldValue            | 得到表单项的值                                                       | (name: string) => any                                                                  |\n| getFieldsValue           | 获取一组字段名对应的值。不传 nameList 则返回全部 fields 对           | (nameList?: string[]) => Record<string, any>                                           |\n| getFieldValidatorStatus  | 得到表单校验状态                                                     | (name: string) => [ValidatorStatus](#validatorstatus)                                  |\n| getFieldsValidatorStatus | 得到一组表单校验状态。不传 nameList 则返回全部 fields 对             | (nameList?: string[]) => Record<string, [ValidatorStatus](#validatorstatus)>           |\n| reset                    | 重置表单为初始值                                                     | () => void                                                                             |\n| isFieldTouched           | 判断表单项是否被修改过                                               | () => boolean                                                                          |\n| onValueChange            | 侦听指定表单项的值修改，查看[详细说明](#onvaluechangeonvalueschange) | (name: string, (changedValue: any, allValues: Record<string, any>) => void) => void    |\n| onValuesChange           | 侦听表单项的值修改，查看[详细说明](#onvaluechangeonvalueschange)     | ((changedValues: Record<string, any>, allValues: Record<string, any>) => void) => void |\n| setFieldValue            | 设置表单项的值                                                       | (name: string, value: any) => void;                                                    |\n| setFieldsValue           | 设置表单项的值                                                       | (values: Record<string, any>) => void;                                                 |\n| setFieldValidatorStatus  | 设置表单校验状态                                                     | (name: string, validatorStatus: [ValidatorStatus](#validatorstatus)) => void           |\n| setFieldsValidatorStatus | 设置一组表单校验状态                                                 | (fieldsValidatorStatus: Record<string, [ValidatorStatus](#validatorstatus)>) => void   |\n| setInitialValues         | 设置表单初始值                                                       | (initialValues: Record<string, any>) => void                                           |\n| submit                   | 提交表单，返回 promise 表单值，校验错误会抛出                        | () => Promise<Record<string, any>>                                                     |\n\n### dependencies\n\n当字段间存在依赖关系时使用。例如注册用户表单的“密码”与“确认密码”字段，其中“确认密码”校验依赖于“密码”字段。设置 `dependencies` 后，“密码”字段更新将自动触发“确认密码”的校验。\n\n### rules\n\n示例：\n\n```javascript\n{\n  account: [\n    {\n      required: true,\n      message: '需要输入用户名'\n    },\n  ],\n  password: [\n    {\n      required: true,\n    },\n  ],\n  confirm: [\n    {\n      required: true,\n      message: '需要输入确认密码'\n    },\n    (form) => ({\n      async validator(_, value) {\n        if (!value || form.getFieldValue('password') === value) {\n          return;\n        }\n        throw new Error('两次密码需一致');\n      },\n    }),\n  ]\n}\n```\n\n`rules` 可以在 `new Form` 中设置，也可以在 `FormItem` 通过 `required` 或 `message` 属性设置。\n\n```html\n<form-input\n  label=\"用户名\"\n  name=\"account\"\n  required\n  message=\"请输入用户名\"\n  ref=\"handleRef\"\n></form-input>\n```\n\n### validateMessages\n\n可以参考 [Asynchronous validator](https://github.com/yiminghe/async-validator/blob/master/src/messages.ts#L4-L55) 的 message，antd-mini 在此基础上加了 `${label}`,`${len}`,`${min}`,`${max}`,`${pattern}`。\n\n示例：\n\n```javascript\n{\n  required: '需要输入${label}',\n  string: {\n    min: '${label}最少${min}个字符',\n  },\n  pattern: {\n    mismatch: '${label}需要满足${pattern}模式',\n  },\n}\n```\n\n### onValueChange 和 onValuesChange\n\n`setFieldValue` 和 `setFieldsValue` 不会触发 `onValueChange` 和 `onValuesChange`。`onValueChange` 和 `onValuesChange` 只有在用户操作时才会被触发。如果在 `setFieldValue` 或 `setFieldsValue` 之后想要触发 `onValueChange` 或 `onValuesChange`，你需要手动调用这些方法。\n\n**示例**：\n\n```js\nconst onValuesChangeCallback = (changedValues) => {\n  console.log(changedValues);\n};\nthis.form.onValuesChange(onValuesChangeCallback);\nthis.form.setFieldValue(name, value);\nonValuesChangeCallback({\n  [name]: value,\n});\n```\n\n### ValidatorStatus\n\n```js\ntype ValidatorStatus = {\n  status: 'default' | 'success' | 'error' | 'validating',\n  errors: string[],\n};\n```\n\n### submit 校验和抛出错误\n\n```js\n{\n  values: Record<string, any>,\n  errorFields: {\n    name: string;\n    errors: string[];\n  }[]\n}\n```\n\n### FormInput\n\n与 `Input` 相同。\n\n### FormTextarea\n\n与 `Textarea` 相同。\n\n### FormSwitch\n\n与 `Switch` 相同。\n\n### FormStepper\n\n与 `Stepper` 相同，但添加了如下属性：\n\n| 属性             | 说明                              | 类型   | 默认值 |\n| ---------------- | --------------------------------- | ------ | ------ |\n| stepperClassName | 对应 `Stepper` 组件的 `className` | string | -      |\n| stepperStyle     | 对应 `Stepper` 组件的 `style`     | string | -      |\n\n### FormCheckGroup\n\n与 `CheckGroup` 相同，但添加了如下属性：\n\n| 属性             | 说明                                | 类型   | 默认值 |\n| ---------------- | ----------------------------------- | ------ | ------ |\n| checkboxLabel    | 对应 `CheckGroup` 组件的 `label`    | slot   | -      |\n| checkboxPosition | 对应 `CheckGroup` 组件的 `position` | string | -      |\n\n### FormRadioGroup\n\n与 `RadioGroup` 相同，但添加了如下属性：\n\n| 属性          | 说明                                | 类型   | 默认值 |\n| ------------- | ----------------------------------- | ------ | ------ |\n| radioLabel    | 对应 `RadioGroup` 组件的 `label`    | slot   | -      |\n| radioPosition | 对应 `RadioGroup` 组件的 `position` | string | -      |\n\n### FormPicker\n\n与 `Picker` 相同，但添加了如下属性：\n\n| 属性  | 说明                                                     | 类型              | 默认值 |\n| ----- | -------------------------------------------------------- | ----------------- | ------ |\n| arrow | 右侧箭头，可选 `right`、`up`、`down`，传 true 为 `right` | string \\| boolean | -      |\n\n### FormDatePicker\n\n与 `DatePicker` 相同，但添加了如下属性：\n\n| 属性  | 说明                                                     | 类型              | 默认值 |\n| ----- | -------------------------------------------------------- | ----------------- | ------ |\n| arrow | 右侧箭头，可选 `right`、`up`、`down`，传 true 为 `right` | string \\| boolean | -      |\n\n### FormRangePicker\n\n与 `RangePicker` 相同，但添加了如下属性：\n\n| 属性  | 说明                                                     | 类型              | 默认值 |\n| ----- | -------------------------------------------------------- | ----------------- | ------ |\n| arrow | 右侧箭头，可选 `right`、`up`、`down`，传 true 为 `right` | string \\| boolean | -      |\n\n### FormCascaderPicker\n\n与 `CascaderPicker` 相同，但添加了如下属性：\n\n| 属性  | 说明                                                     | 类型              | 默认值 |\n| ----- | -------------------------------------------------------- | ----------------- | ------ |\n| arrow | 右侧箭头，可选 `right`、`up`、`down`，传 true 为 `right` | string \\| boolean | -      |\n\n### FormSlider\n\n与 `Slider` 相同。\n\n### FormSelector\n\n与 `Selector` 相同。\n\n### FormImageUpload\n\n与 `ImageUpload` 相同。\n\n### createForm\n\n`createForm` 是一个 `mixin`，用于自定义表单项。\n\n```js\nimport { createForm } from 'antd-mini/es/Form/form';\n\nComponent({\n  mixins: [createForm()],\n  methods: {\n    onChange(value) {\n      this.emit('onChange', value);\n    },\n  },\n});\n```\n\n`createForm` 会为组件增加以下内容：\n\n- `data`\n\n```js\n{\n  formData: {\n    value: undefined, // 表单项的值\n    status: 'default', // 表单项的校验状态，包括 `default`、`success`、`error`、`validating`\n    errors: [], // 错误信息\n  },\n}\n```\n\n- `methods`\n\n```js\n// 修改表单项时，需调用 `emit` 方法。自定义表单项组件在值改变时，应该调用此方法。\nfunction emit(trigger: 'onChange' | 'onBlur' | 'onFocus', value: any): void;\n```\n\n想要了解更多方法，请参考 `createForm` 方法相关文档。使用 `formData` 和 `emit` 即可完成自定义表单项的实现。\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                | 默认值                                                                                            | 深色模式默认值                                                                                    | 备注             |\n| --------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------- |\n| --form-text-color     | <div style=\"width: 150px; height: 30px; background-color: #cccccc; color: #333333;\">#cccccc</div> | <div style=\"width: 150px; height: 30px; background-color: #474747; color: #ffffff;\">#474747</div> | 表单文本颜色     |\n| --form-item-color     | <div style=\"width: 150px; height: 30px; background-color: #666666; color: #ffffff;\">#666666</div> | <div style=\"width: 150px; height: 30px; background-color: #808080; color: #ffffff;\">#808080</div> | 表单项颜色       |\n| --form-item-bg        | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #fff;\">#1a1a1a</div>    | 表单项背景颜色   |\n| --form-error-color    | <div style=\"width: 150px; height: 30px; background-color: #ff3141; color: #ffffff;\">#ff3141</div> | <div style=\"width: 150px; height: 30px; background-color: #ff4a58; color: #ffffff;\">#ff4a58</div> | 表单错误颜色     |\n| --form-extra-color    | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | 表单额外信息颜色 |\n| --form-asterisk-color | <div style=\"width: 150px; height: 30px; background-color: #ff3b30; color: #ffffff;\">#ff3b30</div> | <div style=\"width: 150px; height: 30px; background-color: #ff3b30; color: #ffffff;\">#ff3b30</div> | 表单星号颜色     |\n"
  },
  {
    "path": "src/Form/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n// 字体颜色\n@form-text-color: var(--form-text-color, @COLOR_TEXT_WEAK);\n\n@form-item-color: var(--form-item-color, @COLOR_TEXT_SECONDARY);\n\n@form-item-bg: var(--form-item-bg, @COLOR_CARD);\n\n@form-error-color: var(--color-red, @COLOR_RED);\n\n@form-extra-color: var(--form-extra-color, @COLOR_TEXT_ASSIST);\n\n@form-asterisk-color: var(--form-asterisk-color, @COLOR_TEXT_WARNING);\n"
  },
  {
    "path": "src/Grid/index.axml",
    "content": "<import-sjs\n  from=\"./index.sjs\"\n  name=\"sjs\" />\n\n<view\n  a:if=\"{{ mode === 'default' }}\"\n  class=\"ant-grid ant-grid-columns-{{ columns }} ant-grid-{{ mode }} {{ className || '' }}\"\n  style=\"{{ style || '' }}\">\n  <block\n    a:for=\"{{ items }}\"\n    a:for-index=\"index\"\n    a:for-item=\"item\"\n    a:key=\"title\">\n    <view\n      data-item=\"{{ item }}\"\n      class=\"ant-grid-item ant-grid-item-{{ gridItemLayout }} {{ sjs.checkNeedVerticalSpace(items.length, index, columns) ? 'ant-grid-item-vertical-' : '' }} ant-grid-item-columns-{{ columns }} {{ sjs.checkShowSplitLine(index, items.length, columns, mode, showDivider) ? 'ant-grid-item-line' : '' }}\"\n      catchTap=\"onTap\"\n      onFirstAppear=\"onFirstAppear\">\n      <view\n        class=\"ant-grid-item-icon ant-grid-item-icon-{{ item.iconStyle || iconStyle }}\">\n        <!-- #if ALIPAY -->\n        <slot\n          name=\"icon\"\n          value=\"{{ item }}\"\n          index=\"{{ index }}\">\n        <!-- #endif -->\n          <image-icon\n            image=\"{{ item.icon }}\"\n            className=\"ant-grid-item-icon\"\n            style=\"{{ iconSize ? 'width:' + iconSize + 'px;height:' + iconSize + 'px;font-size:' + iconSize + 'px' : '' }}\" />\n        <!-- #if ALIPAY -->\n        </slot>\n        <!-- #endif -->\n      </view>\n      <view class=\"ant-grid-item-info\">\n        <view class=\"ant-grid-item-title\">\n          <!-- #if ALIPAY -->\n          <slot\n            name=\"title\"\n            value=\"{{ item }}\"\n            index=\"{{ index }}\">\n          <!-- #endif -->\n            {{ item.title }}\n          <!-- #if ALIPAY -->\n          </slot>\n          <!-- #endif -->\n        </view>\n        <view class=\"ant-grid-item-description\">\n          <!-- #if ALIPAY -->\n          <slot\n            name=\"description\"\n            value=\"{{ item }}\"\n            index=\"{{ index }}\">\n          <!-- #endif -->\n            {{ item.description }}\n          <!-- #if ALIPAY -->\n          </slot>\n          <!-- #endif -->\n        </view>\n      </view>\n    </view>\n  </block>\n</view>\n<ant-pagination\n  a:elif=\"{{ mode === 'scroll' }}\"\n  fillColor=\"{{ paginationFillColor }}\"\n  frontColor=\"{{ paginationFrontColor }}\"\n  className=\"{{ className || '' }}\"\n  style=\"{{ style || '' }}\">\n  <view class=\"ant-grid ant-grid-{{ mode }}\">\n    <block\n      a:for=\"{{ items }}\"\n      a:for-index=\"index\"\n      a:for-item=\"item\"\n      a:key=\"title\">\n      <view\n        data-item=\"{{ item }}\"\n        class=\"ant-grid-item ant-grid-item-{{ gridItemLayout }} ant-grid-item-columns-scroll {{ sjs.checkShowSplitLine(index, items.length, columns, mode, showDivider) ? 'ant-grid-item-line' : '' }}\"\n        catchTap=\"onTap\"\n        onFirstAppear=\"onFirstAppear\">\n        <view\n          class=\"ant-grid-item-icon ant-grid-item-icon-{{ item.iconStyle || iconStyle }}\">\n          <!-- #if ALIPAY -->\n          <slot\n            name=\"icon\"\n            value=\"{{ item }}\"\n            index=\"{{ index }}\">\n          <!-- #endif -->\n            <image-icon\n              image=\"{{ item.icon }}\"\n              className=\"ant-grid-item-icon\"\n              style=\"{{ iconSize ? 'width:' + iconSize + 'px;height:' + iconSize + 'px;font-size:' + iconSize + 'px' : '' }}\" />\n          <!-- #if ALIPAY -->\n          </slot>\n          <!-- #endif -->\n        </view>\n        <view class=\"ant-grid-item-info\">\n          <view class=\"ant-grid-item-title\">\n            <!-- #if ALIPAY -->\n            <slot\n              name=\"title\"\n              value=\"{{ item }}\"\n              index=\"{{ index }}\">\n            <!-- #endif -->\n              {{ item.title }}\n            <!-- #if ALIPAY -->\n            </slot>\n            <!-- #endif -->\n          </view>\n          <view class=\"ant-grid-item-description\">\n            <!-- #if ALIPAY -->\n            <slot\n              name=\"description\"\n              value=\"{{ item }}\"\n              index=\"{{ index }}\">\n            <!-- #endif -->\n              {{ item.description }}\n            <!-- #if ALIPAY -->\n            </slot>\n            <!-- #endif -->\n          </view>\n        </view>\n      </view>\n    </block>\n  </view>\n</ant-pagination>\n"
  },
  {
    "path": "src/Grid/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Layout\n  order: 1\ntoc: 'content'\n---\n\n# Grid\n\nThe palace is used for navigation of multiple sub-functions in the business and has a higher screen effect than the form of a list.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-grid\": \"antd-mini/es/Grid/index\"\n#endif\n#if WECHAT\n  \"ant-grid\": \"antd-mini/Grid/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<ant-grid\n  items=\"{{items}}\"\n  iconSize=\"{{36}}\"\n  columns=\"{{3}}\"\n/>\n```\n\n```js\nPage({\n  data: {\n    items: [\n      {\n        title: 'title text',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*L8FjQ7lSdq4AAAAAAAAAAAAAARQnAQ',\n      },\n      {\n        title: 'title text',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*L8FjQ7lSdq4AAAAAAAAAAAAAARQnAQ',\n      },\n      {\n        title: 'title text',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*L8FjQ7lSdq4AAAAAAAAAAAAAARQnAQ',\n      },\n    ],\n  },\n});\n```\n\n### 3 Columns-With Description\n\n```xml\n<ant-grid\n  items=\"{{items3withDesc}}\"\n  iconSize=\"{{36}}\"\n  columns=\"{{3}}\" />\n```\n\n```js\nPage({\n  data: {\n    items: [\n      {\n        title: 'title text',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*L8FjQ7lSdq4AAAAAAAAAAAAAARQnAQ',\n        description: 'description',\n      },\n      {\n        title: 'title text',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*L8FjQ7lSdq4AAAAAAAAAAAAAARQnAQ',\n        description: 'description',\n      },\n      {\n        title: 'title text',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*L8FjQ7lSdq4AAAAAAAAAAAAAARQnAQ',\n        description: 'description',\n      },\n    ],\n  },\n});\n```\n\n### element horizontal layout\n\n```xml\n<ant-grid\n  items=\"{{items}}\"\n  columns=\"{{3}}\"\n  gridItemLayout=\"horizontal\"\n/>\n```\n\n### Custom\n\n```xml\n#if ALIPAY\n<ant-grid\n  items=\"{{items}}\"\n  columns=\"{{5}}\">\n  <view\n    slot=\"icon\"\n    slot-scope=\"props\">\n    <ant-badge\n      a:if=\"{{props.value.tag}}\"\n      offsetX=\"-10px\"\n      type=\"text\"\n      text=\"{{props.value.tag}}\">\n      <image\n        src=\"{{props.value.icon}}\"\n        style=\"width: 44px; height: 44px\" />\n    </ant-badge>\n    <image\n      a:else\n      src=\"{{props.value.icon}}\"\n      style=\"width: 44px; height: 44px\" />\n  </view>\n  <view\n    slot=\"title\"\n    slot-scope=\"props\">\n    Item {{props.index 1}}\n  </view>\n  <view\n    slot=\"description\"\n    slot-scope=\"props\">\n    Description {{props.index 1}}\n  </view>\n</ant-grid>\n\n#endif\n#if WECHAT\n由于微信小程序平台的限制, Grid In微信暂时不支持 Slot\n#endif\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Grid/index'></code>\n\n## API\n\n| Property                        | Description                                                   | Type                                  | Default Value     |\n| --------------------------- | ------------------------------------------------------ | ------------------------------------- | ---------- |\n| className                   | Class Name                                                   | string                                | -          |\n| columns                     | The number of elements displayed per row,`default` Mode effective                 | number                                | 5          |\n| description                 | Description slot, receiving value, index                            | slot                                  | -          |\n| gridItemLayout              | item layout, optional `vertical`(Vertical)`horizontal`(Horizontal) | string                                | `vertical` |\n| icon                        | Icon slot, receiving value, index                            | slot                                  | -          |\n| iconSize                    | Icon size in px                                      | number                                | -          |\n| iconStyle                   | Icon style type, optional `normal` `circle`                   | string                                | `normal`   |\n| items                       | Content Text                                               | [GridItem](#griditem)[]               | -          |\n| mode                        | Style type, optional `default`(Tile)`scroll`(Sliding)       | string                                | `default`  |\n| paginationFillColor         | Page break background color,`scroll` Mode effective                        | string                                | -          |\n| paginationFrontColor        | Page break color,`scroll` Mode effective                          | string                                | -          |\n| showDivider                 | Show split line                                         | boolean                               | -          |\n| style                       | Style                                                   | string                                | -          |\n| title                       | Header slot, receiving value, index                            | slot                                  | -          |\n| #if ALIPAY onTap            | Click on each element to trigger                                       | (item: [GridItem](#griditem)) => void |            |\n| #if ALIPAY onFirstAppear    | Triggered when the first visible area of the current element reaches 50%                    | (item: [GridItem](#griditem)) => void |            |\n| #if WECHAT bindtap         | Click on each element to trigger                                       | (item: [GridItem](#griditem)) => void | -          |\n| #if WECHAT bindfirstappear | Triggered when the first visible area of the current element reaches 50%                    | (item: [GridItem](#griditem)) => void | -          |\n\n#### GridItem\n\n| Parameters        | Description                                                  | Type   | Default Value |\n| ----------- | ----------------------------------------------------- | ------ | ------ |\n| description | Description                                                  | string | -      |\n| icon        | icons, support images and [Icon](./Icon)                       | string | -      |\n| iconStyle   | Icon style type, with priority higher than grid, optional `normal` `circle` | string | -      |\n| title       | Title                                                  | string | -      |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                       | Default Value                                                                                            | Dark Mode Default                                                                                    | Remarks         |\n| ---------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------ |\n| --ant-grid-title-color       | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | Grid Title Color |\n| --ant-grid-description-color | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | Grid Description Color |\n| --ant-grid-border-color      | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #333333;\">#eeeeee</div> | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #ffffff;\">#2b2b2b</div> | Grid Border Color |\n"
  },
  {
    "path": "src/Grid/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"image-icon\": \"../ImageIcon/index\",\n    \"ant-pagination\": \"../Pagination/index\"\n  }\n}\n"
  },
  {
    "path": "src/Grid/index.less",
    "content": "@import (reference) './variable.less';\n\n.@{gridPrefix} {\n  padding: 24 * @rpx;\n  box-sizing: border-box;\n  row-gap: 24 * @rpx;\n  &-columns-3 {\n    padding: 24 * @rpx 0;\n  }\n  &-default {\n    display: flex;\n    flex-wrap: wrap;\n    justify-content: flex-start;\n  }\n  &-scroll {\n    display: flex;\n    flex-wrap: nowrap;\n    align-items: flex-start;\n  }\n  &-item {\n    box-sizing: border-box;\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    text-align: center;\n    flex-shrink: 0;\n    position: relative;\n    &-line {\n      .hairline('right',@border-color);\n    }\n    &-vertical-space {\n      margin-bottom: @vertical-space;\n    }\n    &-columns-5 {\n      width: 20%;\n    }\n    &-columns-4 {\n      width: 25%;\n    }\n    &-columns-3 {\n      width: 33.3%;\n    }\n    &-columns-2 {\n      width: 50%;\n    }\n    &-horizontal {\n      justify-content: center;\n      text-align: left;\n      position: relative;\n      min-height: @icon-size;\n      display: flex;\n      justify-content: flex-start;\n      align-items: center;\n      flex-direction: row;\n      .@{gridPrefix}-item-info {\n        padding-left: 16 * @rpx;\n        display: flex;\n        justify-content: center;\n        align-items: flex-start;\n        flex-direction: column;\n      }\n      .@{gridPrefix}-item-img,\n      .@{gridPrefix}-item-icon {\n        display: flex;\n        justify-content: center;\n        align-items: center;\n      }\n      .@{gridPrefix}-item-title {\n        margin-top: 0;\n      }\n    }\n    &-vertical {\n      .@{gridPrefix}-item-description {\n        padding-top: 4 * @rpx;\n      }\n    }\n    &-columns-scroll {\n      width: @columnsscroll-width;\n    }\n    &-icon {\n      &-circle {\n        border-radius: 50%;\n        overflow: hidden;\n      }\n      &-icon {\n        font-size: @icon-size;\n      }\n      &-image {\n        width: @icon-size;\n        height: @icon-size;\n      }\n    }\n    &-title {\n      font-size: 30 * @rpx;\n      color: @title-color;\n      line-height: 42 * @rpx;\n      width: 100%;\n      margin-top: 16 * @rpx;\n      white-space: nowrap;\n      overflow: hidden;\n      text-overflow: ellipsis;\n    }\n    &-description {\n      font-size: @description-size;\n      color: @description-color;\n      line-height: 33 * @rpx;\n      width: 100%;\n      padding-top: 4 * @rpx;\n      white-space: nowrap;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      &:empty {\n        display: none;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/Grid/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 布局\n  order: 1\ntoc: 'content'\n---\n\n# Grid 宫格\n\n宫格用于业务中多个子功能的导航，相比于列表的形式，具有更高的屏效。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-grid\": \"antd-mini/es/Grid/index\"\n#endif\n#if WECHAT\n  \"ant-grid\": \"antd-mini/Grid/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-grid\n  items=\"{{items}}\"\n  iconSize=\"{{36}}\"\n  columns=\"{{3}}\"\n/>\n```\n\n```js\nPage({\n  data: {\n    items: [\n      {\n        title: 'title text',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*L8FjQ7lSdq4AAAAAAAAAAAAAARQnAQ',\n      },\n      {\n        title: 'title text',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*L8FjQ7lSdq4AAAAAAAAAAAAAARQnAQ',\n      },\n      {\n        title: 'title text',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*L8FjQ7lSdq4AAAAAAAAAAAAAARQnAQ',\n      },\n    ],\n  },\n});\n```\n\n### 3 列-带描述\n\n```xml\n<ant-grid\n  items=\"{{items3withDesc}}\"\n  iconSize=\"{{36}}\"\n  columns=\"{{3}}\" />\n```\n\n```js\nPage({\n  data: {\n    items: [\n      {\n        title: 'title text',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*L8FjQ7lSdq4AAAAAAAAAAAAAARQnAQ',\n        description: 'description',\n      },\n      {\n        title: 'title text',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*L8FjQ7lSdq4AAAAAAAAAAAAAARQnAQ',\n        description: 'description',\n      },\n      {\n        title: 'title text',\n        icon: 'https://gw.alipayobjects.com/mdn/rms_3a7189/afts/img/A*L8FjQ7lSdq4AAAAAAAAAAAAAARQnAQ',\n        description: 'description',\n      },\n    ],\n  },\n});\n```\n\n### 元素横向布局\n\n```xml\n<ant-grid\n  items=\"{{items}}\"\n  columns=\"{{3}}\"\n  gridItemLayout=\"horizontal\"\n/>\n```\n\n### 自定义\n\n```xml\n#if ALIPAY\n<ant-grid\n  items=\"{{items}}\"\n  columns=\"{{5}}\">\n  <view\n    slot=\"icon\"\n    slot-scope=\"props\">\n    <ant-badge\n      a:if=\"{{props.value.tag}}\"\n      offsetX=\"-10px\"\n      type=\"text\"\n      text=\"{{props.value.tag}}\">\n      <image\n        src=\"{{props.value.icon}}\"\n        style=\"width: 44px; height: 44px\" />\n    </ant-badge>\n    <image\n      a:else\n      src=\"{{props.value.icon}}\"\n      style=\"width: 44px; height: 44px\" />\n  </view>\n  <view\n    slot=\"title\"\n    slot-scope=\"props\">\n    第{{props.index + 1}}项\n  </view>\n  <view\n    slot=\"description\"\n    slot-scope=\"props\">\n    描述{{props.index + 1}}\n  </view>\n</ant-grid>\n\n#endif\n#if WECHAT\n由于微信小程序平台的限制, Grid 在微信暂时不支持 Slot\n#endif\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Grid/index'></code>\n\n## API\n\n| 属性                        | 说明                                                   | 类型                                  | 默认值     |\n| --------------------------- | ------------------------------------------------------ | ------------------------------------- | ---------- |\n| className                   | 类名                                                   | string                                | -          |\n| columns                     | 每行展示的元素个数，`default` 模式生效                 | number                                | 5          |\n| description                 | 描述插槽，接收 value、index                            | slot                                  | -          |\n| gridItemLayout              | item 布局，可选 `vertical`（垂直）`horizontal`（水平） | string                                | `vertical` |\n| icon                        | 图标插槽，接收 value、index                            | slot                                  | -          |\n| iconSize                    | 图标尺寸，单位 px                                      | number                                | -          |\n| iconStyle                   | 图标样式类型，可选 `normal` `circle`                   | string                                | `normal`   |\n| items                       | 内容文字                                               | [GridItem](#griditem)[]               | -          |\n| mode                        | 样式类型，可选 `default`（平铺）`scroll`（滑动）       | string                                | `default`  |\n| paginationFillColor         | 分页符背景色，`scroll` 模式生效                        | string                                | -          |\n| paginationFrontColor        | 分页符颜色，`scroll` 模式生效                          | string                                | -          |\n| showDivider                 | 是否展示分割线                                         | boolean                               | -          |\n| style                       | 样式                                                   | string                                | -          |\n| title                       | 标题插槽，接收 value、index                            | slot                                  | -          |\n| #if ALIPAY onTap            | 点击每个元素触发                                       | (item: [GridItem](#griditem)) => void |            |\n| #if ALIPAY onFirstAppear    | 当前元素首次可见面积达到 50% 时触发                    | (item: [GridItem](#griditem)) => void |            |\n| #if WECHAT bindtap         | 点击每个元素触发                                       | (item: [GridItem](#griditem)) => void | -          |\n| #if WECHAT bindfirstappear | 当前元素首次可见面积达到 50% 时触发                    | (item: [GridItem](#griditem)) => void | -          |\n\n#### GridItem\n\n| 参数        | 说明                                                  | 类型   | 默认值 |\n| ----------- | ----------------------------------------------------- | ------ | ------ |\n| description | 描述                                                  | string | -      |\n| icon        | 图标，支持图片和 [Icon](./Icon)                       | string | -      |\n| iconStyle   | 图标样式类型，优先级高于 grid，可选 `normal` `circle` | string | -      |\n| title       | 标题                                                  | string | -      |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                       | 默认值                                                                                            | 深色模式默认值                                                                                    | 备注         |\n| ---------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------ |\n| --ant-grid-title-color       | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | 网格标题颜色 |\n| --ant-grid-description-color | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | 网格描述颜色 |\n| --ant-grid-border-color      | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #333333;\">#eeeeee</div> | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #ffffff;\">#2b2b2b</div> | 网格边框颜色 |\n"
  },
  {
    "path": "src/Grid/index.sjs.ts",
    "content": "function checkNeedVerticalSpace(count, index, columns) {\n  if (count % columns === 0) {\n    return index < count - columns;\n  } else {\n    return index < columns * Math.floor(count / columns);\n  }\n}\nfunction checkShowSplitLine(index, count, columns, mode, showDivider) {\n  if (!showDivider) {\n    return false;\n  }\n  if (index === count - 1) {\n    return false;\n  }\n  if (mode === 'default') {\n    if ((index + 1) % columns === 0) {\n      return false;\n    }\n  }\n  return true;\n}\nexport default {\n  checkNeedVerticalSpace,\n  checkShowSplitLine,\n};\n"
  },
  {
    "path": "src/Grid/index.ts",
    "content": "import { Component, IPlatformEvent, triggerEvent } from '../_util/simply';\nimport { GridFunctionalProps } from './props';\n\nComponent({\n  props: GridFunctionalProps,\n  methods: {\n    onTap(e: IPlatformEvent) {\n      const { item } = e.currentTarget.dataset;\n      triggerEvent(this, 'tap', item);\n    },\n    onFirstAppear(e: IPlatformEvent) {\n      const { item } = e.currentTarget.dataset;\n      triggerEvent(this, 'firstAppear', item);\n    },\n  },\n});\n"
  },
  {
    "path": "src/Grid/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\nexport interface IGridItem {\n  /**\n   * @description 主文案\n   */\n  title: string;\n  /**\n   * @description 副文案\n   */\n  description?: string;\n  /**\n   * @description 图标\n   */\n  icon: string;\n  /**\n   * @desscription 图标样式\n   * @default 'normal'\n   */\n  iconStyle: 'normal' | 'circle';\n}\n/**\n * @description 宫格\n */\nexport interface IGridProps extends IBaseProps {\n  /**\n   * @desscription 图标样式\n   * @default 'normal'\n   */\n  iconStyle: 'normal' | 'circle';\n  /**\n   * @description 图标尺寸，单位px\n   */\n  iconSize: number;\n  /**\n   * @description item布局。垂直/水平，水平仅columns=2生效\n   * @default 'vertical'\n   */\n  gridItemLayout: 'vertical' | 'horizontal';\n  /**\n   * @description 组合形式\n   * @default 'default'\n   */\n  mode: 'default' | 'scroll';\n  /**\n   * @description 每行展示的元素个数\n   * @default 5\n   */\n  columns: number;\n  /**\n   * @description 元素列表\n   */\n  items: IGridItem[];\n  /**\n   * @description 是否展示分割线\n   */\n  showDivider: boolean;\n  /**\n   * @description 分页符背景色\n   * @default '#ddd'\n   */\n  paginationFillColor: string;\n  /**\n   * @description 分页符颜色\n   * @default '#1677ff'\n   */\n  paginationFrontColor: string;\n  /**\n   * @description 点击事件\n   * @param item\n   */\n  onTap?(item: IGridItem): void;\n  /**\n   * @description 当前元素首次可见面积达到50%时触发\n   * @param item\n   */\n  onFirstAppear?(item: IGridItem): void;\n}\n\nexport const GridDefaultProps: Partial<IGridProps> = {\n  iconStyle: 'normal',\n  mode: 'default',\n  columns: 5,\n  gridItemLayout: 'vertical',\n  showDivider: false,\n};\n\nexport const GridFunctionalProps: IGridProps = {\n  iconStyle: 'normal',\n  iconSize: null,\n  gridItemLayout: 'vertical',\n  mode: 'default',\n  columns: 5,\n  items: [],\n  showDivider: false,\n  paginationFrontColor: '',\n  paginationFillColor: '',\n};\n"
  },
  {
    "path": "src/Grid/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n@import (reference) '../style/mixins/hairline.less';\n\n@gridPrefix: ant-grid;\n\n@icon-size: 56 * @rpx;\n\n@title-color: var(--ant-grid-title-color, @COLOR_TEXT_PRIMARY);\n\n@description-size: 24 * @rpx;\n\n@description-color: var(--ant-grid-description-color, @COLOR_TEXT_ASSIST);\n\n@vertical-space: 40 * @rpx;\n\n@columnsscroll-width: 130 * @rpx;\n\n@border-color: var(--ant-grid-border-color, @COLOR_BORDER);\n"
  },
  {
    "path": "src/GuideTour/index.axml",
    "content": "<import-sjs from=\"./index.sjs\" name=\"utils\" />\n<import-sjs from=\"../_util/isPropsEmpty.sjs\" name=\"u\" />\n\n<view a:if=\"{{ visible }}\" class=\"ant-guide-tour {{ className || '' }}\" style=\"{{ style || '' }}\">\n  <ant-mask show className=\"{{ maskClassName }}\" style=\"z-index:9999;{{ maskStyle || '' }}\" />\n  <ant-icon type=\"CloseOutline\" className=\"ant-guide-tour-clear\" onTap=\"onCancel\" />\n  <view class=\"ant-guide-tour-button\">\n    <ant-button\n      a:if=\"{{ utils.checkShowJump(mixin.value, items) }}\"\n      inline\n      size=\"small\"\n      onTap=\"onCancel\"\n    >\n      <!-- #if ALIPAY -->\n      <ant-auto-resize text=\"{{ u.isPropsEmpty(jumpText) ? locale.guideTour.jumpText : jumpText}}\" ratio=\"{{ 4 }}\" minFontSize=\"20\" maxFontSize=\"30\">\n      <!-- #endif -->\n        {{ u.isPropsEmpty(jumpText) ? locale.guideTour.jumpText : jumpText}}\n      <!-- #if ALIPAY -->\n      </ant-auto-resize>\n      <!-- #endif -->\n    </ant-button>\n    <ant-button\n      a:if=\"{{ utils.checkShowPrev(mixin.value, items) }}\"\n      inline\n      size=\"small\"\n      onTap=\"onPrev\"\n      data-currentValue=\"{{ mixin.value }}\"\n    >\n      <!-- #if ALIPAY -->\n      <ant-auto-resize text=\"{{ u.isPropsEmpty(prevStepText) ? locale.guideTour.prevStepText : prevStepText}}\" ratio=\"{{ 4 }}\" minFontSize=\"20\" maxFontSize=\"30\">\n      <!-- #endif -->\n        {{ u.isPropsEmpty(prevStepText) ? locale.guideTour.prevStepText : prevStepText}}\n      <!-- #if ALIPAY -->\n      </ant-auto-resize>\n      <!-- #endif -->\n    </ant-button>\n    <ant-button\n      a:if=\"{{ utils.checkShowNext(mixin.value, items) }}\"\n      inline\n      size=\"small\"\n      onTap=\"onNext\"\n      data-currentValue=\"{{ mixin.value }}\"\n    >\n      <!-- #if ALIPAY -->\n      <ant-auto-resize text=\"{{ u.isPropsEmpty(nextStepText) ? locale.guideTour.nextStepText : nextStepText}}\" ratio=\"{{4}}\" minFontSize=\"20\" maxFontSize=\"30\">\n      <!-- #endif -->\n        {{ u.isPropsEmpty(nextStepText) ? locale.guideTour.nextStepText : nextStepText}}\n      <!-- #if ALIPAY -->\n      </ant-auto-resize>\n      <!-- #endif -->\n    </ant-button>\n    <ant-button\n      a:if=\"{{ utils.checkShowKnow(mixin.value, items) }}\"\n      inline\n      size=\"small\"\n      onTap=\"onCancel\"\n    >\n      <!-- #if ALIPAY -->\n      <ant-auto-resize text=\"{{ u.isPropsEmpty(gotItText) ? locale.guideTour.gotItText : gotItText}}\" ratio=\"{{ 4 }}\" minFontSize=\"20\" maxFontSize=\"30\">\n      <!-- #endif -->\n        {{ u.isPropsEmpty(gotItText) ? locale.guideTour.gotItText : gotItText}}\n      <!-- #if ALIPAY -->\n      </ant-auto-resize>\n      <!-- #endif -->\n    </ant-button>\n  </view>\n  <block a:if=\"{{ swiperable }}\">\n    <view class=\"ant-guide-tour-indicator\">\n      <block a:for=\"{{ items }}\" a:for-index=\"index\" a:for-item=\"item\" a:key=\"imageUrl\">\n        <view class=\"ant-guide-tour-indicator-dot {{ index === mixin.value ? 'ant-guide-tour-indicator-dot-active' : '' }}\" />\n      </block>\n    </view>\n    <swiper\n      class=\"ant-guide-tour-swiper\"\n      current=\"{{ mixin.value }}\"\n      adjust-height=\"none\"\n      style=\"height: 100vh\"\n      onChange=\"onSwiperChange\"\n    >\n      <block a:for=\"{{ items }}\" a:for-index=\"index\" a:for-item=\"item\" a:key=\"imageUrl\">\n        <swiper-item>\n          <view\n            class=\"ant-guide-tour-item {{ item.className || '' }}\"\n            style=\"top:{{ item.top }}px; left:{{ item.left }}px\"\n          >\n            <!-- #if WECHAT -->\n            <image\n              wx:if=\"{{ item.imageUrl }}\"\n              class=\"ant-guide-tour-item-img\"\n              src=\"{{ item.imageUrl }}\"\n              style=\"{{ item.imageStyle }}\"\n              mode=\"{{ item.imageMode }}\"\n            />\n            <slot wx:else name=\"step\" index=\"{{ mixin.current }}\" />\n            <!-- #endif -->\n            <!-- #if ALIPAY -->\n            <slot name=\"step\" index=\"{{ mixin.current }}\">\n              <image\n                a:if=\"{{ item.imageUrl }}\"\n                class=\"ant-guide-tour-item-img\"\n                src=\"{{ item.imageUrl }}\"\n                style=\"{{ item.imageStyle }}\"\n                mode=\"{{ item.imageMode }}\"\n              />\n            </slot>\n            <!-- #endif -->\n          </view>\n        </swiper-item>\n      </block>\n    </swiper>\n  </block>\n  <block a:else>\n    <block a:for=\"{{ items }}\" a:for-index=\"index\" a:for-item=\"item\" a:key=\"imageUrl\">\n      <view\n        a:if=\"{{ mixin.value === index }}\"\n        class=\"ant-guide-tour-item {{ item.className || '' }}\"\n        style=\"top:{{ item.top }}px; left:{{ item.left }}px\"\n      >\n        <!-- #if WECHAT -->\n        <image\n          wx:if=\"{{ item.imageUrl }}\"\n          class=\"ant-guide-tour-item-img\"\n          src=\"{{ item.imageUrl }}\"\n          style=\"{{ item.imageStyle }}\"\n          mode=\"{{ item.imageMode }}\"\n        />\n        <slot wx:else name=\"step\" index=\"{{ index }}\" />\n        <!-- #endif -->\n        <!-- #if ALIPAY -->\n        <slot name=\"step\" index=\"{{ index }}\">\n          <image\n            a:if=\"{{ item.imageUrl }}\"\n            class=\"ant-guide-tour-item-img\"\n            src=\"{{ item.imageUrl }}\"\n            style=\"{{ item.imageStyle }}\"\n            mode=\"{{ item.imageMode }}\"\n          />\n        </slot>\n        <!-- #endif -->\n      </view>\n    </block>\n  </block>\n</view>\n"
  },
  {
    "path": "src/GuideTour/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Navigation\n  order: 6\ntoc: 'content'\n---\n\n# GuideTour\n\n蒙层与自定义卡片的引导组件。适用于页面上关键功能的介绍。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-guide-tour\": \"antd-mini/es/GuideTour/index\"\n#endif\n#if WECHAT\n  \"ant-guide-tour\": \"antd-mini/GuideTour/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-guide-tour\n  items=\"{{items}}\"\n  visible=\"{{visible}}\"\n#if ALIPAY\n  onCancel=\"closeTour\"\n  onChange=\"onChange\"\n#endif\n#if WECHAT\n  bindcancel=\"closeTour\"\n  bindchange=\"onChange\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    visible: true,\n    items: [\n      { left: 20, top: 80, imageUrl: 'https://gw.alipayobjects.com/zos/antfincdn/IV3MGP1qL/bianzu%25252013.png', imageMode: 'widthFix' },\n      { left: 20, top: 160, imageUrl: 'https://gw.alipayobjects.com/zos/antfincdn/%26B6d3lBJn/bianzu%25252020.png' },\n      { left: 20, top: 220, imageUrl: 'https://gw.alipayobjects.com/zos/antfincdn/lwVOkCcwb/bianzu%25252021.png' },\n    ],\n  },\n  onChange(index) {\n#if ALIPAY\n    console.log('index', index);\n#endif\n  },\n  closeTour() {\n    this.setData({\n      visible: false,\n    });\n  },\n});\n```\n\n### 受控模式\n\n```xml\n\n<ant-guide-tour\n  items=\"{{items}}\"\n  current=\"{{current}}\"\n  visible=\"{{visible}}\"\n#if ALIPAY\n  onCancel=\"closeTour\"\n  onChange=\"onChangeControlled\"\n#endif\n#if WECHAT\n  bindcancel=\"closeTour\"\n  bindchange=\"onChangeControlled\"\n#endif\n/>\n\n```\n\n```js\nPage({\n  data: {\n    visible: false,\n    current: 0,\n    items: [\n      { left: 20, top: 80, imageUrl: 'https://gw.alipayobjects.com/zos/antfincdn/IV3MGP1qL/bianzu%25252013.png', imageMode: 'widthFix' },\n      { left: 20, top: 160, imageUrl: 'https://gw.alipayobjects.com/zos/antfincdn/%26B6d3lBJn/bianzu%25252020.png' },\n      { left: 20, top: 220, imageUrl: 'https://gw.alipayobjects.com/zos/antfincdn/lwVOkCcwb/bianzu%25252021.png' },\n    ],\n  },\n  onChangeControlled(value) {\n#if ALIPAY\n    this.setData({ current: value });\n#endif\n#if WECHAT\n    this.setData({ current: value.detail });\n#endif\n  },\n  closeTour() {\n    this.setData({\n      visible: false\n    });\n  },\n});\n\n\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/GuideTour/index'></code>\n\n## API\n\n| 属性                   | 说明             | 类型                                | 默认值   |\n| ---------------------- | ---------------- | ----------------------------------- | -------- |\n| className              | 类名             | `string`                            | -        |\n| current                | 当前步骤         | `number`                            | -        |\n| defaultCurrent         | 默认当前步骤     | `number`                            | 0        |\n| items                  | 步骤信息         | [`GuideTourItem`](#guidetourttem)[] | -        |\n| maskClassName          | 蒙层的类名       | `string`                            | -        |\n| maskStyle              | 蒙层的样式       | `string`                            | -        |\n| style                  | 样式             | `string`                            | -        |\n| swiperable             | 是否开启滑动模式 | `boolean`                           | `false`  |\n| visible                | 是否显示         | `boolean`                           | `false`  |\n| jumpText               | 跳过按钮的文案   | `string`                            | '跳过'   |\n| prevStepText           | 上一步按钮的文案 | `string`                            | '上一步' |\n| nextStepText           | 下一步按钮的文案 | `string`                            | '下一步' |\n| gotItText              | 知道了按钮的文案 | `string`                            | '知道了' |\n| #if ALIPAY onCancel    | 关闭回调         | `() => void`                        | -        |\n| #if ALIPAY onChange    | 步骤改变回调     | `(index: number) => void`           | -        |\n| #if WECHAT bindcancel | 关闭回调         | `() => void`                        | -        |\n| #if WECHAT bindchange | 步骤改变回调     | `(index: number) => void`           | -        |\n\n### GuideTourItem\n\n| 参数       | 说明                       | 类型     | 默认值 |\n| ---------- | -------------------------- | -------- | ------ |\n| left       | 距离左边距离，单位 `px`    | `number` | -      |\n| imageMode  | 图片模式，同 image 的 mode | `string` | -      |\n| imageStyle | 图片内联样式               | `string` | -      |\n| imageUrl   | 图片地址                   | `string` | -      |\n| top        | 距离顶部距离，单位 `px`    | `number` | -      |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                    | 默认值                                                                                            | 深色模式默认值                                                                                    | 备注                 |\n| ------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | -------------------- |\n| --guide-tour-text-color   | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | 引导教程文本颜色     |\n| --guide-tour-clear-color  | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | 引导教程清除按钮颜色 |\n| --guide-tour-dot-color    | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | 引导教程步骤点颜色   |\n| --guide-tour-border-color | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #333333;\">#eeeeee</div> | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #ffffff;\">#2b2b2b</div> | 引导教程边框颜色     |\n| --guide-tour-btn-color    | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | 引导教程按钮颜色     |\n"
  },
  {
    "path": "src/GuideTour/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-mask\": \"../Mask/index\",\n    \"ant-button\": \"../Button/index\",\n    \"ant-icon\": \"../Icon/index\",\n    \"ant-auto-resize\": \"../AutoResize/index\"\n  }\n}\n"
  },
  {
    "path": "src/GuideTour/index.less",
    "content": "@import (reference) './variable.less';\n\n.@{guideTourPrefix} {\n  &-button {\n    width: 100%;\n    position: fixed;\n    left: 0;\n    bottom: @guide-tour-button-bottom;\n    z-index: @guide-tour-z-index-3;\n    display: flex;\n    justify-content: center;\n    .ant-button:nth-of-type(1) {\n      color: @guide-tour-text-color;\n      background-color: transparent;\n      box-shadow: inset 0 0 0 @border-width-standard @guide-tour-border-color;\n    }\n    .ant-button:nth-of-type(2) {\n      color: @guide-tour-btn-color;\n      background-color: @guide-tour-text-color;\n      box-shadow: none;\n    }\n    .ant-button {\n      margin: 0 12 * @rpx;\n      width: 152 * @rpx;\n    }\n  }\n\n  &-indicator {\n    width: 100%;\n    position: absolute;\n    bottom: @guide-tour-dot-bottom;\n    left: 50%;\n    transform: translateX(-50%);\n    z-index: @guide-tour-z-index-2;\n    display: flex;\n    justify-content: center;\n    &-dot {\n      margin: 0 3 * @rpx;\n      background-color: @guide-tour-dot-color;\n      width: @guide-tour-dot-size;\n      height: @guide-tour-dot-size;\n      border-radius: @guide-tour-dot-border-radius;\n      &-active {\n        width: @guide-tour-dot-active-width;\n        background-color: @guide-tour-text-color;\n      }\n    }\n  }\n  &-clear {\n    position: fixed;\n    top: 80 * @rpx;\n    right: 40 * @rpx;\n    z-index: @guide-tour-z-index-3;\n    font-size: 56 * @rpx;\n    color: @guide-tour-clear-color;\n  }\n\n  &-item {\n    z-index: @guide-tour-z-index-2;\n    position: fixed;\n    top: 0;\n    left: 0;\n  }\n  &-swiper {\n    z-index: @guide-tour-z-index-2;\n    position: fixed;\n    top: 0;\n    left: 0;\n\n    /// #if WECHAT\n    width: 100vw;\n    /// #endif\n  }\n}\n"
  },
  {
    "path": "src/GuideTour/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 导航\n  order: 6\ntoc: 'content'\n---\n\n# GuideTour 新手引导\n\n蒙层与自定义卡片的引导组件。适用于页面上关键功能的介绍。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-guide-tour\": \"antd-mini/es/GuideTour/index\"\n#endif\n#if WECHAT\n  \"ant-guide-tour\": \"antd-mini/GuideTour/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-guide-tour\n  items=\"{{items}}\"\n  visible=\"{{visible}}\"\n#if ALIPAY\n  onCancel=\"closeTour\"\n  onChange=\"onChange\"\n#endif\n#if WECHAT\n  bindcancel=\"closeTour\"\n  bindchange=\"onChange\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    visible: true,\n    items: [\n      { left: 20, top: 80, imageUrl: 'https://gw.alipayobjects.com/zos/antfincdn/IV3MGP1qL/bianzu%25252013.png', imageMode: 'widthFix' },\n      { left: 20, top: 160, imageUrl: 'https://gw.alipayobjects.com/zos/antfincdn/%26B6d3lBJn/bianzu%25252020.png' },\n      { left: 20, top: 220, imageUrl: 'https://gw.alipayobjects.com/zos/antfincdn/lwVOkCcwb/bianzu%25252021.png' },\n    ],\n  },\n  onChange(index) {\n#if ALIPAY\n    console.log('index', index);\n#endif\n  },\n  closeTour() {\n    this.setData({\n      visible: false,\n    });\n  },\n});\n```\n\n### 受控模式\n\n```xml\n\n<ant-guide-tour\n  items=\"{{items}}\"\n  current=\"{{current}}\"\n  visible=\"{{visible}}\"\n#if ALIPAY\n  onCancel=\"closeTour\"\n  onChange=\"onChangeControlled\"\n#endif\n#if WECHAT\n  bindcancel=\"closeTour\"\n  bindchange=\"onChangeControlled\"\n#endif\n/>\n\n```\n\n```js\nPage({\n  data: {\n    visible: false,\n    current: 0,\n    items: [\n      { left: 20, top: 80, imageUrl: 'https://gw.alipayobjects.com/zos/antfincdn/IV3MGP1qL/bianzu%25252013.png', imageMode: 'widthFix' },\n      { left: 20, top: 160, imageUrl: 'https://gw.alipayobjects.com/zos/antfincdn/%26B6d3lBJn/bianzu%25252020.png' },\n      { left: 20, top: 220, imageUrl: 'https://gw.alipayobjects.com/zos/antfincdn/lwVOkCcwb/bianzu%25252021.png' },\n    ],\n  },\n  onChangeControlled(value) {\n#if ALIPAY\n    this.setData({ current: value });\n#endif\n#if WECHAT\n    this.setData({ current: value.detail });\n#endif\n  },\n  closeTour() {\n    this.setData({\n      visible: false\n    });\n  },\n});\n\n\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/GuideTour/index'></code>\n\n## API\n\n| 属性                   | 说明             | 类型                                | 默认值   |\n| ---------------------- | ---------------- | ----------------------------------- | -------- |\n| className              | 类名             | `string`                            | -        |\n| current                | 当前步骤         | `number`                            | -        |\n| defaultCurrent         | 默认当前步骤     | `number`                            | 0        |\n| items                  | 步骤信息         | [`GuideTourItem`](#guidetourttem)[] | -        |\n| maskClassName          | 蒙层的类名       | `string`                            | -        |\n| maskStyle              | 蒙层的样式       | `string`                            | -        |\n| style                  | 样式             | `string`                            | -        |\n| swiperable             | 是否开启滑动模式 | `boolean`                           | `false`  |\n| visible                | 是否显示         | `boolean`                           | `false`  |\n| jumpText               | 跳过按钮的文案   | `string`                            | '跳过'   |\n| prevStepText           | 上一步按钮的文案 | `string`                            | '上一步' |\n| nextStepText           | 下一步按钮的文案 | `string`                            | '下一步' |\n| gotItText              | 知道了按钮的文案 | `string`                            | '知道了' |\n| #if ALIPAY onCancel    | 关闭回调         | `() => void`                        | -        |\n| #if ALIPAY onChange    | 步骤改变回调     | `(index: number) => void`           | -        |\n| #if WECHAT bindcancel | 关闭回调         | `() => void`                        | -        |\n| #if WECHAT bindchange | 步骤改变回调     | `(index: number) => void`           | -        |\n\n### GuideTourItem\n\n| 参数       | 说明                       | 类型     | 默认值 |\n| ---------- | -------------------------- | -------- | ------ |\n| left       | 距离左边距离，单位 `px`    | `number` | -      |\n| imageMode  | 图片模式，同 image 的 mode | `string` | -      |\n| imageStyle | 图片内联样式               | `string` | -      |\n| imageUrl   | 图片地址                   | `string` | -      |\n| top        | 距离顶部距离，单位 `px`    | `number` | -      |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                    | 默认值                                                                                            | 深色模式默认值                                                                                    | 备注                 |\n| ------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | -------------------- |\n| --guide-tour-text-color   | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | 引导教程文本颜色     |\n| --guide-tour-clear-color  | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | 引导教程清除按钮颜色 |\n| --guide-tour-dot-color    | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | 引导教程步骤点颜色   |\n| --guide-tour-border-color | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #333333;\">#eeeeee</div> | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #ffffff;\">#2b2b2b</div> | 引导教程边框颜色     |\n| --guide-tour-btn-color    | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | 引导教程按钮颜色     |\n"
  },
  {
    "path": "src/GuideTour/index.sjs.ts",
    "content": "function checkShowNext(current, items) {\n  return current < items.length - 1;\n}\nfunction checkShowPrev(current, items) {\n  return current > 0;\n}\nfunction checkShowJump(current, items) {\n  return current === 0 && items.length > 1;\n}\nfunction checkShowKnow(current, items) {\n  return current === items.length - 1;\n}\nexport default {\n  checkShowNext,\n  checkShowPrev,\n  checkShowJump,\n  checkShowKnow,\n};\n"
  },
  {
    "path": "src/GuideTour/index.ts",
    "content": "import { effect } from '@preact/signals-core';\nimport mixinValue from '../mixins/value';\nimport {\n  ComponentWithSignalStoreImpl,\n  triggerEvent,\n  triggerEventOnly,\n} from '../_util/simply';\nimport i18nController from '../_util/store';\nimport { GuideTourDefaultProps } from './props';\n\nComponentWithSignalStoreImpl({\n  storeOptions: {\n    store: () => i18nController,\n    updateHook: effect,\n    mapState: {\n      locale: ({ store }) => store.currentLocale.value,\n    },\n  },\n  props: GuideTourDefaultProps,\n  methods: {\n    async onNext() {\n      const currentValue = this.getValue();\n      const newCurrent = currentValue + 1;\n      if (!this.isControlled()) {\n        this.update(newCurrent);\n      }\n      triggerEvent(this, 'change', newCurrent);\n    },\n\n    async onPrev() {\n      const currentValue = this.getValue();\n      const newCurrent = currentValue - 1;\n      if (!this.isControlled()) {\n        this.update(newCurrent);\n      }\n      triggerEvent(this, 'change', newCurrent);\n    },\n\n    onCancel() {\n      triggerEventOnly(this, 'cancel');\n    },\n\n    async onSwiperChange(e) {\n      const { current } = e.detail;\n      if (!this.isControlled()) {\n        this.update(current);\n      }\n      triggerEvent(this, 'change', current);\n    },\n  },\n  mixins: [\n    mixinValue({\n      valueKey: 'current',\n      defaultValueKey: 'defaultCurrent',\n    }),\n  ],\n});\n"
  },
  {
    "path": "src/GuideTour/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\ninterface IStep {\n  /**\n   * @description 图片地址\n   */\n  imageUrl: string;\n  /**\n   * @description 图片模式\n   */\n  imageMode: string;\n  /**\n   * @description 图片内联样式\n   */\n  imageStyle: string;\n  /**\n   * @description 距离顶部\n   */\n  top: string;\n  /**\n   * @description 距离左边\n   */\n  left: string;\n  /**\n   * @description className\n   */\n  className?: string;\n}\n\nexport interface IGuideTour extends IBaseProps {\n  /**\n   * @description 蒙层样式\n   */\n  maskStyle: string;\n  /**\n   * @description 蒙层 className\n   */\n  maskClassName?: string;\n  /**\n   * @description 步骤详情\n   */\n  items: IStep[];\n  /**\n   * @description 当前步骤\n   */\n  current: number;\n  /**\n   * @description 初始step\n   */\n  defaultCurrent: number;\n  /**\n   * @description 是否开启滑动模式\n   */\n  swiperable: boolean;\n  /**\n   * @description 引导是否可见, 受控\n   * @default true\n   */\n  visible: boolean;\n  /**\n   * @description 关闭回调\n   */\n  onCancel: () => void;\n  /**\n   * @description 步骤改变回调\n   */\n  onChange: (index: number) => boolean;\n  /**\n   * @description 上一步按钮文案\n   * @default \"上一步\"\n   */\n  prevStepText?: string;\n  /**\n   * @description 下一步按钮文案\n   * @default \"下一步\"\n   */\n  nextStepText?: string;\n  /**\n   * @description 知道了按钮文案\n   * @default \"知道了\"\n   */\n  gotItText?: string;\n  /**\n   * @description 跳过按钮文案\n   * @default \"跳过\"\n   */\n  jumpText?: string;\n}\n\nexport const GuideTourDefaultProps: Partial<IGuideTour> = {\n  visible: false,\n  swiperable: false,\n  items: [],\n  current: null,\n  defaultCurrent: 0,\n  gotItText: null,\n  nextStepText: null,\n  prevStepText: null,\n  jumpText: null,\n  maskStyle: '',\n  maskClassName: '',\n};\n"
  },
  {
    "path": "src/GuideTour/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n@guideTourPrefix: ant-guide-tour;\n\n// 层级-1\n@guide-tour-z-index-1: 9999;\n// 层级-2\n@guide-tour-z-index-2: 10000;\n// 层级-3\n@guide-tour-z-index-3: 10001;\n// 主要文字颜色\n@guide-tour-text-color: var(--guide-tour-text-color, @COLOR_WHITE);\n// 关闭按钮颜色\n@guide-tour-clear-color: var(--guide-tour-clear-color, @COLOR_TEXT_ASSIST);\n// 按钮距离底部\n@guide-tour-button-bottom: calc(100 * @rpx + env(safe-area-inset-bottom));\n// 按钮高度\n@guide-tour-button-height:52 * @rpx;\n// 步骤条点的长宽\n@guide-tour-dot-size: 6 * @rpx;\n// 步骤条点的颜色\n@guide-tour-dot-color: var(--guide-tour-dot-color, @COLOR_TEXT_ASSIST);\n// 激活步骤条点的长度\n@guide-tour-dot-active-width:26 * @rpx;\n// 步骤条点的弧度\n@guide-tour-dot-border-radius:2 * @rpx;\n// 步骤条距离底部\n@guide-tour-dot-bottom: calc(\n  @guide-tour-button-bottom + 40 * @rpx + @guide-tour-button-height\n);\n\n@guide-tour-border-color: var(--guide-tour-border-color, @COLOR_BORDER);\n\n@guide-tour-btn-color: var(--guide-tour-btn-color, @COLOR_TEXT_PRIMARY);\n\n@guide-tour-right-btn-color: var(--guide-tour-right-btn-color, @COLOR_TEXT_PRIMARY);\n"
  },
  {
    "path": "src/Icon/index.axml",
    "content": "<!-- #if ALIPAY -->\n<text\n  class=\"ant-icon ant-icon-{{ type }} {{ className ? className : '' }}\"\n  style=\"{{ style }}\"\n  onTap=\"{{ onTap ? 'onTap' : '' }}\"\n  catchTap=\"{{ catchTap ? 'catchTap' : '' }}\" />\n<!-- #endif -->\n<!-- #if WECHAT -->\n<text\n  class=\"ant-icon ant-icon-{{ type }} {{ className ? className : '' }}\"\n  style=\"{{ style }}\" />\n  <!-- #endif -->\n"
  },
  {
    "path": "src/Icon/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: General\n  order: 2\ntoc: 'content'\n---\n\n# Icon\n\nSemantic vector graphics. Icon icons can be used when graphics are needed to metaphorically present basic operating functions and give users correct, friendly and clear operating guidelines.\n\n## Introduction\n\nIntroducing components in index.json\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-icon\": \"antd-mini/es/Icon/index\"\n#endif\n#if WECHAT\n  \"ant-icon\": \"antd-mini/Icon/index\"\n#endif\n}\n```\n\n## Icon List\n\nSearch and view the icon, click the icon to copy.\n\n<Icon></Icon>\n\n## Code Sample\n\n### Basic use\n\n```xml\n<ant-icon type=\"SmileOutline\" />\n```\n\n### Custom size and color\n\n```xml\n<ant-icon type=\"SmileOutline\" style=\"font-size: 20px\" />\n<ant-icon type=\"SmileOutline\" style=\"color: red\" />\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Icon/index'></code>\n\n## API\n\n| Property                 | Description                     | Type               | Default Value |\n| :------------------- | :----------------------- | :----------------- | :----- |\n| className            | Class Name                     | string             | -      |\n| style                | Style                     | string             | -      |\n| type                 | Types of icons               | string             | -      |\n| #if ALIPAY catchTap  | Callback function triggered when icon is clicked | (e: Event) => void | -      |\n| #if ALIPAY onTap     | Callback function triggered when icon is clicked | (e: Event) => void | -      |\n| #if WECHAT catchtap | Callback function triggered when icon is clicked | (e: Event) => void | -      |\n| #if WECHAT bindtap  | Callback function triggered when icon is clicked | (e: Event) => void | -      |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name       | Default Value                                                                                           | Dark Mode Default                                                                                   | Remarks     |\n| ------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | -------- |\n| --icon-color | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff\">#c5cad1</div> | Icon Color |\n"
  },
  {
    "path": "src/Icon/index.json",
    "content": "{  \n  \"styleIsolation\": \"shared\",\n  \"component\": true\n}"
  },
  {
    "path": "src/Icon/index.less",
    "content": "@import (reference) './variable.less';\n\n@font-face {\n  font-family: antdmini-icon;\n  src: url('https://gw.alipayobjects.com/os/bmw-prod/578c472b-19a7-44ab-a92d-adc367ee2fe2.ttf?v=20210115')\n    format('truetype');\n}\n\n@iconPrefix: ant-icon;\n\n.@{iconPrefix} {\n  /* stylelint-disable font-family-no-missing-generic-family-keyword */\n  font-family: antdmini-icon !important;\n  font-style: normal;\n  -webkit-font-smoothing: antialiased;\n  /// #if ALIPAY\n  line-height: @line-height-base;\n  /// #endif\n  /// #if WECHAT\n  font-size: @size-4;\n  /// #endif\n\n  &-MinusOutline:before {\n    content: '\\e66f';\n  }\n\n  &-AlipayCircleFill:before {\n    content: '\\e670';\n  }\n\n  &-CheckCircleFill:before {\n    content: '\\e671';\n  }\n\n  &-FireFill:before {\n    content: '\\e672';\n  }\n\n  &-FaceRecognitionOutline:before {\n    content: '\\e673';\n  }\n\n  &-StarFill:before {\n    content: '\\e674';\n  }\n\n  &-EyeInvisibleFill:before {\n    content: '\\e675';\n  }\n\n  &-SmileFill:before {\n    content: '\\e676';\n  }\n\n  &-FrownFill:before {\n    content: '\\e677';\n  }\n\n  &-BankcardOutline:before {\n    content: '\\e678';\n  }\n\n  &-HeartOutline:before {\n    content: '\\e679';\n  }\n\n  &-EyeFill:before {\n    content: '\\e67a';\n  }\n\n  &-HeartFill:before {\n    content: '\\e67b';\n  }\n\n  &-DownFill:before {\n    content: '\\e67c';\n  }\n\n  &-CloseCircleFill:before {\n    content: '\\e67d';\n  }\n\n  &-VideoOutline:before {\n    content: '\\e67e';\n  }\n\n  &-CouponOutline:before {\n    content: '\\e67f';\n  }\n\n  &-ReceiptOutline:before {\n    content: '\\e680';\n  }\n\n  &-AntOutline:before {\n    content: '\\e681';\n  }\n\n  &-UserCircleOutline:before {\n    content: '\\e682';\n  }\n\n  &-PayCircleOutline:before {\n    content: '\\e683';\n  }\n\n  &-BillOutline:before {\n    content: '\\e684';\n  }\n\n  &-PlayOutline:before {\n    content: '\\e685';\n  }\n\n  &-PayOutline:before {\n    content: '\\e686';\n  }\n\n  &-MoreOutline:before {\n    content: '\\e687';\n  }\n\n  &-ShrinkOutline:before {\n    content: '\\e688';\n  }\n\n  &-ArrowsAltOutline:before {\n    content: '\\e689';\n  }\n\n  &-StarOutline:before {\n    content: '\\e68a';\n  }\n\n  &-CheckOutline:before {\n    content: '\\e68b';\n  }\n\n  &-DeleteOutline:before {\n    content: '\\e68c';\n  }\n\n  &-LinkOutline:before {\n    content: '\\e68d';\n  }\n\n  &-InformationCircleOutline:before {\n    content: '\\e68e';\n  }\n\n  &-GlobalOutline:before {\n    content: '\\e68f';\n  }\n\n  &-InformationCircleFill:before {\n    content: '\\e690';\n  }\n\n  &-ExclamationCircleFill:before {\n    content: '\\e691';\n  }\n\n  &-CheckCircleOutline:before {\n    content: '\\e692';\n  }\n\n  &-CloseCircleOutline:before {\n    content: '\\e693';\n  }\n\n  &-SetOutline:before {\n    content: '\\e694';\n  }\n\n  &-QuestionCircleFill:before {\n    content: '\\e695';\n  }\n\n  &-QuestionCircleOutline:before {\n    content: '\\e696';\n  }\n\n  &-UpCircleOutline:before {\n    content: '\\e697';\n  }\n\n  &-FrownOutline:before {\n    content: '\\e698';\n  }\n\n  &-DownCircleOutline:before {\n    content: '\\e699';\n  }\n\n  &-ExclamationCircleOutline:before {\n    content: '\\e69a';\n  }\n\n  &-MinusCircleOutline:before {\n    content: '\\e69b';\n  }\n\n  &-RedoOutline:before {\n    content: '\\e69c';\n  }\n\n  &-UndoOutline:before {\n    content: '\\e69d';\n  }\n\n  &-EyeInvisibleOutline:before {\n    content: '\\e69e';\n  }\n\n  &-ForbidFill:before {\n    content: '\\e69f';\n  }\n\n  &-PicturesOutline:before {\n    content: '\\e6a0';\n  }\n\n  &-PictureOutline:before {\n    content: '\\e6a1';\n  }\n\n  &-PictureWrongOutline:before {\n    content: '\\e6a2';\n  }\n\n  &-EyeOutline:before {\n    content: '\\e6a3';\n  }\n\n  &-AddCircleOutline:before {\n    content: '\\e6a4';\n  }\n\n  &-ClockCircleFill:before {\n    content: '\\e6a5';\n  }\n\n  &-ClockCircleOutline:before {\n    content: '\\e6a6';\n  }\n\n  &-BellMuteOutline:before {\n    content: '\\e6a7';\n  }\n\n  &-KeyOutline:before {\n    content: '\\e6a8';\n  }\n\n  &-BellOutline:before {\n    content: '\\e6a9';\n  }\n\n  &-SearchOutline:before {\n    content: '\\e6aa';\n  }\n\n  &-CollectMoneyOutline:before {\n    content: '\\e6ab';\n  }\n\n  &-UnorderedListOutline:before {\n    content: '\\e6ac';\n  }\n\n  &-AppstoreOutline:before {\n    content: '\\e6ad';\n  }\n\n  &-ExclamationTriangleOutline:before {\n    content: '\\e6ae';\n  }\n\n  &-AddOutline:before {\n    content: '\\e6af';\n  }\n\n  &-ScanningOutline:before {\n    content: '\\e6b0';\n  }\n\n  &-ScanCodeOutline:before {\n    content: '\\e6b1';\n  }\n\n  &-ExclamationOutline:before {\n    content: '\\e6b2';\n  }\n\n  &-CloseOutline:before {\n    content: '\\e6b3';\n  }\n\n  &-ScanningFaceOutline:before {\n    content: '\\e6b4';\n  }\n\n  &-LeftOutline:before {\n    content: '\\e6b5';\n  }\n\n  &-DownOutline:before {\n    content: '\\e6b6';\n  }\n\n  &-UpOutline:before {\n    content: '\\e6b7';\n  }\n\n  &-RightOutline:before {\n    content: '\\e6b8';\n  }\n\n  &-KoubeiOutline:before {\n    content: '\\e6b9';\n  }\n\n  &-KoubeiFill:before {\n    content: '\\e6ba';\n  }\n\n  &-AAOutline:before {\n    content: '\\e6bb';\n  }\n\n  &-ArrowDownCircleOutline:before {\n    content: '\\e6bc';\n  }\n\n  &-MovieOutline:before {\n    content: '\\e6bd';\n  }\n\n  &-CompassOutline:before {\n    content: '\\e6be';\n  }\n\n  &-LoopOutline:before {\n    content: '\\e6bf';\n  }\n\n  &-TextOutline:before {\n    content: '\\e6c0';\n  }\n\n  &-TagOutline:before {\n    content: '\\e6c1';\n  }\n\n  &-FlagOutline:before {\n    content: '\\e6c2';\n  }\n\n  &-EnvironmentOutline:before {\n    content: '\\e6c3';\n  }\n\n  &-CalendarOutline:before {\n    content: '\\e6c4';\n  }\n\n  &-LocationFill:before {\n    content: '\\e6c5';\n  }\n\n  &-PhoneFill:before {\n    content: '\\e6c6';\n  }\n\n  &-PhonebookOutline:before {\n    content: '\\e6c7';\n  }\n\n  &-SmileOutline:before {\n    content: '\\e6c8';\n  }\n\n  &-UserAddOutline:before {\n    content: '\\e6c9';\n  }\n\n  &-FileWrongOutline:before {\n    content: '\\e6ca';\n  }\n\n  &-SoundMuteFill:before {\n    content: '\\e6cb';\n  }\n\n  &-SoundMuteOutline:before {\n    content: '\\e6cc';\n  }\n\n  &-LockOutline:before {\n    content: '\\e6cd';\n  }\n\n  &-UnlockOutline:before {\n    content: '\\e6ce';\n  }\n\n  &-EditSOutline:before {\n    content: '\\e6cf';\n  }\n\n  &-UploadOutline:before {\n    content: '\\e6d0';\n  }\n\n  &-SoundOutline:before {\n    content: '\\e6d1';\n  }\n\n  &-DownlandOutline:before {\n    content: '\\e6d2';\n  }\n\n  &-SendOutline:before {\n    content: '\\e6d3';\n  }\n\n  &-FillinOutline:before {\n    content: '\\e6d4';\n  }\n\n  &-AudioMutedOutline:before {\n    content: '\\e6d5';\n  }\n\n  &-AudioOutline:before {\n    content: '\\e6d6';\n  }\n\n  &-UserOutline:before {\n    content: '\\e6d7';\n  }\n\n  &-UserContactOutline:before {\n    content: '\\e6d8';\n  }\n\n  &-TeamOutline:before {\n    content: '\\e6d9';\n  }\n\n  &-UserSetOutline:before {\n    content: '\\e6da';\n  }\n\n  &-FileOutline:before {\n    content: '\\e6db';\n  }\n\n  &-MailOutline:before {\n    content: '\\e6dc';\n  }\n\n  &-TruckOutline:before {\n    content: '\\e6dd';\n  }\n\n  &-MailOpenOutline:before {\n    content: '\\e6de';\n  }\n\n  &-ChatCheckOutline:before {\n    content: '\\e6df';\n  }\n\n  &-ChatAddOutline:before {\n    content: '\\e6e0';\n  }\n\n  &-ChatWrongOutline:before {\n    content: '\\e6e1';\n  }\n\n  &-PhonebookFill:before {\n    content: '\\e6e2';\n  }\n\n  &-AddressBookFill:before {\n    content: '\\e6e3';\n  }\n\n  &-CalculatorOutline:before {\n    content: '\\e6e4';\n  }\n\n  &-PieOutline:before {\n    content: '\\e6e5';\n  }\n\n  &-HandPayCircleOutline:before {\n    content: '\\e6e6';\n  }\n\n  &-GiftOutline:before {\n    content: '\\e6e7';\n  }\n\n  &-TransportQRcodeOutline:before {\n    content: '\\e6e8';\n  }\n\n  &-FolderOutline:before {\n    content: '\\e6e9';\n  }\n\n  &-AlipaySquareFill:before {\n    content: '\\e6ea';\n  }\n\n  &-TravelOutline:before {\n    content: '\\e6eb';\n  }\n\n  &-AppOutline:before {\n    content: '\\e6ec';\n  }\n\n  &-HistogramOutline:before {\n    content: '\\e6ed';\n  }\n\n  &-MailFill:before {\n    content: '\\e6ee';\n  }\n\n  &-CameraOutline:before {\n    content: '\\e6ef';\n  }\n\n  &-EditFill:before {\n    content: '\\e6f0';\n  }\n\n  &-SystemQRcodeOutline:before {\n    content: '\\e6f1';\n  }\n\n  &-LockFill:before {\n    content: '\\e6f2';\n  }\n\n  &-AudioFill:before {\n    content: '\\e6f3';\n  }\n\n  &-TeamFill:before {\n    content: '\\e6f4';\n  }\n\n  &-FilterOutline:before {\n    content: '\\e6f5';\n  }\n\n  &-EditSFill:before {\n    content: '\\e6f6';\n  }\n\n  &-LikeOutline:before {\n    content: '\\e6f7';\n  }\n\n  &-TextDeletionOutline:before {\n    content: '\\e6f8';\n  }\n\n  &-StopOutline:before {\n    content: '\\e6f9';\n  }\n\n  &-FingerdownOutline:before {\n    content: '\\e6fa';\n  }\n\n  &-MessageFill:before {\n    content: '\\e6fb';\n  }\n\n  &-LocationOutline:before {\n    content: '\\e6fc';\n  }\n\n  &-ContentOutline:before {\n    content: '\\e6fd';\n  }\n\n  &-ExclamationShieldFill:before {\n    content: '\\e6fe';\n  }\n\n  &-ReceivePaymentOutline:before {\n    content: '\\e6ff';\n  }\n\n  &-ExclamationShieldOutline:before {\n    content: '\\e700';\n  }\n\n  &-AddSquareOutline:before {\n    content: '\\e701';\n  }\n\n  &-CloseShieldOutline:before {\n    content: '\\e702';\n  }\n\n  &-CheckShieldOutline:before {\n    content: '\\e703';\n  }\n\n  &-CheckShieldFill:before {\n    content: '\\e704';\n  }\n\n  &-ShopbagOutline:before {\n    content: '\\e705';\n  }\n\n  &-MessageOutline:before {\n    content: '\\e706';\n  }\n}\n"
  },
  {
    "path": "src/Icon/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 通用\n  order: 2\ntoc: 'content'\n---\n\n# Icon 图标\n\n语义化的矢量图形。当需要使用图形来对基础操作功能进行隐喻呈现，并给予用户正确、友好且清晰的操作指引时，可以使用 Icon 图标。\n\n## 引入\n\n在 index.json 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-icon\": \"antd-mini/es/Icon/index\"\n#endif\n#if WECHAT\n  \"ant-icon\": \"antd-mini/Icon/index\"\n#endif\n}\n```\n\n## 图标列表\n\n搜索并查看图标，点击图标可进行复制。\n\n<Icon></Icon>\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-icon type=\"SmileOutline\" />\n```\n\n### 自定义大小及颜色\n\n```xml\n<ant-icon type=\"SmileOutline\" style=\"font-size: 20px\" />\n<ant-icon type=\"SmileOutline\" style=\"color: red\" />\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Icon/index'></code>\n\n## API\n\n| 属性                 | 说明                     | 类型               | 默认值 |\n| :------------------- | :----------------------- | :----------------- | :----- |\n| className            | 类名                     | string             | -      |\n| style                | 样式                     | string             | -      |\n| type                 | 图标的类型               | string             | -      |\n| #if ALIPAY catchTap  | 点击图标时触发的回调函数 | (e: Event) => void | -      |\n| #if ALIPAY onTap     | 点击图标时触发的回调函数 | (e: Event) => void | -      |\n| #if WECHAT catchtap | 点击图标时触发的回调函数 | (e: Event) => void | -      |\n| #if WECHAT bindtap  | 点击图标时触发的回调函数 | (e: Event) => void | -      |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名       | 默认值                                                                                           | 深色模式默认值                                                                                   | 备注     |\n| ------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | -------- |\n| --icon-color | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff\">#c5cad1</div> | 图标颜色 |\n"
  },
  {
    "path": "src/Icon/index.ts",
    "content": "import { IconDefaultProps } from './props';\nimport fmtEvent from '../_util/fmtEvent';\nimport '../_util/assert-component2';\n\nComponent({\n  /// #if WECHAT\n  properties: {\n    type: {\n      value: '',\n      type: String,\n    },\n    color: {\n      type: String,\n    },\n    style: {\n      type: String,\n    },\n    className: {\n      type: String,\n    },\n  },\n  options: {\n    //@ts-ignore\n    styleIsolation: 'shared',\n  },\n  /// #endif\n\n  /// #if ALIPAY\n  props: IconDefaultProps,\n  methods: {\n    onTap(e) {\n      if (this.props.onTap) {\n        this.props.onTap(fmtEvent(this.props, e));\n      }\n    },\n    catchTap(e) {\n      if (this.props.catchTap) {\n        this.props.catchTap(fmtEvent(this.props, e));\n      }\n    },\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/Icon/props.ts",
    "content": "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { IBaseProps } from '../_util/base';\n/**\n * @description 图标，内置丰富的图标可以选择。\n */\n\nexport interface IconProps extends IBaseProps {\n  /**\n   * @description icon 图标的类型\n   * @default \"\"\n   */\n  type?: string;\n\n  /**\n   * 点击图标\n   */\n  onTap?: (e: any) => void;\n\n  /**\n   * 点击图标\n   */\n  catchTap?: (e: any) => void;\n}\n\nexport const IconDefaultProps: Partial<IconProps> = {\n  type: '',\n};\n"
  },
  {
    "path": "src/Icon/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n@icon-color: var(--icon-color, @COLOR_TEXT_PRIMARY);\n"
  },
  {
    "path": "src/ImageIcon/index.axml",
    "content": "<import-sjs\n  from=\"./index.sjs\"\n  name=\"helper\" />\n\n<view class=\"ant-imageIcon {{ className ? className : '' }}\">\n  <ant-icon\n    a:if=\"{{ helper.isIcon(image) }}\"\n    type=\"{{ image }}\"\n    className=\"{{ className ? className + '-icon' : '' }}\"\n    style=\"{{ style }}\" />\n  <image\n    a:else\n    src=\"{{ image }}\"\n    class=\"{{ className ? className + '-image' : '' }}\"\n    style=\"{{ style || '' }}\"\n    mode=\"aspectFit\" />\n</view>\n"
  },
  {
    "path": "src/ImageIcon/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-icon\": \"../Icon/index\"\n  }\n}\n"
  },
  {
    "path": "src/ImageIcon/index.sjs.ts",
    "content": "const iconTypes = [\n  'MinusOutline',\n  'AlipayCircleFill',\n  'CheckCircleFill',\n  'FireFill',\n  'FaceRecognitionOutline',\n  'StarFill',\n  'EyeInvisibleFill',\n  'SmileFill',\n  'FrownFill',\n  'BankcardOutline',\n  'HeartOutline',\n  'EyeFill',\n  'HeartFill',\n  'DownFill',\n  'CloseCircleFill',\n  'VideoOutline',\n  'CouponOutline',\n  'ReceiptOutline',\n  'AntOutline',\n  'UserCircleOutline',\n  'PayCircleOutline',\n  'BillOutline',\n  'PlayOutline',\n  'PayOutline',\n  'MoreOutline',\n  'ShrinkOutline',\n  'ArrowsAltOutline',\n  'StarOutline',\n  'CheckOutline',\n  'DeleteOutline',\n  'LinkOutline',\n  'InformationCircleOutline',\n  'GlobalOutline',\n  'InformationCircleFill',\n  'ExclamationCircleFill',\n  'CheckCircleOutline',\n  'CloseCircleOutline',\n  'SetOutline',\n  'QuestionCircleFill',\n  'QuestionCircleOutline',\n  'UpCircleOutline',\n  'FrownOutline',\n  'DownCircleOutline',\n  'ExclamationCircleOutline',\n  'MinusCircleOutline',\n  'RedoOutline',\n  'UndoOutline',\n  'EyeInvisibleOutline',\n  'ForbidFill',\n  'PicturesOutline',\n  'PictureOutline',\n  'PictureWrongOutline',\n  'EyeOutline',\n  'AddCircleOutline',\n  'ClockCircleFill',\n  'ClockCircleOutline',\n  'BellMuteOutline',\n  'KeyOutline',\n  'BellOutline',\n  'SearchOutline',\n  'CollectMoneyOutline',\n  'UnorderedListOutline',\n  'AppstoreOutline',\n  'ExclamationTriangleOutline',\n  'AddOutline',\n  'ScanningOutline',\n  'ScanCodeOutline',\n  'ExclamationOutline',\n  'CloseOutline',\n  'ScanningFaceOutline',\n  'LeftOutline',\n  'DownOutline',\n  'UpOutline',\n  'RightOutline',\n  'KoubeiOutline',\n  'KoubeiFill',\n  'AAOutline',\n  'ArrowDownCircleOutline',\n  'MovieOutline',\n  'CompassOutline',\n  'LoopOutline',\n  'TextOutline',\n  'TagOutline',\n  'FlagOutline',\n  'EnvironmentOutline',\n  'CalendarOutline',\n  'LocationFill',\n  'PhoneFill',\n  'PhonebookOutline',\n  'SmileOutline',\n  'UserAddOutline',\n  'FileWrongOutline',\n  'SoundMuteFill',\n  'SoundMuteOutline',\n  'LockOutline',\n  'UnlockOutline',\n  'EditSOutline',\n  'UploadOutline',\n  'SoundOutline',\n  'DownlandOutline',\n  'SendOutline',\n  'FillinOutline',\n  'AudioMutedOutline',\n  'AudioOutline',\n  'UserOutline',\n  'UserContactOutline',\n  'TeamOutline',\n  'UserSetOutline',\n  'FileOutline',\n  'MailOutline',\n  'TruckOutline',\n  'MailOpenOutline',\n  'ChatCheckOutline',\n  'ChatAddOutline',\n  'ChatWrongOutline',\n  'PhonebookFill',\n  'AddressBookFill',\n  'CalculatorOutline',\n  'PieOutline',\n  'HandPayCircleOutline',\n  'GiftOutline',\n  'TransportQRcodeOutline',\n  'FolderOutline',\n  'AlipaySquareFill',\n  'TravelOutline',\n  'AppOutline',\n  'HistogramOutline',\n  'MailFill',\n  'CameraOutline',\n  'EditFill',\n  'SystemQRcodeOutline',\n  'LockFill',\n  'AudioFill',\n  'TeamFill',\n  'FilterOutline',\n  'EditSFill',\n  'LikeOutline',\n  'TextDeletionOutline',\n  'StopOutline',\n  'FingerdownOutline',\n  'MessageFill',\n  'LocationOutline',\n  'ContentOutline',\n  'ExclamationShieldFill',\n  'ReceivePaymentOutline',\n  'ExclamationShieldOutline',\n  'AddSquareOutline',\n  'CloseShieldOutline',\n  'CheckShieldOutline',\n  'CheckShieldFill',\n  'ShopbagOutline',\n  'MessageOutline',\n];\nconst isIcon = (src) => {\n  return iconTypes.indexOf(src) > -1;\n};\n\nexport default { isIcon };\n"
  },
  {
    "path": "src/ImageIcon/index.ts",
    "content": "import { Component } from '../_util/simply';\nimport { ImageIconProps } from './props';\n\nComponent<ImageIconProps>({\n  props: {\n    image: '',\n  },\n});\n"
  },
  {
    "path": "src/ImageIcon/props.ts",
    "content": "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { IBaseProps } from '../_util/base';\n\nexport interface ImageIconProps extends IBaseProps {\n  image: string;\n}\n\nexport const ImageIconDefaultProps: Partial<ImageIconProps> = {\n  image: '',\n};\n"
  },
  {
    "path": "src/ImageUpload/index.axml",
    "content": "<import-sjs from=\"../_util/isPropsEmpty.sjs\" name=\"u\" />\n\n<view class=\"ant-image-upload {{ className || '' }}\" style=\"{{ style || '' }}\">\n  <!-- #if ALIPAY -->\n  <slot fileList=\"{{ mixin.value }}\">\n    <!-- #endif -->\n    <block a:for=\"{{ mixin.value }}\" a:for-index=\"index\" a:for-item=\"item\" a:key=\"uid\">\n      <view class=\"ant-image-upload-show\">\n        <view data-uid=\"{{ item.uid }}\" onTap=\"onRemove\">\n          <!-- #if ALIPAY  -->\n          <slot name=\"removeButton\">\n            <!-- #endif -->\n            <view class=\"ant-image-upload-close\" />\n            <!-- #if ALIPAY  -->\n          </slot>\n          <!-- #endif -->\n        </view>\n        <!-- #if ALIPAY  -->\n        <slot name=\"image\" value=\"{{ item }}\">\n          <!-- #endif -->\n          <view\n            a:if=\"{{ item.status === 'uploading' || item.status === 'error' }}\"\n            class=\"ant-image-upload-cover\"\n          >\n            <view a:if=\"{{ item.status === 'uploading' }}\" class=\"ant-image-upload-cover-loading\">\n              <loading className=\"ant-image-upload-cover-loading-icon\" />\n              <view class=\"ant-image-upload-cover-loading-text\">\n\n                {{ u.isPropsEmpty(uploadingText) ? locale.imageUpload.uploadingText :  uploadingText }}\n              </view>\n            </view>\n            <view a:if=\"{{ item.status === 'error' }}\" class=\"ant-image-upload-cover-error\">\n              <ant-icon className=\"ant-image-upload-cover-error-icon\" type=\"CloseCircleOutline\" />\n              <view class=\"ant-image-upload-cover-error-text\">\n                {{ u.isPropsEmpty(uploadfailedText) ? locale.imageUpload.uploadfailedText :  uploadfailedText }}\n              </view>\n            </view>\n          </view>\n\n          <image\n            class=\"ant-image-upload-image\"\n            mode=\"{{ imageMode }}\"\n            src=\"{{ item.url || item.path }}\"\n            data-uid=\"{{ item.uid }}\"\n            onTap=\"onPreview\"\n          />\n          <!-- #if ALIPAY  -->\n        </slot>\n        <!-- #endif -->\n      </view>\n    </block>\n    <view onTap=\"chooseImage\">\n      <!-- #if ALIPAY  -->\n      <slot name=\"uploadButton\">\n        <!-- #endif -->\n        <view a:if=\"{{ showUploadButton }}\" class=\"ant-image-upload-add-image-wrapper\">\n          <ant-icon type=\"AddOutline\" className=\"ant-image-upload-add-image-icon\" />\n        </view>\n        <!-- #if ALIPAY  -->\n      </slot>\n      <!-- #endif -->\n    </view>\n    <!-- #if ALIPAY  -->\n  </slot>\n  <!-- #endif -->\n</view>\n"
  },
  {
    "path": "src/ImageUpload/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Information Entry\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# ImageUpload\n\nIt is used to upload pictures to the server, and briefly display the information of the uploaded files and provide preview function. Use when you need to upload local pictures or photos to the server.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-uploader\": \"antd-mini/es/ImageUpload/index\"\n#endif\n#if WECHAT\n  \"ant-uploader\": \"antd-mini/ImageUpload/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n> `onBeforeUpload`、`onUpload` Function Receive `LocalFile`, you can customize the upload-related business logic.`preview` The event is triggered by clicking on the uploaded picture and can be coordinated [my.previewimage](https://opendocs.alipay.com/mini/api/media/image/my.previewimage) Realize the picture preview.`change` event will be triggered when the list of uploaded files changes.\n\n```xml\n<ant-uploader\n  defaultFileList=\"{{defaultFileList}}\"\n  uploadingText=\"上传中……\"\n  uploadfailedText=\"上传失败\"\n#if ALIPAY\n  onBeforeUpload=\"onBeforeUpload\"\n  onUpload=\"onUpload\"\n  onPreview=\"onPreview\"\n  onChange=\"onChange\"\n#endif\n#if WECHAT\n  onBeforeUpload=\"{{onBeforeUpload}}\"\n  onUpload=\"{{onUpload}}\"\n  bindchange=\"onChange\"\n  bindpreview=\"onPreview\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    defaultFileList: [{ url: 'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*znK_ToIL8rQAAAAAAAAAAAAAARQnAQ', status: 'done' }],\n#if WECHAT\n    onUpload(file) {\n      return new Promise((resolve) => {\n        console.log('上传的图片为：', file);\n        setTimeout(() => {\n          resolve(\n            'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ'\n          );\n        }, 2000);\n      });\n    },\n    onBeforeUpload(localFileList) {\n      console.log('即将上传的图片列表为：', localFileList);\n      localFileList = localFileList.filter((item) => item.size < 10000);\n      console.log('修改上传的图片列表为：', localFileList);\n      return localFileList;\n    },\n#endif\n  },\n  onChange(fileList) {\n    console.log('图片列表：', fileList);\n  },\n  onPreview(file) {\n    console.log('preview', file);\n  },\n#if ALIPAY\n  onUpload(file) {\n    return new Promise((resolve) => {\n      console.log('上传的图片为：', file);\n      setTimeout(() => {\n        resolve(\n          'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ'\n        );\n      }, 2000);\n    });\n  },\n  onBeforeUpload(localFileList) {\n    console.log('即将上传的图片列表为：', localFileList);\n    localFileList = localFileList.filter((item) => item.size < 10000);\n    console.log('修改上传的图片列表为：', localFileList);\n    return localFileList;\n  },\n#endif\n});\n```\n\n### Controlled Mode\n\n> `fileList`and `change` Events cooperate to achieve controlled mode. If you want the component to trigger the upload logic externally, pass `ref` way to get the component instance and call the component. `chooseImage` method can be.\n\n```xml\n<ant-uploader\n  ref=\"handleUploaderRef\"\n  fileList=\"{{fileList}}\"\n#if ALIPAY\n  onChange=\"handleControlledChange\"\n  onUpload=\"onUpload\"\n#endif\n#if WECHAT\n  bindchange=\"handleControlledChange\"\n  onUpload=\"{{onUpload}}\"\n#endif\n/>\n<ant-button\n  size=\"medium\"\n  onTap=\"upload\"\n  type=\"primary\">\n  Component External Trigger Upload Logic\n</ant-button>\n```\n\n```js\nPage({\n  data: {\n    fileList: [{ url: 'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*znK_ToIL8rQAAAAAAAAAAAAAARQnAQ', status: 'done' }],\n#if WECHAT\n    onUpload(file) {\n      return new Promise((resolve) => {\n        console.log('上传的图片为：', file);\n        setTimeout(() => {\n          resolve(\n            'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ'\n          );\n        }, 2000);\n      });\n    },\n#endif\n  },\n#if ALIPAY\n  onUpload(file) {\n    return new Promise((resolve) => {\n      console.log('上传的图片为：', file);\n      setTimeout(() => {\n        resolve(\n          'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ'\n        );\n      }, 2000);\n    });\n  },\n#endif\n  handleControlledChange(fileList) {\n#if WECHAT\n    this.setData({\n      fileList: fileList.detail,\n    });\n#endif\n#if ALIPAY\n    this.setData({\n      fileList,\n    });\n#endif\n  },\n  handleUploaderRef(ref) {\n    console.log('handleUploaderRef', ref);\n#if WECHAT\n    this.handleUploaderRef = ref.detail;\n#endif\n#if ALIPAY\n    this.handleUploaderRef = ref;\n#endif\n  },\n  upload() {\n    this.handleUploaderRef.chooseImage();\n  },\n});\n```\n\n### Demo Code\n\n<code src='../../demo/pages/ImageUpload/index'></code>\n\n## API\n\n| Property                    | Description                                                                                                                                                                                     | Type                                                                                        | Default Value              |\n| ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | ------------------- |\n| className               | Class Name                                                                                                                                                                                     | string                                                                                      | -                   |\n| maxCount                | Maximum number of uploaded images. See details in [maxCount](#maxcount)                                                                                                                                       | number                                                                                      | -                   |\n| defaultFileList         | File List Initial Value                                                                                                                                                                           | [File](#file)[]                                                                             | []                  |\n| sourceType              | Upload the selected source. Optional `['album']`、`['camera']` or `['album', 'camera']`                                                                                                                  | string[]                                                                                    | ['album', 'camera'] |\n| style                   | Style                                                                                                                                                                                     | string                                                                                      | -                   |\n| uploadingText           | Prompt copy in upload                                                                                                                                                                           | string                                                                                      | 'Uploading......'          |\n| uploadfailedText        | Prompt copy for upload failure                                                                                                                                                                         | string                                                                                      | 'Upload failed'          |\n| fileList                | File List (Controlled)                                                                                                                                                                         | [File](#file)[]                                                                             | -                   |\n| imageMode               | Picture zoom mode and crop mode. See details in [Image Mode Description](https://opendocs.alipay.com/mini/component/image#mode)                                                                                     | string                                                                                      | scaleToFill         |\n| onBeforeUpload          | The hook before uploading the file. The parameter is the list of uploaded files. If false is returned, the upload is stopped. You can return a Promise object. When you Promise an object to reject, the upload is stopped and the upload is started when it is resolve (resolve the modified localFileList is passed in). | (localFileList: [localFile](#localfile)[]) => boolean \\| Promise<[localFile](#localfile)[]> | -                   |\n| onChooseImageError      | Select picture failure callback. See details in [onChooseImageError](###onChooseImageError)                                                                                                                       | (err) => void                                                                               | -                   |\n| onUpload                | Image upload method. See details in [onUpload](#onupload)                                                                                                                                                 | (localFile: [LocalFile](#localfile)) => Promise\\<string\\>                                   | -                   |\n| onRemove                | Click the callback when removing files. Do not remove if the return value is false. Support to return a Promise object, Promise object resolve(false) or reject does not remove                                                                 | (file: [File](#file)) => boolean \\| Promise\\<boolean\\>                                      | -                   |\n| #if ALIPAY onChange     | Triggered when the list of uploaded files changes                                                                                                                                                               | (fileList: [File](#file)[]) => void                                                         | -                   |\n| #if ALIPAY onPreview    | Triggered when an image is clicked                                                                                                                                                                           | (file: [File](#file)[]) => void                                                             | -                   |\n| #if WECHAT bindchange  | Triggered when the list of uploaded files changes                                                                                                                                                               | (fileList: [File](#file)[]) => void                                                         | -                   |\n| #if WECHAT bindpreview | Triggered when an image is clicked                                                                                                                                                                           | (file: [File](#file)[]) => void                                                             | -                   |\n\n### File\n\n| Parameters   | Description                                                                           | Type   | Default Value |\n| ------ | ------------------------------------------------------------------------------ | ------ | ------ |\n| url    | image url                                                                       | string | -      |\n| status | Upload status. Optional `uploading`(Uploading),`done`(upload complete) or `error`(Upload failed) | string | -      |\n| uid    | The unique identifier. Automatically generated when not set                                                 | string | -      |\n| path   | Local Image Path                                                                   | string | -      |\n| size   | Local image size. Some models may not return this attribute                                     | number | -      |\n\n### LocalFile\n\n| Parameters | Description                                       | Type   | Default Value |\n| ---- | ------------------------------------------ | ------ | ------ |\n| path | Local Image Path                               | string | -      |\n| size | Local image size. Some models may not return this attribute | number | -      |\n\n### onUpload\n\n`onUpload` Method Receive `LocalFile`Return in the Promise. `File`. The following is the call [my.uploadFile](https://opendocs.alipay.com/mini/api/kmq4hc) Sample code for uploading:\n\n```js\nonUpload(localFile) {\n  return new Promise((resolve, reject) => {\n    my.uploadFile({\n      url: 'https://...', // 请替换成有效的服务端 url\n      fileType: 'image',\n      name: 'userfile', // 根据后台服务需求替换\n      filePath: localFile.path, // 传入 localFile.path\n      formData: { extra: '其他信息' }, // 根据后台服务需求替换\n      success: res => {\n        // 根据后台返回，得到上传成功的image url\n        const { url } = JSON.parse(res.data);\n        resolve(url); // 调用 resolve 传入image url\n      },\n      fail: err => {\n        reject(); // 上传错误调用 reject\n      },\n    });\n  });\n}\n```\n\n### onChooseImageError\n\nSelecting a picture may fail,`onChooseImageError` can get errors, you can view [my.chooseImage Error Code](https://opendocs.alipay.com/mini/api/media/image/my.chooseimage#%E9%94%99%E8%AF%AF%E7%A0%81)。\n\n```js\nonChooseImageError(err) {\n  console.log(err);\n}\n```\n\n### maxCount\n\n1. `maxCount` Indicates the maximum number of pictures that can be uploaded, and does not transmit means unlimited. Since the small program selection picture interface has an upper limit of one-time selection of pictures, if `maxCount` More than this limit, multiple uploads are required. For example,`maxCount=\"{{10}}\"`, 10 pictures are allowed to be uploaded. Users need to upload 9 pictures first and then 1 picture.\n2. `maxCount` No restrictions `defaultFileList` and `fileList`. For example,`maxCount` 1, and `defaultFileList` Contains 2 images, will not reduce `defaultFileList` in the picture. The upload button is hidden.\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                            | Default Value                                                                                                                  | Dark Mode Default                                                                                                          | Remarks                         |\n| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ---------------------------- |\n| --image-upload-cover-background   | <div style=\"width: 150px; height: 40px; background-color: rgba(0, 0, 0, 0.4); color: #ffffff;\">rgba(0, 0, 0, 0.4)</div> | <div style=\"width: 150px; height: 40px; background-color: rgba(0, 0, 0, 0.4); color: #ffffff;\">rgba(0, 0, 0, 0.4)</div> | Image upload cover background color (overlay) |\n| --image-upload-wrapper-background | <div style=\"width: 150px; height: 40px; background-color: #f5f5f5; color: #333333;\">#f5f5f5</div>                       | <div style=\"width: 150px; height: 40px; background-color: #121212; color: #ffffff;\">#121212</div>                       | Picture upload package background color         |\n| --image-upload-text-color         | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #333333;\">#ffffff</div>                       | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #333333;\">#ffffff</div>                       | Image upload text color             |\n| --image-upload-background-color   |  <div style=\"width: 150px; height: 40px; background-color: rgba(0, 0, 0, 0.4); color: #ffffff;\">rgba(0, 0, 0, 0.4)</div>                                                                                                               | <div style=\"width: 150px; height: 40px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div>                       | Image upload background color             |\n"
  },
  {
    "path": "src/ImageUpload/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-icon\": \"../Icon/index\",\n    \"loading\": \"../Loading/index\"\n  }\n}\n"
  },
  {
    "path": "src/ImageUpload/index.less",
    "content": "@import (reference) './variable.less';\n\n@imageUploadPrefix: ant-image-upload;\n\n.@{imageUploadPrefix} {\n  display: flex;\n  flex-wrap: wrap;\n  background: @image-upload-background-color;\n\n  &-show {\n    position: relative;\n  }\n\n  &-image {\n    width: 160 * @rpx;\n    height: 160 * @rpx;\n    margin: @image-upload-common-margin;\n    border-radius: @corner-radius-md;\n  }\n\n  &-close {\n    width: @image-upload-close-tip-width;\n    height: @image-upload-close-tip-height;\n    position: absolute;\n    z-index: 99;\n    top: @image-upload-size-base * -1;\n    right: 0;\n    background: url(@image-upload-close-tip-url) no-repeat;\n    background-size: cover;\n  }\n\n  &-add-image-wrapper {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    width: 160 * @rpx;\n    height: 160 * @rpx;\n    margin: @image-upload-add-image-container-margin;\n    background-color: @image-upload-wrapper-background;\n    border-radius: @corner-radius-md;\n  }\n  &-add-image-icon {\n    color: @COLOR_TEXT_ASSIST;\n  }\n  &-cover {\n    position: absolute;\n    width: 160 * @rpx;\n    height: 160 * @rpx;\n    margin: @image-upload-common-margin;\n    border-radius: @corner-radius-md;\n    background-color: @image-upload-cover-background;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n\n    &-loading {\n      text-align: center;\n\n      &-icon {\n        width: 48 * @rpx;\n        height: 48 * @rpx;\n      }\n\n      &-text {\n        color: @image-upload-text-color;\n        font-size: 24 * @rpx;\n        margin-top: 8 * @rpx;\n      }\n    }\n\n    &-error {\n      text-align: center;\n\n      &-icon {\n        font-size: 48rpx;\n        color: @image-upload-text-color;\n      }\n\n      &-text {\n        color: @image-upload-text-color;\n        font-size: 24rpx;\n        margin-top: 8rpx;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/ImageUpload/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 数据录入\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# ImageUpload 图片上传\n\n用于将图片上传到服务器，并简略展示上传文件的信息及提供预览功能。需要将本地图片或拍照后上传到服务器时使用。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-uploader\": \"antd-mini/es/ImageUpload/index\"\n#endif\n#if WECHAT\n  \"ant-uploader\": \"antd-mini/ImageUpload/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n> `onBeforeUpload`、`onUpload` 函数接收 `LocalFile`，可以定制上传相关业务逻辑。`preview` 事件是点击已上传图片触发，可以配合 [my.previewimage](https://opendocs.alipay.com/mini/api/media/image/my.previewimage) 实现图片预览。`change` 事件则将在已上传的文件列表变化时触发。\n\n```xml\n<ant-uploader\n  defaultFileList=\"{{defaultFileList}}\"\n  uploadingText=\"上传中……\"\n  uploadfailedText=\"上传失败\"\n#if ALIPAY\n  onBeforeUpload=\"onBeforeUpload\"\n  onUpload=\"onUpload\"\n  onPreview=\"onPreview\"\n  onChange=\"onChange\"\n#endif\n#if WECHAT\n  onBeforeUpload=\"{{onBeforeUpload}}\"\n  onUpload=\"{{onUpload}}\"\n  bindchange=\"onChange\"\n  bindpreview=\"onPreview\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    defaultFileList: [{ url: 'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*znK_ToIL8rQAAAAAAAAAAAAAARQnAQ', status: 'done' }],\n#if WECHAT\n    onUpload(file) {\n      return new Promise((resolve) => {\n        console.log('上传的图片为：', file);\n        setTimeout(() => {\n          resolve(\n            'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ'\n          );\n        }, 2000);\n      });\n    },\n    onBeforeUpload(localFileList) {\n      console.log('即将上传的图片列表为：', localFileList);\n      localFileList = localFileList.filter((item) => item.size < 10000);\n      console.log('修改上传的图片列表为：', localFileList);\n      return localFileList;\n    },\n#endif\n  },\n  onChange(fileList) {\n    console.log('图片列表：', fileList);\n  },\n  onPreview(file) {\n    console.log('preview', file);\n  },\n#if ALIPAY\n  onUpload(file) {\n    return new Promise((resolve) => {\n      console.log('上传的图片为：', file);\n      setTimeout(() => {\n        resolve(\n          'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ'\n        );\n      }, 2000);\n    });\n  },\n  onBeforeUpload(localFileList) {\n    console.log('即将上传的图片列表为：', localFileList);\n    localFileList = localFileList.filter((item) => item.size < 10000);\n    console.log('修改上传的图片列表为：', localFileList);\n    return localFileList;\n  },\n#endif\n});\n```\n\n### 受控模式\n\n> `fileList`和 `change` 事件配合实现受控模式。想要组件外部触发上传逻辑，通过 `ref` 的方式拿到组件实例，并调用组件中的 `chooseImage` 方法即可。\n\n```xml\n<ant-uploader\n  ref=\"handleUploaderRef\"\n  fileList=\"{{fileList}}\"\n#if ALIPAY\n  onChange=\"handleControlledChange\"\n  onUpload=\"onUpload\"\n#endif\n#if WECHAT\n  bindchange=\"handleControlledChange\"\n  onUpload=\"{{onUpload}}\"\n#endif\n/>\n<ant-button\n  size=\"medium\"\n  onTap=\"upload\"\n  type=\"primary\">\n  组件外部触发上传逻辑\n</ant-button>\n```\n\n```js\nPage({\n  data: {\n    fileList: [{ url: 'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*znK_ToIL8rQAAAAAAAAAAAAAARQnAQ', status: 'done' }],\n#if WECHAT\n    onUpload(file) {\n      return new Promise((resolve) => {\n        console.log('上传的图片为：', file);\n        setTimeout(() => {\n          resolve(\n            'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ'\n          );\n        }, 2000);\n      });\n    },\n#endif\n  },\n#if ALIPAY\n  onUpload(file) {\n    return new Promise((resolve) => {\n      console.log('上传的图片为：', file);\n      setTimeout(() => {\n        resolve(\n          'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*5m0ZQYhxhjEAAAAAAAAAAAAAARQnAQ'\n        );\n      }, 2000);\n    });\n  },\n#endif\n  handleControlledChange(fileList) {\n#if WECHAT\n    this.setData({\n      fileList: fileList.detail,\n    });\n#endif\n#if ALIPAY\n    this.setData({\n      fileList,\n    });\n#endif\n  },\n  handleUploaderRef(ref) {\n    console.log('handleUploaderRef', ref);\n#if WECHAT\n    this.handleUploaderRef = ref.detail;\n#endif\n#if ALIPAY\n    this.handleUploaderRef = ref;\n#endif\n  },\n  upload() {\n    this.handleUploaderRef.chooseImage();\n  },\n});\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/ImageUpload/index'></code>\n\n## API\n\n| 属性                    | 说明                                                                                                                                                                                     | 类型                                                                                        | 默认值              |\n| ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | ------------------- |\n| className               | 类名                                                                                                                                                                                     | string                                                                                      | -                   |\n| maxCount                | 上传图片限制的最大数量。详见 [maxCount](#maxcount)                                                                                                                                       | number                                                                                      | -                   |\n| defaultFileList         | 文件列表初始值                                                                                                                                                                           | [File](#file)[]                                                                             | []                  |\n| sourceType              | 上传选择的来源。可选 `['album']`、`['camera']` 或 `['album', 'camera']`                                                                                                                  | string[]                                                                                    | ['album', 'camera'] |\n| style                   | 样式                                                                                                                                                                                     | string                                                                                      | -                   |\n| uploadingText           | 上传中提示文案                                                                                                                                                                           | string                                                                                      | '上传中……'          |\n| uploadfailedText        | 上传失败提示文案                                                                                                                                                                         | string                                                                                      | '上传失败'          |\n| fileList                | 文件列表（受控）                                                                                                                                                                         | [File](#file)[]                                                                             | -                   |\n| imageMode               | 图片缩放模式和裁剪模式。详见 [图片 mode 说明](https://opendocs.alipay.com/mini/component/image#mode)                                                                                     | string                                                                                      | scaleToFill         |\n| onBeforeUpload          | 上传文件之前的钩子。参数为上传的文件列表，若返回 false 则停止上传。支持返回一个 Promise 对象，Promise 对象 reject 时则停止上传，resolve 时开始上传（resolve 传入修改后的 localFileList） | (localFileList: [localFile](#localfile)[]) => boolean \\| Promise<[localFile](#localfile)[]> | -                   |\n| onChooseImageError      | 选择图片失败回调。详见 [onChooseImageError](###onChooseImageError)                                                                                                                       | (err) => void                                                                               | -                   |\n| onUpload                | 图片上传方法。详见 [onUpload](#onupload)                                                                                                                                                 | (localFile: [LocalFile](#localfile)) => Promise\\<string\\>                                   | -                   |\n| onRemove                | 点击移除文件时的回调。返回值为 false 时不移除。支持返回一个 Promise 对象，Promise 对象 resolve(false) 或 reject 时不移除                                                                 | (file: [File](#file)) => boolean \\| Promise\\<boolean\\>                                      | -                   |\n| #if ALIPAY onChange     | 已上传的文件列表变化时触发                                                                                                                                                               | (fileList: [File](#file)[]) => void                                                         | -                   |\n| #if ALIPAY onPreview    | 点击图片时触发                                                                                                                                                                           | (file: [File](#file)[]) => void                                                             | -                   |\n| #if WECHAT bindchange  | 已上传的文件列表变化时触发                                                                                                                                                               | (fileList: [File](#file)[]) => void                                                         | -                   |\n| #if WECHAT bindpreview | 点击图片时触发                                                                                                                                                                           | (file: [File](#file)[]) => void                                                             | -                   |\n\n### File\n\n| 参数   | 说明                                                                           | 类型   | 默认值 |\n| ------ | ------------------------------------------------------------------------------ | ------ | ------ |\n| url    | 图片 url                                                                       | string | -      |\n| status | 上传状态。可选 `uploading`（上传中）、`done`（上传完成）或 `error`（上传失败） | string | -      |\n| uid    | 唯一标识符。不设置时会自动生成                                                 | string | -      |\n| path   | 本地图片路径                                                                   | string | -      |\n| size   | 本地图片大小。有的机型可能没有返回这个属性                                     | number | -      |\n\n### LocalFile\n\n| 参数 | 说明                                       | 类型   | 默认值 |\n| ---- | ------------------------------------------ | ------ | ------ |\n| path | 本地图片路径                               | string | -      |\n| size | 本地图片大小。有的机型可能没有返回这个属性 | number | -      |\n\n### onUpload\n\n`onUpload` 方法接收 `LocalFile`，在 Promise 里返回 `File`。以下是调用 [my.uploadFile](https://opendocs.alipay.com/mini/api/kmq4hc) 进行上传的示例代码：\n\n```js\nonUpload(localFile) {\n  return new Promise((resolve, reject) => {\n    my.uploadFile({\n      url: 'https://...', // 请替换成有效的服务端 url\n      fileType: 'image',\n      name: 'userfile', // 根据后台服务需求替换\n      filePath: localFile.path, // 传入 localFile.path\n      formData: { extra: '其他信息' }, // 根据后台服务需求替换\n      success: res => {\n        // 根据后台返回，得到上传成功的图片 url\n        const { url } = JSON.parse(res.data);\n        resolve(url); // 调用 resolve 传入图片 url\n      },\n      fail: err => {\n        reject(); // 上传错误调用 reject\n      },\n    });\n  });\n}\n```\n\n### onChooseImageError\n\n选择图片可能会失败，`onChooseImageError` 可获取错误，可以查看 [my.chooseImage 错误码](https://opendocs.alipay.com/mini/api/media/image/my.chooseimage#%E9%94%99%E8%AF%AF%E7%A0%81)。\n\n```js\nonChooseImageError(err) {\n  console.log(err);\n}\n```\n\n### maxCount\n\n1. `maxCount` 表示最多可以上传的图片数量，不传表示无限制。由于小程序选择图片界面有一次性选择图片的上限，如果 `maxCount` 大于此上限，则需要多次上传。例如，`maxCount=\"{{10}}\"`，允许上传 10 张图片，用户需先上传 9 张，之后再上传 1 张。\n2. `maxCount` 不限制 `defaultFileList` 和 `fileList`。例如，`maxCount` 为 1，而 `defaultFileList` 包含 2 张图片，不会减少 `defaultFileList` 里的图片。上传按钮则会隐藏。\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                            | 默认值                                                                                                                  | 深色模式默认值                                                                                                          | 备注                         |\n| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ---------------------------- |\n| --image-upload-cover-background   | <div style=\"width: 150px; height: 40px; background-color: rgba(0, 0, 0, 0.4); color: #ffffff;\">rgba(0, 0, 0, 0.4)</div> | <div style=\"width: 150px; height: 40px; background-color: rgba(0, 0, 0, 0.4); color: #ffffff;\">rgba(0, 0, 0, 0.4)</div> | 图片上传封面背景颜色（覆盖） |\n| --image-upload-wrapper-background | <div style=\"width: 150px; height: 40px; background-color: #f5f5f5; color: #333333;\">#f5f5f5</div>                       | <div style=\"width: 150px; height: 40px; background-color: #121212; color: #ffffff;\">#121212</div>                       | 图片上传包裹背景颜色         |\n| --image-upload-text-color         | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #333333;\">#ffffff</div>                       | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #333333;\">#ffffff</div>                       | 图片上传文本颜色             |\n| --image-upload-background-color   |  <div style=\"width: 150px; height: 40px; background-color: rgba(0, 0, 0, 0.4); color: #ffffff;\">rgba(0, 0, 0, 0.4)</div>                                                                                                               | <div style=\"width: 150px; height: 40px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div>                       | 图片上传背景颜色             |\n"
  },
  {
    "path": "src/ImageUpload/index.ts",
    "content": "import { effect } from '@preact/signals-core';\nimport createValue from '../mixins/value';\nimport { chooseImage } from '../_util/jsapi/choose-image';\nimport {\n  ComponentWithSignalStoreImpl,\n  getValueFromProps,\n  triggerEvent,\n} from '../_util/simply';\nimport { assertAilpayNativeNotSupport } from '../_util/support';\nimport i18nController from '../_util/store';\nimport { File, LocalFile, UploaderDefaultProps } from './props';\n\nassertAilpayNativeNotSupport('ImageUpload');\n\nComponentWithSignalStoreImpl({\n  storeOptions: {\n    store: () => i18nController,\n    updateHook: effect,\n    mapState: {\n      locale: ({ store }) => store.currentLocale.value,\n    },\n  },\n  props: UploaderDefaultProps,\n  methods: {\n    async chooseImage() {\n      const [onBeforeUpload, onUpload, onChooseImageError] = getValueFromProps(\n        this,\n        ['onBeforeUpload', 'onUpload', 'onChooseImageError']\n      );\n      if (!onUpload) {\n        throw new Error('need props onUpload');\n      }\n      const fileList = this.getValue();\n      const [maxCount, sourceType] = getValueFromProps(this, [\n        'maxCount',\n        'sourceType',\n      ]);\n\n      let localFileList: LocalFile[];\n      try {\n        const chooseImageRes = await chooseImage({\n          count:\n            typeof maxCount === 'number' && !isNaN(maxCount)\n              ? maxCount - fileList.length\n              : 9999,\n          sourceType,\n        });\n        localFileList = (\n          chooseImageRes.tempFiles ||\n          chooseImageRes.tempFilePaths ||\n          chooseImageRes.apFilePaths ||\n          chooseImageRes.filePaths ||\n          []\n        )\n          .map((item) => {\n            if (typeof item === 'string') {\n              return {\n                path: item,\n              };\n            }\n            if (item.path) {\n              return {\n                path: item.path,\n                size: item.size,\n              };\n            }\n          })\n          .filter((item) => !!item);\n      } catch (err) {\n        onChooseImageError(err);\n        return;\n      }\n\n      if (onBeforeUpload) {\n        try {\n          const beforeUploadRes = await onBeforeUpload(localFileList);\n          if (beforeUploadRes === false) {\n            return;\n          }\n          if (Array.isArray(beforeUploadRes)) {\n            localFileList = beforeUploadRes;\n          }\n        } catch (err) {\n          return;\n        }\n      }\n\n      const tasks = localFileList.map((file) => this.uploadFile(file));\n      await Promise.all(tasks);\n    },\n\n    async uploadFile(localFile: LocalFile) {\n      const onUpload = getValueFromProps(this, 'onUpload');\n\n      const uid = this.getCount();\n      const tempFileList = [\n        ...this.getValue(),\n        {\n          path: localFile.path,\n          size: localFile.size,\n          uid,\n          status: 'uploading',\n        },\n      ];\n\n      if (!this.isControlled()) {\n        this.update(tempFileList);\n      }\n\n      triggerEvent(this, 'change', tempFileList);\n\n      try {\n        const url = await onUpload(localFile);\n        if (typeof url !== 'string' || !url) {\n          this.updateFile(uid, {\n            status: 'error',\n          });\n          return;\n        }\n        this.updateFile(uid, {\n          status: 'done',\n          url,\n        });\n      } catch (err) {\n        this.updateFile(uid, {\n          status: 'error',\n        });\n      }\n    },\n\n    updateFile(uid: string, file: Partial<File>) {\n      const fileList = this.getValue();\n      const tempFileList = fileList.map((item) => {\n        if (item.uid === uid) {\n          return {\n            ...item,\n            ...file,\n          };\n        }\n        return item;\n      });\n      if (!this.isControlled()) {\n        this.update(tempFileList);\n      }\n\n      triggerEvent(this, 'change', tempFileList);\n    },\n\n    async onRemove(e) {\n      const fileList = this.getValue();\n      const onRemove = getValueFromProps(this, 'onRemove');\n      const { uid } = e.currentTarget.dataset;\n      const file = fileList.find((item) => item.uid === uid);\n\n      if (onRemove) {\n        const result = await onRemove(file);\n        if (result === false) {\n          return;\n        }\n      }\n      const tempFileList = fileList.filter((item) => item.uid !== uid);\n      if (!this.isControlled()) {\n        this.update(tempFileList);\n      }\n\n      triggerEvent(this, 'change', tempFileList);\n    },\n\n    onPreview(e) {\n      const { uid } = e.currentTarget.dataset;\n      const fileList = this.getValue();\n      const file = fileList.find((item) => item.uid === uid);\n      triggerEvent(this, 'preview', file);\n    },\n    updateShowUploadButton() {\n      const maxCount = getValueFromProps(this, 'maxCount');\n      this.setData({\n        showUploadButton: !maxCount || this.getValue().length < maxCount,\n      });\n    },\n    count: 0,\n\n    getCount() {\n      // 使用 Date.now() 与 useId 作为前缀，防止每次前缀都相同\n      this.count = (this.count || 0) + 1;\n      // 使用 Date.now() 与 useId 作为前缀，防止每次前缀都相同\n      let id = this.id;\n      /// #if ALIPAY\n      id = this.$id;\n      /// #endif\n      const prefix = id + '-' + Date.now();\n      return `${prefix}-${this.count}`;\n    },\n  },\n  mixins: [\n    createValue({\n      defaultValueKey: 'defaultFileList',\n      valueKey: 'fileList',\n      transformValue(fileList = []) {\n        return {\n          needUpdate: true,\n          value: (fileList || []).map((item) => {\n            const file = {\n              ...item,\n            };\n            if (typeof item.url === 'undefined') {\n              file.url = '';\n            }\n            if (typeof item.uid === 'undefined') {\n              file.uid = this.getCount();\n            }\n            if (typeof item.status === 'undefined') {\n              file.status = 'done';\n            }\n            return file;\n          }),\n        };\n      },\n    }),\n  ],\n  /// #if ALIPAY\n  didMount() {\n    this.updateShowUploadButton();\n  },\n  didUpdate(prevProps, prevData) {\n    if (!this.isEqualValue(prevData)) {\n      this.updateShowUploadButton();\n    }\n  },\n  /// #endif\n  /// #if WECHAT\n  attached() {\n    this.triggerEvent('ref', this);\n    this.updateShowUploadButton();\n    this._prevData = this.data;\n  },\n  observers: {\n    '**': function (data) {\n      const prevData = this._prevData || this.data;\n      this._prevData = { ...data };\n      if (!this.isEqualValue(prevData)) {\n        this.updateShowUploadButton();\n      }\n    },\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/ImageUpload/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\nexport type Status = 'uploading' | 'done' | 'error';\nexport interface File {\n  /**\n   *  @description 唯一标识符，不设置时会自动生成\n   */\n  uid?: string;\n\n  /**\n   * @description 图片的资源地址\n   */\n  url: string;\n\n  /**\n   * @description 上传状态\n   */\n  status?: Status;\n}\n\nexport interface LocalFile {\n  path: string;\n  size?: number;\n}\n\nexport interface IUploaderProps extends IBaseProps {\n  /**\n   * @description 默认已经上传的文件列表\n   * @default []\n   */\n  defaultFileList: File[];\n\n  /**\n   * @description 已经上传的文件列表（受控）\n   */\n  fileList: File[];\n\n  /**\n   * @description 上传图片的最大数量\n   */\n  maxCount: number;\n\n  /**\n   * @description 图片缩放模式和裁剪模式\n   * @default 'scaleToFill'\n   */\n  imageMode:\n    | 'scaleToFill'\n    | 'aspectFit'\n    | 'aspectFill'\n    | 'widthFix'\n    | 'heightFix'\n    | 'top'\n    | 'bottom'\n    | 'center'\n    | 'left'\n    | 'right'\n    | 'top left'\n    | 'top right'\n    | 'bottom left'\n    | 'bottom right';\n\n  /**\n   * @description 视频选择的来源\n   * @default ['album', 'camera']\n   */\n  sourceType: ['album'] | ['camera'] | ['camera', 'album'];\n\n  /**\n   * @description 图片上传前的回调函数，返回 false 可终止图片上传，支持返回 Promise\n   */\n  onBeforeUpload?: (\n    localFileList: LocalFile[]\n  ) => boolean | Promise<LocalFile[]>;\n\n  /**\n   * @description 选择图片失败回调\n   */\n  onChooseImageError?: (err: any) => void;\n\n  /**\n   * @description 已上传的文件列表变化时触发\n   */\n  onChange?: (v: Array<File>) => void;\n\n  /**\n   * @description 删除当前列表中的图片时触发，包括上传成功和上传失败的图片，如果返回 false 表示阻止删除，支持返回 Promise\n   */\n  onRemove?: (v: File) => boolean | Promise<boolean>;\n\n  /**\n   * @description 点击图片进行预览时触发，会覆盖默认的预览功能\n   */\n  onPreview?: (v: Array<File>) => void;\n\n  /**\n   * @description 自定义上传方式，只在不存在action字段时生效\n   */\n  onUpload?: (localFile: LocalFile) => Promise<string>;\n  /**\n   * @description 上传中文案\n   * @default \"上传中……\"\n   */\n  uploadingText?: string;\n  /**\n   * @description 上传失败文案\n   * @default \"上传失败\"\n   */\n  uploadfailedText?: string;\n}\n\nexport const UploaderDefaultProps: Partial<IUploaderProps> = {\n  defaultFileList: [],\n  fileList: null,\n  maxCount: null,\n  imageMode: 'scaleToFill',\n  sourceType: ['camera', 'album'],\n  onUpload: null,\n  onBeforeUpload: null,\n  onRemove: null,\n  uploadingText: null,\n  uploadfailedText: null,\n};\n"
  },
  {
    "path": "src/ImageUpload/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n@image-upload-size-base: 4 * @rpx;\n\n@image-upload-margin-size-base: 4 * @rpx;\n@image-upload-margin-size-1: @image-upload-margin-size-base * 1;\n@image-upload-margin-size-2: @image-upload-margin-size-base * 2;\n@image-upload-margin-size-3: @image-upload-margin-size-base * 3;\n\n@image-upload-common-margin: @image-upload-margin-size-1\n  @image-upload-margin-size-2;\n@image-upload-add-image-container-margin: @image-upload-margin-size-1\n  @image-upload-margin-size-2 @image-upload-margin-size-3;\n\n@image-upload-close-tip-width: @image-upload-size-base * 10;\n@image-upload-close-tip-height: @image-upload-size-base * 10;\n\n@image-upload-close-tip-url: 'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*_Az1QavR4OsAAAAAAAAAAAAAARQnAQ';\n\n@image-upload-background-color: var(\n  --image-upload-background-color,\n  @COLOR_CARD\n);\n@image-upload-wrapper-background: var(\n  --image-upload-wrapper-background,\n  @COLOR_GREY_CARD\n);\n@image-upload-cover-background: var(\n  --image-upload-cover-background,\n  rgba(0, 0, 0, 0.4)\n);\n@image-upload-text-color: var(--image-upload-text-color, @COLOR_WHITE);\n"
  },
  {
    "path": "src/IndexBar/index.axml",
    "content": "<view\n  class=\"ant-indexbar-side {{className}}\"\n  disable-scroll=\"{{true}}\"\n  style=\"{{style}}\"\n  hover-stop-propagation>\n  <view\n    a:if=\"{{showMask}}\"\n    class=\"ant-indexbar-side-mask\"></view>\n  <view class=\"ant-indexbar-side-content\">\n    <view\n      a:for=\"{{items}}\"\n      a:key=\"label\"\n      class=\"ant-indexbar-side-item\"\n      catchTouchStart=\"onTouchStart\"\n      catchTouchMove=\"onTouchMove\"\n      catchTouchEnd=\"onTouchEnd\"\n      data-item=\"{{item, index}}\"\n      id=\"{{'ant-alphabet-' + index}}\"\n      style=\"width: {{size}}px; height: {{size}}px;\">\n      <view\n        style=\"width: {{size}}px; height: {{size}}px;\"\n        class=\"ant-indexbar-side-item-default {{activeClassName}} {{touchKey ? ((touchKey === item.label) ? 'ant-indexbar-side-active' : '') : (index === currentKey ? 'ant-indexbar-side-active' : '')}}\">\n        {{item.label}}\n      </view>\n      <view\n        class=\"ant-indexbar-side-item-tip\"\n        a:if=\"{{item.label === touchKey && !item.disablePreview && moving}}\">\n        {{item.label}}\n        <slot\n          value=\"{{item}}\"\n          index=\"{{index}}\"\n          name=\"labelPreview\" />\n      </view>\n    </view>\n  </view>\n</view>\n\n<!-- #if ALIPAY -->\n<scroll-view\n  a:if=\"{{ hasDefaultSlot }}\"\n  scroll-y\n  class=\"ant-indexbar-side-scroll {{hasDefaultSlot && topRange.length === 0 ? 'ant-indexbar-side-notSee' : ''}}\"\n  scroll-into-view=\"{{`ant-indexbar-${touchKey}`}}\"\n  onScroll=\"onScroll\">\n  <view\n    a:for=\"{{items}}\"\n    a:key=\"label\"\n    class=\"ant-indexbar-side-list\"\n    id=\"{{`ant-indexbar-${item.label}`}}\">\n    <slot\n      value=\"{{item}}\"\n      index=\"{{index}}\" />\n  </view>\n</scroll-view>\n<!-- #endif -->\n"
  },
  {
    "path": "src/IndexBar/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Information Display\n  order: 8\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# IndexBar\n\nSide index component. Used to quickly locate a list index.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n  \"ant-index-bar\": \"antd-mini/es/IndexBar/index\"\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<view class=\"base\">\n  <ant-list header=\"Basic use\"></ant-list>\n  <view class=\"indexbar\">\n    <ant-index-bar items=\"{{items}}\" />\n  </view>\n</view>\n```\n\n```css\n.base {\n  position: fixed;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n}\n.indexbar {\n  width: calc(100% - 20px);\n  display: flex;\n  align-items: center;\n  justify-content: flex-end;\n}\n```\n\n```js\nPage({\n  data: {\n    items: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('').map((u) => {\n      return { label: u };\n    }),\n  },\n});\n```\n\n### Use in conjunction with a list\n\n```xml\n#if ALIPAY\n<view class=\"base\">\n  <ant-index-bar\n    className=\"indexbar\"\n    items=\"{{items}}\"\n    defaultCurrent=\"H\"\n    onChange=\"onChange\">\n    <view slot-scope=\"props\">\n      <ant-list header=\"{{props.value.label}}\">\n        <ant-list-item\n          a:for=\"{{4}}\"\n          a:for-item=\"itemX\">\n          {{props.value.label}}-{{itemX}}\n        </ant-list-item>\n      </ant-list>\n    </view>\n  </ant-index-bar>\n</view>\n#endif\n#if WECHAT\n因微信不支持作用域插槽，暂不支持此用法\n#endif\n```\n\n```css\n#if ALIPAY .base {\n  width: 100%;\n  height: 100vh;\n}\n.indexbar {\n  position: fixed;\n  right: 10px;\n  top: 20vh;\n}\n# endif #if WECHAT Because WeChat does not support scope slots, this usage is temporarily not supported# endif;\n```\n\n```js\n#if ALIPAY\nPage({\n  data: {\n    items: [],\n  },\n  onLoad() {\n    this.setData({\n      items: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('').map((u) => {\n        return { label: u };\n      }),\n    });\n  },\n});\n#endif\n#if WECHAT\n因微信不支持作用域插槽，暂不支持此用法\n#endif\n```\n\n### Controlled Mode\n\n> Reference below [Demo Code](#demo-代码) implementation in.\n\n### Demo Code\n\n<code src='../../demo/pages/IndexBar/index'></code>\n\n## API\n\n| Property                   | Description                              | Type                                          | Default Value |\n| ---------------------- | --------------------------------- | --------------------------------------------- | ------ |\n| activeClassName        | Style when index is active                  | string                                        | -      |\n| className              | Class Name                              | string                                        | -      |\n| current                | Index value                            | string                                        | -      |\n| defaultCurrent         | Default Index                          | string                                        | -      |\n| labelPreview           | Index preview content, receiving value and index | slot                                          | -      |\n| items                  | Index Array                          | [Item](#item)                                 | []     |\n| style                  | Style                              | string                                        | -      |\n| size                   | Dimensions of the index (width and height in px)       | number                                        | 16     |\n| vibrate                | Whether it vibrates when the index changes                | boolean                                       | true   |\n| #if ALIPAY onChange    | Callback when index changes                  | (value: [Item](#item), index: number) => void |\n| #if WECHAT bindchange | Callback when index changes                  | (value: [Item](#item), index: number) => void |\n\n#### Item\n\n| Property           | Description                     | Type    | Default Value |\n| -------------- | ------------------------ | ------- | ------ |\n| label          | Index ID                 | string  | -      |\n| disablePreview | Disable preview effect when index is triggered | boolean | -      |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For more information, see ConfigProvider Components.\n\n| Variable name                           | Default Value                                                                                            | Dark Mode Default                                                                                    | Remarks               |\n| -------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------ |\n| --index-bar-tip-background-color | <div style=\"width: 150px; height: 30px; background-color: #cccccc; color: #333333;\">#cccccc</div> | <div style=\"width: 150px; height: 30px; background-color: #474747; color: #ffffff;\">#474747</div> | Index bar prompt background color |\n| --index-bar-text-color           | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | Index column text color     |\n| --index-bar-assist-color         | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | Index Bar Secondary Text Color |\n| --index-bar-active-color         | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | Index Bar Activation Color     |\n"
  },
  {
    "path": "src/IndexBar/index.json",
    "content": "{  \n  \"styleIsolation\": \"shared\",\n  \"component\": true\n}\n"
  },
  {
    "path": "src/IndexBar/index.less",
    "content": "@import (reference) './variable.less';\n\n.ant-indexbar-side {\n  z-index: 9;\n  &-mask {\n    position: fixed;\n    width: 100vw;\n    height: 100vh;\n    left: 0;\n    top: 0;\n    z-index: 9;\n  }\n  &-content {\n    width: 100%;\n    height: 100%;\n    justify-content: center;\n    align-items: center;\n    text-align: center;\n  }\n  &-item {\n    position: relative;\n    padding-left: 20 * @rpx;\n    &-default {\n      font-size: 22 * @rpx;\n      font-weight: bold;\n      color: @index-bar-assist-color;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n    }\n    &-tip {\n      position: absolute;\n      left: -158 * @rpx;\n      top: 50%;\n      transform: translateY(-50%);\n      width: 94 * @rpx;\n      height: 94 * @rpx;\n      border-radius: 94 * @rpx;\n      line-height: 94 * @rpx;\n      text-align: center;\n      background: @index-bar-tip-background-color;\n      color: @index-bar-text-color;\n      font-size: 50 * @rpx;\n    }\n  }\n  &-active {\n    border-radius: 16 * @rpx;\n    background-color: @index-bar-active-color;\n    color: @index-bar-text-color;\n  }\n  &-scroll {\n    width: 100%;\n    height: 100%;\n    overflow: scroll;\n    scrollbar-width: none;\n  }\n  &-notSee {\n    position: fixed;\n    left: -200%;\n    top: 0;\n    z-index: -1;\n  }\n}\n"
  },
  {
    "path": "src/IndexBar/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 数据展示\n  order: 8\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# IndexBar 索引\n\n侧边索引组件。用于快速定位列表索引。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n  \"ant-index-bar\": \"antd-mini/es/IndexBar/index\"\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<view class=\"base\">\n  <ant-list header=\"基本使用\"></ant-list>\n  <view class=\"indexbar\">\n    <ant-index-bar items=\"{{items}}\" />\n  </view>\n</view>\n```\n\n```css\n.base {\n  position: fixed;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n}\n.indexbar {\n  width: calc(100% - 20px);\n  display: flex;\n  align-items: center;\n  justify-content: flex-end;\n}\n```\n\n```js\nPage({\n  data: {\n    items: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('').map((u) => {\n      return { label: u };\n    }),\n  },\n});\n```\n\n### 结合列表使用\n\n```xml\n#if ALIPAY\n<view class=\"base\">\n  <ant-index-bar\n    className=\"indexbar\"\n    items=\"{{items}}\"\n    defaultCurrent=\"H\"\n    onChange=\"onChange\">\n    <view slot-scope=\"props\">\n      <ant-list header=\"{{props.value.label}}\">\n        <ant-list-item\n          a:for=\"{{4}}\"\n          a:for-item=\"itemX\">\n          {{props.value.label}}-{{itemX}}\n        </ant-list-item>\n      </ant-list>\n    </view>\n  </ant-index-bar>\n</view>\n#endif\n#if WECHAT\n因微信不支持作用域插槽，暂不支持此用法\n#endif\n```\n\n```css\n#if ALIPAY .base {\n  width: 100%;\n  height: 100vh;\n}\n.indexbar {\n  position: fixed;\n  right: 10px;\n  top: 20vh;\n}\n#endif #if WECHAT 因微信不支持作用域插槽，暂不支持此用法 #endif;\n```\n\n```js\n#if ALIPAY\nPage({\n  data: {\n    items: [],\n  },\n  onLoad() {\n    this.setData({\n      items: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('').map((u) => {\n        return { label: u };\n      }),\n    });\n  },\n});\n#endif\n#if WECHAT\n因微信不支持作用域插槽，暂不支持此用法\n#endif\n```\n\n### 受控模式\n\n> 参考下面 [Demo 代码](#demo-代码) 中的实现。\n\n### Demo 代码\n\n<code src='../../demo/pages/IndexBar/index'></code>\n\n## API\n\n| 属性                   | 说明                              | 类型                                          | 默认值 |\n| ---------------------- | --------------------------------- | --------------------------------------------- | ------ |\n| activeClassName        | 索引激活时的样式                  | string                                        | -      |\n| className              | 类名                              | string                                        | -      |\n| current                | 索引值                            | string                                        | -      |\n| defaultCurrent         | 默认索引                          | string                                        | -      |\n| labelPreview           | 索引预览内容，接收 value 和 index | slot                                          | -      |\n| items                  | 索引数组                          | [Item](#item)                                 | []     |\n| style                  | 样式                              | string                                        | -      |\n| size                   | 索引的尺寸（宽高，单位 px）       | number                                        | 16     |\n| vibrate                | 索引改变时是否震动                | boolean                                       | true   |\n| #if ALIPAY onChange    | 索引改变时的回调                  | (value: [Item](#item), index: number) => void |\n| #if WECHAT bindchange | 索引改变时的回调                  | (value: [Item](#item), index: number) => void |\n\n#### Item\n\n| 属性           | 说明                     | 类型    | 默认值 |\n| -------------- | ------------------------ | ------- | ------ |\n| label          | 索引标识                 | string  | -      |\n| disablePreview | 禁用索引触发时的预览效果 | boolean | -      |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                           | 默认值                                                                                            | 深色模式默认值                                                                                    | 备注               |\n| -------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------ |\n| --index-bar-tip-background-color | <div style=\"width: 150px; height: 30px; background-color: #cccccc; color: #333333;\">#cccccc</div> | <div style=\"width: 150px; height: 30px; background-color: #474747; color: #ffffff;\">#474747</div> | 索引栏提示背景颜色 |\n| --index-bar-text-color           | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | 索引栏文本颜色     |\n| --index-bar-assist-color         | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | 索引栏辅助文本颜色 |\n| --index-bar-active-color         | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | 索引栏激活颜色     |\n"
  },
  {
    "path": "src/IndexBar/index.ts",
    "content": "import equal from 'fast-deep-equal';\nimport {\n  getAllInstanceBoundingClientRect,\n  getInstanceBoundingClientRect,\n} from '../_util/jsapi/get-instance-bounding-client-rect';\nimport {\n  Component,\n  getValueFromProps,\n  triggerEventValues,\n} from '../_util/simply';\nimport { assertAilpayNativeNotSupport } from '../_util/support';\nimport { IndexBarDefaultProps } from './props';\n\nassertAilpayNativeNotSupport('IndexBar');\n\nComponent({\n  props: IndexBarDefaultProps,\n  data: {\n    touchClientY: 0, // 按下触摸点所处页面的高度\n    touchKeyIndex: -1, // 选中的字母\n    touchKey: '', // 触发的key\n    itemHeight: 16, // 每个字母的高度\n    moving: false, // 滑动进行时\n    showMask: false, // 打开遮罩，防止和页面的滑动重叠了\n    currentKey: 0,\n    topRange: [],\n    hasDefaultSlot: true,\n  },\n  methods: {\n    getInstance() {\n      if (this.$id) {\n        return my;\n      }\n      return this;\n    },\n    init(nextProps) {\n      const { defaultCurrent, current, items } = nextProps;\n      this.initItemHeight();\n      /// #if ALIPAY\n      this.initTopRange();\n      /// #endif\n      const initCurrent = this.isControlled(nextProps)\n        ? current\n        : defaultCurrent;\n      const _index = items?.findIndex((u) => initCurrent === u.label);\n      this.setData(\n        {\n          currentKey: _index,\n          touchKeyIndex: _index,\n          touchKey: initCurrent,\n        },\n        () => {\n          this.setData({\n            touchKeyIndex: -1,\n            touchKey: '',\n          });\n        }\n      );\n    },\n    isControlled(nextProps, valueKey = 'current') {\n      if ('controlled' in nextProps) {\n        return nextProps.controlled;\n      }\n      return valueKey in nextProps;\n    },\n    // 初始化每个块的高度，用已计算滑动距离\n    async initItemHeight() {\n      const ret = await getInstanceBoundingClientRect(\n        this.getInstance(),\n        `#ant-alphabet-0`\n      );\n      if (ret === null) return;\n      const { height } = ret;\n      this.setData({ itemHeight: height });\n    },\n    onTouchStart(e: any) {\n      const { moving } = this.data;\n      const items = getValueFromProps(this, 'items');\n      if (moving) return;\n\n      const { item, index } = e.currentTarget.dataset.item;\n      const point = (e && e.touches && e.touches[0]) || {};\n      const { clientY } = point;\n\n      this.setData({\n        touchClientY: clientY,\n        touchKeyIndex: index,\n        touchKey: items[index].label,\n        moving: true,\n        showMask: true,\n        currentKey: index,\n      });\n\n      this.onAlphabetClick(item, index); // 触摸开始\n    },\n    async onAlphabetClick(item, index) {\n      const vibrate = getValueFromProps(this, 'vibrate');\n      /// #if ALIPAY\n      vibrate && (await my.vibrateShort());\n      /// #endif\n      /// #if WECHAT\n      // @ts-ignore\n      vibrate && (await wx.vibrateShort());\n      /// #endif\n      triggerEventValues(this, 'change', [item, index]);\n    },\n    onTouchEnd() {\n      // 没进入moving状态就不处理\n      if (!this.data.moving) return;\n\n      this.setData({\n        touchKeyIndex: -1,\n        touchKey: '',\n        showMask: false,\n        moving: false,\n      });\n    },\n    onTouchMove(e: any) {\n      const { touchClientY, touchKeyIndex, itemHeight, touchKey } = this.data;\n      const items = getValueFromProps(this, 'items');\n      const point = e.changedTouches[0];\n      const movePageY = point.clientY;\n      // 滑动距离\n      const movingHeight = Math.abs(movePageY - touchClientY);\n\n      // 滑动几个itemHeight的距离即等于滑动了几格，不那么精准，但是几乎可以忽略不计\n      const movingNum = parseInt(`${movingHeight / itemHeight}`, 10);\n      // 上 or 下\n      const isUp = movePageY < touchClientY;\n      // 新的触发的索引应该在哪个index\n      const newIndex = isUp\n        ? touchKeyIndex - movingNum\n        : touchKeyIndex + movingNum;\n\n      // 超出索引列表范围 or 索引没变化return\n      if (!items[newIndex] || touchKey === items[newIndex].label) return;\n      // 结算\n      this.setData({ touchKey: items[newIndex].label, currentKey: newIndex });\n      this.onAlphabetClick(items[newIndex], newIndex);\n    },\n    onScroll(e) {\n      const { topRange, currentKey, moving } = this.data;\n      const items = getValueFromProps(this, 'items');\n      const { scrollTop } = e.detail;\n      let newIndex = 0;\n      if (scrollTop + 1 > topRange[topRange.length - 1]) {\n        newIndex = topRange.length;\n      } else {\n        newIndex = topRange?.findIndex((h) => scrollTop + 1 < h);\n      }\n      if (currentKey !== newIndex - 1 && newIndex - 1 >= 0 && !moving) {\n        this.setData({\n          currentKey: newIndex - 1,\n        });\n        this.onAlphabetClick(items[newIndex - 1], newIndex - 1);\n      }\n    },\n    async initTopRange() {\n      const ret = await getAllInstanceBoundingClientRect(\n        this.getInstance(),\n        '.ant-indexbar-side-list'\n      );\n      if (ret.length === 0) return;\n      const arr = [];\n      ret.forEach((u) => {\n        arr.push(u.top - ret[0].top);\n      });\n      this.setData({ topRange: arr, hasDefaultSlot: !!ret[0].height });\n    },\n  },\n\n  /// #if ALIPAY\n  didMount() {\n    this.init(getValueFromProps(this));\n  },\n  deriveDataFromProps(nextProps) {\n    const _prop = getValueFromProps(this);\n    const { current, items } = nextProps;\n    if (!equal(_prop.items, nextProps.items)) {\n      this.init(nextProps);\n    }\n    if (_prop.current !== current) {\n      const _index = items?.findIndex((u) => current === u.label);\n      this.setData({\n        currentKey: _index,\n      });\n      if (!this.isControlled(nextProps)) {\n        this.setData({\n          touchKeyIndex: _index,\n          touchKey: current,\n        });\n      }\n    }\n  },\n  /// #endif\n  /// #if WECHAT\n  attached() {\n    this.init(getValueFromProps(this));\n  },\n  observers: {\n    '**': function (data) {\n      const prevData = this._prevData || this.data;\n      this._prevData = { ...data };\n      if (!equal(prevData.items, data.items)) {\n        this.init(data.items);\n      }\n      if (!equal(prevData.current, data.current)) {\n        const _index = data.items.findIndex((u) => data.current === u.label);\n        this.setData({\n          currentKey: _index,\n        });\n        if (!this.isControlled(data)) {\n          this.setData({\n            touchKeyIndex: _index,\n            touchKey: data.current,\n          });\n        }\n      }\n    },\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/IndexBar/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\ninterface ItemObj {\n  label: string;\n  disablePreview?: boolean;\n}\n\nexport interface IndexBarProps extends IBaseProps {\n  /**\n   * @description 触发的索引样式\n   */\n  activeClassName: string;\n  /**\n   * @description 默认触发的索引\n   */\n  defaultCurrent: string;\n  /**\n   * @description 触发的索引\n   */\n  current: string;\n  /**\n   * @description 索引触发时是否震动\n   */\n  vibrate: boolean;\n  /**\n   * @description 索引列表\n   */\n  items: ItemObj[];\n  /**\n   * @description 索引的尺寸\n   */\n  size: number;\n  /**\n   * @description 触发索引时的回调\n   */\n  onChange: (value: ItemObj, index: number) => void;\n}\n\nexport const IndexBarDefaultProps: Partial<IndexBarProps> = {\n  className: '',\n  activeClassName: '',\n  defaultCurrent: null,\n  vibrate: true,\n  items: [],\n  size: 16,\n  style: '',\n  onChange: (value, index) => {},\n};\n"
  },
  {
    "path": "src/IndexBar/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n@index-bar-tip-background-color: var(\n  --index-bar-tip-background-color,\n  @COLOR_TEXT_WEAK\n);\n@index-bar-text-color: var(--index-bar-text-color, @COLOR_WHITE);\n@index-bar-assist-color: var(--index-bar-assist-color, @COLOR_TEXT_ASSIST);\n@index-bar-active-color: var(--index-bar-active-color, @COLOR_BRAND1);\n"
  },
  {
    "path": "src/Input/InputBlur/index.axml",
    "content": "<input\n  enableNative=\"{{ enableNative }}\"\n  name=\"{{ name }}\"\n  class=\"{{ className }}\"\n  style=\"{{ style }}\"\n  disabled=\"{{ disabled }}\"\n  value=\"{{ state.value }}\"\n  type=\"{{ type }}\"\n  password=\"{{ password }}\"\n  placeholder=\"{{ placeholder  }}\"\n  placeholder-class=\"ant-input-item-placeholder-base {{ placeholderClassName ? placeholderClassName : '' }}\"\n  placeholder-style=\"{{ placeholderStyle ? placeholderStyle : '' }}\"\n  maxlength=\"{{ maxLength }}\"\n  focus=\"{{ focus }}\"\n  confirm-type=\"{{ confirmType }}\"\n  confirm-hold=\"{{ confirmHold }}\"\n  always-system=\"{{ alwaysSystem }}\"\n  cursor=\"{{ cursor }}\"\n  selection-start=\"{{ selectionStart }}\"\n  selection-end=\"{{ selectionEnd }}\"\n  random-number=\"{{ randomNumber }}\"\n  onInput=\"onChange\"\n  onConfirm=\"onConfirm\"\n  onFocus=\"onFocus\"\n  onBlur=\"onBlur\"\n/>\n"
  },
  {
    "path": "src/Input/InputBlur/index.json",
    "content": "{  \n  \"styleIsolation\": \"shared\",\n  \"component\": true\n}\n"
  },
  {
    "path": "src/Input/InputBlur/index.ts",
    "content": "import mixinValue from '../../mixins/value';\nimport { Component, triggerEvent } from '../../_util/simply';\nimport { InputBlurDefaultProps } from './props';\n\nComponent({\n  props: InputBlurDefaultProps,\n  focus: false,\n  methods: {\n    onChange(e) {\n      const value = e.detail.value;\n      if (this.isControlled()) {\n        this.update(value, {}, true);\n      }\n      triggerEvent(this, 'change', value, e);\n    },\n    onFocus(e) {\n      const value = e.detail.value;\n      this.focus = true;\n      triggerEvent(this, 'focus', value, e);\n    },\n    onBlur(e) {\n      const value = e.detail.value;\n      this.focus = false;\n      if (this.isControlled()) {\n        this.update(this.props.value);\n      }\n      triggerEvent(this, 'blur', value, e);\n    },\n    onConfirm(e) {\n      const value = e.detail.value;\n      triggerEvent(this, 'confirm', value, e);\n    },\n  },\n  mixins: [\n    mixinValue({\n      scopeKey: 'state',\n      transformValue(value, extra, updateWithoutFocusCheck) {\n        if (value === null || (!updateWithoutFocusCheck && this.focus)) {\n          return {\n            needUpdate: false,\n          };\n        }\n        return {\n          needUpdate: true,\n          value,\n        };\n      },\n    }),\n  ],\n});\n"
  },
  {
    "path": "src/Input/InputBlur/props.ts",
    "content": "import { IBaseProps } from '../../_util/base';\n\nexport type InputType =\n  | 'text'\n  | 'number'\n  | 'idcard'\n  | 'digit'\n  | 'numberpad'\n  | 'digitpad'\n  | 'idcardpad';\n\n/**\n * @description 输入框。\n */\n\nexport interface InputBlurProps extends IBaseProps {\n  value: string;\n  defaultValue: string;\n  placeholder: string;\n  placeholderClassName: string;\n  placeholderStyle: string;\n  enableNative: boolean;\n  confirmType: string;\n  confirmHold: string;\n  alwaysSystem: boolean;\n  selectionStart: number;\n  selectionEnd: number;\n  cursor: number;\n  controlled: boolean;\n  maxLength?: number;\n  inputClassName: string;\n  inputStyle: string;\n  focus?: boolean;\n  password: boolean;\n  disabled?: boolean;\n  /**\n   * @description 组件名字，用于表单提交获取数据。\n   */\n  name?: string;\n  type?: InputType;\n  /**\n   * @description 当 type 为 number, digit, idcard 数字键盘是否随机排列。\n   * @default false\n   */\n  randomNumber?: boolean;\n  onChange?: (value: string, e: any) => void;\n  onBlur?: (value: string, e: any) => void;\n  onFocus?: (value: string, e: any) => void;\n  onConfirm?: (value: string, e: any) => void;\n}\n\nexport const InputBlurDefaultProps: Partial<InputBlurProps> = {\n  value: null,\n  defaultValue: null,\n  placeholder: null,\n  placeholderClassName: '',\n  placeholderStyle: '',\n  enableNative: null,\n  confirmType: null,\n  confirmHold: null,\n  alwaysSystem: null,\n  selectionStart: null,\n  selectionEnd: null,\n  cursor: null,\n  controlled: null,\n  inputClassName: null,\n  inputStyle: null,\n  focus: null,\n  password: null,\n  disabled: null,\n  name: null,\n  type: null,\n  randomNumber: null,\n  /// #if WECHAT\n  // 微信小程序的 maxLength 需要为 -1 才能不限制输入长度。 不能传 null\n  maxLength: -1,\n  /// #endif\n};\n"
  },
  {
    "path": "src/Input/Textarea/index.axml",
    "content": "<import-sjs from=\"../../_util/isPropsEmpty.sjs\" name=\"u\" />\n\n<view\n  class=\"ant-textarea {{ disabled ? 'ant-textarea-disabled' : '' }} {{ className ? className : '' }} {{ selfFocus ? (focusClassName ? focusClassName : '') : '' }}\"\n  style=\"{{ style || '' }};{{ focusStyle || '' }}\"\n>\n  <view class=\"ant-textarea-line\">\n    <!-- #if ALIPAY -->\n    <textarea\n      enableNative=\"{{ enableNative }}\"\n      name=\"{{ name }}\"\n      class=\"ant-textarea-content {{ allowClear ? 'ant-textarea-content-clear' : '' }}\"\n      disabled=\"{{ disabled }}\"\n      value=\"{{ state.value || '' }}\"\n      placeholder=\"{{ u.isPropsEmpty(placeholder) ? locale.input.placeholder : placeholder }}\"\n      placeholder-class=\"ant-textarea-placeholder {{ placeholderClassName ? placeholderClassName : '' }}\"\n      placeholder-style=\"{{ placeholderStyle ? placeholderStyle : '' }}\"\n      maxlength=\"{{ maxLength }}\"\n      focus=\"{{ focus }}\"\n      confirm-type=\"{{ confirmType }}\"\n      confirm-hold=\"{{ confirmHold }}\"\n      auto-height=\"{{ autoHeight }}\"\n      show-count=\"{{ showCount }}\"\n      controlled=\"{{ controlled }}\"\n      onInput=\"onChange\"\n      onConfirm=\"onConfirm\"\n      onFocus=\"onFocus\"\n      onBlur=\"onBlur\"\n    />\n    <!-- #endif -->\n    <!-- #if WECHAT -->\n    <textarea\n      enableNative=\"{{ enableNative }}\"\n      name=\"{{ name }}\"\n      class=\"ant-textarea-content {{ allowClear ? 'ant-textarea-content-clear' : '' }}\"\n      disabled=\"{{ disabled }}\"\n      value=\"{{ state.value || '' }}\"\n      placeholder=\"{{ u.isPropsEmpty(placeholder) ? locale.input.placeholder : placeholder  }}\"\n      placeholder-class=\"ant-textarea-placeholder {{ placeholderClassName ? placeholderClassName : '' }}\"\n      placeholder-style=\"{{ placeholderStyle ? placeholderStyle : '' }}\"\n      maxlength=\"{{ maxLength }}\"\n      focus=\"{{ focus }}\"\n      confirm-type=\"{{ confirmType }}\"\n      confirm-hold=\"{{ confirmHold }}\"\n      auto-height=\"{{ autoHeight }}\"\n      show-count=\"{{ showCount }}\"\n      controlled=\"{{ controlled }}\"\n      show-confirm-bar=\"{{ showConfirmBar }}\"\n      hold-keyboard=\"{{ holdKeyboard }}\"\n      disable-default-padding=\"{{ disableDefaultPadding }}\"\n      adjust-keyboard-to=\"{{ adjustKeyboardTo }}\"\n      bindinput=\"onChange\"\n      bindconfirm=\"onConfirm\"\n      bindfocus=\"onFocus\"\n      bindblur=\"onBlur\"\n    />\n    <!-- #endif -->\n    <view\n      a:if=\"{{ allowClear }}\"\n      class=\"ant-textarea-clear {{ state.value && state.value.length > 0 ? 'ant-textarea-clear-show' : 'ant-textarea-clear-hidden' }}\"\n      onTap=\"onClear\"\n    >\n      <ant-icon className=\"ant-textarea-clear-icon\" type=\"CloseCircleFill\" />\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "src/Input/Textarea/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-icon\": \"../../Icon/index\"\n  }\n}\n"
  },
  {
    "path": "src/Input/Textarea/index.less",
    "content": "@import (reference) '../variable.less';\n\n@inputItemPrefix: ant-textarea;\n.@{inputItemPrefix} {\n  display: flex;\n  align-items: center;\n  background: @input-background-color;\n  &-disabled {\n    opacity: 0.4;\n  }\n  &-line {\n    position: relative;\n    flex: 1;\n    display: flex;\n    align-items: center;\n    overflow: hidden;\n  }\n  &-content {\n    width: 100%;\n    align-self: center;\n    padding: 0;\n    font-size: 34 * @rpx;\n    text-align: left;\n    color: @input-item-color;\n    background: @input-background-color;\n    &-clear {\n      padding-right: 34 * @rpx;\n    }\n  }\n\n  &-clear {\n    position: absolute;\n    top: 0;\n    right: 0;\n    z-index: 2;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    border-radius: 16 * @rpx;\n    margin-left: 8 * @rpx;\n    &-icon {\n      color: @input-item-placeholder-color;\n      font-size: 34 * @rpx;\n    }\n  }\n\n  &-clear-show {\n    display: flex;\n  }\n  &-clear-hidden {\n    display: none;\n    pointer-events: none;\n  }\n  &-placeholder {\n    font-size: 34 * @rpx;\n    color: @input-item-placeholder-color;\n    margin-left: -6 * @rpx;\n  }\n}\n"
  },
  {
    "path": "src/Input/Textarea/index.ts",
    "content": "import { effect } from '@preact/signals-core';\nimport mixinValue from '../../mixins/value';\nimport { ComponentWithSignalStoreImpl, triggerEvent } from '../../_util/simply';\nimport i18nController from '../../_util/store';\nimport { TextareaDefaultProps } from './props';\n\nComponentWithSignalStoreImpl({\n  storeOptions: {\n    store: () => i18nController,\n    updateHook: effect,\n    mapState: {\n      locale: ({ store }) => store.currentLocale.value,\n    },\n  },\n  props: TextareaDefaultProps,\n  data: {\n    selfFocus: false,\n  },\n  methods: {\n    onChange(e) {\n      const value = e.detail.value;\n      if (!this.isControlled()) {\n        this.update(value);\n      }\n      triggerEvent(this, 'change', value, e);\n    },\n    onFocus(e) {\n      const value = e.detail.value;\n      this.setData({\n        selfFocus: true,\n      });\n      triggerEvent(this, 'focus', value, e);\n    },\n    onBlur(e) {\n      const value = e.detail.value;\n      this.setData({\n        selfFocus: false,\n      });\n      triggerEvent(this, 'blur', value, e);\n    },\n    onConfirm(e) {\n      const value = e.detail.value;\n      triggerEvent(this, 'confirm', value, e);\n    },\n    onClear(e) {\n      if (!this.isControlled()) {\n        this.update('');\n      }\n      triggerEvent(this, 'change', '', e);\n    },\n  },\n  mixins: [mixinValue({ scopeKey: 'state' })],\n  /// #if WECHAT\n  attached() {\n    this.triggerEvent('ref', this);\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/Input/Textarea/props.ts",
    "content": "import { IBaseProps } from '../../_util/base';\n\n/**\n * 有效值：return（显示“换行”）、done（显示“完成”）、go（显示“前往”）、next（显示“下一个”）、search（显示“搜索”）、send（显示“发送”）。\n */\nexport type ConfirmType = 'return' | 'done' | 'go' | 'next' | 'search' | 'send';\n\n/**\n * @description 输入框。\n */\n\nexport interface TextareaProps extends IBaseProps {\n  value?: string;\n  defaultValue: string;\n  placeholder: string;\n  placeholderClassName: string;\n  placeholderStyle: string;\n  autoHeight: boolean;\n  showCount: boolean;\n  allowClear: boolean;\n  controlled: boolean;\n  enableNative?: boolean;\n  maxLength?: number;\n  inputClassName: string;\n  disabled?: boolean;\n  inputStyle: string;\n  focusStyle?: string;\n  name?: string;\n  confirmType?: ConfirmType;\n  focus?: boolean;\n  confirmHold?: string;\n  /// #if WECHAT\n  focusClassName?: boolean;\n  /**\n   * @default true\n   * @description 是否显示键盘上方带有”完成“按钮那一栏\n   */\n  showConfirmBar?: boolean;\n  /**\n   * @default false\n   * @description focus时，点击页面的时候不收起键盘\n   */\n  holdKeyboard?: boolean;\n  /**\n   * @default false\n   * @description 是否去掉 iOS 下的默认内边距\n   */\n  disableDefaultPadding?: boolean;\n  /**\n   * @description 键盘对齐位置\n   */\n  adjustKeyboardTo?: 'cursor' | 'bottom';\n  /// #endif\n  onChange?: (value: string, e: any) => void;\n  onBlur?: (value: string, e: any) => void;\n  onFocus?: (value: string, e: any) => void;\n  onConfirm?: (value: string, e: any) => void;\n}\n\nexport const TextareaDefaultProps: TextareaProps = {\n  value: null,\n  defaultValue: null,\n  placeholder: null,\n  placeholderClassName: null,\n  placeholderStyle: null,\n  autoHeight: null,\n  showCount: null,\n  allowClear: null,\n  controlled: null,\n  enableNative: false,\n  inputClassName: null,\n  disabled: null,\n  inputStyle: null,\n  focusStyle: null,\n  name: null,\n  confirmType: null,\n  focus: null,\n  confirmHold: null,\n  /// #if WECHAT\n  focusClassName: null,\n  maxLength: -1,\n  showConfirmBar: true,\n  holdKeyboard: false,\n  disableDefaultPadding: false,\n  adjustKeyboardTo: 'cursor',\n  /// #endif\n};\n"
  },
  {
    "path": "src/Input/index.axml",
    "content": "<import-sjs from=\"../_util/isPropsEmpty.sjs\" name=\"u\" />\n\n<view\n  class=\"ant-input {{ disabled ? 'ant-input-disabled' : '' }} {{ className ? className : '' }} {{ selfFocus ? (focusClassName ? focusClassName : '') : '' }}\"\n  style=\"{{ style || '' }};{{ focusStyle || '' }}\"\n>\n  <view class=\"ant-input-prefix\">\n    <slot name=\"prefix\">{{ prefix }}</slot>\n  </view>\n  <view class=\"ant-input-line\">\n    <!-- #if ALIPAY -->\n    <input\n      enableNative=\"{{ enableNative }}\"\n      name=\"{{ name }}\"\n      class=\"ant-input-content\"\n      disabled=\"{{ disabled }}\"\n      value=\"{{ state.value }}\"\n      type=\"{{ type }}\"\n      adjust-position=\"{{ adjustPosition }}\"\n      password=\"{{ password }}\"\n      placeholder=\"{{ u.isPropsEmpty(placeholder) ? locale.input.placeholder : placeholder  }}\"\n      placeholder-class=\"ant-input-placeholder {{ placeholderClassName ? placeholderClassName : '' }}\"\n      placeholder-style=\"{{ placeholderStyle ? placeholderStyle : '' }}\"\n      maxlength=\"{{ maxLength }}\"\n      focus=\"{{ focus }}\"\n      confirm-type=\"{{ confirmType }}\"\n      confirm-hold=\"{{ confirmHold }}\"\n      always-system=\"{{ alwaysSystem }}\"\n      controlled=\"{{ state.controlled }}\"\n      cursor=\"{{ cursor }}\"\n      selection-start=\"{{ selectionStart }}\"\n      selection-end=\"{{ selectionEnd }}\"\n      random-number=\"{{ randomNumber }}\"\n      onInput=\"onChange\"\n      onConfirm=\"onConfirm\"\n      onFocus=\"onFocus\"\n      onBlur=\"onBlur\"\n    />\n    <!-- #endif -->\n    <!-- #if WECHAT -->\n    <input\n      enableNative=\"{{ enableNative }}\"\n      name=\"{{ name }}\"\n      class=\"ant-input-content\"\n      disabled=\"{{ disabled }}\"\n      value=\"{{ state.value }}\"\n      type=\"{{ type }}\"\n      cursor-spacing=\"{{ cursorSpacing }}\"\n      always-embed=\"{{ alwaysEmbed }}\"\n      cursor-color=\"{{ cursorColor }}\"\n      hold-keyboard=\"{{ holdKeyboard }}\"\n      adjust-position=\"{{ adjustPosition }}\"\n      password=\"{{ password }}\"\n      placeholder=\"{{ u.isPropsEmpty(placeholder) ? locale.input.placeholder : placeholder  }}\"\n      placeholder-class=\"ant-input-placeholder {{ placeholderClassName ? placeholderClassName : '' }}\"\n      placeholder-style=\"{{ placeholderStyle ? placeholderStyle : '' }}\"\n      maxlength=\"{{ maxLength }}\"\n      focus=\"{{ focus }}\"\n      confirm-type=\"{{ confirmType }}\"\n      confirm-hold=\"{{ confirmHold }}\"\n      always-system=\"{{ alwaysSystem }}\"\n      controlled=\"{{ state.controlled }}\"\n      cursor=\"{{focus && cursor ? cursor : state.value.length}}\"\n      selection-start=\"{{ selectionStart }}\"\n      selection-end=\"{{ selectionEnd }}\"\n      random-number=\"{{ randomNumber }}\"\n      bindinput=\"onChange\"\n      bindconfirm=\"onConfirm\"\n      bindfocus=\"onFocus\"\n      bindblur=\"onBlur\"\n    />\n    <!-- #endif -->\n    <view\n      a:if=\"{{ allowClear }}\"\n      class=\"ant-input-clear {{ state.value && state.value.length > 0 ? 'ant-input-clear-show' : 'ant-input-clear-hidden' }}\"\n      onTap=\"onClear\"\n    >\n      <ant-icon className=\"ant-input-clear-icon\" type=\"CloseCircleFill\" />\n    </view>\n  </view>\n  <view class=\"ant-input-suffix\">\n    <slot name=\"suffix\">{{ suffix }}</slot>\n  </view>\n</view>\n"
  },
  {
    "path": "src/Input/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Information Entry\n  order: 10\ntoc: content\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Input\n\nEnter content through the keyboard, is the most basic form field packaging. Generally used in the form page for information collection.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-input\": \"antd-mini/es/Input/index\",\n  \"ant-textarea\": \"antd-mini/es/Input/Textarea/index\"\n#endif\n#if WECHAT\n  \"ant-input\": \"antd-mini/Input/index\",\n  \"ant-textarea\": \"antd-mini/Input/Textarea/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Input basic usage\n\n```xml\n<ant-input placeholder=\"input here\" />\n<ant-input placeholder=\"input here\" defaultValue=\"initial value\" />\n<ant-input placeholder=\"input here, with clear button\" allowClear />\n<ant-input placeholder=\"disabled input\" disabled=\"{{true}}\" />\n```\n\n### With Prefix and Suffix\n\n```xml\n<ant-input placeholder=\"input here\" allowClear>\n  <view slot=\"prefix\">￥</view>\n  <view slot=\"suffix\">RMB</view>\n</ant-input>\n```\n\n### Controlled Mode\n\n```xml\n<ant-input controlled=\"{{true}}\" value=\"{{value}}\" placeholder=\"input here\" allowClear />\n```\n\n### Enter Amount\n\n```xml\n<ant-input placeholder=\"input digit here\" type=\"digit\" focusClassName=\"border\" allowClear>\n  <view slot=\"prefix\">￥</view>\n  <view slot=\"suffix\">RMB</view>\n</ant-input>\n```\n\n### SearchBar search box\n\n```xml\n <view class=\"search-line\">\n    <ant-input\n      placeholder=\"input here\"\n      onChange=\"onChange\"\n      className=\"search-bar\"\n      focusClassName=\"search-bar-focus\"\n      confirm-type=\"search\"\n      allowClear\n      focus\n    >\n      <ant-icon slot=\"prefix\" type=\"SearchOutline\" />\n      <ant-icon slot=\"suffix\" type=\"AudioOutline\" />\n    </ant-input>\n    <view class=\"cancel\">Cancel</view>\n  </view>\n```\n\n```css\n.search-line {\n  display: flex;\n  align-items: center;\n  padding: 16px;\n}\n.search-bar {\n  padding: 4px 0 4px 0;\n  border-radius: 4px;\n  border: 1px solid transparent;\n  transition: all 0.4s;\n  flex: 1;\n\n  &-focus {\n    border-color: #1677ff;\n  }\n}\n.cancel {\n  color: #fff;\n  margin-left: 8px;\n}\n```\n\n### Textarea\n\n#### Basic Usage\n\n```xml\n <ant-textarea placeholder=\"input here\" autoHeight />\n <ant-textarea placeholder=\"input here\" defaultValue=\"initial value\" autoHeight />\n```\n\n#### Controlled Mode\n\n```xml\n <ant-textarea value=\"{{value}}\" placeholder=\"input here\" allowClear />\n```\n\n### Custom\n\n#### With border\n\n```xml\n<ant-input className=\"custom\" placeholder=\"input here\" />\n```\n\n```css\n.custom {\n  border: 1px solid #ccc;\n  padding: 4px;\n  border-radius: 4px;\n  margin-bottom: 12px;\n}\n```\n\n#### Custom Background Color\n\n```xml\n <ant-input className=\"custom-color\" placeholder=\"input here\" />\n```\n\n```css\n.custom-color {\n  margin-bottom: 12px;\n  input,\n  textarea {\n    padding: 4px;\n    background: #f5f5f5;\n    border-radius: 4px;\n  }\n}\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Input/index'></code>\n\n## API\n\n### Input, Textarea the same property\n\n| Property                   | Description                                                                             | Type                                  | Default Value |\n| ---------------------- | -------------------------------------------------------------------------------- | ------------------------------------- | ------ |\n| className              | Class Name                                                                             | string                                | -      |\n| controlled             | There are keyboard input problems, you can use `controlled=\"{{false}}\"`                                  | boolean                               | -      |\n| defaultValue           | Initial value                                                                           | string                                | -      |\n| disabled               | Disable                                                                         | boolean                               | false  |\n| maxLength              | Maximum length                                                                         | number                                | 140    |\n| placeholder            | Placeholder                                                                           | string                                | -      |\n| style                  | Style                                                                             | string                                | -      |\n| max                    | The maximum value, which takes effect only when type is number, digit, numberpad, or digitpad, and a valid number is entered. | number                                | -      |\n| min                    | The minimum value, which takes effect only when type is number, digit, numberpad, or digitpad, and a valid number is entered. | number                                | -      |\n| precision              | Calculation accuracy, keep a few decimal places, enter a valid number to take effect                                       | number                                | -1     |\n| value                  | The value of the input box. Controlled mode.                                                           | string                                | -      |\n| #if ALIPAY onConfirm   | This callback is triggered when the keyboard is clicked to complete                                                         | (value: string, event: Event) => void | -      |\n| #if ALIPAY onFocus     | Trigger this callback when focused                                                                 | (value: string, event: Event) => void | -      |\n| #if ALIPAY onBlur      | Trigger this callback when out of focus                                                                 | (value: string, event: Event) => void | -      |\n| #if ALIPAY onChange    | This callback is triggered when input                                                                 | (value: string, event: Event) => void | -      |\n| #if WECHAT bindconfirm | This callback is triggered when the keyboard is clicked to complete                                                         | (value: string, event: Event) => void | -      |\n| #if WECHAT bindfocus   | Trigger this callback when focused                                                                 | (value: string, event: Event) => void | -      |\n| #if WECHAT bindblur    | Trigger this callback when out of focus                                                                 | (value: string, event: Event) => void | -      |\n| #if WECHAT bindchange  | This callback is triggered when input                                                                 | (value: string, event: Event) => void | -      |\n\n### Input property\n\n| Property         | Description                               | Type    | Default Value |\n| ------------ | ---------------------------------- | ------- | ------ |\n| allowClear   | You can click the clear icon to delete content           | boolean | false  |\n| enableNative | Whether to use native                    | boolean | -      |\n| focus        | Focus, View[Detailed Description](#input-focus) | boolean | -      |\n| password     | Whether it is password type                     | boolean | false  |\n| prefix       | input prefix                         | slot    | -      |\n| suffix       | input suffix                         | slot    | -      |\n\n### Textarea Properties\n\n| Property         | Description             | Type    | Default Value |\n| ------------ | ---------------- | ------- | ------ |\n| autoHeight   | Whether to increase automatically.   | boolean | false  |\n| enableNative | Whether to use native  | boolean | -      |\n| showCount    | Show word count | boolean | true   |\n\n### Input, Textarea More Same Properties\n\n- confirm-type\n- name\n- placeholder-class\n- placeholder-style\n- type\n\n[Input](https://opendocs.alipay.com/mini/component/input)  \n[Textarea](https://opendocs.alipay.com/mini/component/textarea)\n\n### Input focus\n\nTo use the focus attribute, you need to add it to the app.json window. `\"enableInPageRenderInput\": \"YES\"`Otherwise, the keyboard cannot be opened in iOS.\n\n### Input, Textarea instance methods\n\nInstance methods require small programs `component2` Can be used.\n\n| Property     | Description   | Type                    |\n| -------- | ------ | ----------------------- |\n| update   | Update Value | (value: string) => void |\n| getValue | get value | () => string            |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                         | Default Value                                                                                            | Dark Mode Default                                                                                    | Remarks               |\n| ------------------------------ | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------ |\n| --input-item-color             | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | Input Text Color     |\n| --input-item-placeholder-color | <div style=\"width: 150px; height: 30px; background-color: #cccccc; color: #333333;\">#cccccc</div> | <div style=\"width: 150px; height: 30px; background-color: #474747; color: #ffffff;\">#474747</div> | Input item placeholder color   |\n| --input-item-clear-color       | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | Input Clear Button Color |\n| --input-background-color       | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | Input Background Color     |\n\n## FAQ\n\n### Input focus does not open the keyboard\n\nYou need to add it to the app.json window. `\"enableInPageRenderInput\": \"YES\"`。\n\n### Cursor problem with Input\n\nCan be viewed [This document](https://opendocs.alipay.com/mini/component/input#FAQ) Use `enableNative` property to resolve.\n\n### Keyboard problems using value controlled mode\n\nThis is due [A known issue with input boxes](https://opendocs.alipay.com/mini/component/input#Bug%20%26%20Tip)。\n\nThe solution is to call the input update method in ref mode without using value controlled mode.\n\n```xml\n<input defaultValue=\"{{defaultValue}}\" ref=\"handleRef\" />\n<button\n#if ALIPAY\n  onTap=\"clear\"\n#endif\n#if WECHAT\n  bindtap=\"clear\"\n#endif\n>clear</button>\n```\n\n```js\nPage({\n  handleRef(input) {\n#if ALIPAY\n    this.input = input;\n#endif\n#if WECHAT\n    this.input = input.detail;\n#endif\n  },\n  clear() {\n    this.input.update('');\n  },\n});\n```\n\nStarting with v2.15.0, updating values via the update method is not supported in controlled mode.\n\n### Instance method not available\n\nneed to use `component2`, for details see[ref Get Component Instance](https://opendocs.alipay.com/mini/framework/component-ref)。\n\n### The input font style is overwritten by css and cannot take effect on ios.\n\nNeed to pass in `always-system=\"{{true}}\"`\n"
  },
  {
    "path": "src/Input/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-icon\": \"../Icon/index\"\n  }\n}\n"
  },
  {
    "path": "src/Input/index.less",
    "content": "@import (reference) './variable.less';\n\n@inputItemPrefix: ant-input;\n.@{inputItemPrefix} {\n  display: flex;\n  align-items: center;\n  background: @input-background-color;\n  &-disabled {\n    opacity: 0.4;\n  }\n  &-line {\n    position: relative;\n    flex: 1;\n    display: flex;\n    align-items: center;\n    overflow: hidden;\n  }\n  &-prefix {\n    color: @input-item-placeholder-color;\n    font-size: 34 * @rpx;\n    margin: 0 8 * @rpx 0 8 * @rpx;\n    &:empty {\n      display: none;\n    }\n  }\n  &-suffix {\n    color: @input-item-placeholder-color;\n    font-size: 34 * @rpx;\n    margin: 0 8 * @rpx 0 8 * @rpx;\n    &:empty {\n      display: none;\n    }\n  }\n  &-content {\n    width: 100%;\n    align-self: center;\n    padding: 0;\n    font-size: 34 * @rpx;\n    text-align: left;\n    color: @input-item-color;\n    background: @input-background-color;\n  }\n\n  &-clear {\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    border-radius: 16 * @rpx;\n    &-icon {\n      color: @input-item-placeholder-color;\n      font-size: 34 * @rpx;\n      padding: 8 * @rpx 0 8 * @rpx 16 * @rpx;\n    }\n  }\n\n  &-clear-show {\n    opacity: 1;\n  }\n  &-clear-hidden {\n    opacity: 0;\n    pointer-events: none;\n  }\n  &-placeholder {\n    font-size: 34 * @rpx;\n    color: @input-item-placeholder-color;\n    margin-left: -6 * @rpx;\n  }\n}\n"
  },
  {
    "path": "src/Input/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 数据录入\n  order: 10\ntoc: content\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Input 输入框\n\n通过键盘输入内容，是最基础的表单域包装。一般用在表单页进行信息的收集。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-input\": \"antd-mini/es/Input/index\",\n  \"ant-textarea\": \"antd-mini/es/Input/Textarea/index\"\n#endif\n#if WECHAT\n  \"ant-input\": \"antd-mini/Input/index\",\n  \"ant-textarea\": \"antd-mini/Input/Textarea/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### Input 基本使用\n\n```xml\n<ant-input placeholder=\"input here\" />\n<ant-input placeholder=\"input here\" defaultValue=\"initial value\" />\n<ant-input placeholder=\"input here, with clear button\" allowClear />\n<ant-input placeholder=\"disabled input\" disabled=\"{{true}}\" />\n```\n\n### 带前缀后缀\n\n```xml\n<ant-input placeholder=\"input here\" allowClear>\n  <view slot=\"prefix\">￥</view>\n  <view slot=\"suffix\">RMB</view>\n</ant-input>\n```\n\n### 受控模式\n\n```xml\n<ant-input controlled=\"{{true}}\" value=\"{{value}}\" placeholder=\"input here\" allowClear />\n```\n\n### 输入金额\n\n```xml\n<ant-input placeholder=\"input digit here\" type=\"digit\" focusClassName=\"border\" allowClear>\n  <view slot=\"prefix\">￥</view>\n  <view slot=\"suffix\">RMB</view>\n</ant-input>\n```\n\n### SearchBar 搜索框\n\n```xml\n <view class=\"search-line\">\n    <ant-input\n      placeholder=\"input here\"\n      onChange=\"onChange\"\n      className=\"search-bar\"\n      focusClassName=\"search-bar-focus\"\n      confirm-type=\"search\"\n      allowClear\n      focus\n    >\n      <ant-icon slot=\"prefix\" type=\"SearchOutline\" />\n      <ant-icon slot=\"suffix\" type=\"AudioOutline\" />\n    </ant-input>\n    <view class=\"cancel\">取消</view>\n  </view>\n```\n\n```css\n.search-line {\n  display: flex;\n  align-items: center;\n  padding: 16px;\n}\n.search-bar {\n  padding: 4px 0 4px 0;\n  border-radius: 4px;\n  border: 1px solid transparent;\n  transition: all 0.4s;\n  flex: 1;\n\n  &-focus {\n    border-color: #1677ff;\n  }\n}\n.cancel {\n  color: #fff;\n  margin-left: 8px;\n}\n```\n\n### Textarea\n\n#### 基础用法\n\n```xml\n <ant-textarea placeholder=\"input here\" autoHeight />\n <ant-textarea placeholder=\"input here\" defaultValue=\"initial value\" autoHeight />\n```\n\n#### 受控模式\n\n```xml\n <ant-textarea value=\"{{value}}\" placeholder=\"input here\" allowClear />\n```\n\n### 自定义\n\n#### 带有边框\n\n```xml\n<ant-input className=\"custom\" placeholder=\"input here\" />\n```\n\n```css\n.custom {\n  border: 1px solid #ccc;\n  padding: 4px;\n  border-radius: 4px;\n  margin-bottom: 12px;\n}\n```\n\n#### 自定义背景色\n\n```xml\n <ant-input className=\"custom-color\" placeholder=\"input here\" />\n```\n\n```css\n.custom-color {\n  margin-bottom: 12px;\n  input,\n  textarea {\n    padding: 4px;\n    background: #f5f5f5;\n    border-radius: 4px;\n  }\n}\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Input/index'></code>\n\n## API\n\n### Input、Textarea 相同的属性\n\n| 属性                   | 说明                                                                             | 类型                                  | 默认值 |\n| ---------------------- | -------------------------------------------------------------------------------- | ------------------------------------- | ------ |\n| className              | 类名                                                                             | string                                | -      |\n| controlled             | 有键盘输入问题，可使用 `controlled=\"{{false}}\"`                                  | boolean                               | -      |\n| defaultValue           | 初始值                                                                           | string                                | -      |\n| disabled               | 是否禁用                                                                         | boolean                               | false  |\n| maxLength              | 最大长度                                                                         | number                                | 140    |\n| placeholder            | 占位符                                                                           | string                                | -      |\n| style                  | 样式                                                                             | string                                | -      |\n| max                    | 最大值，仅在 type 为 number、digit、numberpad、digitpad 时，且输入有效数字后生效 | number                                | -      |\n| min                    | 最小值，仅在 type 为 number、digit、numberpad、digitpad 时，且输入有效数字后生效 | number                                | -      |\n| precision              | 计算精度，保留几位小数，输入有效数字后生效                                       | number                                | -1     |\n| value                  | 输入框的值。受控模式。                                                           | string                                | -      |\n| #if ALIPAY onConfirm   | 点击键盘完成时触发此回调                                                         | (value: string, event: Event) => void | -      |\n| #if ALIPAY onFocus     | 聚焦时触发此回调                                                                 | (value: string, event: Event) => void | -      |\n| #if ALIPAY onBlur      | 失焦时触发此回调                                                                 | (value: string, event: Event) => void | -      |\n| #if ALIPAY onChange    | 输入时触发此回调                                                                 | (value: string, event: Event) => void | -      |\n| #if WECHAT bindconfirm | 点击键盘完成时触发此回调                                                         | (value: string, event: Event) => void | -      |\n| #if WECHAT bindfocus   | 聚焦时触发此回调                                                                 | (value: string, event: Event) => void | -      |\n| #if WECHAT bindblur    | 失焦时触发此回调                                                                 | (value: string, event: Event) => void | -      |\n| #if WECHAT bindchange  | 输入时触发此回调                                                                 | (value: string, event: Event) => void | -      |\n\n### Input 属性\n\n| 属性         | 说明                               | 类型    | 默认值 |\n| ------------ | ---------------------------------- | ------- | ------ |\n| allowClear   | 可以点击清除图标删除内容           | boolean | false  |\n| enableNative | 是否使用 native                    | boolean | -      |\n| focus        | 聚焦，查看[详细说明](#input-focus) | boolean | -      |\n| password     | 是否是密码类型                     | boolean | false  |\n| prefix       | input 前缀                         | slot    | -      |\n| suffix       | input 后缀                         | slot    | -      |\n\n### Textarea 属性\n\n| 属性         | 说明             | 类型    | 默认值 |\n| ------------ | ---------------- | ------- | ------ |\n| autoHeight   | 是否自动增高。   | boolean | false  |\n| enableNative | 是否使用 native  | boolean | -      |\n| showCount    | 是否显示字数统计 | boolean | true   |\n\n### Input、Textarea 更多相同属性\n\n- confirm-type\n- name\n- placeholder-class\n- placeholder-style\n- type\n\n[Input](https://opendocs.alipay.com/mini/component/input)  \n[Textarea](https://opendocs.alipay.com/mini/component/textarea)\n\n### Input focus\n\n使用 focus 属性需要在 app.json window 里加上 `\"enableInPageRenderInput\": \"YES\"`，否则无法在 iOS 里打开键盘。\n\n### Input、Textarea 实例方法\n\n实例方法需要小程序 `component2` 可使用。\n\n| 属性     | 说明   | 类型                    |\n| -------- | ------ | ----------------------- |\n| update   | 更新值 | (value: string) => void |\n| getValue | 得到值 | () => string            |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                         | 默认值                                                                                            | 深色模式默认值                                                                                    | 备注               |\n| ------------------------------ | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------ |\n| --input-item-color             | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | 输入项文本颜色     |\n| --input-item-placeholder-color | <div style=\"width: 150px; height: 30px; background-color: #cccccc; color: #333333;\">#cccccc</div> | <div style=\"width: 150px; height: 30px; background-color: #474747; color: #ffffff;\">#474747</div> | 输入项占位符颜色   |\n| --input-item-clear-color       | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | 输入项清除按钮颜色 |\n| --input-background-color       | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | 输入项背景颜色     |\n\n## FAQ\n\n### Input focus 没有打开键盘\n\n需要在 app.json window 里加上 `\"enableInPageRenderInput\": \"YES\"`。\n\n### Input 出现光标问题\n\n可查看 [此文档](https://opendocs.alipay.com/mini/component/input#FAQ) 使用 `enableNative` 属性解决。\n\n### 使用 value 受控模式出现键盘问题\n\n这个是由于 [输入框的一个已知问题](https://opendocs.alipay.com/mini/component/input#Bug%20%26%20Tip)。\n\n解决方式为：不使用 value 受控模式，采用 ref 方式调用 input 更新方法。\n\n```xml\n<input defaultValue=\"{{defaultValue}}\" ref=\"handleRef\" />\n<button\n#if ALIPAY\n  onTap=\"clear\"\n#endif\n#if WECHAT\n  bindtap=\"clear\"\n#endif\n>clear</button>\n```\n\n```js\nPage({\n  handleRef(input) {\n#if ALIPAY\n    this.input = input;\n#endif\n#if WECHAT\n    this.input = input.detail;\n#endif\n  },\n  clear() {\n    this.input.update('');\n  },\n});\n```\n\n从 v2.15.0 开始，受控模式下，不支持通过 update 方法更新值。\n\n### 实例方法不可用\n\n需要使用 `component2`，详情参见[ref 获取组件实例](https://opendocs.alipay.com/mini/framework/component-ref)。\n\n### Input 字体样式通过 css 覆盖，ios 端无法生效\n\n需要传入 `always-system=\"{{true}}\"`\n"
  },
  {
    "path": "src/Input/index.ts",
    "content": "import { effect } from '@preact/signals-core';\nimport mixinValue from '../mixins/value';\nimport {\n  ComponentWithSignalStoreImpl,\n  getValueFromProps,\n  triggerEvent,\n} from '../_util/simply';\nimport i18nController from '../_util/store';\nimport { assertAilpayNativeNotSupport } from '../_util/support';\nimport { InputDefaultProps } from './props';\nimport { formatNumberWithLimits, isNumber } from './utils';\n\nassertAilpayNativeNotSupport('Input');\n\nComponentWithSignalStoreImpl({\n  storeOptions: {\n    store: () => i18nController,\n    updateHook: effect,\n    mapState: {\n      locale: ({ store }) => store.currentLocale.value,\n    },\n  },\n  props: InputDefaultProps,\n  data: {\n    selfFocus: false,\n  },\n  methods: {\n    onChange(e) {\n      const value = e.detail.value;\n      if (!this.isControlled()) {\n        this.update(value);\n      }\n      triggerEvent(this, 'change', value, e);\n    },\n    onFocus(e) {\n      const value = e.detail.value;\n      this.setData({\n        selfFocus: true,\n      });\n      triggerEvent(this, 'focus', value, e);\n    },\n    onBlur(e) {\n      let value = e.detail.value;\n      this.setData({\n        selfFocus: false,\n      });\n      const val = this.checkNumberValue(value);\n      if (val !== null) {\n        if (val !== value && !this.isControlled()) {\n          this.update(val);\n        }\n        value = val;\n      }\n      triggerEvent(this, 'blur', value, e);\n    },\n    onConfirm(e) {\n      const value = e.detail.value;\n      triggerEvent(this, 'confirm', value, e);\n    },\n    onClear(e) {\n      if (!this.isControlled()) {\n        this.update('');\n      }\n      triggerEvent(this, 'change', '', e);\n    },\n    checkNumberValue(value) {\n      const [type, max, min, precision] = getValueFromProps(this, [\n        'type',\n        'max',\n        'min',\n        'precision',\n      ]);\n      const NUMBER_KEYBOARD = ['number', 'digit', 'numberpad', 'digitpad'];\n      if (\n        NUMBER_KEYBOARD.indexOf(type) !== -1 &&\n        isNumber(value) &&\n        isNumber(max) &&\n        isNumber(min)\n      ) {\n        return formatNumberWithLimits(value, max, min, precision);\n      }\n      return null;\n    },\n  },\n  mixins: [mixinValue({ scopeKey: 'state' })],\n  /// #if WECHAT\n  attached() {\n    this.triggerEvent('ref', this);\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/Input/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\nexport type InputType =\n  | 'text'\n  | 'number'\n  | 'idcard'\n  | 'digit'\n  /**\n   * 支付宝\n   */\n  | 'numberpad'\n  | 'digitpad'\n  | 'idcardpad'\n  /**\n   * 只支持微信\n   */\n  | 'safe-password'\n  | 'nickname';\n\n/**\n * @description 输入框。\n */\n\nexport interface InputProps extends IBaseProps {\n  type?: InputType;\n  value?: string;\n  defaultValue: string;\n  placeholder: string;\n  placeholderClassName: string;\n  placeholderStyle: string;\n  allowClear: boolean;\n  enableNative: boolean;\n  confirmType: string;\n  confirmHold: string;\n  controlled: boolean;\n  alwaysSystem: boolean;\n  selectionStart: number;\n  selectionEnd: number;\n  cursor: number;\n  maxLength?: number;\n  inputClassName?: string;\n  inputStyle: string;\n  password?: boolean;\n  prefix?: string;\n  disabled?: boolean;\n  focusClassName?: string;\n  suffix?: string;\n  focus?: boolean;\n  /**\n   * @description 组件名字，用于表单提交获取数据。\n   */\n  name?: string;\n  focusStyle?: string;\n  /**\n   * @description 当 type 为 number, digit, idcard 数字键盘是否随机排列。\n   * @default false\n   */\n  randomNumber?: boolean;\n  /**\n   * @description 最大值，仅在 type 为 number、digit、numberpad、digitpad 时，且输入有效数字后生效\n   */\n  max?: number;\n  /**\n   * @description 最小值，仅在 type 为 number、digit、numberpad、digitpad 时，且输入有效数字后生效\n   */\n  min?: number;\n  /**\n   * @description 计算精度，保留几位小数，输入有效数字后生效\n   * @default -1\n   */\n  precision?: number;\n\n  /// #if WECHAT\n  /**\n   * @default 指定光标与键盘的距离，取 input 距离底部的距离和 cursor-spacing 指定的距离的最小值作为光标与键盘的距离\n   */\n  cursorSpacing?: number;\n\n  /**\n   * @default 强制 input 处于同层状态，默认 focus 时 input 会切到非同层状态 (仅在 iOS 下生效)\n   */\n  alwaysEmbed?: boolean;\n\n  /**\n   * @description 光标颜色。iOS 下的格式为十六进制颜色值 #000000，安卓下的只支持 default 和 green，Skyline 下无限制\n   */\n  cursorColor?: number;\n\n  /**\n   * @default true\n   * @description 键盘弹起时，是否自动上推页面\n   */\n  adjustPosition?: boolean;\n  /**\n   * @default false\n   * @description focus时，点击页面的时候不收起键盘\n   */\n  holdKeyboard?: boolean;\n  /// #endif\n\n  onChange?: (value: string, e: any) => void;\n  onBlur?: (value: string, e: any) => void;\n  onFocus?: (value: string, e: any) => void;\n  onConfirm?: (value: string, e: any) => void;\n}\n\nexport const InputDefaultProps: InputProps = {\n  type: null,\n  value: null,\n  defaultValue: null,\n  placeholder: null,\n  placeholderClassName: null,\n  placeholderStyle: null,\n  allowClear: null,\n  enableNative: null,\n  confirmType: null,\n  confirmHold: null,\n  controlled: null,\n  alwaysSystem: null,\n  selectionStart: null,\n  selectionEnd: null,\n  cursor: null,\n  /// #if WECHAT\n  maxLength: -1,\n  alwaysEmbed: false,\n  cursorSpacing: 0,\n  cursorColor: null,\n  adjustPosition: true,\n  holdKeyboard: false,\n  /// #endif\n  inputClassName: null,\n  inputStyle: null,\n  password: null,\n  prefix: null,\n  disabled: null,\n  focusClassName: null,\n  suffix: null,\n  focus: null,\n  name: null,\n  focusStyle: null,\n  randomNumber: null,\n  min: null,\n  max: null,\n  precision: -1,\n};\n"
  },
  {
    "path": "src/Input/utils.ts",
    "content": "/**\n * 检查给定值是否是一个数字或可以被解析为一个数字\n * @param value - 要检查的任意值，类型为 unknown\n * @returns 一个布尔值，指示值是否是数字或者可以被解析为数字\n */\nexport function isNumber(value: unknown): boolean {\n  if (typeof value === 'number') {\n    return !isNaN(value);\n  }\n\n  if (typeof value === 'string' && value.trim() !== '') {\n    return !isNaN(Number(value));\n  }\n\n  return false;\n}\n\n/**\n * 格式化数字，同时限制其范围和小数精度。\n *\n * @param value - 要格式化的数值。\n * @param max - 数值允许的最大值。若 `value > max`，则将其限制为 `max`。\n * @param min - 数值允许的最小值。若 `value < min`，则将其限制为 `min`。\n * @param precision - 要保留的小数位数。如果为负值，则返回完整的原始数值（不限制精度）。\n * @returns 格式化后的数值字符串。\n */\nexport function formatNumberWithLimits(\n  value: number,\n  max: number,\n  min: number,\n  precision: number\n): string {\n  // 确保值在[min, max]范围内\n  let formattedValue = Math.max(min, Math.min(max, value));\n\n  if (precision < 0) {\n    // 不限制精度，直接返回数值\n    return String(formattedValue);\n  } else {\n    // 限制精度，保留指定的位数并补足零\n    formattedValue = parseFloat(formattedValue.toFixed(precision));\n    return formattedValue.toFixed(precision);\n  }\n}\n"
  },
  {
    "path": "src/Input/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n// input 字体颜色\n@input-item-color: var(--input-item-color, @COLOR_TEXT_PRIMARY);\n// input 字体大小\n@input-item-size: @font-size-content;\n// input placeholder 颜色\n@input-item-placeholder-color: var(\n  --input-item-placeholder-color,\n  @COLOR_TEXT_WEAK\n);\n// input 清除 颜色\n@input-item-clear-color: var(--input-item-clear-color, @COLOR_TEXT_ASSIST);\n@input-background-color: var(--input-background-color, @COLOR_CARD);\n"
  },
  {
    "path": "src/List/ListItem/index.axml",
    "content": "<import-sjs\n  from=\"../../_util/arrow.sjs\"\n  name=\"arrowUtil\" />\n<!-- #if WECHAT -->\n<view\n  class=\"ant-list-item  {{ className ? className : '' }}\"\n  style=\"{{ style || '' }}\"\n  hover-class=\"{{ onTap || catchTap ? 'ant-list-item-hover' : '' }}\"\n  hover-start-time=\"{{ 20 }}\"\n  hover-stay-time=\"{{ 40 }}\">\n<!-- #endif -->\n<!-- #if ALIPAY -->\n<view\n  class=\"ant-list-item  {{ className ? className : '' }}\"\n  style=\"{{ style || '' }}\"\n  onTap=\"{{ onTap ? 'onTap' : '' }}\"\n  catchTap=\"{{ catchTap ? 'catchTap' : '' }}\"\n  hover-class=\"{{ onTap || catchTap ? 'ant-list-item-hover' : '' }}\"\n  hover-start-time=\"{{ 20 }}\"\n  hover-stay-time=\"{{ 40 }}\">\n<!-- #endif -->\n  <view\n    class=\"ant-list-item-line {{ showDivider ? 'ant-list-item-line-divider' : '' }} {{ disabled ? 'ant-list-item-line-disabled' : '' }}\">\n    <view class=\"ant-list-item-image-container\">\n      <!-- #if WECHAT -->\n      <image-icon\n        wx:if=\"{{ image }}\"\n        image=\"{{ image }}\"\n        className=\"{{ brief ? 'ant-list-item-image ant-list-item-image-large' : 'ant-list-item-image ant-list-item-image-normal' }}\"\n        />\n      <block wx:else>\n        <slot name=\"image\" />\n      </block>\n      <!-- #endif -->\n      <!-- #if ALIPAY -->\n      <slot name=\"image\">\n        <image-icon\n          a:if=\"{{ image }}\"\n          image=\"{{ image }}\"\n          className=\"{{ brief ? 'ant-list-item-image ant-list-item-image-large' : 'ant-list-item-image ant-list-item-image-normal' }}\" />\n      </slot>\n      <!-- #endif -->\n    </view>\n    <view class=\"ant-list-item-content-container\">\n      <view class=\"ant-list-item-content-title-container {{ title && brief ? 'ant-list-item-content-container-small-text' : 'ant-list-item-content-container-normal-text' }}\">\n        <!-- #if WECHAT -->\n        <view\n          wx:if=\"{{ title }}\"\n          class=\"ant-list-item-content-title\">\n          {{ title }}\n        </view>\n        <slot\n          wx:else\n          name=\"title\" />\n        <!-- #endif -->\n        <!-- #if ALIPAY -->\n        <slot name=\"title\">\n          <view\n            a:if=\"{{ title }}\"\n            class=\"ant-list-item-content-title\">\n            {{ title }}\n          </view>\n        </slot>\n        <!-- #endif -->\n      </view>\n      <view class=\"ant-list-item-content-main\">\n        <slot />\n      </view>\n      <view class=\"ant-list-item-content-brief-container {{ title && brief ? 'ant-list-item-content-container-small-text' : 'ant-list-item-content-container-normal-text' }}\">\n        <!-- #if WECHAT -->\n        <view\n          wx:if=\"{{ brief }}\"\n          class=\"ant-list-item-content-brief\">\n          {{ brief }}\n        </view>\n        <slot\n          wx:else\n          name=\"brief\" />\n        <!-- #endif -->\n        <!-- #if ALIPAY -->\n        <slot name=\"brief\">\n          <view\n            a:if=\"{{ brief }}\"\n            class=\"ant-list-item-content-brief\">\n            {{ brief }}\n          </view>\n        </slot>\n        <!-- #endif -->\n      </view>\n    </view>\n    <view class=\"ant-list-item-extra-container\">\n      <view class=\"ant-list-item-extra\">\n        <!-- #if WECHAT -->\n        <block wx:if=\"{{ extra }}\">{{ extra }}</block>\n        <block wx:else>\n          <slot name=\"extra\" />\n        </block>\n        <!-- #endif -->\n        <!-- #if ALIPAY -->\n        <slot name=\"extra\">\n          {{ extra }}\n        </slot>\n        <!-- #endif -->\n      </view>\n      <view class=\"ant-list-item-extra-brief\">\n        <!-- #if WECHAT -->\n        <block wx:if=\"{{ extraBrief }}\">{{ extraBrief }}</block>\n        <block wx:else>\n          <slot name=\"extraBrief\" />\n        </block>\n        <!-- #endif -->\n        <!-- #if ALIPAY -->\n        <slot name=\"extraBrief\">{{ extraBrief }}</slot>\n        <!-- #endif -->\n      </view>\n    </view>\n    <view class=\"ant-list-item-arrow {{ extraBrief && extra ? 'ant-list-item-arrow-large-margin' : '' }}\">\n      <ant-icon\n        a:if=\"{{ arrowUtil.getArrow(arrow) }}\"\n        type=\"{{ arrowUtil.getArrow(arrow) }}\" />\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "src/List/ListItem/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-icon\": \"../../Icon/index\",\n    \"image-icon\": \"../../ImageIcon/index\"\n  }\n}\n"
  },
  {
    "path": "src/List/ListItem/index.less",
    "content": "@import (reference) '../variable.less';\n@import '../../style/mixins/hairline.less';\n\n@listItemPrefix: ant-list-item;\n\n.@{listItemPrefix} {\n  align-items: center;\n  background-color: @list-background-color;\n  color: @list-content-color;\n  line-height: 1.4;\n  &-hover {\n    background-color: @list-item-border-color;\n  }\n\n  &-line {\n    flex: 1;\n    display: flex;\n    padding: 0 24 * @rpx;\n    align-items: center;\n    position: relative;\n    &-divider {\n      .hairline('bottom');\n    }\n    &-disabled {\n      opacity: 0.4;\n    }\n  }\n\n  &-image {\n    border-radius: 50vh;\n    &-large-icon {\n      font-size: @list-item-image-large-size;\n    }\n    &-large-image {\n      width: @list-item-image-large-size;\n      height: @list-item-image-large-size;\n    }\n    &-normal-icon {\n      font-size: @list-item-image-normal-size;\n    }\n    &-normal-image {\n      width: @list-item-image-normal-size;\n      height: @list-item-image-normal-size;\n    }\n    &-container {\n      margin-right: 24 * @rpx;\n      &:empty {\n        display: none;\n      }\n    }\n  }\n\n  &-content {\n    &-container {\n      display: flex;\n      flex: 1;\n      flex-direction: column;\n      padding: 24 * @rpx 0;\n      &-small-text {\n        font-size: 24 * @rpx;\n        line-height: 33 * @rpx;\n      }\n      &-normal-text {\n        font-size: 28 * @rpx;\n        line-height: 40 * @rpx;\n      }\n    }\n\n    &-main {\n      font-size: 32 * @rpx;\n      line-height: 45 * @rpx;\n    }\n    &-title {\n      &-container {\n        color: @list-extra-brief-color;\n      }\n    }\n    &-brief {\n      &-container {\n        color: @list-extra-brief-color;\n      }\n    }\n  }\n\n  &-extra {\n    font-size: 32 * @rpx;\n    line-height: 45 * @rpx;\n    display: flex;\n    flex-direction: row-reverse;\n    &:empty {\n      display: none;\n    }\n    &-container {\n      display: flex;\n      flex-direction: column;\n    }\n\n    &-brief {\n      display: flex;\n      flex-direction: row-reverse;\n      font-size: 28 * @rpx;\n      line-height: 40 * @rpx;\n      color: @list-extra-brief-color;\n    }\n  }\n\n  &-arrow {\n    margin-left: 8 * @rpx;\n    color: @list-item-text-color;\n    display: flex;\n    align-items: center;\n    .ant-icon {\n      font-size: 36 * @rpx;\n    }\n    &-large-margin {\n      margin-left: 24 * @rpx;\n    }\n  }\n\n  .line {\n    height: 1 * @rpx;\n    background-color: @list-item-border-color;\n    width: calc(100% - 24 * @rpx);\n    position: absolute;\n    right: 0;\n  }\n}\n"
  },
  {
    "path": "src/List/ListItem/index.ts",
    "content": "import {\n  Component,\n  triggerCatchEvent,\n  triggerEventOnly,\n} from '../../_util/simply';\nimport { IListItemProps } from './props';\n\nComponent<IListItemProps>({\n  props: {\n    image: '',\n    title: '',\n    brief: '',\n    arrow: false,\n    extra: '',\n    extraBrief: '',\n    disabled: false,\n    showDivider: true,\n  },\n  methods: {\n    /// #if ALIPAY\n    onTap(e) {\n      if (this.props.disabled) {\n        return;\n      }\n      triggerEventOnly(this, 'tap', e);\n    },\n    catchTap(e) {\n      if (this.props.disabled) {\n        return;\n      }\n      triggerCatchEvent(this, 'catchTap', e);\n    },\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "src/List/ListItem/props.ts",
    "content": "import { IBaseProps } from '../../_util/base';\n\nexport interface IListItemProps extends IBaseProps {\n  /**\n   * @description 左侧图片\n   */\n  image?: string;\n  /**\n   * @description 标题信息\n   */\n  title?: string;\n  /**\n   * @description 描述信息\n   */\n  brief?: string;\n  /**\n   * @description 箭头方向，不传表示没有箭头\n   */\n  arrow?: boolean | 'right' | 'up' | 'down';\n  /**\n   * @description 右侧额外内容，即，辅助信息\n   */\n  extra?: string;\n  /**\n   * @description 右侧额外内容，即，次要辅助信息\n   */\n  extraBrief?: string;\n  /**\n   * @description 右侧额外内容，即，次要辅助信息\n   * @default false\n   */\n  disabled?: boolean;\n  /**\n   * @description 是否显示下划线\n   * @default true\n   */\n  showDivider?: boolean;\n  /**\n   * @description 点击整行回调\n   */\n  onTap?: (event?: any) => void;\n  /**\n   * @description 点击整行回调\n   */\n  catchTap?: (event?: any) => void;\n}\n\nexport const ListItemDefaultProps: Partial<IListItemProps> = {\n  disabled: false,\n  showDivider: true,\n};\n"
  },
  {
    "path": "src/List/index.axml",
    "content": "<view\n  class=\"ant-list {{ className ? className : '' }} {{ radius ? 'ant-list-radius' : '' }}\" style=\"{{style}}\">\n  <view\n    a:if=\"{{ header }}\"\n    class=\"ant-list-header\">\n    {{ header }}\n  </view>\n  <view\n    a:else\n    class=\"ant-list-header\">\n    <slot name=\"header\" />\n  </view>\n  <view class=\"ant-list-body\">\n    <slot />\n  </view>\n  <view\n    a:if=\"{{ footer }}\"\n    class=\"ant-list-footer\">\n    {{ footer }}\n  </view>\n  <view\n    a:else\n    class=\"ant-list-footer\">\n    <slot name=\"footer\" />\n  </view>\n</view>\n"
  },
  {
    "path": "src/List/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Information Display\n  order: 8\ntoc: 'content'\n---\n\n# List\n\nGeneric lists can be clean and efficient to carry text, lists, pictures, paragraphs and other elements.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-list\": \"antd-mini/es/List/index\"\n#endif\n#if WECHAT\n  \"ant-list\": \"antd-mini/List/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<ant-list\n  header=\"basic use\"\n  radius=\"{{true}}\"\n>\n  <ant-list-item>1</ant-list-item>\n  <ant-list-item>2</ant-list-item>\n  <ant-list-item>3</ant-list-item>\n</ant-list>\n```\n\n### List Item Configuration\n\n```xml\n<ant-list header=\"List Item Configuration\">\n  <ant-list-item\n    className=\"ant-list-item\"\n    disabled=\"{{true}}\"\n    image=\"PayCircleOutline\"\n    brief=\"Total assets\"\n    extra=\"Detail infos\"\n    showDivider=\"{{true}}\"\n  >\n    Total assets\n  </ant-list-item>\n  <ant-list-item\n    style=\"\"\n    image=\"SetOutline\"\n    arrow=\"right\"\n    extraBrief=\"Detail infos\"\n  >\n    Setup\n  </ant-list-item>\n</ant-list>\n```\n\n### List item clickable\n\n```xml\n<ant-list\n  header=\"List item clickable\"\n  radius=\"{{radius}}\"\n>\n  <ant-list-item\n    image=\"PayCircleOutline\"\n#if ALIPAY\n    onTap=\"handleTap\"\n#endif\n    brief=\"Total assets\"\n    extra=\"Detail infos\"\n    data-info=\"Total assets\"\n  >\n    Total assets\n  </ant-list-item>\n  <ant-list-item\n    image=\"SetOutline\"\n    arrow=\"right\"\n    extraBrief=\"Detail infos\"\n#if ALIPAY\n    catchTap=\"handleTap\"\n#endif\n    data-info=\"config\"\n  >\n    Setup\n  </ant-list-item>\n</ant-list>\n```\n\n### Demo Code\n\n<code src='../../demo/pages/List/index'></code>\n\n## API\n\n### List\n\n| Property      | Description       | Type           | Default Value |\n| --------- | ---------- | -------------- | ------ |\n| className | Class Name       | string         | -      |\n| footer    | Bottom Description   | string \\| slot | -      |\n| header    | Head Description   | string \\| slot | -      |\n| radius    | Whether with rounded corners | boolean        | false  |\n| style     | Style       | string         | -      |\n\n### ListItem\n\n| Property                     | Description                                                     | Type               | Default Value |\n| ------------------------ | -------------------------------------------------------- | ------------------ | ------ |\n| arrow                    | right arrow, optional `right`、`up`、`down`, pass true `right` | string \\| boolean  | -      |\n| brief                    | Second line of information                                               | string \\| slot     | -      |\n| className                | Class Name                                                     | string             | -      |\n| disabled                 | Disable                                                 | boolean            | false  |\n| extra                    | Extra right                                             | string \\| slot     | -      |\n| extraBrief               | Auxiliary information on the right side                                             | string \\| slot     | -      |\n| image                    | Picture on the left                                                 | string             | -      |\n| radius                   | Whether with rounded corners                                               | boolean            | false  |\n| showDivider              | Show underline or not                                           | boolean            | true   |\n| style                    | Style                                                     | string             | -      |\n| title                    | Header Information                                                 | string \\| slot     | -      |\n| #if ALIPAY catchTap      | Callback triggered when clicked                                         | (e: Event) => void |\n| #if ALIPAY onTap         | Callback triggered when clicked                                         | (e: Event) => void |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                   | Default Value                                                                                            | Dark Mode Default                                                                                    | Remarks             |\n| ------------------------ | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------- |\n| --list-header-color      | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | List head color     |\n| --list-footer-color      | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | List bottom color     |\n| --list-background-color  | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | List background color     |\n| --list-content-color     | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | List Content Text Color |\n| --list-extra-brief-color | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | List Extra Brief Color |\n| --list-item-border-color | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #333333;\">#eeeeee</div> | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #ffffff;\">#2b2b2b</div> | List Item Border Color   |\n| --list-item-text-color   | <div style=\"width: 150px; height: 30px; background-color: #cccccc; color: #333333;\">#cccccc</div> | <div style=\"width: 150px; height: 30px; background-color: #474747; color: #ffffff;\">#474747</div> | List Item Text Color   |\n"
  },
  {
    "path": "src/List/index.json",
    "content": "{  \n  \"styleIsolation\": \"shared\",\n  \"component\": true\n}\n"
  },
  {
    "path": "src/List/index.less",
    "content": "@import (reference) './variable.less';\n\n@listPrefix: ant-list;\n\n.@{listPrefix} {\n  &-radius {\n    margin: 0 @v-spacing-large;\n    & .@{listPrefix}-body {\n      border-radius: @list-radius;\n    }\n    .@{listPrefix}-header,\n    .@{listPrefix}-footer {\n      padding: @v-spacing-standard 0;\n    }\n  }\n  &-header,\n  &-footer {\n    display: flex;\n    align-items: center;\n    padding: @v-spacing-standard @v-spacing-large;\n    line-height: 1.4;\n    font-size: 30 * @rpx;\n    color: @list-header-color;\n    &:empty {\n      display: none;\n    }\n  }\n  &-body {\n    position: relative;\n    overflow: hidden;\n    // 隐藏最后一根分割线\n    > .ant-list-item:last-child {\n      .ant-list-item-line::after {\n        display: none;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/List/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 数据展示\n  order: 8\ntoc: 'content'\n---\n\n# List 列表\n\n通用列表可以干净高效地承载文字、列表、图片、段落等元素。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-list\": \"antd-mini/es/List/index\"\n#endif\n#if WECHAT\n  \"ant-list\": \"antd-mini/List/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-list\n  header=\"basic use\"\n  radius=\"{{true}}\"\n>\n  <ant-list-item>1</ant-list-item>\n  <ant-list-item>2</ant-list-item>\n  <ant-list-item>3</ant-list-item>\n</ant-list>\n```\n\n### 列表项配置\n\n```xml\n<ant-list header=\"List Item Configuration\">\n  <ant-list-item\n    className=\"ant-list-item\"\n    disabled=\"{{true}}\"\n    image=\"PayCircleOutline\"\n    brief=\"Total assets\"\n    extra=\"Detail infos\"\n    showDivider=\"{{true}}\"\n  >\n    总资产\n  </ant-list-item>\n  <ant-list-item\n    style=\"\"\n    image=\"SetOutline\"\n    arrow=\"right\"\n    extraBrief=\"Detail infos\"\n  >\n    设置\n  </ant-list-item>\n</ant-list>\n```\n\n### 列表项可点击\n\n```xml\n<ant-list\n  header=\"List item clickable\"\n  radius=\"{{radius}}\"\n>\n  <ant-list-item\n    image=\"PayCircleOutline\"\n#if ALIPAY\n    onTap=\"handleTap\"\n#endif\n    brief=\"Total assets\"\n    extra=\"Detail infos\"\n    data-info=\"Total assets\"\n  >\n    总资产\n  </ant-list-item>\n  <ant-list-item\n    image=\"SetOutline\"\n    arrow=\"right\"\n    extraBrief=\"Detail infos\"\n#if ALIPAY\n    catchTap=\"handleTap\"\n#endif\n    data-info=\"config\"\n  >\n    设置\n  </ant-list-item>\n</ant-list>\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/List/index'></code>\n\n## API\n\n### List\n\n| 属性      | 说明       | 类型           | 默认值 |\n| --------- | ---------- | -------------- | ------ |\n| className | 类名       | string         | -      |\n| footer    | 底部说明   | string \\| slot | -      |\n| header    | 头部说明   | string \\| slot | -      |\n| radius    | 是否带圆角 | boolean        | false  |\n| style     | 样式       | string         | -      |\n\n### ListItem\n\n| 属性                     | 说明                                                     | 类型               | 默认值 |\n| ------------------------ | -------------------------------------------------------- | ------------------ | ------ |\n| arrow                    | 右侧箭头，可选 `right`、`up`、`down`，传 true 为 `right` | string \\| boolean  | -      |\n| brief                    | 第二行信息                                               | string \\| slot     | -      |\n| className                | 类名                                                     | string             | -      |\n| disabled                 | 是否禁用                                                 | boolean            | false  |\n| extra                    | 右侧额外内容                                             | string \\| slot     | -      |\n| extraBrief               | 右侧辅助信息                                             | string \\| slot     | -      |\n| image                    | 左侧图片                                                 | string             | -      |\n| radius                   | 是否带圆角                                               | boolean            | false  |\n| showDivider              | 是否显示下划线                                           | boolean            | true   |\n| style                    | 样式                                                     | string             | -      |\n| title                    | 标题信息                                                 | string \\| slot     | -      |\n| #if ALIPAY catchTap      | 点击时触发的回调                                         | (e: Event) => void |\n| #if ALIPAY onTap         | 点击时触发的回调                                         | (e: Event) => void |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                   | 默认值                                                                                            | 深色模式默认值                                                                                    | 备注             |\n| ------------------------ | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------- |\n| --list-header-color      | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | 列表头部颜色     |\n| --list-footer-color      | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | 列表底部颜色     |\n| --list-background-color  | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | 列表背景颜色     |\n| --list-content-color     | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | 列表内容文本颜色 |\n| --list-extra-brief-color | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | 列表额外简述颜色 |\n| --list-item-border-color | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #333333;\">#eeeeee</div> | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #ffffff;\">#2b2b2b</div> | 列表项边框颜色   |\n| --list-item-text-color   | <div style=\"width: 150px; height: 30px; background-color: #cccccc; color: #333333;\">#cccccc</div> | <div style=\"width: 150px; height: 30px; background-color: #474747; color: #ffffff;\">#474747</div> | 列表项文本颜色   |\n"
  },
  {
    "path": "src/List/index.ts",
    "content": "import { Component } from '../_util/simply';\nimport { IListProps } from './props';\n\nComponent<IListProps>({\n  props: {\n    radius: false,\n    header: '',\n    footer: '',\n  },\n});\n"
  },
  {
    "path": "src/List/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n/**\n * @description 列表，内部配合 ListItem 使用。\n */\n\nexport interface IListProps extends IBaseProps {\n  /**\n   * @description 是否带圆角\n   * @default false\n   */\n  radius?: boolean;\n  /**\n   * @description 头部说明\n   */\n\n  header?: string;\n  /**\n   * @description 底部说明\n   */\n\n  footer?: string;\n}\n\nexport const ListDefaultProps: Partial<IListProps> = {\n  radius: false,\n};\n"
  },
  {
    "path": "src/List/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n// header 颜色\n@list-header-color: var(--list-header-color, @COLOR_TEXT_ASSIST);\n// header 字体大小\n@list-header-size: 28 * @rpx;\n// footer 颜色\n@list-footer-color: var(--list-footer-color, @COLOR_TEXT_ASSIST);\n// footer 字体大小\n@list-footer-size: 28 * @rpx;\n// 圆角\n@list-radius: 24 * @rpx;\n// 背景\n@list-background-color: var(--list-background-color, @COLOR_CARD);\n// 主要文字大小\n@list-content-size: @font-size-list;\n// 额外文字大小\n@list-extra-size: 32 * @rpx;\n// 第二行文字大小\n@list-brief-size: 26 * @rpx;\n// 主要文字颜色\n@list-content-color: var(--list-content-color, @COLOR_TEXT_PRIMARY);\n// 辅助文字颜色\n@list-extra-brief-color: var(--list-extra-brief-color, @COLOR_TEXT_ASSIST);\n// 图片尺寸\n@list-icon-size: 52 * @rpx;\n// 多行，图片尺寸\n@list-multi-icon-size: 72 * @rpx;\n\n// 图片和icon的大小\n@list-item-image-normal-size: 56 * @rpx;\n// 图片和icon的大小\n@list-item-image-large-size: 80 * @rpx;\n\n@list-item-border-color: var(--list-item-border-color, @COLOR_BORDER);\n\n@list-item-text-color: var(--list-item-text-color, @COLOR_TEXT_WEAK);\n"
  },
  {
    "path": "src/Loading/index.axml",
    "content": "<import-sjs\n  from=\"./index.sjs\"\n  name=\"helper\" />\n\n<view\n  class=\"ant-loading {{ type === 'spin' ? 'ant-loading-spin' : 'ant-loading-mini' }} {{ helper.getClass(size) }} {{ className ? className : '' }}\"\n  style=\"{{ style }}\">\n  <view\n    a:if=\"{{ type === 'spin' }}\"\n    class=\"ant-loading-spin-icon\"\n    style=\"background-image: url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%2224%2024%2048%2048%22%3E%3CanimateTransform%20attributeName%3D%22transform%22%20type%3D%22rotate%22%20repeatCount%3D%22indefinite%22%20from%3D%220%22%20to%3D%22360%22%20dur%3D%221400ms%22%3E%3C%2FanimateTransform%3E%3Ccircle%20cx%3D%2248%22%20cy%3D%2248%22%20r%3D%2220%22%20fill%3D%22none%22%20stroke%3D%22%23{{helper.getLoadingColor(color || '#fff')}}%22%20stroke-width%3D%222%22%20transform%3D%22translate%5C\\(0%2C0%5C\\)%22%3E%3Canimate%20attributeName%3D%22stroke-dasharray%22%20values%3D%221px%2C%20200px%3B100px%2C%20200px%3B100px%2C%20200px%22%20dur%3D%221400ms%22%20repeatCount%3D%22indefinite%22%3E%3C%2Fanimate%3E%3Canimate%20attributeName%3D%22stroke-dashoffset%22%20values%3D%220px%3B-15px%3B-125px%22%20dur%3D%221400ms%22%20repeatCount%3D%22indefinite%22%3E%3C%2Fanimate%3E%3C%2Fcircle%3E%3C%2Fsvg%3E');\" />\n  <block a:else>\n    <view\n      class=\"ant-loading-mini-item ant-loading-mini-item__1\"\n      style=\"{{ color ? 'background-color: ' + color + ';' : '' }}\">\n      .\n    </view>\n    <view\n      class=\"ant-loading-mini-item ant-loading-mini-item__2\"\n      style=\"{{ color ? 'background-color: ' + color + ';' : '' }}\">\n      .\n    </view>\n    <view\n      class=\"ant-loading-mini-item ant-loading-mini-item__3\"\n      style=\"{{ color ? 'background-color: ' + color + ';' : '' }}\">\n      .\n    </view>\n  </block>\n</view>\n"
  },
  {
    "path": "src/Loading/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Feedback\ntoc: 'content'\n---\n\n# Loading\n\nUsed to prompt that a part or page is loading.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-loading\": \"antd-mini/es/Loading/index\"\n#endif\n#if WECHAT\n  \"ant-loading\": \"antd-mini/Loading/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<ant-loading type=\"mini\" />\n```\n\n### Spin size\n\n```xml\n<ant-loading type=\"spin\" size=\"x-large\" />\n<ant-loading type=\"spin\" size=\"large\" />\n<ant-loading type=\"spin\" size=\"medium\" />\n<ant-loading type=\"spin\" size=\"small\" />\n```\n\n### Custom Colors\n\n```xml\n<ant-loading type=\"mini\" color=\"#1677ff\" />\n<ant-loading color=\"#34B368\" />\n```\n\n### Custom Size\n\n```xml\n<ant-loading style=\"width: 40px; height: 40px\" />\n<ant-loading className=\"custom-size\" />\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Loading/index' noChangeButton></code>\n\n## API\n\n| Property      | Description                                                                               | Type   | Default Value   |\n| --------- | ---------------------------------------------------------------------------------- | ------ | -------- |\n| className | Root node class name                                                                         | string | -        |\n| color     | The color when loading, when type is `spin` Only hexadecimal color codes are supported.                           | string | `#fff`   |\n| size      | Load icon size, when type is `spin` effective. Optional `small`、`medium`、`large`、`x-large` | string | `medium` |\n| style     | root node style                                                                       | string | -        |\n| type      | Load style type, optional `spin`、`mini`                                                  | string | `spin`   |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For more information, see ConfigProvider Components.\n\n| Variable name                     | Default Value                                                                                                                              | Dark Mode Default                                                                                                                      | Remarks                 |\n| -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | -------------------- |\n| --loading-text-color       | <div style=\"width: 150px; height: 40px; background-color: #d8d8d8; color: #333333;\">#d8d8d8</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #454955; color: #ffffff;\">#454955</div>                                   | Load Text Color (Iron Black) |\n| --loading-icon-light-color | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0.6); color: #333333;\">rgba(255, 255, 255, 0.6)</div> | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0.6); color: #333333;\">rgba(255, 255, 255, 0.6)</div> | Load icon light         |\n"
  },
  {
    "path": "src/Loading/index.json",
    "content": "{  \n  \"styleIsolation\": \"shared\",\n  \"component\": true\n}\n"
  },
  {
    "path": "src/Loading/index.less",
    "content": "@import (reference) './variable.less';\n\n@loadingPrefix: ant-loading;\n\n.@{loadingPrefix} {\n  &-small {\n    width: @loading-icon-size-small;\n    height: @loading-icon-size-small;\n  }\n\n  &-medium {\n    width: @loading-icon-size-medium;\n    height: @loading-icon-size-medium;\n  }\n\n  &-large {\n    width: @loading-icon-size-large;\n    height: @loading-icon-size-large;\n  }\n\n  &-x-large {\n    width: @loading-icon-size-x-large;\n    height: @loading-icon-size-x-large;\n  }\n\n  &-spin {\n    display: inline-flex;\n    justify-content: center;\n    align-items: center;\n\n    &-icon {\n      width: 100%;\n      height: 100%;\n      background-position: center;\n      background-repeat: no-repeat;\n    }\n  }\n\n  &-mini {\n    display: inline-flex;\n    justify-content: center;\n    align-items: center;\n    min-width: 66 * @rpx;\n    min-height: 66 * @rpx;\n\n    &-item {\n      flex: 0 0 8 * @rpx;\n      min-width: 8 * @rpx;\n      min-height: 8 * @rpx;\n      max-width: 8 * @rpx;\n      max-height: 8 * @rpx;\n      overflow: hidden;\n      margin-right: @h-spacing-standard;\n      font-size: 0;\n      border-radius: @corner-radius-sm / 2;\n      background-color: @COLOR_TEXT_ASSIST;\n      animation: ant-loading-animation 1s 0s infinite linear;\n\n      &__1 {\n        animation-delay: 0s;\n      }\n\n      &__2 {\n        animation-delay: 150ms;\n      }\n\n      &__3 {\n        margin-right: 0;\n        animation-delay: 300ms;\n      }\n    }\n  }\n}\n\n@keyframes ant-loading-animation {\n  0% {\n    transform: translate3d(0, 0, 0);\n  }\n\n  12% {\n    transform: translate3d(0, -150%, 0);\n  }\n\n  40% {\n    transform: translate3d(0, 110%, 0);\n  }\n\n  55% {\n    transform: translate3d(0, -10%, 0);\n  }\n\n  60% {\n    transform: translate3d(0, 0, 0);\n  }\n\n  100% {\n    transform: translate3d(0, 0, 0);\n  }\n}\n"
  },
  {
    "path": "src/Loading/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 反馈引导\ntoc: 'content'\n---\n\n# Loading 加载\n\n用于提示局部或页面在加载中。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-loading\": \"antd-mini/es/Loading/index\"\n#endif\n#if WECHAT\n  \"ant-loading\": \"antd-mini/Loading/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-loading type=\"mini\" />\n```\n\n### Spin 大小\n\n```xml\n<ant-loading type=\"spin\" size=\"x-large\" />\n<ant-loading type=\"spin\" size=\"large\" />\n<ant-loading type=\"spin\" size=\"medium\" />\n<ant-loading type=\"spin\" size=\"small\" />\n```\n\n### 自定义颜色\n\n```xml\n<ant-loading type=\"mini\" color=\"#1677ff\" />\n<ant-loading color=\"#34B368\" />\n```\n\n### 自定义大小\n\n```xml\n<ant-loading style=\"width: 40px; height: 40px\" />\n<ant-loading className=\"custom-size\" />\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Loading/index' noChangeButton></code>\n\n## API\n\n| 属性      | 说明                                                                               | 类型   | 默认值   |\n| --------- | ---------------------------------------------------------------------------------- | ------ | -------- |\n| className | 根节点类名                                                                         | string | -        |\n| color     | 加载时的颜色，当 type 为 `spin` 时，只支持十六进制颜色码                           | string | `#fff`   |\n| size      | 加载图标尺寸，当 type 为 `spin` 时生效。可选 `small`、`medium`、`large`、`x-large` | string | `medium` |\n| style     | 根节点 style                                                                       | string | -        |\n| type      | 加载样式类型，可选 `spin`、`mini`                                                  | string | `spin`   |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                     | 默认值                                                                                                                              | 深色模式默认值                                                                                                                      | 备注                 |\n| -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | -------------------- |\n| --loading-text-color       | <div style=\"width: 150px; height: 40px; background-color: #d8d8d8; color: #333333;\">#d8d8d8</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #454955; color: #ffffff;\">#454955</div>                                   | 加载文本颜色（铁黑） |\n| --loading-icon-light-color | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0.6); color: #333333;\">rgba(255, 255, 255, 0.6)</div> | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0.6); color: #333333;\">rgba(255, 255, 255, 0.6)</div> | 加载图标浅色         |\n"
  },
  {
    "path": "src/Loading/index.sjs.ts",
    "content": "function getLoadingColor(color) {\n  if (typeof color === 'string' && color[0] === '#') {\n    return color.slice(1);\n  }\n}\n\nfunction getClass(size) {\n  const list = ['small', 'medium', 'large', 'x-large'];\n  if (list.indexOf(size) >= 0) {\n    return `ant-loading-${size}`;\n  }\n  return 'ant-loading-medium';\n}\n\nexport default {\n  getLoadingColor: getLoadingColor,\n  getClass: getClass,\n};\n"
  },
  {
    "path": "src/Loading/index.ts",
    "content": "import { LoadingDefaultProps } from './props';\nimport '../_util/assert-component2';\n\nComponent({\n  /// #if WECHAT\n  properties: {\n    type: {\n      value: 'spin',\n      type: String,\n    },\n    color: {\n      type: String,\n    },\n    size: {\n      type: String,\n    },\n    style: {\n      type: String,\n    },\n    className: {\n      type: String,\n    },\n  },\n  options: {\n    styleIsolation: 'shared',\n  } as unknown,\n  /// #endif\n  props: LoadingDefaultProps,\n});\n"
  },
  {
    "path": "src/Loading/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n/**\n * @description 加载，用于提示局部或页面在加载中。\n */\n\nexport interface ILoadingProps extends IBaseProps {\n  /**\n   * @description 加载时的颜色，当 type 为 'spin' 时，只支持十六进制颜色码，如'#fff'\n   * @default '#fff'\n   */\n  color?: string;\n\n  /**\n   * @description 加载图标尺寸，当 type 为 'spin' 时生效\n   * @default medium\n   */\n  size?: 'small' | 'medium' | 'large' | 'x-large';\n\n  type?: 'spin' | 'mini';\n}\n\nexport const LoadingDefaultProps: Partial<ILoadingProps> = {\n  size: 'medium',\n  color: '#fff',\n  type: 'spin',\n};\n"
  },
  {
    "path": "src/Loading/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n// loading 尺寸\n@loading-icon-size-x-large: 140 * @rpx;\n@loading-icon-size-large: 140 * 0.75 * @rpx;\n@loading-icon-size-medium: 140 * 0.5 * @rpx;\n@loading-icon-size-small: 140 * 0.25 * @rpx;\n// 辅助文字尺寸\n@loading-text-size: @font-size-weak;\n// 辅助文字颜色\n@loading-text-color: var(--loading-text-color, @color-ironblack-1);\n// 浅色颜色\n@loading-icon-light-color: var(\n  --loading-icon-light-color,\n  rgba(255, 255, 255, 0.6)\n);\n"
  },
  {
    "path": "src/Mask/index.axml",
    "content": "<view\n  class=\"ant-mask {{ className || '' }}\"\n  style=\"{{ show ? '' : 'display: none;' }} {{ style || '' }}\"\n  onTap=\"onMaskTap\" />\n"
  },
  {
    "path": "src/Mask/index.json",
    "content": "{  \n  \"styleIsolation\": \"shared\",\n  \"component\": true\n}\n"
  },
  {
    "path": "src/Mask/index.less",
    "content": "@import (reference) './variable.less';\n.ant-mask {\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  z-index: 0;\n  background-color: @mask-background-color;\n  width: 300vw;\n  height: 300vh;\n  transform: translate3d(-100vw, -100vh, 0);\n}\n"
  },
  {
    "path": "src/Mask/index.ts",
    "content": "import { Component, IPlatformEvent, triggerEventOnly } from '../_util/simply';\n\nComponent({\n  props: {\n    show: true,\n  },\n  methods: {\n    onMaskTap(e: IPlatformEvent) {\n      triggerEventOnly(this, 'maskTap', e);\n    },\n  },\n});\n"
  },
  {
    "path": "src/Mask/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\n/**\n * @description 加载，用于提示局部或页面在加载中。\n */\nexport interface IMaskProps extends IBaseProps {\n  show: boolean;\n  onMaskTap?: (v: Record<string, unknown>) => void;\n}\n\nexport const MaskDefaultProps: Partial<IMaskProps> = {\n  show: true,\n};\n"
  },
  {
    "path": "src/Mask/variable.less",
    "content": "@import (reference) '../style/variables.less';\n\n@mask-background-color: var(--mask-background-color, rgba(0, 0, 0, 0.55));\n"
  },
  {
    "path": "src/Modal/index.axml",
    "content": "<import-sjs\n  from=\"./index.sjs\"\n  name=\"utils\" />\n\n<ant-popup\n  className=\"ant-modal {{ className || '' }}\"\n  style=\"{{ style || '' }}\"\n  maskClassName=\"{{ maskClassName }}\"\n  maskStyle=\"{{ maskStyle }}\"\n  visible=\"{{ visible }}\"\n  duration=\"{{ duration }}\"\n  position=\"center\"\n  animation=\"{{ animation }}\"\n  zIndex=\"{{ zIndex }}\"\n  destroyOnClose=\"{{ destroyOnClose }}\"\n  onClose=\"onMaskClose\">\n  <!-- #if ALIPAY -->\n  <slot>\n  <!-- #endif -->\n    <view\n      class=\"ant-modal-body {{ bodyClassName || '' }}\"\n      style=\"{{ bodyStyle || '' }}\">\n      <slot name=\"header\" />\n      <!-- #if WECHAT -->\n      <view\n        wx:if=\"{{ title }}\"\n        class=\"ant-modal-body-title\">\n        {{ title }}\n      </view>\n      <slot\n        wx:else\n        name=\"title\" />\n      <!-- #endif -->\n      <!-- #if ALIPAY -->\n      <slot name=\"title\">\n        <view\n          a:if=\"{{ title }}\"\n          class=\"ant-modal-body-title\">\n          {{ title }}\n        </view>\n      </slot>\n      <!-- #endif -->\n\n      <!-- #if WECHAT -->\n      <view\n        wx:if=\"{{ content }}\"\n        class=\"ant-modal-body-content\">\n        {{ content }}\n      </view>\n      <slot\n        wx:else\n        name=\"content\" />\n      <!-- #endif -->\n      <!-- #if ALIPAY -->\n      <slot name=\"content\">\n        <view\n          a:if=\"{{ content }}\"\n          class=\"ant-modal-body-content\">\n          {{ content }}\n        </view>\n      </slot>\n      <!-- #endif -->\n      <!-- #if ALIPAY -->\n      <slot name=\"footer\">\n      <!-- #endif -->\n        <view\n          a:if=\"{{ type === 'focus' }}\"\n          class=\"ant-modal-body-footer-focus\">\n          <ant-button\n            type=\"primary\"\n            className=\"ant-modal-body-footer-focus-primary\"\n            style=\"{{ primaryButtonStyle || '' }}\"\n            onTap=\"onPrimaryButtonTap\">\n            {{ primaryButtonText }}\n          </ant-button>\n          <view\n            a:if=\"{{ secondaryButtonText }}\"\n            class=\"ant-modal-body-footer-focus-secondary\"\n            style=\"{{ secondaryButtonStyle || '' }}\"\n            onTap=\"onSecondaryButtonTap\">\n            {{ secondaryButtonText }}\n          </view>\n          <view\n            a:if=\"{{ cancelButtonText }}\"\n            class=\"ant-modal-body-footer-focus-cancel\"\n            style=\"{{ cancelButtonStyle || '' }}\"\n            onTap=\"onCancelButtonTap\">\n            {{ cancelButtonText }}\n          </view>\n        </view>\n        <view\n          a:elif=\"{{ utils.getDirection(primaryButtonText, secondaryButtonText, cancelButtonText, type) === 'horizontal' }}\"\n          class=\"ant-modal-body-footer-horizontal\">\n          <view\n            a:if=\"{{ cancelButtonText }}\"\n            class=\"ant-modal-body-footer-horizontal-cancel\"\n            style=\"{{ cancelButtonStyle || '' }}\"\n            onTap=\"onCancelButtonTap\">\n            {{ cancelButtonText }}\n          </view>\n          <view\n            a:if=\"{{ secondaryButtonText }}\"\n            class=\"ant-modal-body-footer-horizontal-secondary\"\n            style=\"{{ secondaryButtonStyle || '' }}\"\n            onTap=\"onSecondaryButtonTap\">\n            {{ secondaryButtonText }}\n          </view>\n          <view\n            a:if=\"{{ primaryButtonText }}\"\n            class=\"ant-modal-body-footer-horizontal-primary\"\n            style=\"{{ primaryButtonStyle || '' }}\"\n            onTap=\"onPrimaryButtonTap\">\n            {{ primaryButtonText }}\n          </view>\n        </view>\n        <view\n          a:elif=\"{{ utils.getDirection(primaryButtonText, secondaryButtonText, cancelButtonText, type) === 'vertical' }}\"\n          class=\"ant-modal-body-footer-vertical\">\n          <view\n            a:if=\"{{ primaryButtonText }}\"\n            class=\"ant-modal-body-footer-vertical-primary\"\n            style=\"{{ primaryButtonStyle || '' }}\"\n            onTap=\"onPrimaryButtonTap\">\n            {{ primaryButtonText }}\n          </view>\n          <view\n            a:if=\"{{ secondaryButtonText }}\"\n            class=\"ant-modal-body-footer-vertical-secondary\"\n            style=\"{{ secondaryButtonStyle || '' }}\"\n            onTap=\"onSecondaryButtonTap\">\n            {{ secondaryButtonText }}\n          </view>\n          <view\n            a:if=\"{{ cancelButtonText }}\"\n            class=\"ant-modal-body-footer-vertical-cancel\"\n            style=\"{{ cancelButtonStyle || '' }}\"\n            onTap=\"onCancelButtonTap\">\n            {{ cancelButtonText }}\n          </view>\n        </view>\n      <!-- #if ALIPAY -->\n      </slot>\n      <!-- #endif -->\n    </view>\n  <!-- #if ALIPAY -->\n  </slot>\n  <!-- #endif -->\n\n  <ant-icon\n    a:if=\"{{ type === 'focus' && closable }}\"\n    type=\"CloseOutline\"\n    onTap=\"onClose\"\n    className=\"ant-modal-close\" />\n</ant-popup>\n"
  },
  {
    "path": "src/Modal/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: To Discard\n  order: 99\ntoc: 'content'\n---\n\n# Modal\n\nNot recommended, this component will be obsolete. recommend use [Dialog](/components/dialog) Components, with the latest design specifications.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-modal\": \"antd-mini/es/Modal/index\"\n#endif\n#if WECHAT\n  \"ant-modal\": \"antd-mini/Modal/index\"\n#endif\n}\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Modal/index'></code>\n\n## API\n\n| Property                               | Description                                              | Type         | Default Value    |\n| ---------------------------------- | ------------------------------------------------- | ------------ | --------- |\n| bodyClassName                      | body class name                                         | string       | -         |\n| bodyStyle                          | body style                                         | string       | -         |\n| cancelButtonStyle                  | Cancel Button Style                                      | string       | -         |\n| cancelButtonText                   | Cancel Button Text                                      | string       | -         |\n| className                          | Class Name                                              | string       | -         |\n| closable                           | Whether to display the close button in the upper right corner. Only valid when type is focus | boolean      | -         |\n| content                            | Content                                              | string\\|slot | -         |\n| destroyOnClose                     | Whether to unload content when invisible                              | boolean      | false     |\n| footer                             | Custom Button Area                                      | slot         | -         |\n| maskClosable                       | Click whether the layer triggers the onClose.                          | boolean      | true      |\n| maskClassName                      | Class name of the layer                                        | string       | -         |\n| maskStyle                          | Mask Style                                        | string       | -         |\n| primaryButtonStyle                 | Main Button Style                                        | string       | -         |\n| primaryButtonText                  | Main button text                                        | string       | -         |\n| secondaryButtonStyle               | Auxiliary Button Style                                      | string       | -         |\n| secondaryButtonText                | Secondary Button Text                                      | string       | -         |\n| style                              | Style                                              | string       | -         |\n| title                              | Title                                              | string\\|slot | -         |\n| type                               | type, optional `default`(default),`focus`(emphasis mode)     | string       | `default` |\n| visible                            | Whether to display                                          | boolean      | false     |\n| #if ALIPAY onCancelButtonTap       | Cancel button click event                                  | ()=>void     | -         |\n| #if ALIPAY onClose                 | Click the close button in the upper right corner in the layer or emphasis mode to trigger the callback  | ()=>void     | -         |\n| #if ALIPAY onPrimaryButtonTap      | Main button click event                                    | ()=>void     | -         |\n| #if ALIPAY onSecondaryButtonTap    | Secondary button click event                                  | ()=>void     | -         |\n| #if WECHAT bindcancelbuttontap    | Cancel button click event                                  | ()=>void     | -         |\n| #if WECHAT bindclose              | Click the close button in the upper right corner in the layer or emphasis mode to trigger the callback  | ()=>void     | -         |\n| #if WECHAT bindprimarybuttontap   | Main button click event                                    | ()=>void     | -         |\n| #if WECHAT bindsecondarybuttontap | Secondary button click event                                  | ()=>void     | -         |\n"
  },
  {
    "path": "src/Modal/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-button\": \"../Button/index\",\n    \"ant-icon\": \"../Icon/index\",\n    \"ant-popup\": \"../Popup/index\"\n  }\n}\n"
  },
  {
    "path": "src/Modal/index.less",
    "content": "@import (reference) './variable.less';\n@import (reference) '../style/mixins/hairline.less';\n\n@modalPrefix: ant-modal;\n\n.@{modalPrefix} {\n  &-body {\n    width: 560 * @rpx;\n    background-color: @modal-background-color;\n    border-radius: @modal-radius;\n    padding-top: 40 * @rpx;\n    display: flex;\n    flex-direction: column;\n    &-title {\n      font-size: @font-size-title;\n      line-height: 50 * @rpx;\n      text-align: center;\n      color: @modal-title-color;\n      margin: 0 24 * @rpx 16 * @rpx;\n    }\n\n    &-content {\n      line-height: 42 * @rpx;\n      font-size: @modal-content-size;\n      color: @modal-content-color;\n      text-align: center;\n      margin: 0 24 * @rpx 40 * @rpx;\n    }\n    &-footer {\n      &-focus {\n        padding: 0 24 * @rpx 24 * @rpx;\n        &-secondary,\n        &-cancel {\n          color: @COLOR_BRAND1;\n          text-align: center;\n          font-size: 36 * @rpx;\n          margin-top: 16 * @rpx;\n          padding-top: 24 * @rpx;\n        }\n      }\n      &-vertical {\n        padding: 0 0 24 * @rpx;\n        &-primary,\n        &-secondary,\n        &-cancel {\n          color: @COLOR_BRAND1;\n          text-align: center;\n          font-size: 36 * @rpx;\n          margin-top: 16 * @rpx;\n          padding-top: 24 * @rpx;\n          position: relative;\n          .hairline('top');\n        }\n      }\n      &-horizontal {\n        display: flex;\n        flex-direction: row;\n        position: relative;\n        .hairline('top');\n        &-primary,\n        &-secondary,\n        &-cancel {\n          position: relative;\n          flex: 1;\n          color: @COLOR_BRAND1;\n          text-align: center;\n          font-size: 36 * @rpx;\n          padding: 24 * @rpx 0;\n          &:nth-child(1) {\n            .hairline('right');\n          }\n        }\n      }\n    }\n  }\n  &-close {\n    position: absolute;\n    right: 16 * @rpx;\n    top: 13 * @rpx;\n    z-index: 3;\n    width: 52 * @rpx;\n    height: 58 * @rpx;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    font-size: 36 * @rpx;\n    color: @modal-close-text-color;\n  }\n  .ant-popup-content.ant-popup-center {\n    min-height: 0;\n    padding: 0;\n  }\n}\n"
  },
  {
    "path": "src/Modal/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 待废弃\n  order: 99\ntoc: 'content'\n---\n\n# Modal 弹窗\n\n不建议使用，此组件即将废弃。推荐使用 [Dialog](/components/dialog) 组件，拥有最新设计规范。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-modal\": \"antd-mini/es/Modal/index\"\n#endif\n#if WECHAT\n  \"ant-modal\": \"antd-mini/Modal/index\"\n#endif\n}\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Modal/index'></code>\n\n## API\n\n| 属性                               | 说明                                              | 类型         | 默认值    |\n| ---------------------------------- | ------------------------------------------------- | ------------ | --------- |\n| bodyClassName                      | body 类名                                         | string       | -         |\n| bodyStyle                          | body 样式                                         | string       | -         |\n| cancelButtonStyle                  | 取消按钮样式                                      | string       | -         |\n| cancelButtonText                   | 取消按钮文本                                      | string       | -         |\n| className                          | 类名                                              | string       | -         |\n| closable                           | 是否显示右上角的关闭按钮。仅在 type 为 focus 生效 | boolean      | -         |\n| content                            | 内容                                              | string\\|slot | -         |\n| destroyOnClose                     | 不可见时是否卸载内容                              | boolean      | false     |\n| footer                             | 自定义按钮区                                      | slot         | -         |\n| maskClosable                       | 点击蒙层是否触发 onClose                          | boolean      | true      |\n| maskClassName                      | 蒙层的类名                                        | string       | -         |\n| maskStyle                          | 蒙层的样式                                        | string       | -         |\n| primaryButtonStyle                 | 主按钮样式                                        | string       | -         |\n| primaryButtonText                  | 主按钮文本                                        | string       | -         |\n| secondaryButtonStyle               | 辅助按钮样式                                      | string       | -         |\n| secondaryButtonText                | 辅助按钮文本                                      | string       | -         |\n| style                              | 样式                                              | string       | -         |\n| title                              | 标题                                              | string\\|slot | -         |\n| type                               | 类型，可选 `default`(默认)、`focus`(强调模式)     | string       | `default` |\n| visible                            | 是否显示                                          | boolean      | false     |\n| #if ALIPAY onCancelButtonTap       | 取消按钮点击事件                                  | ()=>void     | -         |\n| #if ALIPAY onClose                 | 点击蒙层或强调模式下点击右上角关闭按钮，触发回调  | ()=>void     | -         |\n| #if ALIPAY onPrimaryButtonTap      | 主按钮点击事件                                    | ()=>void     | -         |\n| #if ALIPAY onSecondaryButtonTap    | 辅助按钮点击事件                                  | ()=>void     | -         |\n| #if WECHAT bindcancelbuttontap    | 取消按钮点击事件                                  | ()=>void     | -         |\n| #if WECHAT bindclose              | 点击蒙层或强调模式下点击右上角关闭按钮，触发回调  | ()=>void     | -         |\n| #if WECHAT bindprimarybuttontap   | 主按钮点击事件                                    | ()=>void     | -         |\n| #if WECHAT bindsecondarybuttontap | 辅助按钮点击事件                                  | ()=>void     | -         |\n"
  },
  {
    "path": "src/Modal/index.sjs.ts",
    "content": "function getDirection(\n  primaryButtonText,\n  secondaryButtonText,\n  cancelButtonText,\n  type\n) {\n  // 不显示按钮区域\n  if (!primaryButtonText && !secondaryButtonText && !cancelButtonText) {\n    return '';\n  }\n  // 1个按钮，当纵向处理\n  if (\n    [primaryButtonText, secondaryButtonText, cancelButtonText].filter(\n      (v) => !!v\n    ).length === 1\n  ) {\n    return 'vertical';\n  }\n  // 三个按钮，必是纵向\n  if (primaryButtonText && secondaryButtonText && cancelButtonText) {\n    return 'vertical';\n  }\n  // 两个按钮，在 “标准模式” 是横向；在“强调模式”是纵向\n  return type === 'focus' ? 'vertical' : 'horizontal';\n}\n\nexport default { getDirection };\n"
  },
  {
    "path": "src/Modal/index.ts",
    "content": "import { Component, triggerEventOnly } from '../_util/simply';\nimport { ModalFunctionalProps } from './props';\n\nComponent({\n  props: ModalFunctionalProps,\n  methods: {\n    onClose() {\n      triggerEventOnly(this, 'close');\n    },\n    onMaskClose() {\n      /// #if WECHAT\n      if (this.properties.maskClosable) {\n        triggerEventOnly(this, 'close');\n      }\n      /// #endif\n      /// #if ALIPAY\n      if (this.props.maskClosable) {\n        triggerEventOnly(this, 'close');\n      }\n      /// #endif\n    },\n    onPrimaryButtonTap() {\n      triggerEventOnly(this, 'primaryButtonTap');\n    },\n    onSecondaryButtonTap() {\n      triggerEventOnly(this, 'secondaryButtonTap');\n    },\n    onCancelButtonTap() {\n      triggerEventOnly(this, 'cancelButtonTap');\n    },\n  },\n});\n"
  },
  {
    "path": "src/Modal/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n/**\n * @description 对话框，当应用中需要比较明显的对用户当前的操作行为进行警示或提醒时，可以使用对话框。用户需要针对对话框进行操作后方可结束。\n */\n\nexport interface IModalProps extends IBaseProps {\n  /**\n   * @description Modal body类名\n   */\n  bodyClassName: string;\n  /**\n   * @description Modal body样式\n   */\n  bodyStyle: string;\n  /**\n   * @description 遮罩层类名\n   */\n  maskClassName: string;\n  /**\n   * @description 遮罩层样式\n   */\n  maskStyle: string;\n  /**\n   * @description 是否可点击蒙层关闭\n   * @default true\n   */\n  maskClosable: boolean;\n  /**\n   * @description 类型\n   */\n  type: 'default' | 'focus';\n  /**\n   * @description 是否显示右上角的关闭按钮。只有在 type 为 focus 生效\n   */\n  closable: boolean;\n  /**\n   * @description 过渡动画时长，单位毫秒\n   */\n  duration: number;\n  /**\n   * @description 是否开启过渡动画\n   */\n  animation: boolean;\n  /**\n   * @description 弹窗层级\n   */\n  zIndex: number;\n  /**\n   * @description 标题\n   */\n  title: string;\n  /**\n   * @description 内容\n   */\n  content: string;\n  /**\n   * @description 是否可见，受控模式\n   * @default false\n   */\n  visible: boolean;\n  /**\n   * @description 是否关闭后销毁内部元素\n   * @default false\n   */\n  destroyOnClose?: boolean;\n  /**\n   * @description 主按钮文本\n   */\n  primaryButtonText: string;\n  /**\n   * @description 辅助按钮文本\n   */\n  secondaryButtonText: string;\n  /**\n   * @description 取消按钮文案\n   */\n  cancelButtonText: string;\n  /**\n   * @description 主按钮样式\n   */\n  primaryButtonStyle: string;\n  /**\n   * @description 辅助按钮样式\n   */\n  secondaryButtonStyle: string;\n  /**\n   * @description 取消按钮样式\n   */\n  cancelButtonStyle: string;\n  /**\n   * @description 触发关闭时回调\n   */\n  onClose: () => void;\n  /**\n   * @description 主按钮点击事件\n   */\n  onPrimaryButtonTap: () => void;\n  /**\n   * @description 次要按钮点击事件\n   */\n  onSecondaryButtonTap: () => void;\n  /**\n   * @description 取消按钮点击事件\n   */\n  onCancelButtonTap: () => void;\n}\n\nexport const ModalDefaultProps: Partial<IModalProps> = {\n  visible: false,\n  maskClosable: true,\n  closable: true,\n  type: 'default',\n  duration: 200,\n  animation: true,\n  zIndex: 998,\n};\n\nexport const ModalFunctionalProps: Partial<IModalProps> = {\n  bodyClassName: '',\n  bodyStyle: '',\n  maskClassName: '',\n  maskStyle: '',\n  maskClosable: true,\n  type: 'default',\n  closable: true,\n  duration: 200,\n  animation: true,\n  zIndex: 998,\n  title: '',\n  content: '',\n  visible: false,\n  destroyOnClose: false,\n  primaryButtonText: '',\n  secondaryButtonText: '',\n  cancelButtonText: '',\n  primaryButtonStyle: '',\n  secondaryButtonStyle: '',\n  cancelButtonStyle: '',\n};\n"
  },
  {
    "path": "src/Modal/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n// modal 背景色\n@modal-background-color: var(--modal-background-color, @COLOR_CARD);\n// modal 圆角\n@modal-radius: @corner-radius-lg;\n// 标题颜色\n@modal-title-color: var(--modal-title-color, @COLOR_TEXT_PRIMARY);\n// 内容大小\n@modal-content-size: @font-size-subtitle;\n// 内容颜色\n@modal-content-color: var(--modal-content-color, @COLOR_TEXT_PRIMARY);\n// 关闭图标尺寸\n@modal-close-icon-size: 36 * @rpx;\n\n@modal-close-text-color: var(--modal-close-text-color, @COLOR_TEXT_ASSIST);\n"
  },
  {
    "path": "src/NoticeBar/index.axml",
    "content": "<view\n  a:if=\"{{ show }}\"\n  class=\"ant-notice-bar {{ className || '' }} {{ type ? 'ant-notice-bar-' + type : '' }} {{ellipsisRow > 1 ? 'ant-notice-bar-no-height' : ''}}\"\n  style=\"{{ style }}\">\n  <!-- #if ALIPAY -->\n  <slot name=\"icon\">\n    <view class=\"ant-notice-bar-icon\">\n      <image-icon\n        a:if=\"{{ icon }}\"\n        image=\"{{ icon }}\"\n        className=\"ant-notice-bar-icon-image\" />\n      <ant-icon\n        a:elif=\"{{ type === 'error' }}\"\n        type=\"InformationCircleOutline\" />\n      <ant-icon\n        a:else\n        type=\"SoundOutline\" />\n    </view>\n  </slot>\n  <!-- #endif -->\n  <!-- #if WECHAT -->\n  <slot\n    wx:if=\"{{ slotIcon }}\"\n    name=\"icon\" />\n  <view\n    wx:else\n    class=\"ant-notice-bar-icon\">\n    <image-icon\n      wx:if=\"{{ icon }}\"\n      image=\"{{ icon }}\"\n      className=\"ant-notice-bar-icon-image\" />\n    <ant-icon\n      wx:elif=\"{{ type === 'error' }}\"\n      type=\"InformationCircleOutline\" />\n    <ant-icon\n      wx:else\n      type=\"SoundOutline\" />\n  </view>\n  <!-- #endif -->\n  <view\n    class=\"ant-notice-bar-content ant-notice-bar-content{{ $id ? '-' + $id : '' }}\">\n    <view\n      class=\"ant-notice-bar-marquee ant-notice-bar-marquee{{ $id ? '-' + $id : '' }} {{ellipsisRow > 1 ? 'ant-notice-bar-ellipsis' : ''}}\"\n      style=\"{{ marqueeStyle }} display: {{ enableMarquee ? 'inline-block' : (ellipsisRow > 1 ? '-webkit-box' : 'block') }}; -webkit-line-clamp:{{ellipsisRow}}; white-space: {{ellipsisRow > 1 ? 'wrap' : 'nowrap'}}\"\n      onTransitionEnd=\"onTransitionEnd\">\n      <slot />\n    </view>\n  </view>\n  <view class=\"ant-notice-bar-operation\">\n    <slot name=\"extra\" />\n    <ant-icon\n      a:if=\"{{ mode === 'link' }}\"\n      className=\"ant-notice-bar-operation-icon\"\n      type=\"RightOutline\"\n      onTap=\"onTap\" />\n    <ant-icon\n      a:if=\"{{ mode === 'closeable' }}\"\n      className=\"ant-notice-bar-operation-icon\"\n      type=\"CloseOutline\"\n      onTap=\"onTap\" />\n  </view>\n</view>\n"
  },
  {
    "path": "src/NoticeBar/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Feedback\n  order: 12\ntoc: content\n---\n\n# NoticeBar\n\nShows a set of message notifications. Usually used for the notification of information in the current page, is a more eye-catching in-page notification.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-notice\": \"antd-mini/es/NoticeBar/index\"\n#endif\n#if WECHAT\n  \"ant-notice\": \"antd-mini/NoticeBar/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n <ant-notice type=\"default\">default</ant-notice>\n <ant-notice type=\"info\">info</ant-notice>\n <ant-notice type=\"error\">error</ant-notice>\n```\n\n### Can close the notice board\n\n```xml\n<ant-notice mode=\"closeable\">\n  This notification can be turned off\n</ant-notice>\n```\n\n### Multi-line display notice board\n```xml\n<ant-notice type=\"default\" ellipsisRow=\"{{2}}\">\n  Turn on line feed when text overflows. Not enough text to continue adding text to make up. Not enough text to continue adding text to make up.\n</ant-notice>\n```\n\n### Scrollable notice board\n\n```xml\n<ant-notice\n  type=\"default\"\n  enableMarquee=\"{{true}}\"\n  loop=\"{{true}}\"\n  onTap=\"handleTapLink\"\n  mode=\"link\">\n  Turn on circular scrolling when text overflows. Not enough text to continue adding text to make up.\n</ant-notice>\n```\n\n### Custom\n\n```xml\n<ant-notice type=\"primary\" icon=\"GlobalOutline\" mode=\"link\">\n  Customize Left Icon\n</ant-notice>\n\n<ant-notice type=\"primary\" mode=\"link\"\n  icon=\"https://gw.alipayobjects.com/mdn/rms_ce4c6f/afts/img/A*XMCgSYx3f50AAAAAAAAAAABkARQnAQ\"\n>Customize the left icon image</ant-notice>\n\n<ant-notice mode=\"link\" onTap=\"handleTapLink\">\n  Customize right button\n  <view slot=\"extra\" class=\"extra\">\n    <view onTap=\"handleTapAction\">No more prompting</view>\n    <view onTap=\"handleTapAction\">View Details</view>\n  </view>\n</ant-notice>\n```\n\n### Demo Code\n\n<code src='../../demo/pages/NoticeBar/index'></code>\n\n## API\n\n| Property          | Description                                                                                           | Type         | Default Value  |\n| ------------- | ---------------------------------------------------------------------------------------------- | ------------ | ------- |\n| className     | Class Name                                                                                           | string       | -       |\n| enableMarquee | Whether to turn on scroll animation                                                                               | boolean      | false   |\n| ellipsisRow     | The copy multi-line shows the maximum number of rows, and`enableMarquee`Cannot be configured simultaneously             | number\\|boolean       | false       |\n| extra         | Customize right content                                                                                 | slot         | -       |\n| icon          | The icon on the left supports all built-in iconType and custom links, as well as custom slots (WeChat version requires slotIcon settings) | string       | -       |\n| loop          | Whether to cycle scrolling,`enableMarquee` Valid when true                                                   | boolean      | false   |\n| mode          | the type of announcement,`link` Indicates connection, the whole line can be dotted;`closeable` Indicates that clicking x can be closed; If you do not fill in, there is no icon on the right.   | string       | -       |\n| style         | Style                                                                                           | string       | -       |\n| title         | Title                                                                                           | string\\|slot | -       |\n| type          | type, optional `default`, `error`, `primary`, `info`                                               | string       | default |\n| slotIcon      | WeChat version needs to enable the slot of icon position through this field                                                     | boolean      | -       |\n| onTap         | Click the icon (arrow or cross) on the right side of the notification bar to trigger the callback                                                   | () => void   | -       |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                            | Default Value                                                                                                              | Dark Mode Default                                                                                                                      | Remarks             |\n| --------------------------------- | ------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ---------------- |\n| --notice-background-color         | <div style=\"width: 150px; height: 40px; background-color: #fff9ed; color: #333;\">#fff9ed</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #fff9ed; color: #000000;\">#fff9ed</div>                                   | Notification background color     |\n| --notice-border-color             | <div style=\"width: 150px; height: 40px; background-color: #fff3d9; color: #333;\">#fff3d9</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #fff3d9; color: #000000;\">#fff3d9</div>                                   | Notification border color     |\n| --notice-color                    | <div style=\"width: 150px; height: 40px; background-color: #ff6010;\">#ff6010</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #ff6010; color: #ffffff;\">#ff6010</div>                                   | Notification Color         |\n| --notice-error-border-color       | <div style=\"width: 150px; height: 40px; background-color: #fff3d9; color: #333;\">#fff3d9</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #fff3d9; color: #000000;\">#fff3d9</div>                                   | Error notification border color |\n| --notice-error-color              | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #333333;\">#ffffff</div>                   | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #333333;\">#ffffff</div>                                   | Error notification color     |\n| --notice-error-background-color   | <div style=\"width: 150px; height: 40px; background-color: #ff3141;\">#ff3141</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #ff4a58; color: #ffffff;\">#ff4a58</div>                                   | Error notification background color |\n| --notice-primary-border-color     | <div style=\"width: 150px; height: 40px; background-color: rgba(22, 119, 255, 0.72);\">rgba(22, 119, 255, 0.72)</div> | <div style=\"width: 150px; height: 40px; background-color: rgba(22, 119, 255, 0.72); color: #ffffff;\">rgba(22, 119, 255, 0.72)</div> | Primary notification border color |\n| --notice-primary-color            | <div style=\"width: 150px; height: 40px; background-color: #1677ff;\">#1677ff</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #3086ff; color: #ffffff;\">#3086ff</div>                                   | Primary notification color     |\n| --notice-primary-background-color | <div style=\"width: 150px; height: 40px; background-color: rgba(208, 228, 255, 1); color: #333;\">rgba(208, 228, 255, 1)</div>     | <div style=\"width: 150px; height: 40px; background-color: rgba(208, 228, 255, 1); color: #000000;\">rgba(208, 228, 255, 1)</div>     | Primary notification background color |\n| --notice-info-text-color          | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #333333;\">#ffffff</div>                   | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #333333;\">#ffffff</div>                                   | Information notification text color |\n| --notice-info-background-color    | <div style=\"width: 150px; height: 40px; background-color: #666666;\">#666666</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #808080; color: #ffffff;\">#808080</div>                                   | Information notification background color |\n"
  },
  {
    "path": "src/NoticeBar/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-icon\": \"../Icon/index\",\n    \"image-icon\": \"../ImageIcon/index\"\n  }\n}\n"
  },
  {
    "path": "src/NoticeBar/index.less",
    "content": "@import (reference) './variable.less';\n\n@noticeBarPrefix: ant-notice-bar;\n\n.@{noticeBarPrefix} {\n  position: relative;\n  display: flex;\n  height: 75 * @rpx;\n  align-items: center;\n  overflow: hidden;\n  padding: @v-spacing-standard @h-spacing-large;\n  font-size: @notice-font-size;\n  color: @notice-color;\n  background-color: @notice-background-color;\n  box-sizing: border-box;\n  &.@{noticeBarPrefix}-no-height {\n    height: unset;\n    align-items: flex-start;\n  }\n\n  &-error {\n    color: @notice-error-color;\n    background-color: @notice-error-background-color;\n\n    &-scroll-left,\n    &-scroll-right {\n      background: @notice-error-background-color;\n    }\n  }\n\n  &-primary {\n    color: @notice-primary-color;\n    background-color: @notice-primary-background-color;\n\n    &-scroll-left,\n    &-scroll-right {\n      background: @notice-primary-background-color;\n    }\n  }\n\n  &-info {\n    color: @notice-info-text-color;\n    background: @notice-info-background-color;\n\n    &-scroll-left,\n    &-scroll-right {\n      background: @notice-info-background-color;\n    }\n  }\n\n  &-icon {\n    margin-right: @h-spacing-standard;\n    font-size: 36 * @rpx;\n\n    &-image-image {\n      width: 36 * @rpx;\n      height: 36 * @rpx;\n    }\n  }\n\n  &-content {\n    position: relative;\n    z-index: 2;\n    flex: 1 100%;\n    overflow: hidden;\n    vertical-align: middle;\n    line-height: @default-line-height;\n  }\n\n  &-marquee {\n    overflow: hidden;\n    text-overflow: ellipsis;\n    vertical-align: middle;\n  }\n\n  &-ellipsis {\n    word-break: break-all;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    -webkit-box-orient: vertical;\n  }\n\n  &-operation {\n    display: flex;\n    align-items: center;\n\n    &-icon {\n      margin-left: 24 * @rpx;\n    }\n  }\n}\n\n.ant-icon-size-x-small {\n  font-size: 18px;\n}\n"
  },
  {
    "path": "src/NoticeBar/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 反馈引导\n  order: 12\ntoc: content\n---\n\n# NoticeBar 通告栏\n\n展示一组消息通知。通常用于当前页面内信息的通知，是一种较醒目的页面内通知方式。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-notice\": \"antd-mini/es/NoticeBar/index\"\n#endif\n#if WECHAT\n  \"ant-notice\": \"antd-mini/NoticeBar/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n <ant-notice type=\"default\">default</ant-notice>\n <ant-notice type=\"info\">info</ant-notice>\n <ant-notice type=\"error\">error</ant-notice>\n```\n\n### 可关闭通告栏\n\n```xml\n<ant-notice mode=\"closeable\">\n  这条通知可以关闭\n</ant-notice>\n```\n\n### 多行展示通告栏\n```xml\n<ant-notice type=\"default\" ellipsisRow=\"{{2}}\">\n  文本溢出时，开启换行。文字不够继续添加文字凑数。文字不够继续添加文字凑数。\n</ant-notice>\n```\n\n### 可滚动通告栏\n\n```xml\n<ant-notice\n  type=\"default\"\n  enableMarquee=\"{{true}}\"\n  loop=\"{{true}}\"\n  onTap=\"handleTapLink\"\n  mode=\"link\">\n  文本溢出时，开启循环滚动。文字不够继续添加文字凑数。\n</ant-notice>\n```\n\n### 自定义\n\n```xml\n<ant-notice type=\"primary\" icon=\"GlobalOutline\" mode=\"link\">\n  自定义左侧图标\n</ant-notice>\n\n<ant-notice type=\"primary\" mode=\"link\"\n  icon=\"https://gw.alipayobjects.com/mdn/rms_ce4c6f/afts/img/A*XMCgSYx3f50AAAAAAAAAAABkARQnAQ\"\n>自定义左侧图标图片</ant-notice>\n\n<ant-notice mode=\"link\" onTap=\"handleTapLink\">\n  自定义右侧按钮\n  <view slot=\"extra\" class=\"extra\">\n    <view onTap=\"handleTapAction\">不再提示</view>\n    <view onTap=\"handleTapAction\">查看详情</view>\n  </view>\n</ant-notice>\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/NoticeBar/index'></code>\n\n## API\n\n| 属性          | 说明                                                                                           | 类型         | 默认值  |\n| ------------- | ---------------------------------------------------------------------------------------------- | ------------ | ------- |\n| className     | 类名                                                                                           | string       | -       |\n| enableMarquee | 是否开启滚动动画                                                                               | boolean      | false   |\n| ellipsisRow     | 文案多行展示最大行数，和`enableMarquee`不能同时配置             | number\\|boolean       | false       |\n| extra         | 自定义右侧内容                                                                                 | slot         | -       |\n| icon          | 左侧 icon，支持所有内置 iconType 和自定义链接，也支持自定义 slot （微信版本需要设置 slotIcon） | string       | -       |\n| loop          | 是否循环滚动，`enableMarquee` 为 true 时有效                                                   | boolean      | false   |\n| mode          | 通告类型，`link` 表示连接，整行可点；`closeable` 表示点击 x 可以关闭；不填时表示右侧没有图标   | string       | -       |\n| style         | 样式                                                                                           | string       | -       |\n| title         | 标题                                                                                           | string\\|slot | -       |\n| type          | 类型，可选 `default`, `error`, `primary`, `info`                                               | string       | default |\n| slotIcon      | 微信版本需要通过此字段启用 icon 位置的插槽                                                     | boolean      | -       |\n| onTap         | 点击通知栏右侧的图标（箭头或者叉），触发回调                                                   | () => void   | -       |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                            | 默认值                                                                                                              | 深色模式默认值                                                                                                                      | 备注             |\n| --------------------------------- | ------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ---------------- |\n| --notice-background-color         | <div style=\"width: 150px; height: 40px; background-color: #fff9ed; color: #333;\">#fff9ed</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #fff9ed; color: #000000;\">#fff9ed</div>                                   | 通知背景颜色     |\n| --notice-border-color             | <div style=\"width: 150px; height: 40px; background-color: #fff3d9; color: #333;\">#fff3d9</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #fff3d9; color: #000000;\">#fff3d9</div>                                   | 通知边框颜色     |\n| --notice-color                    | <div style=\"width: 150px; height: 40px; background-color: #ff6010;\">#ff6010</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #ff6010; color: #ffffff;\">#ff6010</div>                                   | 通知颜色         |\n| --notice-error-border-color       | <div style=\"width: 150px; height: 40px; background-color: #fff3d9; color: #333;\">#fff3d9</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #fff3d9; color: #000000;\">#fff3d9</div>                                   | 错误通知边框颜色 |\n| --notice-error-color              | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #333333;\">#ffffff</div>                   | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #333333;\">#ffffff</div>                                   | 错误通知颜色     |\n| --notice-error-background-color   | <div style=\"width: 150px; height: 40px; background-color: #ff3141;\">#ff3141</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #ff4a58; color: #ffffff;\">#ff4a58</div>                                   | 错误通知背景颜色 |\n| --notice-primary-border-color     | <div style=\"width: 150px; height: 40px; background-color: rgba(22, 119, 255, 0.72);\">rgba(22, 119, 255, 0.72)</div> | <div style=\"width: 150px; height: 40px; background-color: rgba(22, 119, 255, 0.72); color: #ffffff;\">rgba(22, 119, 255, 0.72)</div> | 主要通知边框颜色 |\n| --notice-primary-color            | <div style=\"width: 150px; height: 40px; background-color: #1677ff;\">#1677ff</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #3086ff; color: #ffffff;\">#3086ff</div>                                   | 主要通知颜色     |\n| --notice-primary-background-color | <div style=\"width: 150px; height: 40px; background-color: rgba(208, 228, 255, 1); color: #333;\">rgba(208, 228, 255, 1)</div>     | <div style=\"width: 150px; height: 40px; background-color: rgba(208, 228, 255, 1); color: #000000;\">rgba(208, 228, 255, 1)</div>     | 主要通知背景颜色 |\n| --notice-info-text-color          | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #333333;\">#ffffff</div>                   | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #333333;\">#ffffff</div>                                   | 信息通知文字颜色 |\n| --notice-info-background-color    | <div style=\"width: 150px; height: 40px; background-color: #666666;\">#666666</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #808080; color: #ffffff;\">#808080</div>                                   | 信息通知背景颜色 |\n"
  },
  {
    "path": "src/NoticeBar/index.ts",
    "content": "import { IBoundingClientRect } from '../_util/base';\nimport { getInstanceBoundingClientRect } from '../_util/jsapi/get-instance-bounding-client-rect';\nimport {\n  Component,\n  getValueFromProps,\n  triggerEventOnly,\n} from '../_util/simply';\nimport { NoticeBarDefaultProps } from './props';\n\nComponent({\n  props: NoticeBarDefaultProps,\n  data: {\n    show: true,\n    marqueeStyle: '',\n  },\n  methods: {\n    getInstance() {\n      if (this.$id) {\n        return my;\n      }\n      return this;\n    },\n\n    async getBoundingClientRectWithId(prefix: string) {\n      return await getInstanceBoundingClientRect(\n        this.getInstance(),\n        `${prefix}${this.$id ? `-${this.$id}` : ''}`\n      );\n    },\n    onTap() {\n      const mode = getValueFromProps(this, 'mode');\n      if (mode === 'link') {\n        triggerEventOnly(this, 'tap');\n      }\n      if (mode === 'closeable') {\n        /// #if ALIPAY\n        if (typeof this.props.onTap !== 'function') {\n          return;\n        }\n        /// #endif\n        this.setData({\n          show: false,\n        });\n        triggerEventOnly(this, 'tap');\n      }\n    },\n    startMarquee(state) {\n      const loop = getValueFromProps(this, 'loop');\n      const leading = 500;\n      const { duration, overflowWidth, viewWidth } = state;\n      let marqueeScrollWidth = overflowWidth;\n      if (loop) {\n        marqueeScrollWidth = overflowWidth + viewWidth;\n        /// #if WECHAT\n        // 微信的view标签不支持onTransitionEnd，需要这里实现循环\n        const trailing = 200;\n        clearTimeout(this.timer);\n        this.timer = setTimeout(() => {\n          this.measureText((state) => {\n            this.resetMarquee.call(this, state);\n            this.measureText((state) => {\n              this.startMarquee.call(this, state);\n            });\n          });\n          clearTimeout(this.timer);\n        }, trailing + duration * 1000);\n        /// #endif\n      }\n      const newMarqueeStyle = `transform: translate3d(${-marqueeScrollWidth}px, 0, 0); transition: ${duration}s all linear ${\n        typeof leading === 'number' ? `${leading / 1000}s` : '0s'\n      };`;\n\n      this.setData({\n        marqueeStyle: newMarqueeStyle,\n      });\n      return newMarqueeStyle;\n    },\n\n    measureText(callback) {\n      const fps = 40;\n      const loop = getValueFromProps(this, 'loop');\n      // 计算文本所占据的宽度，计算需要滚动的宽度\n      setTimeout(async () => {\n        const marqueeSize: IBoundingClientRect | null =\n          await this.getBoundingClientRectWithId('.ant-notice-bar-marquee');\n        const contentSize: IBoundingClientRect | null =\n          await this.getBoundingClientRectWithId('.ant-notice-bar-content');\n        const overflowWidth =\n          (marqueeSize &&\n            contentSize &&\n            marqueeSize.width - contentSize.width) ||\n          0;\n\n        const viewWidth = contentSize?.width || 0;\n        let marqueeScrollWidth = overflowWidth;\n        if (loop) {\n          marqueeScrollWidth = overflowWidth + viewWidth;\n        }\n        if (overflowWidth > 0) {\n          callback({\n            overflowWidth,\n            viewWidth,\n            duration: marqueeScrollWidth / fps,\n          });\n        }\n      }, 0);\n    },\n    // 文本滚动的计算\n    resetMarquee(state) {\n      const loop = getValueFromProps(this, 'loop');\n      const { viewWidth } = state;\n      let showMarqueeWidth = '0px';\n      if (loop) {\n        showMarqueeWidth = `${viewWidth}px`;\n      }\n      const marqueeStyle = `transform: translate3d(${showMarqueeWidth}, 0, 0); transition: 0s all linear;`;\n      this.setData({\n        marqueeStyle,\n      });\n    },\n\n    /// #if ALIPAY\n    onTransitionEnd() {\n      const loop = getValueFromProps(this, 'loop');\n      const trailing = 200;\n      if (loop) {\n        const timer = setTimeout(() => {\n          this.measureText((state) => {\n            this.resetMarquee.call(this, state);\n          });\n          clearTimeout(timer);\n        }, trailing);\n      }\n    },\n    /// #endif\n  },\n\n  /// #if ALIPAY\n  didMount() {\n    const { enableMarquee } = this.props;\n\n    if (enableMarquee) {\n      this.measureText((state) => {\n        this.startMarquee.call(this, state);\n      });\n    }\n  },\n\n  didUpdate() {\n    const { enableMarquee } = this.props;\n    // 这里更新处理的原因是防止notice内容在动画过程中发生改变。\n    if (enableMarquee) {\n      this.measureText((state) => {\n        this.startMarquee.call(this, state);\n      });\n    }\n  },\n\n  pageEvents: {\n    onShow() {\n      if (this.props.enableMarquee) {\n        this.setData({ marqueeStyle: '' });\n        this.resetMarquee({\n          overflowWidth: 0,\n          duration: 0,\n          viewWidth: 0,\n        });\n        this.measureText((state) => {\n          this.startMarquee.call(this, state);\n        });\n      }\n    },\n  },\n  /// #endif\n\n  /// #if WECHAT\n  attached() {\n    const { enableMarquee } = this.properties;\n\n    if (enableMarquee) {\n      this.measureText((state) => {\n        this.startMarquee.call(this, state);\n      });\n    }\n  },\n\n  observers: {\n    'enableMarquee': function (enableMarquee) {\n      // 这里更新处理的原因是防止notice内容在动画过程中发生改变。\n      if (enableMarquee) {\n        this.measureText((state) => {\n          this.startMarquee.call(this, state);\n        });\n      }\n    },\n  },\n\n  pageLifetimes: {\n    show: function () {\n      if (this.properties.enableMarquee) {\n        this.setData({ marqueeStyle: '' });\n        this.resetMarquee({\n          overflowWidth: 0,\n          duration: 0,\n          viewWidth: 0,\n        });\n        this.measureText((state) => this.startMarquee.call(this, state));\n      }\n    },\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/NoticeBar/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\n/**\n * @description 通告栏，\n * 当应用有重要公告或者由于用户的刷新操作产生提示反馈时可以使用通告栏系统。\n * 通告栏不会对用户浏览当前页面内容产生影响，但又能明显的引起用户的注意。公告内容不超过一行。\n */\n\nexport interface INoticeBarProps extends IBaseProps {\n  /**\n   * @description 消息的展示\n   */\n  icon?: string;\n  /**\n   * @description 提示类型\n   * default 橙色，error 红色，primary 蓝色，info 灰色\n   * @default \"default\"\n   */\n  type?: 'default' | 'error' | 'primary' | 'info';\n  /**\n   * @description 通告类型，link 表示连接，整行可点；closeable 表示点击 x 可以关闭；不填时表示你右侧没有图标\n   */\n  mode?: 'link' | 'closeable';\n  /**\n   * @description 是否开启滚动动画\n   * @default false\n   */\n  enableMarquee: boolean;\n  /**\n   * @description 是否循环滚动，enableMarquee 为 true 时有效\n   * @default false\n   */\n  loop: boolean;\n  /**\n   * @description 微信版本需要通过此字段启用 icon 位置的插槽\n   * @default false\n   */\n  slotIcon?: boolean;\n  /**\n   * @description 多行省略展示的行数配置\n   * @default false\n   */\n  ellipsisRow: number | boolean;\n  /**\n   * @description 点击图标（箭头或者叉，由mode属性决定）的事件回调\n   */\n  onTap: () => void;\n  /**\n   * @description 行动点点击回调\n   * @param 当前点击的行动点序号\n   */\n  onActionTap: (index: number) => void;\n}\n\nexport const NoticeBarDefaultProps: Partial<INoticeBarProps> = {\n  icon: '',\n  type: 'default',\n  mode: null,\n  enableMarquee: false,\n  ellipsisRow: false,\n  loop: false,\n  slotIcon: false,\n};\n"
  },
  {
    "path": "src/NoticeBar/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n// 标准背景\n@notice-background-color: var(--notice-background-color, @COLOR_GOLDEN_3);\n// 标准边框颜色\n@notice-border-color: var(--notice-border-color, @COLOR_GOLDEN_2);\n// 标准字体颜色\n@notice-color: var(--notice-color, @COLOR_TANGERINE_1);\n// 标准字体大小\n@notice-font-size: @font-size-subtitle;\n\n// error 边框颜色\n@notice-error-border-color: var(--notice-error-border-color, @COLOR_GOLDEN_2);\n// error 字体颜色\n@notice-error-color: var(--notice-error-color, @COLOR_WHITE);\n// error 背景\n@notice-error-background-color: var(\n  --notice-error-background-color,\n  @COLOR_RED\n);\n\n// primary 边框颜色\n@notice-primary-border-color: var(\n  --notice-primary-border-color,\n  tint(@COLOR_BRAND1, 72%)\n);\n// primary 字体颜色\n@notice-primary-color: var(--notice-primary-color, @COLOR_BRAND1);\n// primary 背景\n@notice-primary-background-color: var(\n  --notice-primary-background-color,\n  tint(@COLOR_BRAND1, 80%)\n);\n\n@notice-info-text-color: var(--notice-info-text-color, @COLOR_WHITE);\n\n@notice-info-background-color: var(\n  --notice-info-background-color,\n  @COLOR_TEXT_SECONDARY\n);\n\n"
  },
  {
    "path": "src/NumberInput/index.axml",
    "content": "<view class=\"ant-number-input {{className}}\" style=\"{{style}}\">\n  <!-- 标题区 -->\n  <view class=\"ant-number-input-header\">\n    <text class=\"ant-number-input-title\">{{title}}</text>\n    <text a:if=\"{{linkText}}\" onTap=\"handleLinkTap\" class=\"ant-number-input-link\">{{linkText}}</text>\n  </view>\n\n  <!-- 单位展示区 -->\n  <view class=\"ant-number-input-unit\">\n    <view class=\"ant-number-input-unit-text\" >{{unit}}</view>\n  </view>\n\n  <!-- 输入区 -->\n  <view class=\"ant-number-input-content\">\n    <text class=\"ant-number-input-prefix\">{{prefix}}</text>\n    <ant-input\n      className=\"ant-number-input-field\"\n      placeholderClassName=\"ant-number-input-placeholder\"\n      value=\"{{value}}\"\n      placeholder=\"{{placeholder}}\"\n      type=\"digit\"\n      allowClear\n      maxLength=\"10\"\n      onChange=\"handleInput\"\n    />\n  </view>\n  <view class=\"ant-number-input-footer\">\n  <!-- 快捷金额区 -->\n    <view class=\"ant-number-input-quick\">\n      <view\n        class=\"ant-number-input-quick-item\"\n        a:for=\"{{quickAmounts}}\"\n        a:key=\"*this\"\n        data-value=\"{{item}}\"\n        onTap=\"handleQuickInput\"\n      >\n        {{prefix}}{{item}}\n      </view>\n    </view>\n\n    <!-- 底部slot -->\n    <slot name=\"footer\"></slot>\n  </view>\n</view>\n"
  },
  {
    "path": "src/NumberInput/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Bizness Components\n  order: 15\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# NumberInput\n\nUse when you need to enter an amount and provide a quick amount selection. Supports automatic conversion of units, maximum limit and other functions.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-number-input\": \"antd-mini/es/NumberInput/index\"\n#endif\n#if WECHAT\n  \"ant-number-input\": \"antd-mini/NumberInput/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n<code src='../../demo/pages/NumberInput/index'></code>\n\n## API\n\n### Property\n\n| Property                   | Description                 | Type                    | Default Value       |\n| ---------------------- | -------------------- | ----------------------- | ------------ |\n| className              | Class Name                 | string                  | -            |\n| style                  | Style                 | string                  | -            |\n| value                  | Value of the input box           | string                  | -            |\n| title                  | Title                 | string                  | -            |\n| linkText               | Top right link copy       | string                  | -            |\n| quickAmounts           | Quick Amount Options         | number[]                | -            |\n| placeholder            | Placeholder text           | string                  | 'Please enter amount' |\n| prefix                 | Amount prefix             | string                  | '¥'          |\n| maxValue               | Maximum amount that can be entered       | number                  | -            |\n| #if ALIPAY onChange    | Callback when content changes     | (value: string) => void | -            |\n| #if ALIPAY onLinkTap   | Click on the callback link in the upper right corner | () => void              | -            |\n| #if WECHAT bindchange  | Callback when content changes     | (value: string) => void | -            |\n| #if WECHAT bindlinktap | Click on the callback link in the upper right corner | () => void              | -            |\n\n### Slot\n\nCurrently only one footer slot is provided for inserting custom content below the input box. More content may be opened later on demand.\n\nExample of use:\n\n```xml\n<ant-number-input>\n  <view slot=\"footer\">\n    <text>This is a piece of custom content</text>\n  </view>\n</ant-number-input>\n```\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                            | Light Mode Default                                                                                    | Dark Mode Default                                                                                    | Remarks               |\n| --------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------ |\n| --number-input-background-color   | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | Background Color           |\n| --number-input-title-color        | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | Title Color           |\n| --number-input-link-color         | <div style=\"width: 150px; height: 30px; background-color: #4b6b99; color: #ffffff;\">#4b6b99</div> | <div style=\"width: 150px; height: 30px; background-color: #3f5980; color: #ffffff;\">#3f5980</div> | Top Right Link Color     |\n| --number-input-unit-color         | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | Unit color above input box |\n| --number-input-border-color       | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #333333;\">#eeeeee</div> | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #ffffff;\">#2b2b2b</div> | Split line color         |\n| --number-input-prefix-color       | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | Claw Color         |\n| --number-input-caret-color        | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | Cursor Color           |\n| --number-input-quick-text-color   | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | Quick input text color   |\n| --number-input-quick-border-color | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | Quick input border color   |\n"
  },
  {
    "path": "src/NumberInput/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-input\": \"../Input/index\"\n  }\n}\n"
  },
  {
    "path": "src/NumberInput/index.less",
    "content": "@import (reference) './variable.less';\n@import (reference) '../style/mixins/hairline.less';\n\n@prefixCls: ant-number-input;\n\n.@{prefixCls} {\n  background: @number-input-background-color;\n  padding: @v-spacing-standard;\n  border-radius: @corner-radius-lg;\n\n  &-header {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    margin-bottom: @v-spacing-standard;\n  }\n\n  &-title {\n    font-size: @font-size-subtitle;\n    color: @number-input-title-color;\n  }\n\n  &-link {\n    font-size: @font-size-subtitle;\n    color: @number-input-link-color;\n  }\n\n  &-unit {\n    height: 28rpx;\n    margin-top: 30rpx;\n    margin-left: 50rpx;\n    &-text {\n      position: relative;\n      font-size: @sizeFont5;\n      color: @number-input-unit-color;\n      text-align: left;\n      line-height: 28rpx;\n      text-indent: 0.5em;\n      .hairline('left', @number-input-border-color);\n    }\n  }\n\n  &-content {\n    position: relative;\n    display: flex;\n    align-items: baseline;\n    margin-bottom: @v-spacing-standard;\n    .hairline('bottom', @number-input-border-color);\n  }\n\n  &-prefix {\n    font-size: @sizeFont12;\n    color: @number-input-prefix-color;\n    margin-right: @h-spacing-standard;\n  }\n\n  &-field {\n    flex: 1;\n    .ant-input-content {\n      height: 125rpx;\n      font-size: @sizeFont14;\n      line-height: 74rpx;\n      caret-color: @number-input-caret-color;\n    }\n  }\n\n  &-placeholder {\n    font-size: @sizeFont5;\n  }\n\n  &-quick {\n    display: flex;\n    flex-wrap: wrap;\n    gap: @h-spacing-standard;\n    margin-bottom: @v-spacing-standard;\n\n    &-item {\n      font-size: @sizeFont5;\n      line-height: @default-line-height;\n      color: @number-input-quick-text-color;\n      padding: @size-1 @size-3;\n      border: 1rpx solid @number-input-quick-border-color;\n      border-radius: @corner-radius-circle;\n\n      &:active {\n        opacity: 0.7;\n      }\n    }\n  }\n}\n\n"
  },
  {
    "path": "src/NumberInput/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 业务组件\n  order: 15\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# NumberInput 金额输入\n\n需要输入金额并提供快捷金额选择时使用。支持单位自动转换、最大值限制等功能。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-number-input\": \"antd-mini/es/NumberInput/index\"\n#endif\n#if WECHAT\n  \"ant-number-input\": \"antd-mini/NumberInput/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n<code src='../../demo/pages/NumberInput/index'></code>\n\n## API\n\n### 属性\n\n| 属性                   | 说明                 | 类型                    | 默认值       |\n| ---------------------- | -------------------- | ----------------------- | ------------ |\n| className              | 类名                 | string                  | -            |\n| style                  | 样式                 | string                  | -            |\n| value                  | 输入框的值           | string                  | -            |\n| title                  | 标题                 | string                  | -            |\n| linkText               | 右上角链接文案       | string                  | -            |\n| quickAmounts           | 快捷金额选项         | number[]                | -            |\n| placeholder            | 占位符文本           | string                  | '请输入金额' |\n| prefix                 | 金额前缀             | string                  | '¥'          |\n| maxValue               | 最大可输入金额       | number                  | -            |\n| #if ALIPAY onChange    | 内容变化时的回调     | (value: string) => void | -            |\n| #if ALIPAY onLinkTap   | 点击右上角链接的回调 | () => void              | -            |\n| #if WECHAT bindchange  | 内容变化时的回调     | (value: string) => void | -            |\n| #if WECHAT bindlinktap | 点击右上角链接的回调 | () => void              | -            |\n\n### 插槽\n\n目前只提供一个 footer 插槽,用于在输入框下方插入自定义内容。后续根据需求可能会开放更多内容。\n\n使用示例：\n\n```xml\n<ant-number-input>\n  <view slot=\"footer\">\n    <text>这是一条自定义内容</text>\n  </view>\n</ant-number-input>\n```\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                            | 浅色模式默认值                                                                                    | 深色模式默认值                                                                                    | 备注               |\n| --------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------ |\n| --number-input-background-color   | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | 背景颜色           |\n| --number-input-title-color        | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | 标题颜色           |\n| --number-input-link-color         | <div style=\"width: 150px; height: 30px; background-color: #4b6b99; color: #ffffff;\">#4b6b99</div> | <div style=\"width: 150px; height: 30px; background-color: #3f5980; color: #ffffff;\">#3f5980</div> | 右上角链接颜色     |\n| --number-input-unit-color         | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | 输入框上方单位颜色 |\n| --number-input-border-color       | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #333333;\">#eeeeee</div> | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #ffffff;\">#2b2b2b</div> | 分割线颜色         |\n| --number-input-prefix-color       | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | 羊角符颜色         |\n| --number-input-caret-color        | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | 光标颜色           |\n| --number-input-quick-text-color   | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | 快捷输入文本颜色   |\n| --number-input-quick-border-color | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | 快捷输入边框颜色   |\n"
  },
  {
    "path": "src/NumberInput/index.ts",
    "content": "import {\n  Component,\n  getValueFromProps,\n  triggerEvent,\n  triggerEventOnly,\n} from '../_util/simply';\nimport { assertAilpayNativeNotSupport } from '../_util/support';\nimport { NumberInputProps } from './props';\n\nassertAilpayNativeNotSupport('NumberInput');\n\nconst UNIT_LIST = [\n  '百',\n  '千',\n  '万',\n  '十万',\n  '百万',\n  '千万',\n  '亿',\n  '十亿',\n  '百亿',\n  '千亿',\n];\n\nComponent({\n  props: NumberInputProps,\n  data: {\n    unit: '',\n  },\n  methods: {\n    // 统一处理输入值\n    update(value: string) {\n      this.setUnit(value);\n      triggerEvent(this, 'change', value);\n    },\n    handleInput(val) {\n      let value = val;\n      /// #if WECHAT\n      value = val.detail;\n      /// #endif\n      // 处理金额输入格式\n      const formattedValue = this.formatAmount(value);\n      const checkedValue = this.checkMaxValue(formattedValue);\n      this.update(checkedValue);\n    },\n\n    handleQuickInput(e) {\n      const { value } = e.currentTarget.dataset;\n      this.update(value);\n    },\n\n    formatAmount(value: string) {\n      // 移除非数字和小数点\n      value = value.replace(/[^\\d.]/g, '');\n      // 保留两位小数\n      const parts = value.split('.');\n      if (parts.length > 2) {\n        // 移除多余的小数点\n        value = parts[0] + '.' + parts[1];\n      }\n      if (parts[1]?.length > 2) {\n        // 保留两位小数\n        value = parts[0] + '.' + parts[1].slice(0, 2);\n      }\n      return value;\n    },\n    checkMaxValue(value: string) {\n      const maxValue = getValueFromProps(this, 'maxValue');\n      if (Number(value) > maxValue) {\n        return maxValue;\n      }\n      return value;\n    },\n    handleLinkTap() {\n      triggerEventOnly(this, 'linkTap');\n    },\n\n    setUnit(value: string) {\n      const intValue = parseInt(value);\n      let unit = '';\n      if (intValue) {\n        unit = UNIT_LIST[intValue.toString().length - 3] || '';\n      }\n      this.setData({ unit });\n    },\n  },\n\n  /// #if WECHAT\n  attached() {\n    this.triggerEvent('ref', this);\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/NumberInput/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\ninterface NumberInputProps extends IBaseProps {\n  /**\n   * @description 输入框的值\n   */\n  value: string,\n  /**\n   * @description 标题\n   */\n  title: string,\n  /**\n   * @description 快捷金额选项\n   */\n  quickAmounts: string[],\n  /**\n   * @description 占位符文本\n   */\n  placeholder: string,\n  /**\n   * @description 最大值\n   */\n  maxValue: number,\n  /**\n   * @description 前缀\n   */\n  prefix: string,\n  /**\n   * @description 链接文本\n   */\n  linkText: string,\n  /**\n   * @description 内容变化时的回调\n   */\n  onChange: (value: string) => void,\n  /**\n   * @description 链接点击时的回调\n   */\n  onLinkTap: () => void,\n}\n\nexport const NumberInputProps: NumberInputProps = {\n  value: '',\n  title: '输入金额',\n  quickAmounts: [],\n  placeholder: '',\n  maxValue: Infinity,\n  prefix: '¥',\n  linkText: '',\n  onChange: () => {},\n  onLinkTap: () => {},\n}\n"
  },
  {
    "path": "src/NumberInput/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n// 背景色\n@number-input-background-color: var(--number-input-background-color, @COLOR_WHITE);\n\n// 标题文字颜色\n@number-input-title-color: var(--number-input-title-color, @COLOR_TEXT_PRIMARY);\n\n// 链接文字颜色\n@number-input-link-color: var(--number-input-link-color, @COLOR_LINK);\n\n// 单位文字颜色\n@number-input-unit-color: var(--number-input-unit-color, @COLOR_TEXT_ASSIST);\n\n// 分割线\n@number-input-border-color: var(--number-input-border-color, @COLOR_BORDER);\n\n// 前缀文字颜色\n@number-input-prefix-color: var(--number-input-prefix-color, @COLOR_TEXT_PRIMARY);\n\n// 输入框光标颜色\n@number-input-caret-color: var(--number-input-caret-color, @COLOR_BRAND1);\n\n// 快捷金额按钮文字颜色\n@number-input-quick-text-color: var(--number-input-quick-text-color, @COLOR_BRAND1);\n\n// 快捷金额按钮边框颜色\n@number-input-quick-border-color: var(--number-input-quick-border-color, @COLOR_BRAND1);\n"
  },
  {
    "path": "src/NumberKeyboard/index.axml",
    "content": "<view\n  key=\"ant-number-input-{{ $id }}\"\n  style=\"{{ style }}\"\n  class=\"ant-number-keyboard {{ className || '' }}\">\n  <view\n    a:if=\"{{ visible }}\"\n    class=\"ant-number-keyboard-modal\"\n    onTap=\"handleHide\"\n    onAppear=\"catchAppearModal\" />\n\n  <view\n    class=\"ant-number-keyboard-kb {{ visible ? '' : 'ant-number-keyboard-kb_hide' }}\">\n    <!-- #if ALIPAY -->\n    <slot name=\"header\">\n    <!-- #endif -->\n      <view\n        a:if=\"{{ closeable }}\"\n        onTap=\"handleHide\"\n        class=\"ant-number-keyboard-kb_none\">\n        <ant-icon\n          type=\"DownOutline\"\n          className=\"ant-number-keyboard-down\" />\n      </view>\n    <!-- #if ALIPAY -->\n    </slot>\n    <!-- #endif -->\n    <view class=\"ant-number-keyboard-kb_bd\">\n      <view class=\"ant-number-keyboard-kb_keys\">\n        <block\n          a:for=\"{{ random ? randomArr : numArr }}\"\n          a:for-index=\"index\"\n          a:for-item=\"item\">\n          <view class=\"ant-number-keyboard-kb_row\">\n            <block\n              a:for=\"{{ item }}\"\n              a:for-index=\"index\"\n              a:for-item=\"itemKey\">\n              <view\n                data-key=\"{{ itemKey }}\"\n                class=\"ant-number-keyboard-kb_number\"\n                onTouchStart=\"tapButton\">\n                {{ itemKey }}\n              </view>\n            </block>\n          </view>\n        </block>\n        <view\n          a:if=\"{{ !confirmText }}\"\n          class=\"ant-number-keyboard-kb_row\">\n          <view\n            a:if=\"{{ !point }}\"\n            class=\"ant-number-keyboard-kb_number ant-number-keyboard-kb_point ant-number-keyboard-kb_flex ant-number-keyboard-kb_e\" />\n          <view\n            a:if=\"{{ point }}\"\n            class=\"ant-number-keyboard-kb_number ant-number-keyboard-kb_point ant-number-keyboard-kb_flex\"\n            data-key=\".\"\n            onTouchStart=\"tapButton\">\n            .\n          </view>\n          <view\n            class=\"ant-number-keyboard-kb_number ant-number-keyboard-kb_zero ant-number-keyboard-kb_flex\"\n            data-key=\"0\"\n            onTouchStart=\"tapButton\">\n            0\n          </view>\n          <view\n            class=\"ant-number-keyboard-kb_number ant-number-keyboard-kb_point ant-number-keyboard-kb_flex {{ point ? '' : 'ant-number-keyboard-kb_e' }}\"\n            data-key=\"del\"\n            onTouchStart=\"tapButton\">\n            <ant-icon\n              type=\"TextDeletionOutline\"\n              className=\"ant-number-keyboard-del\" />\n          </view>\n        </view>\n        <view\n          a:if=\"{{ confirmText }}\"\n          class=\"ant-number-keyboard-kb_row\">\n          <view\n            class=\"ant-number-keyboard-kb_number ant-number-keyboard-kb_zero\"\n            data-key=\"0\"\n            onTouchStart=\"tapButton\">\n            0\n          </view>\n          <view\n            a:if=\"{{ point }}\"\n            class=\"ant-number-keyboard-kb_number ant-number-keyboard-kb_point\"\n            data-key=\".\"\n            onTouchStart=\"tapButton\">\n            .\n          </view>\n        </view>\n      </view>\n      <view\n        a:if=\"{{ confirmText }}\"\n        class=\"ant-number-keyboard-kb_function\">\n        <view\n          class=\"ant-number-keyboard-kb_number ant-number-keyboard-kb_del\"\n          data-key=\"del\"\n          onTouchStart=\"tapButton\">\n          <ant-icon\n            type=\"TextDeletionOutline\"\n            className=\"ant-number-keyboard-del\" />\n        </view>\n        <view\n          style=\"opacity: {{ confirmDisabled ? '0.5' : '1' }}\"\n          onTouchStart=\"tapButton\"\n          class=\"ant-number-keyboard-kb_transfer\"\n          data-key=\"enter\">\n          <!-- #if ALIPAY -->\n          <slot name=\"confirm\">\n          <!-- #endif -->\n            <view class=\"amount-input-kb_transfer-btn\">{{ confirmText }}</view>\n          <!-- #if ALIPAY -->\n          </slot>\n          <!-- #endif -->\n        </view>\n      </view>\n    </view>\n    <view class=\"ant-number-keyboard-kb_iphonex-safe\" />\n  </view>\n</view>\n"
  },
  {
    "path": "src/NumberKeyboard/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Information Entry\n  order: 10\ntoc: 'content'\n---\n\n# NumberKeyboard\n\nCustomize the numeric keypad.\n\n## Precautions\n\n1. The numeric keyboard has not yet solved the problem that the keyboard blocks the input box. Developers need to set up screen scrolling to solve such problems.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-number-keyboard\": \"antd-mini/es/NumberKeyboard/index\"\n#endif\n#if WECHAT\n  \"ant-number-keyboard\": \"antd-mini/NumberKeyboard/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n#### Default Keyboard\n\n```xml\n<ant-number-keyboard visible=\"{{visible}}\" />\n```\n\n#### No decimal point\n\n```xml\n<ant-number-keyboard point=\"{{false}}\" visible=\"{{visible}}\" />\n```\n\n#### With confirmation button\n\n```xml\n<ant-number-keyboard confirmText=\"confirm\" visible=\"{{visible}}\" />\n```\n\n#### With closed arrow\n\n```xml\n<ant-number-keyboard closeable=\"{{true}}\" visible=\"{{visible}}\" />\n```\n\n#### scrambled keyboard\n\n```xml\n<ant-number-keyboard random=\"{{true}}\" visible=\"{{visible}}\" />\n```\n\n#### Custom Button\n\n```xml\n<ant-number-keyboard visible=\"{{visible}}\" >\n  <view\n      slot=\"header\"\n      class=\"number-keyboard-header\"\n    >\n      Custom Title\n    </view>\n</ant-number-keyboard>\n\n<ant-number-keyboard visible=\"{{visible}}\" >\n  <view\n    slot=\"confirm\"\n    class=\"number-keyboard-confirm\"\n  >\n    <!-- 自定义确认按钮 -->\n    <ant-icon type=\"DownOutline\"></ant-icon>\n  </view>\n</ant-number-keyboard>\n```\n\n### Digital input box\n\n<code src='../../demo/pages/NumberKeyboardNumber/index'></code>\n\n### Verification code input box\n\n<code src='../../demo/pages/NumberKeyboardCode/index'></code>\n\n### Demo Code\n\n<code src='../../demo/pages/NumberKeyboard/index'></code>\n\n## API\n\n| Property                    | Description             | Type                  | Default Value |\n| ----------------------- | ---------------- | --------------------- | ------ |\n| className               | Class Name             | string                | -      |\n| style                   | Style             | string                | -      |\n| value                   | Enter value           | string                | -      |\n| visible                 | Show             | boolean               | false  |\n| vibrate                 | Vibration             | boolean               | true   |\n| closeable               | Close Arrow         | boolean               | false  |\n| point                   | decimal point           | boolean               | true   |\n| random                  | out of order             | boolean               | false  |\n| confirmDisabled         | Disable confirmation button     | boolean               | false  |\n| safeArea                | Safety distance         | boolean               | true   |\n| confirmText             | Confirm the text of the button   | string                | -      |\n| header                  | Override the title bar of the keyboard | slot                  | -      |\n| confirm                 | Override keyboard confirmation button | slot                  | -      |\n| #if ALIPAY onChange     | Callback when number changes | (val: string) => void | -      |\n| #if ALIPAY onClose      | Callback when hiding keyboard | () => void            | -      |\n| #if ALIPAY onConfirm    | Callback when clicking confirmation | () => void            | -      |\n| #if WECHAT bindchange  | Callback when number changes | (val: string) => void | -      |\n| #if WECHAT bindclose   | Callback when hiding keyboard | () => void            | -      |\n| #if WECHAT bindconfirm | Callback when clicking confirmation | () => void            | -      |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                                           | Default Value                                                                                            | Dark Mode Default                                                                                    | Remarks                               |\n| ------------------------------------------------ | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------------------------- |\n| --number-key-board-active-background-color       | <div style=\"width: 150px; height: 30px; background-color: #d3d3d3; color: #333333;\">#d3d3d3</div> | <div style=\"width: 150px; height: 30px; background-color: #d3d3d3; color: #333333;\">#d3d3d3</div> | Numeric keypad to activate background color               |\n| --number-key-board-text-color                    | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | Number pad text color                   |\n| --number-key-board-none-text-color               | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | No text color on numeric keypad                 |\n| --number-key-board-iphonex-safe-background-color | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | Digital Keyboard iPhone X Secure Area Background Color |\n| --number-key-board-background-color              | <div style=\"width: 150px; height: 30px; background-color: #f5f5f5; color: #333333;\">#f5f5f5</div> | <div style=\"width: 150px; height: 30px; background-color: #121212; color: #ffffff;\">#121212</div> | Numeric keypad background color                   |\n| --number-key-board-border-color                  | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #333333;\">#eeeeee</div> | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #ffffff;\">#2b2b2b</div> | Numeric keypad border color                   |\n| --number-key-board-transfer-bg               | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | Numeric keypad button background               |\n| --number-key-board-transfer-color                | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | Numeric keypad button color               |\n"
  },
  {
    "path": "src/NumberKeyboard/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-icon\": \"../Icon/index\"\n  }\n}\n"
  },
  {
    "path": "src/NumberKeyboard/index.less",
    "content": "@import (reference) './variable.less';\n\n@keyframes number-input-cursor {\n  0% {\n    opacity: 0;\n  }\n  50% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n\n.ant-number-keyboard {\n  color: @number-key-board-text-color;\n  width: 0;\n  height: 0;\n  position: relative;\n  overflow: hidden;\n  &-modal {\n    z-index: 998;\n    position: fixed;\n    bottom: 0;\n    left: 0;\n    width: 100vw;\n    height: 100vh;\n    background-color: transparent;\n  }\n  &-kb {\n    background: @number-key-board-background-color;\n    max-height: 600px;\n    min-width: 100vw;\n    overflow: hidden;\n    position: fixed;\n    bottom: 0;\n    left: 0;\n    transition: all 200ms linear;\n    z-index: 999;\n    &_hide {\n      transform: translateY(100%);\n      max-height: 0;\n    }\n    &_bd {\n      display: flex;\n    }\n    &_row {\n      display: flex;\n    }\n    &_keys {\n      flex: 3;\n    }\n    &_function {\n      flex: 1;\n      display: flex;\n      flex-direction: column;\n    }\n    &_none {\n      height: 80 * @rpx;\n      width: calc(100% - @number-key-board-none-padding * 2);\n      padding: 0 @number-key-board-none-padding;\n      font-size: 28 * @rpx;\n      background-color: @number-key-board-iphonex-safe-background-color;\n      display: flex;\n      position: relative;\n      flex-direction: row;\n      align-items: center;\n      justify-content: center;\n      border-bottom: @border-width-standard solid\n        @number-key-board-background-color;\n      color: @number-key-board-none-text-color;\n    }\n    &_number {\n      flex: 1;\n      height: calc(100vh / 14);\n      text-align: center;\n      font-size: 50 * @rpx;\n      color: @number-key-board-text-color;\n      background: @number-key-board-iphonex-safe-background-color;\n      border-right: @border-width-standard solid\n        @number-key-board-background-color;\n      border-bottom: @border-width-standard solid\n        @number-key-board-background-color;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      user-select: none;\n      &:active {\n        background-color: @number-key-board-active-background-color;\n        opacity: 0.5;\n        color: @number-key-board-text-color;\n      }\n    }\n    &_disable {\n      &:active {\n        opacity: 1;\n      }\n    }\n    &_zero {\n      flex: 2;\n    }\n    &_point {\n      flex: 1;\n    }\n    &_transfer {\n      background-color: @number-key-board-transfer-bg;\n      color: @number-key-board-transfer-color;\n      flex: 1;\n      height: calc(100vh / 14);\n      text-align: center;\n      font-size: 34 * @rpx;\n      border-right: @border-width-standard solid\n        @number-key-board-background-color;\n      border-bottom: @border-width-standard solid\n        @number-key-board-background-color;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      user-select: none;\n      position: relative;\n      overflow: hidden;\n      &-btn {\n        font-size: 32 * @rpx;\n        font-weight: bold;\n      }\n      &:active {\n        opacity: 0.9;\n      }\n    }\n    &_del {\n      position: relative;\n      flex: none;\n      border-right: none;\n      &::before {\n        display: block;\n        position: absolute;\n        top: 0;\n        right: 0;\n        bottom: 0;\n        left: 0;\n        content: '';\n      }\n    }\n    &_iphonex-safe {\n      height: 48 * @rpx;\n      width: 100%;\n      background-color: @number-key-board-iphonex-safe-background-color;\n    }\n    &_flex {\n      flex: 1;\n    }\n    &-e {\n      background-color: @number-key-board-border-color;\n    }\n  }\n  &-down {\n    font-size: 40 * @rpx;\n  }\n  &-del {\n    font-size: 50 * @rpx;\n  }\n}\n"
  },
  {
    "path": "src/NumberKeyboard/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 数据录入\n  order: 10\ntoc: 'content'\n---\n\n# NumberKeyboard 数字键盘\n\n自定义数字键盘。\n\n## 注意事项\n\n1. 数字键盘暂未解决键盘遮挡输入框的问题，需要开发者自行设置屏幕滚动来解决此类问题。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-number-keyboard\": \"antd-mini/es/NumberKeyboard/index\"\n#endif\n#if WECHAT\n  \"ant-number-keyboard\": \"antd-mini/NumberKeyboard/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n#### 默认键盘\n\n```xml\n<ant-number-keyboard visible=\"{{visible}}\" />\n```\n\n#### 没有小数点\n\n```xml\n<ant-number-keyboard point=\"{{false}}\" visible=\"{{visible}}\" />\n```\n\n#### 带确认按钮\n\n```xml\n<ant-number-keyboard confirmText=\"confirm\" visible=\"{{visible}}\" />\n```\n\n#### 带关闭箭头\n\n```xml\n<ant-number-keyboard closeable=\"{{true}}\" visible=\"{{visible}}\" />\n```\n\n#### 乱序键盘\n\n```xml\n<ant-number-keyboard random=\"{{true}}\" visible=\"{{visible}}\" />\n```\n\n#### 自定义按钮\n\n```xml\n<ant-number-keyboard visible=\"{{visible}}\" >\n  <view\n      slot=\"header\"\n      class=\"number-keyboard-header\"\n    >\n      自定义标题\n    </view>\n</ant-number-keyboard>\n\n<ant-number-keyboard visible=\"{{visible}}\" >\n  <view\n    slot=\"confirm\"\n    class=\"number-keyboard-confirm\"\n  >\n    <!-- 自定义确认按钮 -->\n    <ant-icon type=\"DownOutline\"></ant-icon>\n  </view>\n</ant-number-keyboard>\n```\n\n### 数字输入框\n\n<code src='../../demo/pages/NumberKeyboardNumber/index'></code>\n\n### 验证码输入框\n\n<code src='../../demo/pages/NumberKeyboardCode/index'></code>\n\n### Demo 代码\n\n<code src='../../demo/pages/NumberKeyboard/index'></code>\n\n## API\n\n| 属性                    | 说明             | 类型                  | 默认值 |\n| ----------------------- | ---------------- | --------------------- | ------ |\n| className               | 类名             | string                | -      |\n| style                   | 样式             | string                | -      |\n| value                   | 输入值           | string                | -      |\n| visible                 | 展示             | boolean               | false  |\n| vibrate                 | 震动             | boolean               | true   |\n| closeable               | 关闭箭头         | boolean               | false  |\n| point                   | 小数点           | boolean               | true   |\n| random                  | 乱序             | boolean               | false  |\n| confirmDisabled         | 禁用确认按钮     | boolean               | false  |\n| safeArea                | 安全距离         | boolean               | true   |\n| confirmText             | 确认按钮的文字   | string                | -      |\n| header                  | 覆盖键盘的标题栏 | slot                  | -      |\n| confirm                 | 覆盖键盘确认按钮 | slot                  | -      |\n| #if ALIPAY onChange     | 数字变化时的回调 | (val: string) => void | -      |\n| #if ALIPAY onClose      | 隐藏键盘时的回调 | () => void            | -      |\n| #if ALIPAY onConfirm    | 点击确认时的回调 | () => void            | -      |\n| #if WECHAT bindchange  | 数字变化时的回调 | (val: string) => void | -      |\n| #if WECHAT bindclose   | 隐藏键盘时的回调 | () => void            | -      |\n| #if WECHAT bindconfirm | 点击确认时的回调 | () => void            | -      |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                                           | 默认值                                                                                            | 深色模式默认值                                                                                    | 备注                               |\n| ------------------------------------------------ | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------------------------- |\n| --number-key-board-active-background-color       | <div style=\"width: 150px; height: 30px; background-color: #d3d3d3; color: #333333;\">#d3d3d3</div> | <div style=\"width: 150px; height: 30px; background-color: #d3d3d3; color: #333333;\">#d3d3d3</div> | 数字键盘激活背景颜色               |\n| --number-key-board-text-color                    | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | 数字键盘文本颜色                   |\n| --number-key-board-none-text-color               | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | 数字键盘无文本颜色                 |\n| --number-key-board-iphonex-safe-background-color | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | 数字键盘 iPhone X 安全区域背景颜色 |\n| --number-key-board-background-color              | <div style=\"width: 150px; height: 30px; background-color: #f5f5f5; color: #333333;\">#f5f5f5</div> | <div style=\"width: 150px; height: 30px; background-color: #121212; color: #ffffff;\">#121212</div> | 数字键盘背景颜色                   |\n| --number-key-board-border-color                  | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #333333;\">#eeeeee</div> | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #ffffff;\">#2b2b2b</div> | 数字键盘边框颜色                   |\n| --number-key-board-transfer-bg               | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | 数字键盘按钮背景               |\n| --number-key-board-transfer-color                | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | 数字键盘按钮颜色               |\n"
  },
  {
    "path": "src/NumberKeyboard/index.ts",
    "content": "import {\n  Component,\n  getValueFromProps,\n  triggerEvent,\n  triggerEventOnly,\n} from '../_util/simply';\n\nimport { NumberKeyboardDefaultProps } from './props';\n\nconst arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];\n\nComponent({\n  props: NumberKeyboardDefaultProps,\n  data: {\n    numArr: [\n      [1, 2, 3],\n      [4, 5, 6],\n      [7, 8, 9],\n    ],\n    randomArr: [],\n  },\n  methods: {\n    catchAppearModal() {\n      this.setRandom();\n    },\n    setRandom() {\n      if (getValueFromProps(this, 'random')) {\n        const newArr = arr.sort(function () {\n          return Math.random() - 0.5;\n        });\n        this.setData({\n          randomArr: [\n            newArr.slice(0, 3),\n            newArr.slice(3, 6),\n            newArr.slice(6, 9),\n          ],\n        });\n      }\n    },\n    tapButton(e) {\n      const [value, confirmDisabled] = getValueFromProps(this, [\n        'value',\n        'confirmDisabled',\n      ]);\n      this.vibrate();\n      const _key = e.currentTarget.dataset.key;\n      const _val = `${value}`;\n\n      // 回退\n      if (_key === 'del') {\n        triggerEvent(this, 'change', `${_val.substr(0, _val.length - 1)}`, e);\n        return;\n      }\n      if (_key !== 'del' && _key !== 'enter') {\n        triggerEvent(this, 'change', `${_val}${_key}`, e);\n      }\n      if (_key === 'enter' && !confirmDisabled) {\n        this.onClickEnter();\n        triggerEventOnly(this, 'close');\n      }\n    },\n    // 隐藏键盘，失去焦点\n    handleHide() {\n      triggerEventOnly(this, 'close');\n    },\n    onClickEnter() {\n      const confirmDisabled = getValueFromProps(this, 'confirmDisabled');\n      if (confirmDisabled) return;\n      this.handleHide();\n      triggerEventOnly(this, 'confirm');\n    },\n    // 振动反馈\n    vibrate() {\n      if (getValueFromProps(this, 'vibrate') && typeof my !== 'undefined') {\n        my.canIUse('vibrateShort') && my.vibrateShort();\n      }\n    },\n  },\n\n  /// #if ALIPAY\n  didMount() {\n    this.setRandom();\n  },\n  /// #endif\n  /// #if WECHAT\n  attached() {\n    this.setRandom();\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/NumberKeyboard/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\nexport interface INumberKeyboardProps extends IBaseProps {\n  /**\n   * @description 关闭箭头\n   * @default false\n   */\n  closeable: boolean;\n  /**\n   * @description 展示小数点\n   * @default true\n   */\n  point: boolean;\n  /**\n   * @description 确认按钮文字\n   * @default ''\n   */\n  confirmText: string;\n  /**\n   * @description 是否震动\n   * @default true\n   */\n  vibrate: boolean;\n  /**\n   * @description 是否展示\n   * @default false\n   */\n  visible: boolean;\n  /**\n   * @description 值\n   * @default ''\n   */\n  value: string;\n  /**\n   * @description 安全距离\n   * @default true\n   */\n  safeArea: boolean;\n  /**\n   * @description 乱序\n   * @default fasle\n   */\n  random: boolean;\n  /**\n   * @description 禁用\n   * @default false\n   */\n  confirmDisabled: boolean;\n  /**\n   * @description 输入值变化时的回调\n   */\n  onChange?: (val: string) => void;\n  /**\n   * @description 点击确认时的回调\n   */\n  onConfirm?: () => void;\n  /**\n   * @description 隐藏键盘时的回调\n   */\n  onClose?: () => void;\n}\n\nexport const NumberKeyboardDefaultProps: Partial<INumberKeyboardProps> = {\n  closeable: false, // 关闭箭头\n  point: true, // 展示小数点\n  confirmText: '', // 确认按钮文字\n  vibrate: false, // 震动反馈\n  visible: false, // 是否展示\n  value: '', // 值\n  safeArea: true, // 安全区域\n  random: false, // 乱序\n  confirmDisabled: false, // 禁用确认按钮\n  onChange: () => {},\n  onConfirm: () => {},\n  onClose: () => {},\n};\n"
  },
  {
    "path": "src/NumberKeyboard/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n@number-key-board-none-padding: 48 * @rpx;\n\n// 标准字体颜色\n@number-key-board-text-color: var(\n  --number-key-board-text-color,\n  @COLOR_TEXT_PRIMARY\n);\n// nont-字体颜色\n@number-key-board-none-text-color: var(\n  --number-key-board-none-text-color,\n  @COLOR_TEXT_ASSIST\n);\n@number-key-board-iphonex-safe-background-color: var(\n  --number-key-board-iphonex-safe-background-color,\n  @COLOR_CARD\n);\n\n@number-key-board-background-color: var(\n  --number-key-board-background-color,\n  @COLOR_BACKGROUND\n);\n\n@number-key-board-border-color: var(\n  --number-key-board-border-color,\n  @COLOR_BORDER\n);\n\n@number-key-board-transfer-bg: var(\n  --number-key-board-transfer-bg,\n  @COLOR_BRAND1\n);\n\n@number-key-board-active-background-color: var(\n  --number-key-board-active-background-color,\n  #d3d3d3\n);\n\n@number-key-board-transfer-color: var(\n  --number-key-board-transfer-color,\n  @COLOR_WHITE\n);\n"
  },
  {
    "path": "src/PageContainer/index.axml",
    "content": "<view\n  class=\"ant-page-container {{className || ''}} {{safeArea === 'top' || safeArea === 'both' ? 'ant-page-container-safe-top' : ''}} {{safeArea === 'bottom' || safeArea === 'both' ? 'ant-page-container-safe-bottom' : ''}}\"\n  style=\"{{style || ''}}\"\n>\n  <!-- loading -->\n  <view\n    a:if=\"{{loading}}\"\n    class=\"ant-page-container-loading-wrap\"\n  >\n    <view class=\"ant-page-container-loading\">\n      <!-- #if ALIPAY -->\n      <slot name=\"loading\">\n      <!-- #endif -->\n        <ant-loading\n          type=\"{{loadingType}}\"\n          size=\"{{loadingSize}}\"\n          color=\"{{loadingColor}}\"\n        />\n      <!-- #if ALIPAY -->\n      </slot>\n      <!-- #endif -->\n    </view>\n  </view>\n\n  <!-- 页面异常状态 -->\n  <view class=\"ant-page-container-status\" a:if=\"{{image && title && message}}\">\n    <ant-empty\n      image=\"{{image}}\"\n      title=\"{{title}}\"\n      imageMode=\"heightFix\"\n      message=\"{{message}}\"\n    >\n      <view slot=\"extra\">\n        <ant-button\n          a:if=\"{{actionText}}\"\n          onTap=\"handleActionTap\"\n          type=\"primary\"\n          size=\"small\"\n          inline\n        >\n          {{actionText}}\n        </ant-button>\n        <ant-button\n          a:if=\"{{secondaryActionText}}\"\n          onTap=\"handleSecondaryActionTap\"\n          size=\"small\"\n          inline\n          style=\"margin-left: 12px\"\n        >\n          {{secondaryActionText}}\n        </ant-button>\n        <slot name=\"extra\" />\n      </view>\n    </ant-empty>\n  </view>\n\n  <!-- 正常页面内容 -->\n  <slot a:else />\n</view>\n"
  },
  {
    "path": "src/PageContainer/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Information Display\n  order: 8\ntoc: 'content'\n---\n\n# PageContainer\n\nThe page-level container component provides common capabilities such as loading status, page exception handling, top/bottom safe margins, and so on, out of the box.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n  \"ant-page\": \"antd-mini/es/PageContainer/index\"\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<ant-page\n  loading=\"{{loading}}\"\n  status=\"{{status}}\"\n  title=\"{{title}}\"\n  message=\"{{message}}\"\n  image=\"{{image}}\"\n  safeArea=\"{{safeArea}}\"\n  loadingColor=\"#ccc\"\n  loadingSize=\"medium\"\n  loadingType=\"spin\"\n  actionText=\"refresh\"\n  secondaryActionText=\"internet error\"\n  onActionTap=\"handleRefresh\"\n  onSecondaryActionTap=\"handleSwitchToDisconnected\"\n>\n  <view class=\"content\">\n   minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n  </view>\n</ant-page>\n```\n\n```js\nPage({\n  data: {\n    loading: true,\n    status: 'failed',\n    safeArea: 'both',\n  },\n  onLoad() {\n    setTimeout(() => {\n      this.setData({\n        loading: false,\n      });\n    }, 1000);\n  },\n  handleRefresh() {\n    my.reLaunch({\n      url: 'index',\n      fail(e) {\n        console.log(e);\n      },\n    });\n  },\n  handleSwitchToDisconnected() {\n    this.setData({\n      status: 'disconnected',\n      title: undefined,\n      message: undefined,\n      image: '',\n    });\n  },\n});\n```\n\n### Demo Code\n\n<code src='../../demo/pages/PageContainer/index'></code>\n\n## API\n\n| Property                 | Description                                                    | Type             | Default Value   |\n| -------------------- | ------------------------------------------------------- | ---------------- | -------- |\n| className            | Class Name                                                    | string           | -        |\n| style                | Style                                                    | string           | -        |\n| safeArea             | Location of margin inside the safety zone,`top`、`bottom`、`both`               | string           | `both`   |\n| loading              | Loading                                                  | boolean \\| slot  | false    |\n| loadingType          | Load style type,`spin`、`mini`                            | string           | `spin`   |\n| loadingSize          | Load Style Size,`small`、`medium`、`large`、`x-large`     | string           | `medium` |\n| loadingColor         | Load Style Color                                            | string           | '#ccc'   |\n| status               | Page exception status,`failed`、`busy`、`disconnected`、`empty` | string \\| slot   | -        |\n| image                | Page Exception Status Custom Image                                  | string           | -        |\n| title                | Page Exception Status Custom Title                                  | string           | -        |\n| message              | Page Exception Status Custom Description                                  | string           | -        |\n| actionText           | Page Exception Status Button Copy                                    | string           | -        |\n| secondaryActionText  | Page Exception Secondary Button Copy                                | string           | -        |\n| extra                | Page Exception Custom Button                                  | slot             | -        |\n| onActionTap          | Page abnormal state button click event                                | (e: any) => void | -        |\n| onSecondaryActionTap | Page Exception Status Secondary Button Click Event                            | (e: any) => void | -        |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                            | Default Value                                                                            | Dark Mode Default                                                                                    | Remarks             |\n| --------------------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------- |\n| --page-container-background-color | <div style=\"width: 150px; height: 30px; background-color: #333333;\">#f5f5f5</div> | <div style=\"width: 150px; height: 30px; background-color: #121212; color: #ffffff;\">#121212</div> | Page Container Background Color |\n"
  },
  {
    "path": "src/PageContainer/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-button\": \"../Button/index\",\n    \"ant-loading\": \"../Loading/index\",\n    \"ant-empty\": \"../Empty/index\"\n  }\n}\n"
  },
  {
    "path": "src/PageContainer/index.less",
    "content": "@import (reference) './variable.less';\n@import '../style/mixins/hairline.less';\n\n@prefix: ant-page-container;\n\n.@{prefix} {\n  overflow: auto;\n  color: @COLOR_TEXT_PRIMARY;\n\n  &-safe-top {\n    padding-top: constant(safe-area-inset-top);\n    padding-top: env(safe-area-inset-top);\n  }\n\n  &-safe-bottom {\n    padding-bottom: constant(safe-area-inset-bottom);\n    padding-bottom: env(safe-area-inset-bottom);\n  }\n\n  &-loading-wrap {\n    position: fixed;\n    left: 0;\n    top: 0;\n    width: 100%;\n    height: 100vh;\n    background: @page-container-background-color;\n    opacity: 0.4;\n    z-index: 3;\n  }\n\n  &-loading {\n    position: absolute;\n    left: 50%;\n    top: 50%;\n    transform: translate(-50%, -50%);\n  }\n\n  &-status {\n    margin-top: 420 * @rpx;\n    text-align: center;\n  }\n}\n"
  },
  {
    "path": "src/PageContainer/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 数据展示\n  order: 8\ntoc: 'content'\n---\n\n# PageContainer 页面容器\n\n页面级容器组件，提供加载状态、页面异常处理、顶部/底部安全边距等常用能力，开箱即用。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n  \"ant-page\": \"antd-mini/es/PageContainer/index\"\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-page\n  loading=\"{{loading}}\"\n  status=\"{{status}}\"\n  title=\"{{title}}\"\n  message=\"{{message}}\"\n  image=\"{{image}}\"\n  safeArea=\"{{safeArea}}\"\n  loadingColor=\"#ccc\"\n  loadingSize=\"medium\"\n  loadingType=\"spin\"\n  actionText=\"refresh\"\n  secondaryActionText=\"internet error\"\n  onActionTap=\"handleRefresh\"\n  onSecondaryActionTap=\"handleSwitchToDisconnected\"\n>\n  <view class=\"content\">\n   minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n  </view>\n</ant-page>\n```\n\n```js\nPage({\n  data: {\n    loading: true,\n    status: 'failed',\n    safeArea: 'both',\n  },\n  onLoad() {\n    setTimeout(() => {\n      this.setData({\n        loading: false,\n      });\n    }, 1000);\n  },\n  handleRefresh() {\n    my.reLaunch({\n      url: 'index',\n      fail(e) {\n        console.log(e);\n      },\n    });\n  },\n  handleSwitchToDisconnected() {\n    this.setData({\n      status: 'disconnected',\n      title: undefined,\n      message: undefined,\n      image: '',\n    });\n  },\n});\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/PageContainer/index'></code>\n\n## API\n\n| 属性                 | 说明                                                    | 类型             | 默认值   |\n| -------------------- | ------------------------------------------------------- | ---------------- | -------- |\n| className            | 类名                                                    | string           | -        |\n| style                | 样式                                                    | string           | -        |\n| safeArea             | 安全区内边距位置，`top`、`bottom`、`both`               | string           | `both`   |\n| loading              | 加载中                                                  | boolean \\| slot  | false    |\n| loadingType          | 加载样式类型，`spin`、`mini`                            | string           | `spin`   |\n| loadingSize          | 加载样式大小，`small`、`medium`、`large`、`x-large`     | string           | `medium` |\n| loadingColor         | 加载样式颜色                                            | string           | '#ccc'   |\n| status               | 页面异常状态，`failed`、`busy`、`disconnected`、`empty` | string \\| slot   | -        |\n| image                | 页面异常状态自定义图片                                  | string           | -        |\n| title                | 页面异常状态自定义标题                                  | string           | -        |\n| message              | 页面异常状态自定义描述                                  | string           | -        |\n| actionText           | 页面异常状态按钮文案                                    | string           | -        |\n| secondaryActionText  | 页面异常状态次要按钮文案                                | string           | -        |\n| extra                | 页面异常状态自定义按钮                                  | slot             | -        |\n| onActionTap          | 页面异常状态按钮点击事件                                | (e: any) => void | -        |\n| onSecondaryActionTap | 页面异常状态次要按钮点击事件                            | (e: any) => void | -        |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                            | 默认值                                                                            | 深色模式默认值                                                                                    | 备注             |\n| --------------------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------- |\n| --page-container-background-color | <div style=\"width: 150px; height: 30px; background-color: #333333;\">#f5f5f5</div> | <div style=\"width: 150px; height: 30px; background-color: #121212; color: #ffffff;\">#121212</div> | 页面容器背景颜色 |\n"
  },
  {
    "path": "src/PageContainer/index.sjs.ts",
    "content": ""
  },
  {
    "path": "src/PageContainer/index.ts",
    "content": "import { effect } from '@preact/signals-core';\nimport equal from 'fast-deep-equal';\nimport {\n  ComponentWithSignalStoreImpl,\n  getValueFromProps,\n  triggerEventOnly,\n} from '../_util/simply';\nimport i18nController from '../_util/store';\nimport { BuiltinStatus, PageDefaultProps } from './props';\n\nComponentWithSignalStoreImpl({\n  storeOptions: {\n    store: () => i18nController,\n    updateHook: effect,\n    mapState: {\n      locale: ({ store }) => store.currentLocale.value,\n    },\n  },\n  props: PageDefaultProps,\n  methods: {\n    handleActionTap(e) {\n      triggerEventOnly(this, 'actionTap', e);\n    },\n    handleSecondaryActionTap(e) {\n      triggerEventOnly(this, 'secondaryActionTap', e);\n    },\n    updatePageStatus(prevProps: any, nextProps: any) {\n      if (!equal(prevProps, nextProps)) {\n        const [status, image, title, message] = getValueFromProps(this, [\n          'status',\n          'image',\n          'title',\n          'message',\n        ]);\n        const updateData = {\n          ...nextProps,\n          // 自定义内容优先 status\n          image: image || BuiltinStatus[status]?.image || '',\n          title:\n            title ||\n            BuiltinStatus[status]?.title ||\n            this.data.locale.pageContainer[status]?.title ||\n            '',\n          message:\n            message ||\n            BuiltinStatus[status]?.message ||\n            this.data.locale.pageContainer[status]?.message ||\n            '',\n        };\n\n        this.setData(updateData);\n      }\n    },\n  },\n\n  /// #if ALIPAY\n  didMount() {\n    const props = getValueFromProps(this);\n    this.updatePageStatus({}, props);\n  },\n  didUpdate(prevProps) {\n    const props = getValueFromProps(this);\n    this.updatePageStatus(prevProps, props);\n  },\n  /// #endif\n\n  /// #if WECHAT\n  attached() {\n    const props = getValueFromProps(this);\n    this.updatePageStatus({}, props);\n  },\n  observers: {\n    '**': function (data) {\n      const prevData = this._prevData || this.data;\n      this._prevData = { ...data };\n      this.updatePageStatus(prevData, data);\n    },\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/PageContainer/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\n/**\n * @description 页面容器，提供开箱即用的页面状态展示和基础能力。\n */\n\nexport interface IPageProps extends IBaseProps {\n  /**\n   * @description 安全区内边距位置 top=顶部 bottom=底部 both=顶部和底部\n   */\n  safeArea?: 'top' | 'bottom' | 'both';\n\n  /**\n   * @description 加载中\n   */\n  loading?: boolean;\n\n  /**\n   * @description 加载样式类型，参考 Loading 组件\n   */\n  loadingType?: string;\n\n  /**\n   * @description 加载样式大小，参考 Loading 组件\n   */\n  loadingSize?: string;\n\n  /**\n   * @description 加载样式颜色，参考 Loading 组件\n   */\n  loadingColor?: string;\n\n  /**\n   * @description 页面异常状态\n   */\n  status?: 'failed' | 'busy' | 'disconnected' | 'empty';\n\n  /**\n   * @description 页面异常状态-标题\n   */\n  title?: string;\n  /**\n   * @description 页面异常状态-图片\n   */\n  image?: string;\n  /**\n   * @description 页面异常状态-描述\n   */\n  message?: string;\n\n  /**\n   * @description 页面异常状态-按钮文案\n   */\n  actionText?: string;\n\n  /**\n   * @description 页面异常状态-次要按钮文案\n   */\n  secondaryActionText?: string;\n\n  /**\n   * @description 页面异常状态-按钮点击事件\n   */\n  onActionTap?: (e: any) => void;\n\n  /**\n   * @description 页面异常状态-次要按钮点击事件\n   */\n  onSecondaryActionTap?: (e: any) => void;\n}\n\nexport const PageDefaultProps: IPageProps = {\n  loading: false,\n  safeArea: 'both',\n  loadingColor: '#ccc',\n  loadingSize: 'medium',\n  loadingType: 'spin',\n  status: null,\n  title: '',\n  image: '',\n  message: '',\n  actionText: '',\n  secondaryActionText: '',\n  onActionTap: null,\n  onSecondaryActionTap: null,\n};\n\n// 内置异常配置\nexport const BuiltinStatus = {\n  failed: {\n    image:\n      'https://gw.alipayobjects.com/mdn/rms_7cc883/afts/img/A*PG7NQoXbN38AAAAAAAAAAAAAARQnAQ',\n    title: '',\n    message: '',\n  },\n  disconnected: {\n    image:\n      'https://mdn.alipayobjects.com/huamei_yqdpol/afts/img/A*uqB5TY4urA4AAAAAAAAAAAAADj16AQ/original',\n    title: '',\n    message: '',\n  },\n  empty: {\n    title: '',\n    message: '',\n    image:\n      'https://gw.alipayobjects.com/mdn/rms_226d75/afts/img/A*0AaRRrYlVDkAAAAAAAAAAAAAARQnAQ',\n  },\n  busy: {\n    image:\n      'https://mdn.alipayobjects.com/huamei_yqdpol/afts/img/A*avTGQIyeHk0AAAAAAAAAAAAADj16AQ/original',\n    title: '',\n    message: '',\n  },\n};\n"
  },
  {
    "path": "src/PageContainer/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n@page-container-background-color: var(\n  --page-container-background-color,\n  @COLOR_BACKGROUND\n);\n"
  },
  {
    "path": "src/Pagination/index.axml",
    "content": "<import-sjs\n  from=\"./index.sjs\"\n  name=\"sjs\" />\n\n<view\n  class=\"ant-page-infinite {{ className || '' }}\"\n  style=\"{{ style || '' }}\">\n  <scroll-view\n    scroll-x=\"{{ true }}\"\n    class=\"ant-page-infinite-content\"\n    id=\"ant-pageInfinite{{ $id ? '-' + $id : '' }}\"\n    onScroll=\"{{ supportSjs ? sjs.changeScollDistance : 'onScroll' }}\">\n    <slot />\n  </scroll-view>\n  <view class=\"ant-page-infinite-wrap\">\n    <view\n      class=\"ant-page-infinite-area\"\n      style=\"{{ fillColor ? 'background-color:' + fillColor : '' }}\">\n      <view\n        class=\"ant-page-infinite-move\"\n        style=\"{{ frontColor ? 'background-color:' + frontColor : '' }}; transform: translateX({{ pageDeg }}%);\" />\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "src/Pagination/index.json",
    "content": "{  \n  \"styleIsolation\": \"shared\",\n  \"component\": true\n}\n"
  },
  {
    "path": "src/Pagination/index.less",
    "content": "@import (reference) './variable.less';\n\n@pageInfinite: ant-page-infinite;\n\n.@{pageInfinite} {\n  position: relative;\n  width: 100%;\n  box-sizing: border-box;\n  &-content {\n    width: 100%;\n    &::-webkit-scrollbar {\n      display: none;\n    }\n  }\n  &-wrap {\n    position: absolute;\n    bottom: 2 * @rpx;\n    left: 0;\n    right: 0;\n    width: 100%;\n    height: 6 * @rpx;\n    z-index: 2;\n    pointer-events: none;\n  }\n  &-area {\n    position: absolute;\n    left: 50%;\n    width: 52 * @rpx;\n    height: 6 * @rpx;\n    overflow: hidden;\n    border-radius: @corner-radius-sm / 2;\n    transform: translateX(-50%);\n    background-color: @pagination-area-background-color;\n  }\n  &-move {\n    position: absolute;\n    bottom: 0;\n    left: 0;\n    width: 50%;\n    height: 100%;\n    transition: all 100ms linear;\n    border-radius: @corner-radius-sm / 2;\n    background-color: @pagination-move-background-color;\n  }\n}\n"
  },
  {
    "path": "src/Pagination/index.sjs.ts",
    "content": "function changeScollDistance(event, ownerComponent) {\n  const scrollLeft = event.detail.scrollLeft;\n  const scrollWidth = event.detail.scrollWidth;\n  const viewWidth = ownerComponent\n    .selectComponent('.ant-page-infinite-content')\n    .getBoundingClientRect().width;\n  const moveDom = ownerComponent.selectComponent('.ant-page-infinite-move');\n  const pageDeg = Math.ceil((scrollLeft / (scrollWidth - viewWidth)) * 100);\n  moveDom.setStyle(`transform: translateX(${pageDeg}%);`);\n}\n\nexport default { changeScollDistance };\n"
  },
  {
    "path": "src/Pagination/index.ts",
    "content": "import { isAilpayNative } from '../_util/support';\nimport { getInstanceBoundingClientRect } from '../_util/jsapi/get-instance-bounding-client-rect';\nimport { Component } from '../_util/simply';\nimport { PaginationDefaultProps } from './props';\n\nComponent({\n  props: PaginationDefaultProps,\n  data: {\n    pageDeg: 0,\n    supportSjs: true,\n  },\n  wrapWidth: 0,\n  methods: {\n    async clacWidth() {\n      const rect = await getInstanceBoundingClientRect(\n        this,\n        `#ant-pageInfinite${this.$id ? `-${this.$id}` : ''}`\n      );\n      if (rect) {\n        return rect.width;\n      }\n      return 0;\n    },\n    async onScroll(e) {\n      const { scrollLeft, scrollWidth } = e.detail;\n      const viewWidth = await this.clacWidth();\n      if (viewWidth) {\n        this.setData({\n          pageDeg: Math.ceil((scrollLeft / (scrollWidth - viewWidth)) * 100),\n        });\n      }\n    },\n  },\n  onInit() {\n    /// #if ALIPAY\n    let supportSjs;\n    if (typeof my === 'undefined') {\n      supportSjs = true;\n    }\n    supportSjs = my.canIUse('sjs.event');\n    if (isAilpayNative()) {\n      supportSjs = false;\n    }\n    this.setData({ supportSjs });\n    /// #endif\n  },\n});\n"
  },
  {
    "path": "src/Pagination/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\nexport interface IPaginationProps extends IBaseProps {\n  /**\n   * @description 分页符背景色\n   * @default '#ddd'\n   */\n  fillColor: string;\n  /**\n   * @description 分页符颜色\n   * @default '#1677ff'\n   */\n  frontColor: string;\n}\n\nexport const PaginationDefaultProps: Partial<IPaginationProps> = {\n  fillColor: '',\n  frontColor: '',\n};\n"
  },
  {
    "path": "src/Pagination/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n@pagination-area-background-color: var(\n  --pagination-area-background-color,\n  @COLOR_GREY_CARD\n);\n\n@pagination-move-background-color: var(\n  --pagination-move-background-color,\n  @COLOR_BRAND1\n);\n"
  },
  {
    "path": "src/Picker/CascaderPicker/index.axml",
    "content": "<ant-picker\n  className=\"ant-cascader-picker {{ className || '' }}\"\n  style=\"{{ style }}\"\n  animationType=\"{{ animationType }}\"\n  popClassName=\"ant-cascader-picker-popup {{ popClassName || '' }}\"\n  popStyle=\"{{ popStyle }}\"\n  visible=\"{{ visible }}\"\n  options=\"{{ columns }}\"\n  value=\"{{ currentValue }}\"\n  disabled=\"{{ disabled }}\"\n  readonly=\"{{ readonly }}\"\n  title=\"{{ title }}\"\n  placeholder=\"{{ placeholder }}\"\n  okText=\"{{  okText }}\"\n  cancelText=\"{{ cancelText }}\"\n  maskStyle=\"{{ maskStyle }}\"\n  maskClassName=\"{{ maskClassName }}\"\n  indicatorStyle=\"{{ indicatorStyle }}\"\n  indicatorClassName=\"{{ indicatorClassName }}\"\n  onChange=\"onChange\"\n  onCancel=\"onCancel\"\n  onOk=\"onOk\"\n  formattedValueText=\"{{ formattedValueText }}\"\n  onVisibleChange=\"onVisibleChange\"\n  maskClosable=\"{{ maskClosable }}\"\n>\n  <slot name=\"content\" slot=\"content\" />\n  <slot name=\"title\" slot=\"title\" />\n  <slot name=\"prefix\" slot=\"prefix\" />\n  <slot name=\"suffix\" slot=\"suffix\" />\n</ant-picker>\n"
  },
  {
    "path": "src/Picker/CascaderPicker/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-picker\": \"../index\"\n  }\n}\n"
  },
  {
    "path": "src/Picker/CascaderPicker/index.less",
    "content": ""
  },
  {
    "path": "src/Picker/CascaderPicker/index.ts",
    "content": "import equal from 'fast-deep-equal';\nimport mixinValue from '../../mixins/value';\nimport { resolveEventValue, resolveEventValues } from '../../_util/platform';\nimport {\n  Component,\n  getValueFromProps,\n  triggerEvent,\n  triggerEventOnly,\n  triggerEventValues,\n} from '../../_util/simply';\nimport { CascaderDefaultProps } from './props';\n\nComponent({\n  props: CascaderDefaultProps,\n  data: {\n    currentValue: [], // 当前picker选中值，didmount、弹窗打开、picker变化时更新\n    columns: [], // 可选项，didmound、弹窗打开、picker变化时更新\n    formattedValueText: '',\n    visible: false,\n  },\n  methods: {\n    // visible受控判断\n    isVisibleControlled() {\n      /// #if ALIPAY\n      return 'visible' in getValueFromProps(this);\n      /// #endif\n      /// #if WECHAT\n      return getValueFromProps(this, 'visible') !== null;\n      /// #endif\n    },\n    initColumns() {\n      const [options, visible, defaultVisible, value, defaultValue] =\n        getValueFromProps(this, [\n          'options',\n          'visible',\n          'defaultVisible',\n          'value',\n          'defaultValue',\n        ]);\n\n      const realValue = value || defaultValue || [];\n      const columns = this.getterColumns(realValue, options);\n\n      // 首次无需校验value有效性，onOk时会校验\n      this.setData({\n        columns,\n        visible: this.isVisibleControlled() ? visible : defaultVisible,\n        currentValue: realValue,\n        formattedValueText: this.onFormat(),\n      });\n    },\n    getterColumns(value, options) {\n      const getColumns = (options, value, columns = []) => {\n        columns.push(options.map((v) => ({ value: v.value, label: v.label })));\n        const currentOption =\n          options.find((v) => v.value === value?.[columns.length - 1]) ||\n          options[0];\n        if (currentOption?.children?.length > 0) {\n          return getColumns(currentOption.children, value, columns);\n        }\n        return columns;\n      };\n      return getColumns(options, value);\n    },\n    // 获取有效value，若从x项开始在columns里找不到，则从此项开始都选第一条\n    getValidValue(value, columns) {\n      const result = [];\n      for (let i = 0; i < columns.length; i++) {\n        if (!columns[i].some((v) => v?.value === value?.[i])) {\n          result.push(...columns.slice(i).map((v) => v?.[0]?.value));\n          break;\n        } else {\n          result[i] = value[i];\n        }\n      }\n      return result;\n    },\n    getOptionByValue(value) {\n      const options = getValueFromProps(this, 'options');\n      if (!(value?.length > 0)) return null;\n      const result = [];\n      let item = options.find((v) => v.value === value[0]);\n      for (let i = 0; i < value.length; i++) {\n        if (!item) {\n          return null;\n        }\n        result.push({\n          value: item.value,\n          label: item.label,\n        });\n        item = item.children?.find((v) => v.value === value[i + 1]);\n      }\n      return result;\n    },\n    onChange(selectedVal) {\n      let [selectedValue] = resolveEventValues(selectedVal);\n      const options = getValueFromProps(this, 'options');\n      const { columns } = this.data;\n      const newColumns = this.getterColumns(selectedValue, options);\n      // columns没变化说明selectedValue在范围内，无需重置\n      const newData: any = {};\n      if (!equal(columns, newColumns)) {\n        selectedValue = this.getValidValue(selectedValue, newColumns);\n        newData.columns = newColumns;\n      }\n      newData.currentValue = selectedValue;\n      this.setData(newData);\n      triggerEventValues(this, 'change', [\n        selectedValue,\n        this.getOptionByValue(selectedValue),\n      ]);\n    },\n    async onOk() {\n      const { currentValue } = this.data;\n      const options = getValueFromProps(this, 'options');\n      const newColumns = this.getterColumns(currentValue, options);\n      const validValue = this.getValidValue(currentValue, newColumns);\n      if (!this.isControlled()) {\n        this.update(validValue);\n      }\n      triggerEventValues(this, 'ok', [\n        validValue,\n        this.getOptionByValue(validValue),\n      ]);\n    },\n    onVisibleChange(visible) {\n      const options = getValueFromProps(this, 'options');\n      const { columns } = this.data;\n      const realValue = this.getValue();\n      if (!this.isVisibleControlled() && visible) {\n        const newColumns = this.getterColumns(realValue, options);\n\n        if (!equal(columns, newColumns)) {\n          this.setData({ columns: newColumns }, () => {\n            this.setData({\n              currentValue: this.getValidValue(realValue, newColumns),\n              formattedValueText: this.onFormat(),\n            });\n          });\n        }\n      }\n      triggerEvent(this, 'visibleChange', resolveEventValue(visible));\n    },\n    defaultFormat(value, options) {\n      if (options) {\n        return options.map((v) => v.label).join('');\n      }\n      return '';\n    },\n    onFormat() {\n      const realValue = this.getValue();\n      const onFormat = getValueFromProps(this, 'onFormat');\n      const formatValueByProps =\n        onFormat && onFormat(realValue, this.getOptionByValue(realValue));\n      if (formatValueByProps !== undefined && formatValueByProps !== null) {\n        return formatValueByProps;\n      }\n      return this.defaultFormat(realValue, this.getOptionByValue(realValue));\n    },\n\n    onCancel(e) {\n      triggerEventOnly(this, 'cancel', e);\n    },\n  },\n\n  mixins: [mixinValue()],\n\n  /// #if ALIPAY\n  onInit() {\n    this.initColumns();\n  },\n  didUpdate(prevProps, prevData) {\n    const options = getValueFromProps(this, 'options');\n    if (!equal(options, prevProps.options)) {\n      const { currentValue } = this.data;\n      const newColumns = this.getterColumns(currentValue, options);\n      this.setData({\n        columns: newColumns,\n      });\n    }\n    if (!this.isEqualValue(prevData)) {\n      const realValue = this.getValue();\n      const newColumns = this.getterColumns(realValue, options);\n      const currentValue = this.getValidValue(realValue, newColumns);\n      this.setData({ currentValue, formattedValueText: this.onFormat() });\n    }\n    const visible = getValueFromProps(this, 'visible');\n    if (this.isVisibleControlled() && !equal(prevProps.visible, visible)) {\n      this.setData({ visible });\n    }\n  },\n  /// #endif\n  /// #if WECHAT\n  created() {\n    this.initColumns();\n  },\n  observers: {\n    '**': function (data) {\n      const prevData = this._prevData || this.data;\n      this._prevData = { ...data };\n      const options = getValueFromProps(this, 'options');\n      if (!equal(options, prevData.options)) {\n        const { currentValue } = this.data;\n        const newColumns = this.getterColumns(currentValue, options);\n        this.setData({\n          columns: newColumns,\n        });\n      }\n      if (!this.isEqualValue(prevData)) {\n        const realValue = this.getValue();\n        const newColumns = this.getterColumns(realValue, options);\n        const currentValue = this.getValidValue(realValue, newColumns);\n        this.setData({ currentValue, formattedValueText: this.onFormat() });\n      }\n    },\n    'visible': function (data) {\n      const prevVisible = this._prevVisible;\n      this._prevVisible = data;\n      const visible = getValueFromProps(this, 'visible');\n      if (this.isVisibleControlled() && !equal(prevVisible, visible)) {\n        this.setData({ visible });\n      }\n    },\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/Picker/CascaderPicker/props.ts",
    "content": "import { IBaseProps } from '../../_util/base';\n\nexport interface ICascaderOption {\n  label: string;\n  value: any;\n  children?: ICascaderOption[];\n}\n\n/**\n * @description 级联组件，基于Picker封装\n */\nexport interface ICascaderProps extends IBaseProps {\n  visible?: boolean;\n  defaultVisible?: boolean;\n  /**\n   * @desciption  动画类型\n   * @default \"transform\"\n   */\n  animationType: 'transform' | 'position';\n  /**\n   * @description 当前数据\n   */\n  value: any[];\n  /**\n   * @description 默认值\n   */\n  defaultValue: any[];\n  /**\n   * @description 可选项数据\n   */\n  options: ICascaderOption[];\n  /**\n   * @description 提示文案\n   * @default '请选择'\n   */\n  placeholder: string;\n  /**\n   * @description 取消文案\n   * @default \"取消\"\n   */\n  cancelText: string;\n  /**\n   * @description 是否禁用\n   */\n  disabled?: boolean;\n  /**\n   * @description 是否只读\n   */\n  readonly?: boolean;\n  /**\n   * @description 标题\n   */\n  title: string;\n  /**\n   * @description 确定按钮文案\n   * @default \"确定\"\n   */\n  okText: string;\n\n  /**\n   *@description 选中框样式\n   * 版本要求： 支付宝小程序基础库 1.10.0 及以上\n   */\n  indicatorStyle?: string;\n\n  /**\n   *@description 选中框类名\n   * 版本要求： 支付宝小程序基础库 1.10.0 及以上\n   */\n  indicatorClassName?: string;\n\n  /**\n   * @description 蒙层的样式。\n   * 版本要求： 支付宝小程序基础库 1.10.0 及以上\n   */\n  maskStyle?: string;\n\n  /**\n   * @description 蒙层的类名。\n   * 版本要求： 支付宝小程序基础库 1.10.0 及以上\n   */\n  maskClassName?: string;\n\n  /**\n   * @description 点击确认回调\n   */\n  onOk?: (\n    value: any[],\n    selectedOptions: ICascaderOption[],\n    e: Record<string, any>\n  ) => void;\n  /**\n   * @description 点击取消回调\n   */\n  onCancel?: (e: Record<string, any>) => void;\n  /**\n   * @description 选中值的文本显示格式\n   */\n  onFormat?: (value: any[], selectedOptions: ICascaderOption[]) => string;\n  /**\n   * @description 切换显示隐藏\n   */\n  onVisibleChange?: (visible: boolean, e: Record<string, any>) => void;\n  /**\n   * @description 发生滚动即触发， 与 onChange 点击 ok 后触发不同\n   */\n  onChange?: (\n    value: any[],\n    selectedOptions: ICascaderOption[],\n    e: Record<string, any>\n  ) => void;\n  /**\n   * @description 点击蒙层是否可以关闭\n   * @default false\n   */\n  maskClosable: boolean;\n  /**\n   * @description 弹出框类名\n   */\n  popClassName: string;\n  /**\n   * @description 弹出框样式\n   */\n  popStyle: string;\n}\n\nexport const CascaderDefaultProps: Partial<ICascaderProps> = {\n  visible: null,\n  defaultVisible: null,\n  animationType: 'transform',\n  value: null,\n  defaultValue: null,\n  options: [],\n  placeholder: '请选择',\n  cancelText: '取消',\n  disabled: false,\n  readonly: false,\n  title: '',\n  okText: '确定',\n  maskClosable: true,\n  popClassName: '',\n  popStyle: '',\n  onFormat: null,\n};\n"
  },
  {
    "path": "src/Picker/CascaderPicker/utils.ts",
    "content": "export function defaultFormat(value, options) {\n  if (options) {\n    return options.map((v) => v.label).join('');\n  }\n  return '';\n}\n\nexport function getterColumns(value, options = []) {\n  const getColumns = (options, value, columns = []) => {\n    columns.push(options.map((v) => ({ value: v.value, label: v.label })));\n    const currentOption =\n      options.find((v) => v.value === value?.[columns.length - 1]) ||\n      options[0];\n    if (currentOption?.children?.length > 0) {\n      return getColumns(currentOption.children, value, columns);\n    }\n    return columns;\n  };\n  return getColumns(options, value);\n}\n\nexport function getValidValue(value, columns) {\n  const result = [];\n  for (let i = 0; i < columns.length; i++) {\n    if (!columns[i].some((v) => v.value === value?.[i])) {\n      result.push(...columns.slice(i).map((v) => v[0]?.value));\n      break;\n    } else {\n      result[i] = value[i];\n    }\n  }\n  return result;\n}\n"
  },
  {
    "path": "src/Picker/index.axml",
    "content": "<import-sjs from=\"./index.sjs\" name=\"_sjs\" />\n<import-sjs from=\"../_util/isPropsEmpty.sjs\" name=\"u\" />\n\n<view\n  class=\"ant-picker {{ disabled ? 'ant-picker-disabled' : '' }} {{ readonly ? 'ant-picker-readonly' : '' }} {{ className || '' }}\"\n  style=\"{{ style || '' }}\"\n  onTap=\"onOpen\"\n>\n  <slot name=\"prefix\" value=\"{{formatValue}}\" />\n  <view class=\"ant-picker-value\">\n    <!-- #if ALIPAY -->\n    <slot name=\"content\" value=\"{{formatValue}}\">\n      <!-- #endif -->\n      <view a:if=\"{{ formatValue }}\" class=\"ant-picker-value-text\">\n        {{ formatValue }}\n      </view>\n      <block a:else>\n        <view class=\"ant-picker-value-placeholder\">\n          {{ u.isPropsEmpty(placeholder) ? locale.global.placeholder : placeholder }}\n        </view>\n      </block>\n      <!-- #if ALIPAY -->\n    </slot>\n    <!-- #endif -->\n  </view>\n  <slot name=\"suffix\" value=\"{{formatValue}}\" />\n</view>\n<ant-popup\n  className=\"ant-picker-popup {{ popClassName || '' }}\"\n  style=\"{{ popStyle || '' }}\"\n  position=\"bottom\"\n  animationType=\"{{ animationType }}\"\n  destroyOnClose\n  onClose=\"onMaskDismiss\"\n  visible=\"{{ visible }}\"\n>\n  <view class=\"ant-picker-header\">\n    <view\n      class=\"ant-picker-header-item ant-picker-header-cancel\"\n      hover-class=\"ant-picker-header-item-hover\"\n      hover-start-time=\"20\"\n      hover-stay-time=\"50\"\n      onTap=\"onCancel\"\n    >\n      {{ u.isPropsEmpty(cancelText)  ? locale.global.cancelText : cancelText }}\n    </view>\n    <view class=\"ant-picker-header-item ant-picker-header-title\">\n      <!-- #if ALIPAY -->\n      <slot name=\"title\">{{ title }}</slot>\n      <!-- #endif -->\n      <!-- #if WECHAT -->\n      <view>{{title}}</view>\n      <!-- #endif -->\n    </view>\n    <view\n      class=\"ant-picker-header-item ant-picker-header-confirm\"\n      hover-class=\"ant-picker-header-item-hover\"\n      hover-start-time=\"20\"\n      hover-stay-time=\"50\"\n      onTap=\"onOk\"\n    >\n      {{u.isPropsEmpty(okText) ? locale.global.okText : okText }}\n    </view>\n  </view>\n  <view class=\"ant-picker-content\">\n    <slot name=\"content-header\" />\n    <block a:if=\"{{ columns.length > 0 }}\">\n      <picker-view\n        class=\"ant-picker-picker-view\"\n        mask-style=\"{{ maskStyle || '' }}\"\n        mask-class=\"{{ maskClassName || '' }}\"\n        indicator-style=\"{{ indicatorStyle || '' }}\"\n        indicator-class=\"{{ indicatorClassName || '' }}\"\n        value=\"{{ selectedIndex }}\"\n        onChange=\"onChange\"\n      >\n        <block a:for=\"{{ columns }}\" a:for-index=\"dataIndex\" a:for-item=\"dataRoot\">\n          <picker-view-column a:if=\"{{ dataIndex < options.length }}\" class=\"ant-picker-picker-view-column\">\n            <block a:for=\"{{ dataRoot }}\" a:for-index=\"index\" a:for-item=\"item\">\n              <view class=\"ant-picker-content-item\">\n                {{ _sjs.getPickerViewLabel(item) }}\n              </view>\n            </block>\n          </picker-view-column>\n        </block>\n      </picker-view>\n    </block>\n    <block a:else>\n      <picker-view class=\"ant-picker-picker-view\">\n        <picker-view-column class=\"ant-picker-picker-view-column\">\n          <!-- display: inline -->\n          <text style=\"color: #ccc\">\n            {{ u.isPropsEmpty(emptyText) ? locale.global.emptyText : emptyText}}\n          </text>\n        </picker-view-column>\n      </picker-view>\n    </block>\n  </view>\n</ant-popup>\n"
  },
  {
    "path": "src/Picker/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Information Entry\n  order: 10\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Picker\n\nThe Picker selector displays a scrollable list of one or more collections of options, providing consistency between the iOS and Android-side experiences compared to native pickers.\n\n- One or more sets of association options are provided for selection by the user.\n- When there are less than 5 options, it is recommended to tile the options directly. Using Radio is a better choice.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-picker\": \"antd-mini/es/Picker/index\",\n  \"ant-cascader-picker\": \"antd-mini/es/Picker/CascaderPicker/index\"\n#endif\n#if WECHAT\n  \"ant-picker\": \"antd-mini/Picker/index\",\n  \"ant-cascader-picker\": \"antd-mini/Picker/CascaderPicker/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<ant-picker\n  placeholder=\"请选择\"\n  title=\"请选择\"\n  emptyText=\"暂无数据\"\n  defaultValue=\"{{defaultValue}}\"\n  options=\"{{list}}\"\n#if ALIPAY\n  onCancel=\"handleDismiss\"\n  onVisibleChange=\"handleTriggerPicker\"\n  onOk=\"handleOk\"\n  onChange=\"handleChange\"\n#endif\n#if WECHAT\n  bindcancel=\"handleDismiss\"\n  bindvisiblechange=\"handleTriggerPicker\"\n  bindok=\"handleOk\"\n  bindchange=\"handleChange\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    defaultValue: '上海',\n    list: ['北京', '上海', '深圳', '广州', '南京', '武汉', '无锡', '苏州'],\n  },\n  handleDismiss(e) {\n    console.log('onCancel', e);\n  },\n  handleTriggerPicker(visible, e) {\n    console.log('onVisibleChange', visible, e);\n  },\n  handleOk(value, column, e) {\n    console.log('onOk value', value, 'onOk  column', column, e);\n  },\n  handleChange(value, column, e) {\n    console.log('onChange value', value, 'onChange  column', column, e);\n  },\n});\n```\n\n### Format selected text\n\n> `onFormat` The function return value is the value of the selected area to be rendered.\n\n```xml\n<ant-picker\n#if ALIPAY\n  onFormat=\"onFormat\"\n#endif\n#if WECHAT\n  onFormat=\"{{onFormat}}\"\n#endif\n  />\n```\n\n```js\nPage({\n  data: {\n#if WECHAT\n    onFormat: (value) => {\n      return `已选择：${value}`;\n    },\n#endif\n  },\n#if ALIPAY\n  onFormat: (value) => {\n    return `已选择：${value}`;\n  },\n#endif\n})\n```\n\n### multi-column selection\n\n> When complex options appear, but do not need to link between options, you can achieve multi-column selection in the following ways:\n\n```xml\n<ant-picker\n  defaultValue=\"{{['Tues', 'pm']}}\"\n  options=\"{{columns}}\"\n#if ALIPAY\n  onFormat=\"formatTime\"\n#endif\n#if WECHAT\n  onFormat=\"{{formatTime}}\"\n  bindok=\"handleOk\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    columns: [\n      [\n        {\n          label: '周一',\n          value: 'Mon',\n        },\n        {\n          label: '周二',\n          value: 'Tues',\n        },\n        {\n          label: '周三',\n          value: 'Wed',\n        },\n        {\n          label: '周四',\n          value: 'Thur',\n        },\n        {\n          label: '周五',\n          value: 'Fri',\n        },\n      ],\n      [\n        {\n          label: '上午',\n          value: 'am',\n        },\n        {\n          label: '下午',\n          value: 'pm',\n        },\n      ],\n    ],\n#if WECHAT\n    formatTime: (value) => {\n      return column.map((c) => c && c.label).join('，');\n    },\n#endif\n  },\n#if ALIPAY\n  formatTime: (value) => {\n    return column.map((c) => c && c.label).join('，');\n  }\n#endif\n})\n```\n\n### Controlled Mode\n\n> `value` property and `ok` Events, with the implementation of controlled mode.\n\n```xml\n <ant-picker\n  value=\"{{value}}\"\n  options=\"{{list}}\"\n#if ALIPAY\n  onOk=\"handleControlledOk\"\n#endif\n#if WECHAT\n  bindok=\"handleControlledOk\"\n#endif\n/>\n<ant-button onTap=\"handleChangeControlled\">Select Shenzhen</ant-button>\n<ant-button onTap=\"handleClearControlled\">Empty</ant-button>\n```\n\n```js\nPage({\n  data:{\n    value: '上海',\n    list: ['北京', '上海', '深圳', '广州', '南京', '武汉', '无锡', '苏州'],\n  },\n  handleControlledOk(value) {\n#if ALIPAY\n    this.setData({\n      value,\n    });\n#endif\n#if WECHAT\n    this.setData({\n      value: value.detail[0],\n    });\n#endif\n  },\n  handleClearControlled() {\n    this.setData({\n      value: '',\n    });\n  },\n  handleChangeControlled() {\n    this.setData({\n      value: '深圳',\n    });\n  },\n})\n```\n\n### Cascading Picker\n\n> When more complex options appear, the need for linkage between options requires the introduction `ant-cascader-picker` Cascade selection components to achieve. The component implements the cascading function by passing in the following tree structure:\n\n```xml\n<ant-cascader-picker\n  options=\"{{cityList}}\"\n/>\n```\n\n```js\nPage({\n  data: {\n    cityList: [\n      {\n        label: '北京',\n        value: '11',\n        children: [\n          {\n            label: '北京',\n            value: '110',\n          },\n        ],\n      },\n      {\n        label: '河北',\n        value: '18',\n        children: [\n          {\n            label: '石家庄',\n            value: '188',\n          },\n          {\n            label: '唐山',\n            value: '181',\n          },\n        ],\n      },\n    ],\n  },\n});\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Picker/index'></code>\n\n## API\n\n### Picker\n\n| Property                         | Description                                                                                                                                                                        | Type                                                                                                                                                                           | Default Value      |\n| ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------- |\n| animationType                | Animation type, optional`transform` `position`, the default is used`transform`Animation performance is better. Due to a bug in the basic library of small programs, the picker-view shadow style in the pop-up window may have style problems under iOS and can be temporarily switched`position`Solve | string                                                                                                                                                                         | `transform` |\n| className                    | Class Name                                                                                                                                                                        | string                                                                                                                                                                         | -           |\n| defaultValue                 | Default Value                                                                                                                                                                      | string \\| number \\| Array\\<string \\| number\\>                                                                                                                                  | -           |\n| disabled                     | Disable                                                                                                                                                                    | boolean                                                                                                                                                                        | false       |\n| readonly                     | Read-only                                                                                                                                                                    | boolean                                                                                                                                                                        | false       |\n| cancelText                   | Cancel Copy                                                                                                                                                                    | string                                                                                                                                                                         | 'Cancel'      |\n| content                      | Custom Content Slots                                                                                                                                                              | slot                                                                                                                                                                           | -           |\n| indicatorStyle               | Check Box Style                                                                                                                                                                  | string                                                                                                                                                                         | -           |\n| indicatorClassName           | Class name of the check box                                                                                                                                                                | string                                                                                                                                                                         | -           |\n| maskClassName                | Class name of the layer                                                                                                                                                                  | string                                                                                                                                                                         | -           |\n| maskClosable                 | Click whether the layer can be closed                                                                                                                                                        | boolean                                                                                                                                                                        | true        |\n| maskStyle                    | Mask Style                                                                                                                                                                  | string                                                                                                                                                                         | -           |\n| okText                       | Confirm Button Copy                                                                                                                                                                | string                                                                                                                                                                         | 'OK'      |\n| emptyText                    | Empty status button copy                                                                                                                                                              | string                                                                                                                                                                         | 'No data'  |\n| options                      | picker data, configure options for each column                                                                                                                                               | [PickerColumnItem](#pickercolumnitem)[]                                                                                                                                        | []          |\n| placeholder                  | Prompt Copy                                                                                                                                                                    | string                                                                                                                                                                         | 'Please Select'    |\n| popClassName                 | Popup box class name                                                                                                                                                                  | string                                                                                                                                                                         | -           |\n| popStyle                     | Pop-up Style                                                                                                                                                                  | string                                                                                                                                                                         | -           |\n| prefix                       | Prefix                                                                                                                                                                        | slot                                                                                                                                                                           | -           |\n| style                        | Style                                                                                                                                                                        | string                                                                                                                                                                         | -           |\n| suffix                       | Suffix                                                                                                                                                                        | slot                                                                                                                                                                           | -           |\n| title                        | Pop-up Title                                                                                                                                                                  | string \\| slot                                                                                                                                                                 | -           |\n| value                        | Selected value                                                                                                                                                                    | string \\| number \\| Array\\<string \\| number\\>                                                                                                                                  | -           |\n| visible                      | Display                                                                                                                                                                    | boolean                                                                                                                                                                        | false       |\n| defaultVisible               | Display by default                                                                                                                                                                | boolean                                                                                                                                                                        | false       |\n| onFormat                     | Text display format of the selected value                                                                                                                                                        | (value: [PickerColumnItem](#pickercolumnitem), column: [PickerColumnItem](#pickercolumnitem)) => string                                                                        | -           |\n| #if ALIPAY onOk              | Click the OK button to trigger the callback                                                                                                                                                      | (value: [PickerColumnItem](#pickercolumnitem), column: [PickerColumnItem](#pickercolumnitem), event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -           |\n| #if ALIPAY onCancel          | Click the cancel button/layer to trigger the callback                                                                                                                                                 | (event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                                                              | -           |\n| #if ALIPAY onChange          | The selected item changes, triggering a callback                                                                                                                                                    | (value: [PickerColumnItem](#pickercolumnitem), column: [PickerColumnItem](#pickercolumnitem), event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -           |\n| #if ALIPAY onVisibleChange   | Pop-up display/hide status change trigger                                                                                                                                                 | (visible: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                                            | -           |\n| #if WECHAT bindok            | Click the OK button to trigger the callback                                                                                                                                                      | (value: [PickerColumnItem](#pickercolumnitem), column: [PickerColumnItem](#pickercolumnitem), event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -           |\n| #if WECHAT bindcancel        | Click the cancel button/layer to trigger the callback                                                                                                                                                 | (event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                                                              | -           |\n| #if WECHAT bindchange        | The selected item changes, triggering a callback                                                                                                                                                    | (value: [PickerColumnItem](#pickercolumnitem), column: [PickerColumnItem](#pickercolumnitem), event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -           |\n| #if WECHAT bindvisiblechange | Pop-up display/hide status change trigger                                                                                                                                                 | (visible: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                                            | -           |\n\n### CascaderPicker\n\n| Property                         | Description                                                                                                                                                                        | Type                                                                                                                                                     | Default Value       |\n| ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ |\n| animationType                | Animation type, optional`transform` `position`, the default is used`transform`Animation performance is better. Due to a bug in the basic library of small programs, the picker-view shadow style in the pop-up window may have style problems under iOS and can be temporarily switched`position`Solve | string                                                                                                                                                   | `transform`  |\n| className                    | Class Name                                                                                                                                                                        | string                                                                                                                                                   | -            |\n| defaultValue                 | Default selected value                                                                                                                                                                | string[]                                                                                                                                                 | -            |\n| disabled                     | Disable                                                                                                                                                                    | boolean                                                                                                                                                  | false        |\n| readonly                     | Read-only                                                                                                                                                                    | boolean                                                                                                                                                  | false        |\n| cancelText                   | Cancel Copy                                                                                                                                                                    | string                                                                                                                                                   | 'Cancel'       |\n| content                      | Custom Content Slots                                                                                                                                                              | slot                                                                                                                                                     | -            |\n| format                       | Time format display, the format is the same[dayjs](https://day.js.org/docs/zh-CN/display/format)                                                                                                 | string                                                                                                                                                   | 'YYYY/MM/DD' |\n| indicatorStyle               | Check Box Style                                                                                                                                                                  | string                                                                                                                                                   | -            |\n| indicatorClassName           | Class name of the check box                                                                                                                                                                | string                                                                                                                                                   | -            |\n| maskClassName                | Class name of the layer                                                                                                                                                                  | string                                                                                                                                                   | -            |\n| maskClosable                 | Click whether the layer can be closed                                                                                                                                                        | boolean                                                                                                                                                  | true         |\n| maskStyle                    | Mask Style                                                                                                                                                                  | string                                                                                                                                                   | -            |\n| okText                       | Confirm Button Copy                                                                                                                                                                | string                                                                                                                                                   | 'OK'       |\n| options                      | Optional data                                                                                                                                                                    | [CascaderOption](#cascaderoption)[]                                                                                                                      | []           |\n| placeholder                  | Prompt Copy                                                                                                                                                                    | string                                                                                                                                                   | 'Please Select'     |\n| popClassName                 | Popup box class name                                                                                                                                                                  | string                                                                                                                                                   | -            |\n| popStyle                     | Pop-up Style                                                                                                                                                                  | string                                                                                                                                                   | -            |\n| prefix                       | Prefix                                                                                                                                                                        | slot                                                                                                                                                     | -            |\n| style                        | Style                                                                                                                                                                        | string                                                                                                                                                   | -            |\n| suffix                       | Suffix                                                                                                                                                                        | slot                                                                                                                                                     | -            |\n| title                        | Pop-up Title                                                                                                                                                                  | string \\| slot                                                                                                                                           | -            |\n| value                        | Selected value                                                                                                                                                                    | string[]                                                                                                                                                 | -            |\n| visible                      | Display                                                                                                                                                                    | boolean                                                                                                                                                  | false        |\n| defaultVisible               | Display by default                                                                                                                                                                | boolean                                                                                                                                                  | false        |\n| onFormat                     | The text display format of the selected value. The default display is labels.join('').                                                                                                                              | (value: string[], selectedOptions: [CascaderOption](#cascaderoption)[]) => string                                                                        | -            |\n| #if ALIPAY onOk              | Click the OK button to trigger the callback                                                                                                                                                      | (value: string[], selectedOptions: [CascaderOption](#cascaderoption)[], event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -            |\n| #if ALIPAY onCancel          | Click the cancel button/layer to trigger the callback                                                                                                                                                 | (event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                                        | -            |\n| #if ALIPAY onChange          | The selected item changes, triggering a callback                                                                                                                                                    | (value: string[], selectedOptions: [CascaderOption](#cascaderoption)[], event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -            |\n| #if ALIPAY onVisibleChange   | Pop-up display/hide status change trigger                                                                                                                                                 | (visible: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                      | -            |\n| #if WECHAT bindok            | Click the OK button to trigger the callback                                                                                                                                                      | (value: string[], selectedOptions: [CascaderOption](#cascaderoption)[], event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -            |\n| #if WECHAT bindcancel        | Click the cancel button/layer to trigger the callback                                                                                                                                                 | (event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                                        | -            |\n| #if WECHAT bindchange        | The selected item changes, triggering a callback                                                                                                                                                    | (value: string[], selectedOptions: [CascaderOption](#cascaderoption)[], event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -            |\n| #if WECHAT bindvisibleChange | Pop-up display/hide status change trigger                                                                                                                                                 | (visible: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                      | -            |\n\n### PickerColumnItem\n\n| Parameters  | Description | Type             | Default Value |\n| ----- | ---- | ---------------- | ------ |\n| label | Text | string           | -      |\n| value | Value   | string \\| number | -      |\n\n### CascaderOption\n\n| Parameters     | Description | Type             | Default Value |\n| -------- | ---- | ---------------- | ------ |\n| label    | Text | string           | -      |\n| value    | Value   | string \\| number | -      |\n| children | Sub Level | CascaderOption[] | -      |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                            | Light Mode Default                                                                                                                        | Dark Mode Default                                                                                                                        | Remarks                          |\n| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- |\n| --picker-item-color               | <div style=\"width: 150px; height: 40px; background-color: #333333; color: #ffffff;\">#333333</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div>                                     | Selector item color                  |\n| --picker-header-action-color      | <div style=\"width: 150px; height: 40px; background-color: #1677ff; color: #ffffff;\">#1677ff</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #3086ff; color: #ffffff;\">#3086ff</div>                                     | Selector Head Operation Color            |\n| --picker-placeholder-color        | <div style=\"width: 150px; height: 40px; background-color: #cccccc; color: #333333;\">#cccccc</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #474747; color: #ffffff;\">#474747</div>                                     | Selector Placeholder Color              |\n| --picker-header-color             | <div style=\"width: 150px; height: 40px; background-color: #eeeeee; color: #333333;\">#eeeeee</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #2b2b2b; color: #ffffff;\">#2b2b2b</div>                                     | Selector head color                |\n| --picker-content-background-color | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #333333;\">#ffffff</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div>                                     | Selector Content Background Color            |\n| --picker-mask-bg-faded-95         | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0.05); color: #000000;\">rgba(255, 255, 255, 0.05)</div> | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0.05); color: #000000;\">rgba(255, 255, 255, 0.02)</div> | Selector mask background color (95% transparency) |\n| --picker-mask-bg-faded-60         | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0.4); color: #000000;\">rgba(255, 255, 255, 0.4)</div>   | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0.4); color: #000000;\">rgba(255, 255, 255, 0.01)</div>  | Selector mask background color (60% transparency) |\n\n## FAQ\n\n### Exhibit exception when dynamically changing the number of picker columns\n\nDue to the limitation of native picker-view, dynamic change of the number of columns is not supported for the time being.\n"
  },
  {
    "path": "src/Picker/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-popup\": \"../Popup/index\"\n  }\n}\n"
  },
  {
    "path": "src/Picker/index.less",
    "content": "@import (reference) './variable.less';\n@import '../style/mixins/hairline.less';\n\n@pickerPrefix: ant-picker;\n\n.@{pickerPrefix} {\n  display: inline-flex;\n  align-items: center;\n  color: @picker-item-color;\n  &-disabled {\n    color: @picker-placeholder-color;\n  }\n  &-header {\n    position: relative;\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    padding: @picker-header-padding;\n    box-sizing: border-box;\n    .hairline('bottom', @COLOR_BORDER);\n\n    &-item {\n      display: flex;\n      align-items: center;\n      height: 100%;\n      white-space: nowrap;\n      font-size: @picker-header-action-size;\n      color: @picker-header-action-color;\n      box-sizing: border-box;\n    }\n\n    &-title {\n      display: flex;\n      justify-content: center;\n      overflow: hidden;\n      -webkit-line-clamp: 1;\n      box-orient: vertical;\n      white-space: normal;\n      color: @picker-item-color;\n      width: @picker-header-title-width;\n    }\n  }\n\n  /// #if WECHAT\n  &-picker-view {\n    width: 100%;\n    height: @picker-view-height;\n  }\n\n  &-picker-view-column {\n    text-align: center;\n  }\n  /// #endif\n\n  &-content {\n    background: @picker-content-background-color;\n\n    .a-picker-view-picker-item {\n      color: @picker-item-color;\n    }\n    .a-picker-view-picker-indicator {\n      &::before,\n      &::after {\n        border-color: @picker-header-color;\n      }\n    }\n    .a-picker-view-picker-mask {\n      background-image: linear-gradient(\n          to bottom,\n          @picker-mask-bg-faded-95,\n          @picker-mask-bg-faded-60\n        ),\n        linear-gradient(\n          to top,\n          @picker-mask-bg-faded-95,\n          @picker-mask-bg-faded-60\n        );\n      will-change: transform;\n    }\n  }\n  &-value {\n    &-placeholder,\n    &-text {\n      &:not(:nth-child(1)) {\n        display: none;\n      }\n    }\n    &-placeholder {\n      color: @picker-placeholder-color;\n    }\n  }\n}\n"
  },
  {
    "path": "src/Picker/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 数据录入\n  order: 10\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Picker 选择器\n\nPicker 选择器显示一个或多个选项集合的可滚动列表，相比于原生 picker，实现了 iOS 与 Android 端体验的一致性。\n\n- 提供一组或多组关联选项供用户选择。\n- 当少于 5 个选项时，建议直接将选项平铺，使用 Radio 是更好的选择。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-picker\": \"antd-mini/es/Picker/index\",\n  \"ant-cascader-picker\": \"antd-mini/es/Picker/CascaderPicker/index\"\n#endif\n#if WECHAT\n  \"ant-picker\": \"antd-mini/Picker/index\",\n  \"ant-cascader-picker\": \"antd-mini/Picker/CascaderPicker/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-picker\n  placeholder=\"请选择\"\n  title=\"请选择\"\n  emptyText=\"暂无数据\"\n  defaultValue=\"{{defaultValue}}\"\n  options=\"{{list}}\"\n#if ALIPAY\n  onCancel=\"handleDismiss\"\n  onVisibleChange=\"handleTriggerPicker\"\n  onOk=\"handleOk\"\n  onChange=\"handleChange\"\n#endif\n#if WECHAT\n  bindcancel=\"handleDismiss\"\n  bindvisiblechange=\"handleTriggerPicker\"\n  bindok=\"handleOk\"\n  bindchange=\"handleChange\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    defaultValue: '上海',\n    list: ['北京', '上海', '深圳', '广州', '南京', '武汉', '无锡', '苏州'],\n  },\n  handleDismiss(e) {\n    console.log('onCancel', e);\n  },\n  handleTriggerPicker(visible, e) {\n    console.log('onVisibleChange', visible, e);\n  },\n  handleOk(value, column, e) {\n    console.log('onOk value', value, 'onOk  column', column, e);\n  },\n  handleChange(value, column, e) {\n    console.log('onChange value', value, 'onChange  column', column, e);\n  },\n});\n```\n\n### 格式化已选文本\n\n> `onFormat` 函数返回值则是已选区域需要渲染的值。\n\n```xml\n<ant-picker\n#if ALIPAY\n  onFormat=\"onFormat\"\n#endif\n#if WECHAT\n  onFormat=\"{{onFormat}}\"\n#endif\n  />\n```\n\n```js\nPage({\n  data: {\n#if WECHAT\n    onFormat: (value) => {\n      return `已选择：${value}`;\n    },\n#endif\n  },\n#if ALIPAY\n  onFormat: (value) => {\n    return `已选择：${value}`;\n  },\n#endif\n})\n```\n\n### 多列选择\n\n> 当出现复杂选项时，但又不需要选项之间联动，可以通过一下方式实现多列选择：\n\n```xml\n<ant-picker\n  defaultValue=\"{{['Tues', 'pm']}}\"\n  options=\"{{columns}}\"\n#if ALIPAY\n  onFormat=\"formatTime\"\n#endif\n#if WECHAT\n  onFormat=\"{{formatTime}}\"\n  bindok=\"handleOk\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    columns: [\n      [\n        {\n          label: '周一',\n          value: 'Mon',\n        },\n        {\n          label: '周二',\n          value: 'Tues',\n        },\n        {\n          label: '周三',\n          value: 'Wed',\n        },\n        {\n          label: '周四',\n          value: 'Thur',\n        },\n        {\n          label: '周五',\n          value: 'Fri',\n        },\n      ],\n      [\n        {\n          label: '上午',\n          value: 'am',\n        },\n        {\n          label: '下午',\n          value: 'pm',\n        },\n      ],\n    ],\n#if WECHAT\n    formatTime: (value) => {\n      return column.map((c) => c && c.label).join('，');\n    },\n#endif\n  },\n#if ALIPAY\n  formatTime: (value) => {\n    return column.map((c) => c && c.label).join('，');\n  }\n#endif\n})\n```\n\n### 受控模式\n\n> `value` 属性和 `ok` 事件，配合实现受控模式。\n\n```xml\n <ant-picker\n  value=\"{{value}}\"\n  options=\"{{list}}\"\n#if ALIPAY\n  onOk=\"handleControlledOk\"\n#endif\n#if WECHAT\n  bindok=\"handleControlledOk\"\n#endif\n/>\n<ant-button onTap=\"handleChangeControlled\">选择深圳</ant-button>\n<ant-button onTap=\"handleClearControlled\">清空</ant-button>\n```\n\n```js\nPage({\n  data:{\n    value: '上海',\n    list: ['北京', '上海', '深圳', '广州', '南京', '武汉', '无锡', '苏州'],\n  },\n  handleControlledOk(value) {\n#if ALIPAY\n    this.setData({\n      value,\n    });\n#endif\n#if WECHAT\n    this.setData({\n      value: value.detail[0],\n    });\n#endif\n  },\n  handleClearControlled() {\n    this.setData({\n      value: '',\n    });\n  },\n  handleChangeControlled() {\n    this.setData({\n      value: '深圳',\n    });\n  },\n})\n```\n\n### 级联 Picker\n\n> 当出现更复杂选项时，需要选项之间联动，就需要引入 `ant-cascader-picker` 级联选择组件来实现。该组件通过传入以下的树状结构来实现级联功能：\n\n```xml\n<ant-cascader-picker\n  options=\"{{cityList}}\"\n/>\n```\n\n```js\nPage({\n  data: {\n    cityList: [\n      {\n        label: '北京',\n        value: '11',\n        children: [\n          {\n            label: '北京',\n            value: '110',\n          },\n        ],\n      },\n      {\n        label: '河北',\n        value: '18',\n        children: [\n          {\n            label: '石家庄',\n            value: '188',\n          },\n          {\n            label: '唐山',\n            value: '181',\n          },\n        ],\n      },\n    ],\n  },\n});\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Picker/index'></code>\n\n## API\n\n### Picker\n\n| 属性                         | 说明                                                                                                                                                                        | 类型                                                                                                                                                                           | 默认值      |\n| ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------- |\n| animationType                | 动画类型，可选`transform` `position`，默认使用`transform`动画性能更好。由于小程序基础库 bug，弹窗内 picker-view 阴影样式在 iOS 下可能存在样式问题，可暂切换为`position`解决 | string                                                                                                                                                                         | `transform` |\n| className                    | 类名                                                                                                                                                                        | string                                                                                                                                                                         | -           |\n| defaultValue                 | 默认值                                                                                                                                                                      | string \\| number \\| Array\\<string \\| number\\>                                                                                                                                  | -           |\n| disabled                     | 是否禁用                                                                                                                                                                    | boolean                                                                                                                                                                        | false       |\n| readonly                     | 是否只读                                                                                                                                                                    | boolean                                                                                                                                                                        | false       |\n| cancelText                   | 取消文案                                                                                                                                                                    | string                                                                                                                                                                         | '取消'      |\n| content                      | 自定义内容插槽                                                                                                                                                              | slot                                                                                                                                                                           | -           |\n| indicatorStyle               | 选中框样式                                                                                                                                                                  | string                                                                                                                                                                         | -           |\n| indicatorClassName           | 选中框的类名                                                                                                                                                                | string                                                                                                                                                                         | -           |\n| maskClassName                | 蒙层的类名                                                                                                                                                                  | string                                                                                                                                                                         | -           |\n| maskClosable                 | 点击蒙层是否可以关闭                                                                                                                                                        | boolean                                                                                                                                                                        | true        |\n| maskStyle                    | 蒙层的样式                                                                                                                                                                  | string                                                                                                                                                                         | -           |\n| okText                       | 确认按钮文案                                                                                                                                                                | string                                                                                                                                                                         | '确定'      |\n| emptyText                    | 空状态按钮文案                                                                                                                                                              | string                                                                                                                                                                         | '暂无数据'  |\n| options                      | picker 数据，配置每一列的选项                                                                                                                                               | [PickerColumnItem](#pickercolumnitem)[]                                                                                                                                        | []          |\n| placeholder                  | 提示文案                                                                                                                                                                    | string                                                                                                                                                                         | '请选择'    |\n| popClassName                 | 弹出框类名                                                                                                                                                                  | string                                                                                                                                                                         | -           |\n| popStyle                     | 弹出框样式                                                                                                                                                                  | string                                                                                                                                                                         | -           |\n| prefix                       | 前缀                                                                                                                                                                        | slot                                                                                                                                                                           | -           |\n| style                        | 样式                                                                                                                                                                        | string                                                                                                                                                                         | -           |\n| suffix                       | 后缀                                                                                                                                                                        | slot                                                                                                                                                                           | -           |\n| title                        | 弹出框标题                                                                                                                                                                  | string \\| slot                                                                                                                                                                 | -           |\n| value                        | 选中的值                                                                                                                                                                    | string \\| number \\| Array\\<string \\| number\\>                                                                                                                                  | -           |\n| visible                      | 是否显示                                                                                                                                                                    | boolean                                                                                                                                                                        | false       |\n| defaultVisible               | 默认是否显示                                                                                                                                                                | boolean                                                                                                                                                                        | false       |\n| onFormat                     | 选中值的文本显示格式                                                                                                                                                        | (value: [PickerColumnItem](#pickercolumnitem), column: [PickerColumnItem](#pickercolumnitem)) => string                                                                        | -           |\n| #if ALIPAY onOk              | 点击确定按钮，触发回调                                                                                                                                                      | (value: [PickerColumnItem](#pickercolumnitem), column: [PickerColumnItem](#pickercolumnitem), event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -           |\n| #if ALIPAY onCancel          | 点击取消按钮/蒙层，触发回调                                                                                                                                                 | (event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                                                              | -           |\n| #if ALIPAY onChange          | 选中项发生变化，触发回调                                                                                                                                                    | (value: [PickerColumnItem](#pickercolumnitem), column: [PickerColumnItem](#pickercolumnitem), event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -           |\n| #if ALIPAY onVisibleChange   | 弹出框显示/隐藏状态变化触发                                                                                                                                                 | (visible: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                                            | -           |\n| #if WECHAT bindok            | 点击确定按钮，触发回调                                                                                                                                                      | (value: [PickerColumnItem](#pickercolumnitem), column: [PickerColumnItem](#pickercolumnitem), event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -           |\n| #if WECHAT bindcancel        | 点击取消按钮/蒙层，触发回调                                                                                                                                                 | (event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                                                              | -           |\n| #if WECHAT bindchange        | 选中项发生变化，触发回调                                                                                                                                                    | (value: [PickerColumnItem](#pickercolumnitem), column: [PickerColumnItem](#pickercolumnitem), event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -           |\n| #if WECHAT bindvisiblechange | 弹出框显示/隐藏状态变化触发                                                                                                                                                 | (visible: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                                            | -           |\n\n### CascaderPicker\n\n| 属性                         | 说明                                                                                                                                                                        | 类型                                                                                                                                                     | 默认值       |\n| ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ |\n| animationType                | 动画类型，可选`transform` `position`，默认使用`transform`动画性能更好。由于小程序基础库 bug，弹窗内 picker-view 阴影样式在 iOS 下可能存在样式问题，可暂切换为`position`解决 | string                                                                                                                                                   | `transform`  |\n| className                    | 类名                                                                                                                                                                        | string                                                                                                                                                   | -            |\n| defaultValue                 | 默认选中的值                                                                                                                                                                | string[]                                                                                                                                                 | -            |\n| disabled                     | 是否禁用                                                                                                                                                                    | boolean                                                                                                                                                  | false        |\n| readonly                     | 是否只读                                                                                                                                                                    | boolean                                                                                                                                                  | false        |\n| cancelText                   | 取消文案                                                                                                                                                                    | string                                                                                                                                                   | '取消'       |\n| content                      | 自定义内容插槽                                                                                                                                                              | slot                                                                                                                                                     | -            |\n| format                       | 时间格式化显示，格式同[dayjs](https://day.js.org/docs/zh-CN/display/format)                                                                                                 | string                                                                                                                                                   | 'YYYY/MM/DD' |\n| indicatorStyle               | 选中框样式                                                                                                                                                                  | string                                                                                                                                                   | -            |\n| indicatorClassName           | 选中框的类名                                                                                                                                                                | string                                                                                                                                                   | -            |\n| maskClassName                | 蒙层的类名                                                                                                                                                                  | string                                                                                                                                                   | -            |\n| maskClosable                 | 点击蒙层是否可以关闭                                                                                                                                                        | boolean                                                                                                                                                  | true         |\n| maskStyle                    | 蒙层的样式                                                                                                                                                                  | string                                                                                                                                                   | -            |\n| okText                       | 确认按钮文案                                                                                                                                                                | string                                                                                                                                                   | '确定'       |\n| options                      | 可选数据                                                                                                                                                                    | [CascaderOption](#cascaderoption)[]                                                                                                                      | []           |\n| placeholder                  | 提示文案                                                                                                                                                                    | string                                                                                                                                                   | '请选择'     |\n| popClassName                 | 弹出框类名                                                                                                                                                                  | string                                                                                                                                                   | -            |\n| popStyle                     | 弹出框样式                                                                                                                                                                  | string                                                                                                                                                   | -            |\n| prefix                       | 前缀                                                                                                                                                                        | slot                                                                                                                                                     | -            |\n| style                        | 样式                                                                                                                                                                        | string                                                                                                                                                   | -            |\n| suffix                       | 后缀                                                                                                                                                                        | slot                                                                                                                                                     | -            |\n| title                        | 弹出框标题                                                                                                                                                                  | string \\| slot                                                                                                                                           | -            |\n| value                        | 选中的值                                                                                                                                                                    | string[]                                                                                                                                                 | -            |\n| visible                      | 是否显示                                                                                                                                                                    | boolean                                                                                                                                                  | false        |\n| defaultVisible               | 默认是否显示                                                                                                                                                                | boolean                                                                                                                                                  | false        |\n| onFormat                     | 选中值的文本显示格式，默认展示 labels.join('')                                                                                                                              | (value: string[], selectedOptions: [CascaderOption](#cascaderoption)[]) => string                                                                        | -            |\n| #if ALIPAY onOk              | 点击确定按钮，触发回调                                                                                                                                                      | (value: string[], selectedOptions: [CascaderOption](#cascaderoption)[], event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -            |\n| #if ALIPAY onCancel          | 点击取消按钮/蒙层，触发回调                                                                                                                                                 | (event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                                        | -            |\n| #if ALIPAY onChange          | 选中项发生变化，触发回调                                                                                                                                                    | (value: string[], selectedOptions: [CascaderOption](#cascaderoption)[], event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -            |\n| #if ALIPAY onVisibleChange   | 弹出框显示/隐藏状态变化触发                                                                                                                                                 | (visible: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                      | -            |\n| #if WECHAT bindok            | 点击确定按钮，触发回调                                                                                                                                                      | (value: string[], selectedOptions: [CascaderOption](#cascaderoption)[], event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -            |\n| #if WECHAT bindcancel        | 点击取消按钮/蒙层，触发回调                                                                                                                                                 | (event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                                        | -            |\n| #if WECHAT bindchange        | 选中项发生变化，触发回调                                                                                                                                                    | (value: string[], selectedOptions: [CascaderOption](#cascaderoption)[], event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -            |\n| #if WECHAT bindvisibleChange | 弹出框显示/隐藏状态变化触发                                                                                                                                                 | (visible: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                      | -            |\n\n### PickerColumnItem\n\n| 参数  | 说明 | 类型             | 默认值 |\n| ----- | ---- | ---------------- | ------ |\n| label | 文字 | string           | -      |\n| value | 值   | string \\| number | -      |\n\n### CascaderOption\n\n| 参数     | 说明 | 类型             | 默认值 |\n| -------- | ---- | ---------------- | ------ |\n| label    | 文字 | string           | -      |\n| value    | 值   | string \\| number | -      |\n| children | 子级 | CascaderOption[] | -      |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                            | 浅色模式默认值                                                                                                                        | 深色模式默认值                                                                                                                        | 备注                          |\n| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- |\n| --picker-item-color               | <div style=\"width: 150px; height: 40px; background-color: #333333; color: #ffffff;\">#333333</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div>                                     | 选择器项颜色                  |\n| --picker-header-action-color      | <div style=\"width: 150px; height: 40px; background-color: #1677ff; color: #ffffff;\">#1677ff</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #3086ff; color: #ffffff;\">#3086ff</div>                                     | 选择器头部操作颜色            |\n| --picker-placeholder-color        | <div style=\"width: 150px; height: 40px; background-color: #cccccc; color: #333333;\">#cccccc</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #474747; color: #ffffff;\">#474747</div>                                     | 选择器占位符颜色              |\n| --picker-header-color             | <div style=\"width: 150px; height: 40px; background-color: #eeeeee; color: #333333;\">#eeeeee</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #2b2b2b; color: #ffffff;\">#2b2b2b</div>                                     | 选择器头部颜色                |\n| --picker-content-background-color | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #333333;\">#ffffff</div>                                     | <div style=\"width: 150px; height: 40px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div>                                     | 选择器内容背景颜色            |\n| --picker-mask-bg-faded-95         | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0.05); color: #000000;\">rgba(255, 255, 255, 0.05)</div> | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0.05); color: #000000;\">rgba(255, 255, 255, 0.02)</div> | 选择器遮罩背景色（95%透明度） |\n| --picker-mask-bg-faded-60         | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0.4); color: #000000;\">rgba(255, 255, 255, 0.4)</div>   | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0.4); color: #000000;\">rgba(255, 255, 255, 0.01)</div>  | 选择器遮罩背景色（60%透明度） |\n\n## FAQ\n\n### 动态改变 picker 列数时展示异常\n\n由于原生 picker-view 的限制，暂不支持动态改变列数\n"
  },
  {
    "path": "src/Picker/index.sjs.ts",
    "content": "function getPickerViewLabel(item) {\n  if (typeof item === 'object' && typeof item.label === 'string') {\n    return item.label || '';\n  }\n  return item;\n}\n\nexport default {\n  getPickerViewLabel,\n};\n"
  },
  {
    "path": "src/Picker/index.ts",
    "content": "import { effect } from '@preact/signals-core';\nimport equal from 'fast-deep-equal';\nimport mixinValue from '../mixins/value';\nimport {\n  ComponentWithSignalStoreImpl,\n  getValueFromProps,\n  triggerEvent,\n  triggerEventOnly,\n  triggerEventValues,\n} from '../_util/simply';\nimport i18nController from '../_util/store';\nimport { assertAilpayNativeNotSupport } from '../_util/support';\nimport { PickerDefaultProps } from './props';\nimport {\n  getMatchedItemByIndex,\n  getMatchedItemByValue,\n  getStrictMatchedItemByValue,\n} from './utils';\n\nassertAilpayNativeNotSupport('Picker');\n\nComponentWithSignalStoreImpl({\n  storeOptions: {\n    store: () => i18nController,\n    updateHook: effect,\n    mapState: {\n      locale: ({ store }) => store.currentLocale.value,\n    },\n  },\n  props: PickerDefaultProps,\n  data: {\n    formatValue: '',\n    columns: [],\n    visible: false,\n    selectedIndex: [],\n    locale: {\n      locale: '23123',\n      global: {},\n    },\n  },\n  tempSelectedIndex: null,\n  single: false,\n  isChangingPickerView: false,\n  methods: {\n    // visible受控判断\n    isVisibleControlled() {\n      /// #if ALIPAY\n      return 'visible' in getValueFromProps(this);\n      /// #endif\n      /// #if WECHAT\n      return getValueFromProps(this, 'visible') !== null;\n      /// #endif\n    },\n    initData() {\n      const [options, visible, defaultVisible] = getValueFromProps(this, [\n        'options',\n        'visible',\n        'defaultVisible',\n      ]);\n      const columns = this.getterColumns(options);\n      this.setData(\n        {\n          columns,\n        },\n        () => {\n          const formatValue = this.getterFormatText();\n          const selectedIndex = this.getterSelectedIndex();\n          this.setData({\n            formatValue,\n            selectedIndex,\n            visible: this.isVisibleControlled() ? visible : defaultVisible,\n          });\n        }\n      );\n    },\n    getterColumns(options) {\n      let columns = [];\n      if (options.length > 0) {\n        if (options.every((item) => Array.isArray(item))) {\n          this.single = false;\n          columns = options.slice();\n        } else {\n          this.single = true;\n          columns = [options];\n        }\n      }\n      return columns;\n    },\n    defaultFormat(value, column) {\n      if (Array.isArray(column)) {\n        return column\n          .filter((c) => c !== undefined)\n          .map(function (c) {\n            if (typeof c === 'object') {\n              return c.label;\n            }\n            return c;\n          })\n          .join('-');\n      }\n      return (column && column.label) || column || '';\n    },\n    getterFormatText() {\n      const [onFormat, formattedValueText] = getValueFromProps(this, [\n        'onFormat',\n        'formattedValueText',\n      ]);\n      if (typeof formattedValueText === 'string') {\n        return formattedValueText;\n      }\n      const { columns } = this.data;\n      const realValue = this.getValue();\n      const { matchedColumn } = getStrictMatchedItemByValue(\n        columns,\n        realValue,\n        this.single\n      );\n      const formatValueByProps = onFormat && onFormat(realValue, matchedColumn);\n      if (formatValueByProps !== undefined && formatValueByProps !== null) {\n        return formatValueByProps;\n      }\n      return this.defaultFormat(realValue, matchedColumn);\n    },\n    getterSelectedIndex() {\n      const selectedIndex = [];\n      const columns = this.data.columns;\n      const realValue = this.getValue();\n      let value = realValue || [];\n      if (this.single) {\n        value = [realValue];\n      }\n      for (let i = 0; i < columns.length; i++) {\n        const column = columns[i];\n        const compareValue = value[i];\n        if (compareValue === undefined || compareValue === null) {\n          selectedIndex[i] = 0;\n        }\n        let index = column.findIndex((c) => {\n          return c === compareValue || c.value === compareValue;\n        });\n        if (index === -1) {\n          index = 0;\n        }\n        selectedIndex[i] = index;\n      }\n      return selectedIndex;\n    },\n\n    onOpen() {\n      const [disabled, readonly] = getValueFromProps(this, [\n        'disabled',\n        'readonly',\n      ]);\n      if (!disabled && !readonly) {\n        this.tempSelectedIndex = null;\n        const selectedIndex = this.getterSelectedIndex();\n        this.setData({\n          selectedIndex,\n        });\n        this.triggerPicker(true);\n      }\n    },\n\n    triggerPicker(visible) {\n      this.setData({\n        visible,\n      });\n      triggerEvent(this, 'visibleChange', visible);\n    },\n\n    onMaskDismiss() {\n      const maskClosable = getValueFromProps(this, 'maskClosable');\n      if (!maskClosable) {\n        return;\n      }\n      this.triggerPicker(false);\n      triggerEventOnly(this, 'cancel', { detail: { type: 'mask' } });\n    },\n\n    onCancel() {\n      this.triggerPicker(false);\n      triggerEventOnly(this, 'cancel', { detail: { type: 'cancel' } });\n    },\n\n    onChange(e) {\n      const { value: selectedIndex } = e.detail;\n      this.tempSelectedIndex = selectedIndex;\n      this.isChangingPickerView = true;\n      const { matchedColumn, matchedValues } = getMatchedItemByIndex(\n        this.data.columns,\n        this.tempSelectedIndex,\n        this.single\n      );\n      this.setData({\n        selectedIndex,\n      });\n      triggerEventValues(this, 'change', [matchedValues, matchedColumn], e);\n    },\n\n    async onOk() {\n      let result;\n      if (this.tempSelectedIndex) {\n        result = getMatchedItemByIndex(\n          this.data.columns,\n          this.tempSelectedIndex,\n          this.single\n        );\n      } else {\n        result = getMatchedItemByValue(\n          this.data.columns,\n          this.getValue(),\n          this.single\n        );\n      }\n      const { matchedColumn, matchedValues } = result;\n      this.triggerPicker(false);\n      if (!this.isControlled()) {\n        this.update(matchedValues);\n      }\n      triggerEventValues(this, 'ok', [matchedValues, matchedColumn]);\n    },\n  },\n\n  mixins: [\n    mixinValue({\n      transformValue(value) {\n        return {\n          needUpdate: true,\n          value: value === undefined ? [] : value,\n        };\n      },\n    }),\n  ],\n\n  /// #if ALIPAY\n  onInit() {\n    this.initData();\n  },\n  didUpdate(prevProps) {\n    const options = getValueFromProps(this, 'options');\n    if (!equal(options, prevProps.options)) {\n      const newColums = this.getterColumns(options);\n      this.setData(\n        {\n          columns: newColums,\n        },\n        () => {\n          // 如果是在滚动过程中columns发生变化，以onChange里抛出的selectedIndex为准\n          if (!this.isChangingPickerView) {\n            this.tempSelectedIndex = null;\n            const selectedIndex = this.getterSelectedIndex();\n            this.setData({\n              selectedIndex,\n            });\n          }\n        }\n      );\n    }\n    const value = getValueFromProps(this, 'value');\n    if (!equal(prevProps.value, value)) {\n      const selectedIndex = this.getterSelectedIndex();\n      this.tempSelectedIndex = null;\n      this.setData({\n        selectedIndex,\n      });\n    }\n    const visible = getValueFromProps(this, 'visible');\n    if (!equal(prevProps.visible, visible)) {\n      this.setData({ visible });\n    }\n    const formatValue = this.getterFormatText();\n    const formattedValueText = getValueFromProps(this, 'formattedValueText');\n    if (\n      formatValue !== this.data.formatValue ||\n      prevProps.formattedValueText !== formattedValueText\n    ) {\n      this.setData({\n        formatValue,\n      });\n    }\n    this.isChangingPickerView = false;\n  },\n  /// #endif\n  /// #if WECHAT\n  created() {\n    this.initData();\n  },\n  observers: {\n    'options': function () {\n      const options = getValueFromProps(this, 'options');\n      const newColums = this.getterColumns(options);\n      this.setData(\n        {\n          columns: newColums,\n        },\n        () => {\n          // 如果是在滚动过程中columns发生变化，以onChange里抛出的selectedIndex为准\n          if (!this.isChangingPickerView) {\n            this.tempSelectedIndex = null;\n            const selectedIndex = this.getterSelectedIndex();\n            this.setData({\n              selectedIndex,\n            });\n          }\n          this.isChangingPickerView = false;\n        }\n      );\n    },\n    'value': function () {\n      const selectedIndex = this.getterSelectedIndex();\n      this.tempSelectedIndex = null;\n      this.setData({\n        selectedIndex,\n      });\n    },\n    'visible': function () {\n      const visible = getValueFromProps(this, 'visible');\n      if (this.data.visible !== visible) {\n        this.setData({\n          visible,\n        });\n      }\n    },\n    'formattedValueText': function () {\n      const formattedValueText = getValueFromProps(this, 'formattedValueText');\n      this.setData({\n        formatValue: formattedValueText,\n      });\n    },\n    '**': function () {\n      const formatValue = this.getterFormatText();\n      if (formatValue !== this.data.formatValue) {\n        this.setData({\n          formatValue,\n        });\n      }\n    },\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/Picker/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\nexport interface PickerData {\n  value: PickerValue;\n  label: string;\n}\nexport declare type PickerValue =\n  | string\n  | number\n  | PickerData\n  | (string | number | PickerData)[];\n/**\n * @description 选择器，包括一个或多个不同值的可滚动列表，每个值可以在视图的中心以较暗的文本形式显示。当用户激活 **Picker** 后，将会从底部弹出。\n */\nexport interface IPickerProps extends IBaseProps {\n  visible?: boolean;\n  defaultVisible?: boolean;\n  /**\n   * @desciption  动画类型\n   * @default \"transform\"\n   */\n  animationType: 'transform' | 'position';\n  /**\n   * @description picker 数据\n   */\n  value: PickerValue;\n  /**\n   * @description 格式化后的 value 文本, 优先级大于 onFormat\n   */\n  formattedValueText?: string;\n  /**\n   * @description 默认picker 数据\n   */\n  defaultValue: PickerValue;\n  /**\n   * @description 是否禁用\n   */\n  disabled?: boolean;\n  /**\n   * @description 是否只读\n   */\n  readonly?: boolean;\n  /**\n   * @description 标题\n   */\n  title: string;\n  /**\n   * @description 确定按钮文案\n   * @default \"确定\"\n   */\n  okText: string;\n  /**\n   * @description 取消文案\n   * @default \"取消\"\n   */\n  cancelText: string;\n  /**\n   * @description 提示文案\n   * @default '请选择'\n   */\n  placeholder: string;\n  /**\n   * @description 空状态提示文案\n   * @default '暂无数据'\n   */\n  emptyText?: string;\n  /**\n   * @description picker 数据\n   */\n  options: PickerValue[];\n\n  /**\n   * @description 点击蒙层是否可以关闭\n   * @default false\n   */\n  maskClosable: boolean;\n  /**\n   * @description 弹出框类名\n   */\n  popClassName: string;\n  /**\n   * @description 弹出框样式\n   */\n  popStyle: string;\n  /**\n   *@description 选中框样式\n   * 版本要求： 支付宝小程序基础库 1.10.0 及以上\n   */\n  indicatorStyle?: string;\n\n  /**\n   *@description 选中框类名\n   * 版本要求： 支付宝小程序基础库 1.10.0 及以上\n   */\n  indicatorClassName?: string;\n\n  /**\n   * @description 蒙层的样式。\n   * 版本要求： 支付宝小程序基础库 1.10.0 及以上\n   */\n  maskStyle?: string;\n\n  /**\n   * @description 蒙层的类名。\n   * 版本要求： 支付宝小程序基础库 1.10.0 及以上\n   */\n  maskClassName?: string;\n  /**\n   * @description 点击确认回调\n   */\n  onOk?: (\n    value: PickerValue,\n    column: PickerData,\n    e: Record<string, any>\n  ) => void;\n  /**\n   * @description 点击取消回调\n   */\n  onCancel?: (e: Record<string, any>) => void;\n  /**\n   * @description 发生滚动即触发， 与 onChange 点击 ok 后触发不同\n   */\n  onChange?: (\n    value: PickerValue,\n    column: PickerData,\n    e: Record<string, any>\n  ) => void;\n  /**\n   * @description 选中值的文本显示格式\n   */\n  onFormat?: (value: PickerValue, column: PickerValue) => string;\n  /**\n   * @description 切换显示隐藏\n   */\n  onVisibleChange?: (visible: boolean, e: Record<string, any>) => void;\n}\n\nexport const PickerDefaultProps: Partial<IPickerProps> = {\n  formattedValueText: null,\n  visible: null,\n  defaultVisible: null,\n  animationType: 'transform',\n  value: null,\n  defaultValue: null,\n  disabled: false,\n  readonly: false,\n  title: '',\n  okText: null,\n  cancelText: null,\n  placeholder: null,\n  options: [],\n  popClassName: '',\n  popStyle: '',\n  maskClosable: true,\n  onFormat: null,\n  emptyText: null,\n};\n"
  },
  {
    "path": "src/Picker/utils.ts",
    "content": "function getColumnValue(columnItem) {\n  if (typeof columnItem === 'object') return columnItem.value;\n  return columnItem;\n}\n\nexport function getStrictMatchedItemByValue(columns, value, single) {\n  if (single) {\n    value = [value];\n  }\n  const matchedValues = [];\n  const matchedColumn = [];\n  let index = null;\n  for (let i = 0; i < columns.length; i++) {\n    const column = columns[i];\n    const compareValue = (value || [])[i];\n    index = column.findIndex((c) => {\n      const columnValue = getColumnValue(c);\n      return columnValue === compareValue;\n    });\n    matchedColumn[i] = column[index];\n    matchedValues[i] = getColumnValue(column[index]);\n  }\n  return {\n    matchedColumn: single ? matchedColumn?.[0] : matchedColumn,\n    matchedValues: single ? matchedValues?.[0] : matchedValues,\n  };\n}\n\n// 如果找不到value对应的item项目，返回第一项\nexport function getMatchedItemByValue(columns, value, single) {\n  if (single) {\n    value = [value];\n  }\n  const matchedValues = [];\n  const matchedColumn = [];\n  let index = null;\n  for (let i = 0; i < columns.length; i++) {\n    const column = columns[i];\n    const compareValue = (value || [])[i];\n    if (compareValue === undefined || compareValue === null) {\n      index = 0;\n    } else {\n      index = column.findIndex((c) => {\n        const columnValue = getColumnValue(c);\n        return columnValue === compareValue;\n      });\n      if (index === -1) {\n        index = 0;\n      } // 没有找到， 默认选择第一个\n    }\n    matchedColumn[i] = column[index];\n    matchedValues[i] = getColumnValue(column[index]);\n  }\n  return {\n    matchedColumn: single ? matchedColumn[0] : matchedColumn,\n    matchedValues: single ? matchedValues[0] : matchedValues,\n  };\n}\n\nexport function getMatchedItemByIndex(columns, selectedIndex, single) {\n  const matchedValues = [];\n  const matchedColumn = [];\n  let index = null;\n  for (let i = 0; i < columns.length; i++) {\n    const column = columns[i];\n    const compareValue = selectedIndex[i];\n    index = null;\n    if (compareValue === undefined || compareValue === null) {\n      index = 0;\n    } else {\n      index = compareValue;\n      // 当column变化时， picker-view onChange 里抛出来的selectedIndex有可能不正确\n      if (columns?.[i]?.[compareValue] === undefined) {\n        index = 0;\n      }\n      if (index === -1) {\n        index = 0;\n      } // 没有找到， 默认选择第一个\n    }\n    matchedColumn[i] = column[index];\n    matchedValues[i] = getColumnValue(column[index]);\n  }\n\n  return {\n    matchedColumn: single ? matchedColumn[0] : matchedColumn,\n    matchedValues: single ? matchedValues[0] : matchedValues,\n  };\n}\n"
  },
  {
    "path": "src/Picker/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n// picker 选项的高度\n@picker-item-height: 68 * @rpx;\n// picker 选项字体颜色\n@picker-item-color: var(--picker-item-color, @COLOR_TEXT_PRIMARY);\n// picker 选项字体大小\n@picker-item-size: 42 * @rpx;\n// picker 选项选中字体大小\n@picker-item-active-size: @font-size-list;\n// 取消 和 确定认按钮颜色\n@picker-header-action-color: var(--picker-header-action-color, @COLOR_BRAND1);\n// 取消 和 确定按钮大小\n@picker-header-action-size: 30 * @rpx;\n// header 区域padding\n@picker-header-padding: 30 * @rpx 24 * @rpx 24 * @rpx;\n// header 区域 title 宽度\n@picker-header-title-width: 518 * @rpx;\n\n@picker-placeholder-color: var(--picker-placeholder-color, @COLOR_TEXT_WEAK);\n\n@picker-header-color: var(--picker-header-color, @COLOR_BORDER);\n\n@picker-content-background-color: var(\n  --picker-content-background-color,\n  @COLOR_CARD\n);\n\n// 微信小程序 picker-view 高度\n@picker-view-height: 460 * @rpx;\n\n@picker-mask-bg-faded-95: var(--picker-mask-bg-faded-95, @COLOR_CARD_FADED_95);\n@picker-mask-bg-faded-60: var(--picker-mask-bg-faded-60, @COLOR_CARD_FADED_60);\n"
  },
  {
    "path": "src/Popover/index.axml",
    "content": "<view\n  class=\"ant-popover {{ showMask && mixin.value ? 'ant-popover-children' : '' }} {{ className ? className : '' }}\"\n  style=\"{{ style || '' }}\">\n  <view\n    id=\"ant-popover-children{{ $id ? '-' + $id : '' }}\"\n    onTap=\"onVisibleChange\">\n    <!-- #if ALIPAY -->\n    <slot />\n    <!-- #endif -->\n    <!-- #if WECHAT -->\n    <view id=\"ant-popover-children-container\">\n      <slot />\n    </view>\n    <!-- #endif -->\n  </view>\n  <view\n    a:if=\"{{ !destroyOnClose || mixin.value || closing }}\"\n    hidden=\"{{ !mixin.value && !closing }}\"\n    id=\"ant-popover-content{{ $id ? '-' + $id : '' }}\"\n    class=\"ant-popover-content ant-popover-{{ adjustedPlacement }} {{ closing ? `ant-popover-${adjustedPlacement}-closing` : `ant-popover-${adjustedPlacement}-opening` }}\"\n    style=\"{{ popoverContentStyle }}; {{ adjustedPlacement ? '' : 'opacity: 0' }}\"\n    onAnimationEnd=\"onAnimationEnd\">\n    <view\n      class=\"ant-popover-arrow ant-popover-{{ adjustedPlacement }}-arrow\"\n      style=\"{{ color ? 'border-bottom-color:' + color : '' }}\" />\n    <view\n      class=\"ant-popover-inner {{ contentClassName || '' }}\"\n      style=\"{{ color ? 'background:' + color : '' }};{{ contentStyle || '' }}\">\n      <view a:if=\"{{ imageUrl }}\" class=\"ant-popover-image\">\n        <image-icon className=\"ant-popover-image-content\" image=\"{{ imageUrl }}\" />\n      </view>\n      <slot a:else name=\"leftContent\">\n      </slot>\n      <!-- #if ALIPAY -->\n      <slot name=\"content\">\n        <view class=\"ant-popover-inner-text\">\n          {{ content }}\n        </view>\n      </slot>\n      <!-- #endif -->\n      <!-- #if WECHAT -->\n      <slot\n        wx:if=\"{{ !content }}\"\n        name=\"content\" />\n      <view wx:else class=\"ant-popover-inner-text\">{{ content }}</view>\n      <!-- #endif -->\n      <view a:if=\"{{ actionText }}\" onTap=\"onTapAction\" class=\"ant-popover-action\">\n        {{ actionText }}\n      </view>\n      <slot a:else name=\"rightContent\"/>\n      <view onTap=\"onVisibleChange\" class=\"ant-popover-close\" a:if=\"{{ showCloseIcon }}\">\n        <image-icon className=\"ant-popover-close-icon\" image=\"CloseOutline\" />\n      </view>\n    </view>\n  </view>\n</view>\n<ant-mask\n  show=\"{{ showMask && mixin.value }}\"\n  id=\"ant-popover-mask{{ $id ? '-' + $id : '' }}\"\n  className=\"ant-popover-mask {{ maskClassName || '' }}\"\n  style=\"{{ maskStyle }}\"\n  onMaskTap=\"onVisibleChange\" />\n"
  },
  {
    "path": "src/Popover/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Feedback\n  order: 12\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Popover\n\nClick on the element to pop up the bubble menu. The bubble menu for navigation functions is evoked, usually used to accommodate functions used at low frequencies. This function can only be activated via the icon on the navigation bar.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-popover\": \"antd-mini/es/Popover/index\"\n#endif\n#if WECHAT\n  \"ant-popover\": \"antd-mini/Popover/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<popover\n  content=\"simple tips\"\n  placement=\"top-left\"\n  showCloseIcon=\"{{true}}\"\n  style=\"display: inline-block\">\n  <ant-button\n    size=\"small\"\n    inline>\n    Point me\n  </ant-button>\n</popover>\n```\n\n### Support for pictures and action point buttons\n\n```xml\n<popover\n  content=\"这里是一个提示文案很长的Tips，酌情使用文案。单一Tips最多可容纳2行文案这里是一个提示文案很长的Tips，酌情使用文案。单一Tips最多可容纳2行文案…\"\n  placement=\"top\"\n  actionText=\"operation\"\n  imageUrl=\"https://mdn.alipayobjects.com/huamei_mnxlps/afts/img/A*tLCBTqxataIAAAAAAAAAAAAADkqGAQ/original\"\n#if ALIPAY\n  onVisibleChange=\"onVisibleChange\"\n  onTapAction=\"onTapAction\"\n#endif\n#if WECHAT\n  bindvisiblechange=\"onVisibleChange\"\n  bindtapaction=\"onTapAction\"\n#endif\n  >\n  <ant-button>Point me</ant-button>\n</popover>\n```\n\n### Custom\n\n#### Color\n\n```xml\n<popover\n  content=\"red\"\n  color=\"red\">\n  <ant-button style=\"margin-right: 24rpx;\" inline type=\"primary\">Custom Colors</ant-button>\n</popover>\n```\n\n#### Slot\n\n```xml\n<popover content=\"left & right slots\">\n  <ant-button inline style=\"margin-right: 24rpx;\">Slot</ant-button>\n  <icon slot=\"leftContent\" style=\"font-size: 48rpx; margin-right: 24rpx;\" type=\"FaceRecognitionOutline\" />\n  <icon slot=\"rightContent\" style=\"font-size: 48rpx; margin-left: 24rpx;\" type=\"FaceRecognitionOutline\" />\n</popover>\n```\n\n#### Location\n\nOptional `top`、`top-right`、`top-left`、`bottom`、`bottom-left`、`bottom-right`、`left`、`left-top`、`left-bottom`、`right`、`right-top`、`right-bottom`\n\n```xml\n<popover placement=\"top-right\">\n  <ant-button size=\"small\" inline>Point me</ant-button>\n  <view slot=\"content\" />\n</popover>\n```\n\n### Controlled\n\n```xml\n<view>\n  <popover\n    content=\"prompt\"\n    placement=\"right\"\n    showMask=\"{{false}}\"\n    visible=\"{{visible}}\"\n    style=\"display: inline-block\">\n    <text>Click the button to modify the visible</text>\n  </popover>\n</view>\n<ant-button\n  size=\"small\"\n  inline\n  style=\"margin-top: 8px\"\n#if ALIPAY\n  onTap=\"handleVisibleChange\"\n#endif\n#if WECHAT\n  bindtap=\"handleVisibleChange\"\n#endif\n>\n  Change visible\n</ant-button>\n```\n\n```js\nPage({\n  data: { visible: false },\n  handleVisibleChange() {\n    this.setData({\n      visible: !this.data.visible,\n    });\n  },\n});\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Popover/index' noChangeButton></code>\n\n## API\n\n| Property                          | Description                                                                                                                                                                | Type                                                                                                | Default Value |\n| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | ------ |\n| autoAdjustOverflow            | Automatically adjust the position when the bubble is blocked                                                                                                                                          | boolean                                                                                             | true   |\n| className                     | Class Name                                                                                                                                                                | string                                                                                              | -      |\n| color                         | Background Color                                                                                                                                                            | string                                                                                              | -      |\n| contentClassName              | content Class Name                                                                                                                                                        | string                                                                                              | -      |\n| contentStyle                  | content Style                                                                                                                                                        | string                                                                                              | -      |\n| content                       | Content                                                                                                                                                                | string \\| slot                                                                                      | -      |\n| defaultVisible                | Display by default                                                                                                                                                        | boolean                                                                                             | false  |\n| destroyOnClose                | Whether to unload content when invisible                                                                                                                                                | boolean                                                                                             | false  |\n| maskClassName                 | Class name of the layer                                                                                                                                                          | string                                                                                              | -      |\n| maskStyle                     | The style of the layer                                                                                                                                                          | string                                                                                              | -      |\n| placement                     | Bubble box position, optional `top`、`top-right`、`top-left`、`bottom`、`bottom-left`、`bottom-right`、`left`、`left-top`、`left-bottom`、`right`、`right-top` or `right-bottom` | string                                                                                              | top    |\n| showMask                      | Whether to display the mask layer. If true, click the blank to close the Popover.                                                                                                                    | boolean                                                                                             | true   |\n| style                         | Style                                                                                                                                                                | string                                                                                              | -      |\n| visible                       | Whether to display                                                                                                                                                            | boolean                                                                                             | -      |\n| #if ALIPAY onVisibleChange    | Callback at the time of visible change                                                                                                                                                | (visible: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -      |\n| #if ALIPAY onTapAction        | Operation button click callback                                                                                                                                                    | () => void                                                                                          | -      |\n| #if WECHAT bindvisiblechange | Callback at the time of visible change                                                                                                                                                | (visible: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -      |\n| #if WECHAT bindtapaction     | Operation button click callback                                                                                                                                                    | () => void                                                                                          | -      |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                     | Default Value                                                                                            | Dark Mode Default                                                                                    | Remarks             |\n| -------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------- |\n| --popover-color-background | <div style=\"width: 150px; height: 30px; background-color: #404040; color: #ffffff;\">#404040</div> | <div style=\"width: 150px; height: 30px; background-color: #404040; color: #ffffff;\">#404040</div> | Popover default background color |\n| --popover-bg               | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | Popover background color |\n| --popover-inner-color      | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #000000;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #000000;\">#ffffff</div> | Popover internal text color |\n| --popover-text-color       | <div style=\"width: 150px; height: 30px; background-color: #000000; color: #ffffff;\">#000000</div> | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #000000;\">#ffffff</div> | Popover operation button text color |\n"
  },
  {
    "path": "src/Popover/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"image-icon\": \"../ImageIcon/index\",\n    \"ant-mask\": \"../Mask/index\"\n  }\n}\n"
  },
  {
    "path": "src/Popover/index.less",
    "content": "@import (reference) './variable.less';\n@import '../style/mixins/hairline.less';\n\n@popoverPrefix: ant-popover;\n\n.@{popoverPrefix} {\n  position: relative;\n\n  &-children {\n    z-index: 999;\n  }\n\n  &-close {\n    margin-left: 24 * @rpx;\n    width: 38 * @rpx;\n    height: 38 * @rpx;\n    .ant-popover-close-icon {\n      position: absolute;\n      top: 20 * @rpx;\n      right: 20 * @rpx;\n      /// #if ALIPAY\n      font-size: 36 * @rpx;\n      /// #endif\n      .ant-icon {\n        color: @popover-inner-color;\n      }\n    }\n  }\n\n  &-image {\n    padding-right: 24 * @rpx;\n    border-radius: 16 * @rpx;\n  }\n  &-action {\n    background: @popover-bg;\n    font-weight: 400;\n    font-size: 24 * @rpx;\n    color: @popover-text-color;\n    padding: 10 * @rpx 20 * @rpx;\n    line-height: 33 * @rpx;\n    border-radius: 50vh;\n    margin-left: 24 * @rpx;\n  }\n\n  &-mask {\n    z-index: 998;\n    background: none;\n  }\n  &-content {\n    position: absolute;\n    min-width: 64 * @rpx;\n    max-width: calc(100vw - 48 * @rpx);\n    z-index: 999;\n  }\n\n  &-inner {\n    position: relative;\n    border-radius: 24 * @rpx;\n    overflow: hidden;\n    font-size: 28 * @rpx;\n    background-color: @popover-inner-bg;\n    color: @popover-inner-color;\n    padding: 20 * @rpx;\n    width: max-content;\n    .ant-icon {\n      color: @popover-inner-color;\n    }\n\n    display: flex;\n    justify-content: flex-start;\n    align-items: center;\n    &-text {\n      word-break: break-all;\n      text-overflow: ellipsis;\n      display: -webkit-box;\n      -webkit-box-orient: vertical;\n      -webkit-line-clamp: 2; /* 这里是超出几行省略 */\n      overflow: hidden;\n      max-width: 400 * @rpx;\n      line-height: 40 * @rpx;\n    }\n    .ant-popover-image-content-image {\n      width: 80 * @rpx;\n      height: 80 * @rpx;\n    }\n  }\n  &-arrow {\n    position: absolute;\n    width: 0;\n    height: 0;\n    border-left: 18 * @rpx solid transparent;\n    border-right: 18 * @rpx solid transparent;\n    border-bottom: 18 * @rpx solid @popover-inner-bg;\n  }\n\n  &-top {\n    transform-origin: center bottom;\n    .popover-position(0.6, -50%, -100%);\n\n    &-opening {\n      opacity: 0;\n      .popover-position(0.6, -50%, -100%);\n      .popover-scale-animation('top');\n    }\n\n    &-closing {\n      opacity: 1;\n      .popover-scale-animation-close('top');\n    }\n    &-arrow {\n      bottom: 2 * @rpx;\n      transform: translate(-50%, 100%) rotate(180deg);\n      left: 50%;\n    }\n  }\n\n  &-bottom {\n    transform-origin: center top;\n    .popover-position(0.6, -50%, 100%);\n\n    &-opening {\n      opacity: 0;\n      .popover-position(0.6, -50%, 100%);\n      .popover-scale-animation('bottom');\n    }\n\n    &-closing {\n      opacity: 1;\n      .popover-scale-animation-close('bottom');\n    }\n    &-arrow {\n      top: 2 * @rpx;\n      transform: translate(-50%, -100%) rotate(0deg);\n      left: 50%;\n    }\n  }\n\n  &-left {\n    transform-origin: right center;\n    .popover-position(0.6, -100%, -50%);\n\n    &-opening {\n      opacity: 0;\n      .popover-position(0.6, -100%, -50%);\n      .popover-scale-animation('left');\n    }\n\n    &-closing {\n      opacity: 1;\n      .popover-scale-animation-close('left');\n    }\n    &-arrow {\n      right: 2 * @rpx;\n      transform: translate(75%, -50%) rotate(90deg);\n      top: 50%;\n    }\n  }\n\n  &-right {\n    transform-origin: left center;\n    .popover-position(0.6, 100%, -50%);\n\n    &-opening {\n      opacity: 0;\n      .popover-position(0.6, 100%, -50%);\n      .popover-scale-animation('right');\n    }\n\n    &-closing {\n      opacity: 1;\n      .popover-scale-animation-close('right');\n    }\n    &-arrow {\n      left: 2 * @rpx;\n      transform: translate(-75%, -50%) rotate(-90deg);\n      top: 50%;\n    }\n  }\n\n  &-top-left {\n    transform-origin: left bottom;\n    .popover-position(0.6, 0, -100%);\n\n    &-opening {\n      opacity: 0;\n      .popover-position(0.6, 0, -100%);\n      .popover-scale-animation('top-left');\n    }\n\n    &-closing {\n      opacity: 1;\n      .popover-scale-animation-close('top-left');\n    }\n    &-arrow {\n      bottom: 2 * @rpx;\n      transform: translate(0, 100%) rotate(180deg);\n      left: 24 * @rpx;\n    }\n  }\n\n  &-top-right {\n    transform-origin: right bottom;\n    .popover-position(0.6, 0, -100%);\n\n    &-opening {\n      opacity: 0;\n      .popover-position(0.6, 0, -100%);\n      .popover-scale-animation('top-right');\n    }\n\n    &-closing {\n      opacity: 1;\n      .popover-scale-animation-close('top-right');\n    }\n    &-arrow {\n      bottom: 2 * @rpx;\n      transform: translate(0, 100%) rotate(180deg);\n      right: 24 * @rpx;\n    }\n  }\n\n  &-bottom-left {\n    transform-origin: left top;\n    .popover-position(0.6, 0, 100%);\n\n    &-opening {\n      opacity: 0;\n      .popover-position(0.6, 0, 100%);\n      .popover-scale-animation('bottom-left');\n    }\n\n    &-closing {\n      opacity: 1;\n      .popover-scale-animation-close('bottom-left');\n    }\n    &-arrow {\n      top: 2 * @rpx;\n      transform: translate(0, -100%) rotate(0deg);\n      left: 24 * @rpx;\n    }\n  }\n\n  &-bottom-right {\n    transform-origin: right top;\n    .popover-position(0.6, 0, 100%);\n\n    &-opening {\n      opacity: 0;\n      .popover-position(0.6, 0, 100%);\n      .popover-scale-animation('bottom-right');\n    }\n\n    &-closing {\n      opacity: 1;\n      .popover-scale-animation-close('bottom-right');\n    }\n    &-arrow {\n      top: 2 * @rpx;\n      transform: translate(0, -100%) rotate(0deg);\n      right: 24 * @rpx;\n    }\n  }\n\n  &-left-top {\n    transform-origin: right top;\n    .popover-position(0.6, -100%, 0);\n\n    &-opening {\n      opacity: 0;\n      .popover-position(0.6, -100%, 0);\n      .popover-scale-animation('left-top');\n    }\n\n    &-closing {\n      opacity: 1;\n      .popover-scale-animation-close('left-top');\n    }\n    &-arrow {\n      right: 2 * @rpx;\n      transform: translate(75%, 0) rotate(90deg);\n      top: 24 * @rpx;\n    }\n  }\n\n  &-left-bottom {\n    transform-origin: right bottom;\n    .popover-position(0.6, -100%, 0);\n\n    &-opening {\n      opacity: 0;\n      .popover-position(0.6, -100%, 0);\n      .popover-scale-animation('left-bottom');\n    }\n\n    &-closing {\n      opacity: 1;\n      .popover-scale-animation-close('left-bottom');\n    }\n    &-arrow {\n      right: 2 * @rpx;\n      transform: translate(75%, 0) rotate(90deg);\n      bottom: 24 * @rpx;\n    }\n  }\n\n  &-right-top {\n    transform-origin: left top;\n    .popover-position(0.6, 100%, 0);\n\n    &-opening {\n      opacity: 0;\n      .popover-position(0.6, 100%, 0);\n      .popover-scale-animation('right-top');\n    }\n\n    &-closing {\n      opacity: 1;\n      .popover-scale-animation-close('right-top');\n    }\n    &-arrow {\n      left: 2 * @rpx;\n      transform: translate(-75%, 0) rotate(-90deg);\n      top: 24 * @rpx;\n    }\n  }\n\n  &-right-bottom {\n    transform-origin: left bottom;\n    .popover-position(0.6, 100%, 0);\n\n    &-opening {\n      opacity: 0;\n      .popover-position(0.6, 100%, 0);\n      .popover-scale-animation('right-bottom');\n    }\n\n    &-closing {\n      opacity: 1;\n      .popover-scale-animation-close('right-bottom');\n    }\n    &-arrow {\n      left: 2 * @rpx;\n      transform: translate(-75%, 0) rotate(-90deg);\n      bottom: 24 * @rpx;\n    }\n  }\n}\n\n.ant-popover-animation('top', -50%, -100%);\n.ant-popover-animation('bottom', -50%, 100%);\n.ant-popover-animation('left', -100%, -50%);\n.ant-popover-animation('right', 100%, -50%);\n.ant-popover-animation('top-left', 0, -100%);\n.ant-popover-animation('top-right', 0, -100%);\n.ant-popover-animation('bottom-left', 0, 100%);\n.ant-popover-animation('bottom-right', 0, 100%);\n.ant-popover-animation('left-top', -100%, 0);\n.ant-popover-animation('left-bottom', -100%, 0);\n.ant-popover-animation('right-top', 100%, 0);\n.ant-popover-animation('right-bottom', 100%, 0);\n"
  },
  {
    "path": "src/Popover/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 反馈引导\n  order: 12\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Popover 气泡\n\n点击元素，弹出气泡式的菜单。用于导航功能的气泡菜单唤起，通常用于收纳低频使用的功能。该功能只能通过导航栏上的图标激活。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-popover\": \"antd-mini/es/Popover/index\"\n#endif\n#if WECHAT\n  \"ant-popover\": \"antd-mini/Popover/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<popover\n  content=\"simple tips\"\n  placement=\"top-left\"\n  showCloseIcon=\"{{true}}\"\n  style=\"display: inline-block\">\n  <ant-button\n    size=\"small\"\n    inline>\n    点我\n  </ant-button>\n</popover>\n```\n\n### 支持图片和行动点按钮\n\n```xml\n<popover\n  content=\"这里是一个提示文案很长的Tips，酌情使用文案。单一Tips最多可容纳2行文案这里是一个提示文案很长的Tips，酌情使用文案。单一Tips最多可容纳2行文案…\"\n  placement=\"top\"\n  actionText=\"operation\"\n  imageUrl=\"https://mdn.alipayobjects.com/huamei_mnxlps/afts/img/A*tLCBTqxataIAAAAAAAAAAAAADkqGAQ/original\"\n#if ALIPAY\n  onVisibleChange=\"onVisibleChange\"\n  onTapAction=\"onTapAction\"\n#endif\n#if WECHAT\n  bindvisiblechange=\"onVisibleChange\"\n  bindtapaction=\"onTapAction\"\n#endif\n  >\n  <ant-button>点我</ant-button>\n</popover>\n```\n\n### 自定义\n\n#### 颜色\n\n```xml\n<popover\n  content=\"red\"\n  color=\"red\">\n  <ant-button style=\"margin-right: 24rpx;\" inline type=\"primary\">自定义颜色</ant-button>\n</popover>\n```\n\n#### 插槽\n\n```xml\n<popover content=\"left & right slots\">\n  <ant-button inline style=\"margin-right: 24rpx;\">插槽</ant-button>\n  <icon slot=\"leftContent\" style=\"font-size: 48rpx; margin-right: 24rpx;\" type=\"FaceRecognitionOutline\" />\n  <icon slot=\"rightContent\" style=\"font-size: 48rpx; margin-left: 24rpx;\" type=\"FaceRecognitionOutline\" />\n</popover>\n```\n\n#### 位置\n\n可选 `top`、`top-right`、`top-left`、`bottom`、`bottom-left`、`bottom-right`、`left`、`left-top`、`left-bottom`、`right`、`right-top`、`right-bottom`\n\n```xml\n<popover placement=\"top-right\">\n  <ant-button size=\"small\" inline>点我</ant-button>\n  <view slot=\"content\" />\n</popover>\n```\n\n### 受控\n\n```xml\n<view>\n  <popover\n    content=\"prompt\"\n    placement=\"right\"\n    showMask=\"{{false}}\"\n    visible=\"{{visible}}\"\n    style=\"display: inline-block\">\n    <text>点击按钮修改visible</text>\n  </popover>\n</view>\n<ant-button\n  size=\"small\"\n  inline\n  style=\"margin-top: 8px\"\n#if ALIPAY\n  onTap=\"handleVisibleChange\"\n#endif\n#if WECHAT\n  bindtap=\"handleVisibleChange\"\n#endif\n>\n  更改visible\n</ant-button>\n```\n\n```js\nPage({\n  data: { visible: false },\n  handleVisibleChange() {\n    this.setData({\n      visible: !this.data.visible,\n    });\n  },\n});\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Popover/index' noChangeButton></code>\n\n## API\n\n| 属性                          | 说明                                                                                                                                                                | 类型                                                                                                | 默认值 |\n| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | ------ |\n| autoAdjustOverflow            | 气泡被遮挡时的自动调整位置                                                                                                                                          | boolean                                                                                             | true   |\n| className                     | 类名                                                                                                                                                                | string                                                                                              | -      |\n| color                         | 背景颜色                                                                                                                                                            | string                                                                                              | -      |\n| contentClassName              | content 类名                                                                                                                                                        | string                                                                                              | -      |\n| contentStyle                  | content 样式                                                                                                                                                        | string                                                                                              | -      |\n| content                       | 内容                                                                                                                                                                | string \\| slot                                                                                      | -      |\n| defaultVisible                | 默认是否显示                                                                                                                                                        | boolean                                                                                             | false  |\n| destroyOnClose                | 不可见时是否卸载内容                                                                                                                                                | boolean                                                                                             | false  |\n| maskClassName                 | 蒙层的类名                                                                                                                                                          | string                                                                                              | -      |\n| maskStyle                     | 蒙层的样式                                                                                                                                                          | string                                                                                              | -      |\n| placement                     | 气泡框位置，可选 `top`、`top-right`、`top-left`、`bottom`、`bottom-left`、`bottom-right`、`left`、`left-top`、`left-bottom`、`right`、`right-top` 或 `right-bottom` | string                                                                                              | top    |\n| showMask                      | 是否展示蒙层，为 true 时点击空白处可关闭 Popover                                                                                                                    | boolean                                                                                             | true   |\n| style                         | 样式                                                                                                                                                                | string                                                                                              | -      |\n| visible                       | 是否显示                                                                                                                                                            | boolean                                                                                             | -      |\n| #if ALIPAY onVisibleChange    | visible 变更时的回调                                                                                                                                                | (visible: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -      |\n| #if ALIPAY onTapAction        | 操作按钮点击回调                                                                                                                                                    | () => void                                                                                          | -      |\n| #if WECHAT bindvisiblechange | visible 变更时的回调                                                                                                                                                | (visible: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -      |\n| #if WECHAT bindtapaction     | 操作按钮点击回调                                                                                                                                                    | () => void                                                                                          | -      |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                     | 默认值                                                                                            | 深色模式默认值                                                                                    | 备注             |\n| -------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------- |\n| --popover-color-background | <div style=\"width: 150px; height: 30px; background-color: #404040; color: #ffffff;\">#404040</div> | <div style=\"width: 150px; height: 30px; background-color: #404040; color: #ffffff;\">#404040</div> | Popover 默认底色 |\n| --popover-bg               | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | Popover 背景颜色 |\n| --popover-inner-color      | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #000000;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #000000;\">#ffffff</div> | Popover 内部文字颜色 |\n| --popover-text-color       | <div style=\"width: 150px; height: 30px; background-color: #000000; color: #ffffff;\">#000000</div> | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #000000;\">#ffffff</div> | Popover 操作按钮文字颜色 |\n"
  },
  {
    "path": "src/Popover/index.ts",
    "content": "import mixinValue from '../mixins/value';\nimport { getInstanceBoundingClientRect } from '../_util/jsapi/get-instance-bounding-client-rect';\nimport { getSystemInfo } from '../_util/jsapi/get-system-info';\nimport {\n  Component,\n  getValueFromProps,\n  triggerEvent,\n  triggerEventOnly,\n} from '../_util/simply';\nimport { assertAilpayNativeNotSupport } from '../_util/support';\nimport { PopoverDefaultProps } from './props';\nimport { getPopoverStyle } from './utils';\n\nassertAilpayNativeNotSupport('Popover');\n\nComponent({\n  props: PopoverDefaultProps,\n  data: {\n    adjustedPlacement: '',\n    popoverContentStyle: '',\n    closing: false,\n  },\n  methods: {\n    getInstance() {\n      if (this.$id) {\n        return my;\n      }\n      return this;\n    },\n    async updatePopover() {\n      const [placement, autoAdjustOverflow] = getValueFromProps(this, [\n        'placement',\n        'autoAdjustOverflow',\n      ]);\n      const [containerRect, childrenRect, contentRect, systemInfo] =\n        await Promise.all([\n          getInstanceBoundingClientRect(\n            this.getInstance(),\n            `#ant-popover-children${this.$id ? `-${this.$id}` : ''}`\n          ),\n          getInstanceBoundingClientRect(\n            this.getInstance(),\n            this.$id\n              ? `#ant-popover-children-${this.$id} > *`\n              : `#ant-popover-children-container`\n          ),\n          getInstanceBoundingClientRect(\n            this.getInstance(),\n            this.$id\n              ? `#ant-popover-content-${this.$id}`\n              : '#ant-popover-content'\n          ),\n          getSystemInfo(),\n        ]);\n\n      const { popoverContentStyle, adjustedPlacement } = getPopoverStyle(\n        placement,\n        autoAdjustOverflow,\n        {\n          containerRect,\n          childrenRect,\n          contentRect,\n          systemInfo,\n        }\n      );\n\n      this.setData({\n        popoverContentStyle,\n        adjustedPlacement,\n      });\n    },\n\n    onVisibleChange(e) {\n      /// #if ALIPAY\n      if (\n        !this.getValue() &&\n        e.target.id &&\n        e.target.id.indexOf('ant-popover-') === 0\n      ) {\n        return;\n      }\n      /// #endif\n      const value = !this.getValue();\n\n      if (!this.isControlled()) {\n        this.update(value);\n      }\n      triggerEvent(this, 'visibleChange', value, e);\n      if (!value) {\n        this.setData({ closing: true });\n      }\n    },\n    onAnimationEnd() {\n      if (this.data.closing) {\n        this.setData({ closing: false });\n      }\n    },\n    onTapAction() {\n      this.onVisibleChange();\n      triggerEventOnly(this, 'tapAction');\n    },\n  },\n  mixins: [\n    mixinValue({\n      valueKey: 'visible',\n      defaultValueKey: 'defaultVisible',\n      transformValue(value) {\n        if (value) {\n          this.updatePopover();\n        }\n        return {\n          needUpdate: true,\n          value,\n        };\n      },\n    }),\n  ],\n\n  /// #if ALIPAY\n  didUpdate(prevProps) {\n    const [placement, autoAdjustOverflow] = getValueFromProps(this, [\n      'placement',\n      'autoAdjustOverflow',\n    ]);\n    if (\n      (prevProps.placement !== placement ||\n        prevProps.autoAdjustOverflow !== autoAdjustOverflow) &&\n      this.getValue()\n    ) {\n      this.updatePopover();\n    }\n  },\n  /// #endif\n  /// #if WECHAT\n  observers: {\n    'placement, autoAdjustOverflow, mixin': function () {\n      if (this.getValue()) {\n        this.updatePopover();\n      }\n    },\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/Popover/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n/**\n * @description 气泡，内部配合 PopoverItem 使用。\n */\n\nexport interface IPopoverProps extends IBaseProps {\n  /**\n   * @description 是否可见\n   * @default false\n   */\n  visible: boolean;\n  /**\n   * @description 默认是否可见\n   * @default false\n   */\n  defaultVisible: boolean;\n  /**\n   * @description 是否关闭后销毁内部元素\n   * @default false\n   */\n  destroyOnClose: boolean;\n  /**\n   * @description 背景颜色\n   */\n  color: string;\n  /**\n   * @description content区样式\n   */\n  contentStyle: string;\n  /**\n   * @description content类名\n   */\n  contentClassName: string;\n  /**\n   * @description content 内容\n   */\n  content?: string;\n  /**\n   * @description 蒙层类名\n   */\n  maskClassName: string;\n  /**\n   * @description 蒙层样式\n   */\n  maskStyle: string;\n  /**\n   * @description visible 变更时回调\n   */\n  onVisibleChange?: (visible: boolean, e: Record<string, any>) => void;\n  /**\n   * @description 点击行动点\n   */\n  onTapAction?: () => void;\n  /**\n   * @description 气泡框位置\n   */\n  placement:\n    | 'top'\n    | 'top-right'\n    | 'top-left'\n    | 'bottom'\n    | 'bottom-left'\n    | 'bottom-right'\n    | 'left'\n    | 'left-top'\n    | 'left-bottom'\n    | 'right'\n    | 'right-top'\n    | 'right-bottom';\n  /**\n   * @description 是否展示蒙层\n   * @default false\n   */\n  showMask: boolean;\n\n  /**\n   * @description 气泡被遮挡时自动调整位置\n   * @default true\n   */\n  autoAdjustOverflow: boolean;\n  /**\n   * @description 是否关闭的icon\n   * @default false\n   */\n  showCloseIcon: boolean;\n  /**\n   * @description 气泡左侧的图片链接\n   * @default ''\n   */\n  imageUrl: string;\n  /**\n   * @description 右侧操作按钮文案\n   * @default ''\n   */\n  actionText: string;\n}\n\nexport const PopoverDefaultProps: Partial<IPopoverProps> = {\n  visible: null,\n  imageUrl: '',\n  defaultVisible: false,\n  destroyOnClose: false,\n  showCloseIcon: false,\n  contentClassName: '',\n  actionText: '',\n  color: '',\n  contentStyle: '',\n  showMask: true,\n  placement: 'top',\n  autoAdjustOverflow: true,\n  maskClassName: '',\n  maskStyle: '',\n  content: '',\n  onVisibleChange() {},\n  onTapAction() {},\n};\n"
  },
  {
    "path": "src/Popover/utils.ts",
    "content": "interface Rect {\n  left: number;\n  top: number;\n  right: number;\n  bottom: number;\n  width: number;\n  height: number;\n}\n\ninterface SystemInfo {\n  windowHeight: number;\n  windowWidth: number;\n}\n\nexport function getPopoverStyle(\n  placement: string,\n  autoAdjustOverflow: boolean,\n  size: {\n    containerRect: Rect;\n    childrenRect: Rect;\n    contentRect: Rect;\n    systemInfo: SystemInfo;\n  }\n) {\n  const { containerRect, childrenRect, contentRect, systemInfo } = size;\n  const left = childrenRect.left - containerRect.left;\n  const top = childrenRect.top - containerRect.top;\n  const bottom = containerRect.bottom - childrenRect.bottom;\n  const right = containerRect.right - childrenRect.right;\n  let adjustedPlacement = placement as string;\n  const arrowMargin = 12;\n\n  const contentRectWidth = contentRect.width + arrowMargin;\n  const contentRectHeight = contentRect.height + arrowMargin;\n\n  if (autoAdjustOverflow) {\n    if (adjustedPlacement === 'top') {\n      if (childrenRect.top - contentRectHeight < 0) {\n        adjustedPlacement = 'bottom';\n      }\n    } else if (adjustedPlacement === 'bottom') {\n      if (childrenRect.bottom + contentRectHeight > systemInfo.windowHeight) {\n        adjustedPlacement = 'top';\n      }\n    } else if (adjustedPlacement === 'left') {\n      if (childrenRect.left - contentRectWidth < 0) {\n        adjustedPlacement = 'right';\n      }\n    } else if (adjustedPlacement === 'right') {\n      if (childrenRect.right + contentRectWidth > systemInfo.windowWidth) {\n        adjustedPlacement = 'left';\n      }\n    } else if (adjustedPlacement === 'top-left') {\n      if (childrenRect.top - contentRectHeight < 0) {\n        adjustedPlacement = adjustedPlacement.replace('top', 'bottom');\n      }\n      if (childrenRect.left + contentRectWidth > systemInfo.windowWidth) {\n        adjustedPlacement = adjustedPlacement.replace('left', 'right');\n      }\n    } else if (adjustedPlacement === 'top-right') {\n      if (childrenRect.top - contentRectHeight < 0) {\n        adjustedPlacement = adjustedPlacement.replace('top', 'bottom');\n      }\n      if (childrenRect.right - contentRectWidth < 0) {\n        adjustedPlacement = adjustedPlacement.replace('right', 'left');\n      }\n    } else if (adjustedPlacement === 'bottom-left') {\n      if (childrenRect.bottom + contentRectHeight > systemInfo.windowHeight) {\n        adjustedPlacement = adjustedPlacement.replace('bottom', 'top');\n      }\n      if (childrenRect.left + contentRectWidth > systemInfo.windowWidth) {\n        adjustedPlacement = adjustedPlacement.replace('left', 'right');\n      }\n    } else if (adjustedPlacement === 'bottom-right') {\n      if (childrenRect.bottom + contentRectHeight > systemInfo.windowHeight) {\n        adjustedPlacement = adjustedPlacement.replace('bottom', 'top');\n      }\n      if (childrenRect.right - contentRectWidth < 0) {\n        adjustedPlacement = adjustedPlacement.replace('right', 'left');\n      }\n    } else if (adjustedPlacement === 'left-top') {\n      if (childrenRect.left - contentRectWidth < 0) {\n        adjustedPlacement = adjustedPlacement.replace('left', 'right');\n      }\n      if (childrenRect.top + contentRectHeight > systemInfo.windowHeight) {\n        adjustedPlacement = adjustedPlacement.replace('top', 'bottom');\n      }\n    } else if (adjustedPlacement === 'left-bottom') {\n      if (childrenRect.left - contentRectWidth < 0) {\n        adjustedPlacement = adjustedPlacement.replace('left', 'right');\n      }\n      if (childrenRect.bottom - contentRectHeight < 0) {\n        adjustedPlacement = adjustedPlacement.replace('bottom', 'top');\n      }\n    } else if (adjustedPlacement === 'right-top') {\n      if (childrenRect.right + contentRectWidth > systemInfo.windowWidth) {\n        adjustedPlacement = adjustedPlacement.replace('right', 'left');\n      }\n      if (childrenRect.top + contentRectHeight > systemInfo.windowHeight) {\n        adjustedPlacement = adjustedPlacement.replace('top', 'bottom');\n      }\n    } else if (adjustedPlacement === 'right-bottom') {\n      if (childrenRect.right + contentRectWidth > systemInfo.windowWidth) {\n        adjustedPlacement = adjustedPlacement.replace('right', 'left');\n      }\n      if (childrenRect.bottom - contentRectHeight < 0) {\n        adjustedPlacement = adjustedPlacement.replace('bottom', 'top');\n      }\n    }\n  }\n\n  let popoverContentStyle;\n  if (adjustedPlacement === 'top') {\n    popoverContentStyle = getStyle({\n      left: left + childrenRect.width / 2,\n      top: top - arrowMargin,\n    });\n  } else if (adjustedPlacement === 'bottom') {\n    popoverContentStyle = getStyle({\n      left: left + childrenRect.width / 2,\n      bottom: bottom - arrowMargin,\n    });\n  } else if (adjustedPlacement === 'left') {\n    popoverContentStyle = getStyle({\n      left: left - arrowMargin,\n      top: top + childrenRect.height / 2,\n    });\n  } else if (adjustedPlacement === 'right') {\n    popoverContentStyle = getStyle({\n      right: right - arrowMargin,\n      top: top + childrenRect.height / 2,\n    });\n  } else if (adjustedPlacement === 'top-left') {\n    popoverContentStyle = getStyle({\n      left,\n      top: top - arrowMargin,\n    });\n  } else if (adjustedPlacement === 'top-right') {\n    popoverContentStyle = getStyle({\n      right,\n      top: top - arrowMargin,\n    });\n  } else if (adjustedPlacement === 'bottom-left') {\n    popoverContentStyle = getStyle({\n      left,\n      bottom: bottom - arrowMargin,\n    });\n  } else if (adjustedPlacement === 'bottom-right') {\n    popoverContentStyle = getStyle({\n      right,\n      bottom: bottom - arrowMargin,\n    });\n  } else if (adjustedPlacement === 'left-top') {\n    popoverContentStyle = getStyle({\n      left: left - arrowMargin,\n      top,\n    });\n  } else if (adjustedPlacement === 'left-bottom') {\n    popoverContentStyle = getStyle({\n      left: left - arrowMargin,\n      bottom,\n    });\n  } else if (adjustedPlacement === 'right-top') {\n    popoverContentStyle = getStyle({\n      right: right - arrowMargin,\n      top,\n    });\n  } else if (adjustedPlacement === 'right-bottom') {\n    popoverContentStyle = getStyle({\n      right: right - arrowMargin,\n      bottom,\n    });\n  }\n\n  return {\n    popoverContentStyle,\n    adjustedPlacement,\n  };\n}\n\nfunction getStyle(obj) {\n  return Object.keys(obj)\n    .map((item) => `${item}: ${obj[item]}px`)\n    .join(';');\n}\n"
  },
  {
    "path": "src/Popover/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n// 蒙层\n@popover-mask: @color-product-mask;\n// 圆角\n@popover-radius: @corner-radius-md;\n\n@popover-bg: var(--popover-bg, @COLOR_CARD);\n\n@popover-text-color: var(--popover-text-color, @COLOR_BLACK);\n\n@popover-inner-bg: var(--popover-color-background, @COLOR_BACKGROUND_POPOVER);\n\n@popover-inner-color: var(--popover-inner-color, @COLOR_WHITE_DEFAULT);\n\n.popover-position(@translate-scale, @translate-x, @translate-y) {\n  transform: translate(@translate-x, @translate-y) scale(@translate-scale);\n}\n\n.popover-scale-animation(@position) {\n  @open-scale-name: ~'ant-popover-open-scale-@{position}';\n  @open-opacity-name: ~'ant-popover-open-opacity-@{position}';\n  animation-name: @open-scale-name, @open-opacity-name;\n  animation-duration: 200ms, 100ms;\n  animation-timing-function: cubic-bezier(0.57, -0.22, 0, 1.2),\n    cubic-bezier(0.35, 0, 0.65, 1);\n  animation-fill-mode: forwards;\n}\n\n.popover-scale-animation-close(@position) {\n  @close-name: ~'ant-popover-close-@{position}';\n  animation-name: @close-name;\n  animation-duration: 200ms;\n  animation-timing-function: cubic-bezier(0.6, 0, 1, 0.6);\n  animation-fill-mode: forwards;\n}\n\n.ant-popover-animation(@position, @translate-x, @translate-y) {\n  @open-scale-name: ~'ant-popover-open-scale-@{position}';\n  @open-opacity-name: ~'ant-popover-open-opacity-@{position}';\n  @close-name: ~'ant-popover-close-@{position}';\n\n  @keyframes @open-scale-name {\n    0% {\n      .popover-position(0.6, @translate-x, @translate-y);\n    }\n    100% {\n      .popover-position(1, @translate-x, @translate-y);\n    }\n  }\n\n  @keyframes @open-opacity-name {\n    0% {\n      opacity: 0;\n    }\n    100% {\n      opacity: 1;\n    }\n  }\n\n  @keyframes @close-name {\n    0% {\n      .popover-position(1, @translate-x, @translate-y);\n      opacity: 1;\n    }\n    100% {\n      .popover-position(0.6, @translate-x, @translate-y);\n      opacity: 0;\n    }\n  }\n}\n"
  },
  {
    "path": "src/PopoverList/index.axml",
    "content": "<view\n  a:if=\"{{ list.length > 0 }}\"\n  class=\"ant-popover-list {{ showMask && mixin.value ? 'ant-popover-list-children' : '' }} {{ className ? className : '' }}\"\n  style=\"{{ style || '' }}\">\n  <view\n    id=\"ant-popover-list-children{{ $id ? '-' + $id : '' }}\"\n    onTap=\"onVisibleChange\">\n    <!-- #if ALIPAY -->\n    <slot />\n    <!-- #endif -->\n    <!-- #if WECHAT -->\n    <view id=\"ant-popover-list-children-container\">\n      <slot />\n    </view>\n    <!-- #endif -->\n  </view>\n  <view\n    a:if=\"{{ !destroyOnClose || mixin.value || closing }}\"\n    hidden=\"{{ !mixin.value && !closing }}\"\n    id=\"ant-popover-list-content{{ $id ? '-' + $id : '' }}\"\n    class=\"ant-popover-list-content ant-popover-list-{{ adjustedPlacement }} {{ closing ? `ant-popover-list-${adjustedPlacement}-closing` : `ant-popover-list-${adjustedPlacement}-opening` }}\"\n    style=\"{{ popoverContentStyle }}; {{ adjustedPlacement ? '' : 'opacity: 0' }}\"\n    onAnimationEnd=\"onAnimationEnd\">\n    <view\n      class=\"ant-popover-list-content-arrow ant-popover-list-{{ adjustedPlacement }}-arrow\" />\n    <view\n      a:for=\"{{ list }}\"\n      onTap=\"onTapItem\"\n      data-item=\"{{ item }}\"\n      class=\"ant-popover-list-item ant-popover-list-item-{{ index }} {{ contentClassName || '' }}\">\n      <view a:if=\"{{ item.iconImage || item.icon }}\" class=\"ant-popover-list-item-left\">\n        <image a:if=\"{{ item.iconImage }}\" class=\"ant-popover-list-item-image\" mode=\"scaleToFill\" src=\"{{ item.iconImage }}\" />\n        <ant-icon a:elif=\"{{ item.icon }}\" type=\"{{ item.icon }}\"></ant-icon>\n      </view>\n      <view class=\"ant-popover-list-item-text\">\n        {{ item.text }}\n        <view a:if=\"{{ item.showBadge }}\" class=\"ant-popover-list-item-text-badge\" />\n      </view>\n    </view>\n  </view>\n</view>\n<ant-mask\n  show=\"{{ showMask && mixin.value }}\"\n  id=\"ant-popover-list-mask{{ $id ? '-' + $id : '' }}\"\n  className=\"ant-popover-list-mask {{ maskClassName || '' }}\"\n  style=\"{{ maskStyle }}\"\n  onMaskTap=\"onVisibleChange\" />\n"
  },
  {
    "path": "src/PopoverList/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Navigation\n  order: 6\ntoc: 'content'\n---\n\n# PopoverList\n\nClick on the element to pop up the bubble menu. The bubble menu for navigation functions is evoked, usually used to accommodate functions used at low frequencies. This function can only be activated via the icon on the navigation bar.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-popover-list\": \"antd-mini/es/PopoverList/index\"\n#endif\n#if WECHAT\n  \"ant-popover-list\": \"antd-mini/PopoverList/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<ant-popover-list\n  visible=\"{{visible}}\"\n  list=\"{{list}}\"\n  placement=\"bottom-right\"\n#if ALIPAY\n  onTapItem=\"handleTapItem\"\n  onVisibleChange=\"handleVisibleChange\"\n#endif\n#if WECHAT\n  bindtapitem=\"handleTapItem\"\n  bindvisiblechange=\"handleVisibleChange\"\n#endif\n>\n  <ant-button inline>Point me</ant-button>\n</ant-popover-list>\n```\n\n```js\nPage({\n  data: {\n    visible: true,\n    list: [\n      { text: '扫一扫', icon: 'ScanningOutline', showBadge: true, id: 'scan', },\n      { text: '付钱/收钱', icon: 'ReceivePaymentOutline', showBadge: false, id: 'pay', },\n      { text: '乘车码', icon: 'TransportQRcodeOutline', showBadge: false, id: 'code', },\n      { text: '图片', iconImage: 'https://gw.alipayobjects.com/mdn/rms_ce4c6f/afts/img/A*XMCgSYx3f50AAAAAAAAAAABkARQnAQ', showBadge: false, id: 'image', },\n    ],\n  },\n  handleVisibleChange(visible, e) {\n    console.log(visible, e);\n#if ALIPAY\n    this.setData({ visible });\n#endif\n#if WECHAT\n    this.setData({ visible: visible.detail });\n#endif\n  },\n  handleTapItem(e, item) {\n    console.log(e, item);\n    this.setData({ visible: false });\n#if ALIPAY\n    my.showToast({ content: '点击列表', duration: 1000 });\n#endif\n#if WECHAT\n    wx.showToast({ title: '点击列表' });\n#endif\n  },\n});\n```\n\n### bubble position adaptive\n\n> `autoAdjustOverflow` Property to automatically adjust the position of the bubble when it is occluded\n\n```xml\n<ant-popover-list\n  visible=\"{{true}}\"\n  list=\"{{list}}\"\n  autoAdjustOverflow=\"{{true}}\"\n>\n  <ant-button inline style=\"margin-top: 500px;\">bubble position adaptive</ant-button>\n</ant-popover-list>\n```\n\n### Demo Code\n\n<code src='../../demo/pages/PopoverList/index'></code>\n\n## API\n\n| Property                          | Description                                                                                                                                                                | Type                                                                                                                         | Default Value |\n| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | ------ |\n| autoAdjustOverflow            | Automatically adjust the position when the bubble is blocked                                                                                                                                          | boolean                                                                                                                      | true   |\n| className                     | Class Name                                                                                                                                                                | string                                                                                                                       | -      |\n| color                         | Background Color                                                                                                                                                            | string                                                                                                                       | -      |\n| contentClassName              | content Class Name                                                                                                                                                        | string                                                                                                                       | -      |\n| contentStyle                  | content Style                                                                                                                                                        | string                                                                                                                       | -      |\n| content                       | Content                                                                                                                                                                | string \\| slot                                                                                                               | -      |\n| defaultVisible                | Display by default                                                                                                                                                        | boolean                                                                                                                      | false  |\n| destroyOnClose                | Whether to unload content when invisible                                                                                                                                                | boolean                                                                                                                      | false  |\n| maskClassName                 | Class name of the layer                                                                                                                                                          | string                                                                                                                       | -      |\n| maskStyle                     | The style of the layer                                                                                                                                                          | string                                                                                                                       | -      |\n| placement                     | Bubble box position, optional `top`、`top-right`、`top-left`、`bottom`、`bottom-left`、`bottom-right`、`left`、`left-top`、`left-bottom`、`right`、`right-top` or `right-bottom` | string                                                                                                                       | top    |\n| showMask                      | Whether to show the layer, if true, click the blank to close the Popover.                                                                                                                    | boolean                                                                                                                      | true   |\n| style                         | Style                                                                                                                                                                | string                                                                                                                       | -      |\n| visible                       | Display                                                                                                                                                            | boolean                                                                                                                      | -      |\n| #if ALIPAY onVisibleChange    | Callback at the time of visible change                                                                                                                                                | (visible: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                          | -      |\n| #if ALIPAY onTapItem          | Callback at the time of visible change                                                                                                                                                | (item: [PopoverListItem](#popoverlistitem), event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -      |\n| #if WECHAT bindvisiblechange | Callback at the time of visible change                                                                                                                                                | (visible: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                          | -      |\n| #if WECHAT bindtapitem       | Callback at the time of visible change                                                                                                                                                | (item: [PopoverListItem](#popoverlistitem), event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -      |\n\n### PopoverListItem\n\n| Property      | Description                                                    | Type    | Default Value |\n| --------- | ------------------------------------------------------- | ------- | ------ |\n| icon      | The icon of the menu                                             | string  | -      |\n| iconImage | The icon picture of the menu is taken first iconImage the icon field is not taken again. | string  | -      |\n| text      | Class Name                                                    | string  | -      |\n| showBadge | Disable                                                | boolean | false  |\n| id        | Extra right                                            | string  | -      |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For more information, see ConfigProvider Components.\n\n| Variable name                       | Default Value                                                                                                                    | Dark Mode Default                                                                                                            | Remarks                     |\n| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------ |\n| --popover-list-content-bg    | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.93); color: #ffffff;\">rgba(0, 0, 0, 0.93)</div> | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.93); color: #ffffff;\">rgba(0, 0, 0, 0.93)</div> | Popover List Content Background Color |\n| --popover-list-content-color | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div>                         | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div>                         | Popover List Content Color     |\n| --popover-list-badge-color   | <div style=\"width: 150px; height: 30px; background-color: #ff411c; color: #ffffff;\">#ff411c</div>                         | <div style=\"width: 150px; height: 30px; background-color: #ff411c; color: #ffffff;\">#ff411c</div>                         | Popover List Badge Color     |\n|  --popover-list-item-bg      | <div style=\"width: 150px; height: 30px; background-color: #e5e5e5; color: #333333;\">#e5e5e5</div>                         | <div style=\"width: 150px; height: 30px; background-color: #444444; color: #ffffff;\">#444444</div>                         | Popover list content text color |\n"
  },
  {
    "path": "src/PopoverList/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-icon\": \"../Icon/index\",\n    \"ant-mask\": \"../Mask/index\"\n  }\n}\n"
  },
  {
    "path": "src/PopoverList/index.less",
    "content": "@import (reference) './variable.less';\n@import '../style/mixins/hairline.less';\n\n@popoverPrefix: ant-popover-list;\n\n.@{popoverPrefix} {\n  position: relative;\n\n  &-children {\n    z-index: 999;\n  }\n\n  &-mask {\n    z-index: 998;\n    background: none;\n  }\n  &-content {\n    position: absolute;\n    // min-width: 64 * @rpx;\n    max-width: calc(100vw - 48 * @rpx);\n    z-index: 999;\n    border-radius: 24 * @rpx;\n    background: @popover-content-bg;\n    box-shadow: 0 4 * @rpx 10 * @rpx 0 @popover-content-bg;\n    color: @popover-content-color;\n\n    &-arrow {\n      position: absolute;\n      width: 0;\n      height: 0;\n      border-left: 18 * @rpx solid transparent;\n      border-right: 18 * @rpx solid transparent;\n      border-bottom: 18 * @rpx solid @popover-content-bg;\n    }\n    .ant-popover-list-item::before {\n      background: @popover-list-item-bg;\n    }\n  }\n\n  &-item {\n    padding: 26 * @rpx 24 * @rpx 26 * @rpx 32 * @rpx;\n    display: flex;\n    justify-content: flex-start;\n    align-items: center;\n    flex-direction: row;\n    position: relative;\n    z-index: 1;\n    &-0 {\n      &::before {\n        display: none;\n      }\n    }\n    &::before {\n      content: '';\n      position: absolute;\n      top: 0;\n      left: 16 * @rpx;\n      width: calc(200% - @popover-content-width);\n      height: 2 * @rpx;\n      transform: scale(0.5);\n      background: @popover-content-color;\n      z-index: 2;\n    }\n    &-left {\n      padding-right: 16 * @rpx;\n      width: 48 * @rpx;\n      height: 48 * @rpx;\n      overflow: hidden;\n      .ant-icon {\n        font-size: 48 * @rpx;\n        width: 48 * @rpx;\n        height: 48 * @rpx;\n        color: @popover-content-color;\n      }\n    }\n    &-image {\n      width: 48 * @rpx;\n      height: 48 * @rpx;\n    }\n    &-text {\n      font-weight: 400;\n      font-size: 30 * @rpx;\n      letter-spacing: 0;\n      white-space: nowrap;\n\n      display: flex;\n      justify-content: flex-start;\n      align-items: center;\n      flex-direction: row;\n      &-badge {\n        background: @popover-badge-color;\n        width: 20 * @rpx;\n        border-radius: 50vh;\n        height: 20 * @rpx;\n        margin-left: 8 * @rpx;\n      }\n    }\n  }\n\n  &-top {\n    transform-origin: center bottom;\n    .popover-list-position(0.4, -50%, -100%);\n\n    &-opening {\n      opacity: 0;\n      .popover-list-position(0.4, -50%, -100%);\n      .popover-list-scale-animation('top');\n    }\n\n    &-closing {\n      opacity: 1;\n      .popover-list-scale-animation-close('top');\n    }\n    &-arrow {\n      bottom: 2 * @rpx;\n      transform: translate(-50%, 100%) rotate(180deg);\n      left: 50%;\n    }\n  }\n\n  &-bottom {\n    transform-origin: center top;\n    .popover-list-position(0.4, -50%, 100%);\n\n    &-opening {\n      opacity: 0;\n      .popover-list-position(0.4, -50%, 100%);\n      .popover-list-scale-animation('bottom');\n    }\n\n    &-closing {\n      opacity: 1;\n      .popover-list-scale-animation-close('bottom');\n    }\n    &-arrow {\n      top: 2 * @rpx;\n      transform: translate(-50%, -100%) rotate(0deg);\n      left: 50%;\n    }\n  }\n\n  &-left {\n    transform-origin: right center;\n    .popover-list-position(0.4, -100%, -50%);\n\n    &-opening {\n      opacity: 0;\n      .popover-list-position(0.4, -100%, -50%);\n      .popover-list-scale-animation('left');\n    }\n\n    &-closing {\n      opacity: 1;\n      .popover-list-scale-animation-close('left');\n    }\n    &-arrow {\n      right: 2 * @rpx;\n      transform: translate(75%, -50%) rotate(90deg);\n      top: 50%;\n    }\n  }\n\n  &-right {\n    transform-origin: left center;\n    .popover-list-position(0.4, 100%, -50%);\n\n    &-opening {\n      opacity: 0;\n      .popover-list-position(0.4, 100%, -50%);\n      .popover-list-scale-animation('right');\n    }\n\n    &-closing {\n      opacity: 1;\n      .popover-list-scale-animation-close('right');\n    }\n    &-arrow {\n      left: 2 * @rpx;\n      transform: translate(-75%, -50%) rotate(-90deg);\n      top: 50%;\n    }\n  }\n\n  &-top-left {\n    transform-origin: left bottom;\n    .popover-list-position(0.4, 0, -100%);\n\n    &-opening {\n      opacity: 0;\n      .popover-list-position(0.4, 0, -100%);\n      .popover-list-scale-animation('top-left');\n    }\n\n    &-closing {\n      opacity: 1;\n      .popover-list-scale-animation-close('top-left');\n    }\n    &-arrow {\n      bottom: 2 * @rpx;\n      transform: translate(0, 100%) rotate(180deg);\n      left: 24 * @rpx;\n    }\n  }\n\n  &-top-right {\n    transform-origin: right bottom;\n    .popover-list-position(0.4, 0, -100%);\n\n    &-opening {\n      opacity: 0;\n      .popover-list-position(0.4, 0, -100%);\n      .popover-list-scale-animation('top-right');\n    }\n\n    &-closing {\n      opacity: 1;\n      .popover-list-scale-animation-close('top-right');\n    }\n    &-arrow {\n      bottom: 2 * @rpx;\n      transform: translate(0, 100%) rotate(180deg);\n      right: 24 * @rpx;\n    }\n  }\n\n  &-bottom-left {\n    transform-origin: left top;\n    .popover-list-position(0.4, 0, 100%);\n\n    &-opening {\n      opacity: 0;\n      .popover-list-position(0.4, 0, 100%);\n      .popover-list-scale-animation('bottom-left');\n    }\n\n    &-closing {\n      opacity: 1;\n      .popover-list-scale-animation-close('bottom-left');\n    }\n    &-arrow {\n      top: 2 * @rpx;\n      transform: translate(0, -100%) rotate(0deg);\n      left: 24 * @rpx;\n    }\n  }\n\n  &-bottom-right {\n    transform-origin: right top;\n    .popover-list-position(0.4, 0, 100%);\n\n    &-opening {\n      opacity: 0;\n      .popover-list-position(0.4, 0, 100%);\n      .popover-list-scale-animation('bottom-right');\n    }\n\n    &-closing {\n      opacity: 1;\n      .popover-list-scale-animation-close('bottom-right');\n    }\n    &-arrow {\n      top: 2 * @rpx;\n      transform: translate(0, -100%) rotate(0deg);\n      right: 24 * @rpx;\n    }\n  }\n\n  &-left-top {\n    transform-origin: right top;\n    .popover-list-position(0.4, -100%, 0);\n\n    &-opening {\n      opacity: 0;\n      .popover-list-position(0.4, -100%, 0);\n      .popover-list-scale-animation('left-top');\n    }\n\n    &-closing {\n      opacity: 1;\n      .popover-list-scale-animation-close('left-top');\n    }\n    &-arrow {\n      right: 2 * @rpx;\n      transform: translate(75%, 0) rotate(90deg);\n      top: 24 * @rpx;\n    }\n  }\n\n  &-left-bottom {\n    transform-origin: right bottom;\n    .popover-list-position(0.4, -100%, 0);\n\n    &-opening {\n      opacity: 0;\n      .popover-list-position(0.4, -100%, 0);\n      .popover-list-scale-animation('left-bottom');\n    }\n\n    &-closing {\n      opacity: 1;\n      .popover-list-scale-animation-close('left-bottom');\n    }\n    &-arrow {\n      right: 2 * @rpx;\n      transform: translate(75%, 0) rotate(90deg);\n      bottom: 24 * @rpx;\n    }\n  }\n\n  &-right-top {\n    transform-origin: left top;\n    .popover-list-position(0.4, 100%, 0);\n\n    &-opening {\n      opacity: 0;\n      .popover-list-position(0.4, 100%, 0);\n      .popover-list-scale-animation('right-top');\n    }\n\n    &-closing {\n      opacity: 1;\n      .popover-list-scale-animation-close('right-top');\n    }\n    &-arrow {\n      left: 2 * @rpx;\n      transform: translate(-75%, 0) rotate(-90deg);\n      top: 24 * @rpx;\n    }\n  }\n\n  &-right-bottom {\n    transform-origin: left bottom;\n    .popover-list-position(0.4, 100%, 0);\n\n    &-opening {\n      opacity: 0;\n      .popover-list-position(0.4, 100%, 0);\n      .popover-list-scale-animation('right-bottom');\n    }\n\n    &-closing {\n      opacity: 1;\n      .popover-list-scale-animation-close('right-bottom');\n    }\n    &-arrow {\n      left: 2 * @rpx;\n      transform: translate(-75%, 0) rotate(-90deg);\n      bottom: 24 * @rpx;\n    }\n  }\n}\n\n.ant-popover-list-animation('top', -50%, -100%);\n.ant-popover-list-animation('bottom', -50%, 100%);\n.ant-popover-list-animation('left', -100%, -50%);\n.ant-popover-list-animation('right', 100%, -50%);\n.ant-popover-list-animation('top-left', 0, -100%);\n.ant-popover-list-animation('top-right', 0, -100%);\n.ant-popover-list-animation('bottom-left', 0, 100%);\n.ant-popover-list-animation('bottom-right', 0, 100%);\n.ant-popover-list-animation('left-top', -100%, 0);\n.ant-popover-list-animation('left-bottom', -100%, 0);\n.ant-popover-list-animation('right-top', 100%, 0);\n.ant-popover-list-animation('right-bottom', 100%, 0);\n"
  },
  {
    "path": "src/PopoverList/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 导航\n  order: 6\ntoc: 'content'\n---\n\n# PopoverList 气泡菜单\n\n点击元素，弹出气泡式的菜单。用于导航功能的气泡菜单唤起，通常用于收纳低频使用的功能。该功能只能通过导航栏上的图标激活。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-popover-list\": \"antd-mini/es/PopoverList/index\"\n#endif\n#if WECHAT\n  \"ant-popover-list\": \"antd-mini/PopoverList/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-popover-list\n  visible=\"{{visible}}\"\n  list=\"{{list}}\"\n  placement=\"bottom-right\"\n#if ALIPAY\n  onTapItem=\"handleTapItem\"\n  onVisibleChange=\"handleVisibleChange\"\n#endif\n#if WECHAT\n  bindtapitem=\"handleTapItem\"\n  bindvisiblechange=\"handleVisibleChange\"\n#endif\n>\n  <ant-button inline>点我</ant-button>\n</ant-popover-list>\n```\n\n```js\nPage({\n  data: {\n    visible: true,\n    list: [\n      { text: '扫一扫', icon: 'ScanningOutline', showBadge: true, id: 'scan', },\n      { text: '付钱/收钱', icon: 'ReceivePaymentOutline', showBadge: false, id: 'pay', },\n      { text: '乘车码', icon: 'TransportQRcodeOutline', showBadge: false, id: 'code', },\n      { text: '图片', iconImage: 'https://gw.alipayobjects.com/mdn/rms_ce4c6f/afts/img/A*XMCgSYx3f50AAAAAAAAAAABkARQnAQ', showBadge: false, id: 'image', },\n    ],\n  },\n  handleVisibleChange(visible, e) {\n    console.log(visible, e);\n#if ALIPAY\n    this.setData({ visible });\n#endif\n#if WECHAT\n    this.setData({ visible: visible.detail });\n#endif\n  },\n  handleTapItem(e, item) {\n    console.log(e, item);\n    this.setData({ visible: false });\n#if ALIPAY\n    my.showToast({ content: '点击列表', duration: 1000 });\n#endif\n#if WECHAT\n    wx.showToast({ title: '点击列表' });\n#endif\n  },\n});\n```\n\n### 气泡位置自适应\n\n> `autoAdjustOverflow` 属性，可以让气泡被遮挡时自动调整位置\n\n```xml\n<ant-popover-list\n  visible=\"{{true}}\"\n  list=\"{{list}}\"\n  autoAdjustOverflow=\"{{true}}\"\n>\n  <ant-button inline style=\"margin-top: 500px;\">气泡位置自适应</ant-button>\n</ant-popover-list>\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/PopoverList/index'></code>\n\n## API\n\n| 属性                          | 说明                                                                                                                                                                | 类型                                                                                                                         | 默认值 |\n| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | ------ |\n| autoAdjustOverflow            | 气泡被遮挡时的自动调整位置                                                                                                                                          | boolean                                                                                                                      | true   |\n| className                     | 类名                                                                                                                                                                | string                                                                                                                       | -      |\n| color                         | 背景颜色                                                                                                                                                            | string                                                                                                                       | -      |\n| contentClassName              | content 类名                                                                                                                                                        | string                                                                                                                       | -      |\n| contentStyle                  | content 样式                                                                                                                                                        | string                                                                                                                       | -      |\n| content                       | 内容                                                                                                                                                                | string \\| slot                                                                                                               | -      |\n| defaultVisible                | 默认是否显示                                                                                                                                                        | boolean                                                                                                                      | false  |\n| destroyOnClose                | 不可见时是否卸载内容                                                                                                                                                | boolean                                                                                                                      | false  |\n| maskClassName                 | 蒙层的类名                                                                                                                                                          | string                                                                                                                       | -      |\n| maskStyle                     | 蒙层的样式                                                                                                                                                          | string                                                                                                                       | -      |\n| placement                     | 气泡框位置，可选 `top`、`top-right`、`top-left`、`bottom`、`bottom-left`、`bottom-right`、`left`、`left-top`、`left-bottom`、`right`、`right-top` 或 `right-bottom` | string                                                                                                                       | top    |\n| showMask                      | 是否展示蒙层，为 true 时点击空白处可关闭 Popover                                                                                                                    | boolean                                                                                                                      | true   |\n| style                         | 样式                                                                                                                                                                | string                                                                                                                       | -      |\n| visible                       | 是否显示                                                                                                                                                            | boolean                                                                                                                      | -      |\n| #if ALIPAY onVisibleChange    | visible 变更时的回调                                                                                                                                                | (visible: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                          | -      |\n| #if ALIPAY onTapItem          | visible 变更时的回调                                                                                                                                                | (item: [PopoverListItem](#popoverlistitem), event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -      |\n| #if WECHAT bindvisiblechange | visible 变更时的回调                                                                                                                                                | (visible: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                          | -      |\n| #if WECHAT bindtapitem       | visible 变更时的回调                                                                                                                                                | (item: [PopoverListItem](#popoverlistitem), event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -      |\n\n### PopoverListItem\n\n| 属性      | 说明                                                    | 类型    | 默认值 |\n| --------- | ------------------------------------------------------- | ------- | ------ |\n| icon      | 菜单的 icon                                             | string  | -      |\n| iconImage | 菜单的 icon 的图片, 优先取 iconImage 没有再取 icon 字段 | string  | -      |\n| text      | 类名                                                    | string  | -      |\n| showBadge | 是否禁用                                                | boolean | false  |\n| id        | 右侧额外内容                                            | string  | -      |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                       | 默认值                                                                                                                    | 深色模式默认值                                                                                                            | 备注                     |\n| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------ |\n| --popover-list-content-bg    | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.93); color: #ffffff;\">rgba(0, 0, 0, 0.93)</div> | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.93); color: #ffffff;\">rgba(0, 0, 0, 0.93)</div> | Popover 列表内容背景颜色 |\n| --popover-list-content-color | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div>                         | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div>                         | Popover 列表内容颜色     |\n| --popover-list-badge-color   | <div style=\"width: 150px; height: 30px; background-color: #ff411c; color: #ffffff;\">#ff411c</div>                         | <div style=\"width: 150px; height: 30px; background-color: #ff411c; color: #ffffff;\">#ff411c</div>                         | Popover 列表徽章颜色     |\n|  --popover-list-item-bg      | <div style=\"width: 150px; height: 30px; background-color: #e5e5e5; color: #333333;\">#e5e5e5</div>                         | <div style=\"width: 150px; height: 30px; background-color: #444444; color: #ffffff;\">#444444</div>                         | Popover 列表内容文字颜色 |\n"
  },
  {
    "path": "src/PopoverList/index.ts",
    "content": "import mixinValue from '../mixins/value';\nimport { getInstanceBoundingClientRect } from '../_util/jsapi/get-instance-bounding-client-rect';\nimport { getSystemInfo } from '../_util/jsapi/get-system-info';\nimport { Component, getValueFromProps, triggerEvent } from '../_util/simply';\nimport { assertAilpayNativeNotSupport } from '../_util/support';\nimport { PopoverDefaultProps } from './props';\nimport { getPopoverStyle } from './utils';\n\nassertAilpayNativeNotSupport('PopoverList');\n\nComponent({\n  props: PopoverDefaultProps,\n  data: {\n    adjustedPlacement: '',\n    popoverContentStyle: '',\n    closing: false,\n  },\n  methods: {\n    getInstance() {\n      if (this.$id) {\n        return my;\n      }\n      return this;\n    },\n    onTapItem(e) {\n      const { item } = e.currentTarget.dataset;\n      triggerEvent(this, 'tapItem', item, e);\n    },\n    async updatePopover() {\n      const [placement, autoAdjustOverflow] = getValueFromProps(this, [\n        'placement',\n        'autoAdjustOverflow',\n      ]);\n      const [containerRect, childrenRect, contentRect, systemInfo] =\n        await Promise.all([\n          getInstanceBoundingClientRect(\n            this.getInstance(),\n            `#ant-popover-list-children${this.$id ? `-${this.$id}` : ''}`\n          ),\n          getInstanceBoundingClientRect(\n            this.getInstance(),\n            this.$id\n              ? `#ant-popover-list-children-${this.$id} > *`\n              : `#ant-popover-list-children-container`\n          ),\n          getInstanceBoundingClientRect(\n            this.getInstance(),\n            this.$id\n              ? `#ant-popover-list-content-${this.$id}`\n              : '#ant-popover-list-content'\n          ),\n          getSystemInfo(),\n        ]);\n\n      const { popoverContentStyle, adjustedPlacement } = getPopoverStyle(\n        placement,\n        autoAdjustOverflow,\n        {\n          containerRect,\n          childrenRect,\n          contentRect,\n          systemInfo,\n        }\n      );\n\n      this.setData({\n        popoverContentStyle,\n        adjustedPlacement,\n      });\n    },\n\n    onVisibleChange(e) {\n      /// #if ALIPAY\n      if (\n        !this.getValue() &&\n        e.target.id &&\n        e.target.id.indexOf('ant-popover-list-') === 0\n      ) {\n        return;\n      }\n      /// #endif\n      const value = !this.getValue();\n\n      if (!this.isControlled()) {\n        this.update(value);\n      }\n      triggerEvent(this, 'visibleChange', value, e);\n      if (!value) {\n        this.setData({ closing: true });\n      }\n    },\n    onAnimationEnd() {\n      if (this.data.closing) {\n        this.setData({ closing: false });\n      }\n    },\n  },\n\n  mixins: [\n    mixinValue({\n      valueKey: 'visible',\n      defaultValueKey: 'defaultVisible',\n      transformValue(value) {\n        if (value) {\n          this.updatePopover();\n        }\n        return {\n          needUpdate: true,\n          value,\n        };\n      },\n    }),\n  ],\n\n  /// #if ALIPAY\n  didUpdate(prevProps) {\n    const [placement, autoAdjustOverflow] = getValueFromProps(this, [\n      'placement',\n      'autoAdjustOverflow',\n    ]);\n    if (\n      (prevProps.placement !== placement ||\n        prevProps.autoAdjustOverflow !== autoAdjustOverflow) &&\n      this.getValue()\n    ) {\n      this.updatePopover();\n    }\n  },\n  /// #endif\n  /// #if WECHAT\n  observers: {\n    'placement, autoAdjustOverflow, mixin': function () {\n      if (this.getValue()) {\n        this.updatePopover();\n      }\n    },\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/PopoverList/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\nexport interface PopoverListItem {\n  /**\n   *  @description 菜单的icon\n   */\n  icon: string;\n  /**\n   *  @description 菜单的icon的图片, 优先取iconImage 没有再取icon字段\n   *  @default ''\n   */\n  iconImage: string;\n  /**\n   *  @description 菜单项的文案，如果没有则不展示该菜单\n   *  @default ''\n   */\n  text: string;\n  /**\n   *  @description 菜单项是否展示红点徽标\n   *  @default false\n   */\n  showBadge: boolean;\n  /**\n   *  @description 菜单项的唯一标识\n   *  @default ''\n   */\n  id: string;\n}\n/**\n * @description 气泡，内部配合 PopoverItem 使用。\n */\n\nexport interface IPopoverListProps extends IBaseProps {\n  /**\n   * @description 是否可见\n   * @default false\n   */\n  visible: boolean;\n  /**\n   * @description 默认是否可见\n   * @default false\n   */\n  defaultVisible: boolean;\n  /**\n   * @description 是否关闭后销毁内部元素\n   * @default false\n   */\n  destroyOnClose: boolean;\n  /**\n   * @description content区样式\n   */\n  contentStyle: string;\n  /**\n   * @description content类名\n   */\n  contentClassName: string;\n  /**\n   * @description content 内容\n   */\n  content?: string;\n  /**\n   * @description 蒙层类名\n   */\n  maskClassName: string;\n  /**\n   * @description 蒙层样式\n   */\n  maskStyle: string;\n  /**\n   * @description visible 变更时回调\n   */\n  onVisibleChange?: (visible: boolean, e: Record<string, any>) => void;\n  /**\n   * @description 点击列表项\n   */\n  onTapItem?: (item: PopoverListItem, e: Record<string, any>) => void;\n  /**\n   * @description 气泡框位置\n   */\n  placement:\n    | 'top'\n    | 'top-right'\n    | 'top-left'\n    | 'bottom'\n    | 'bottom-left'\n    | 'bottom-right'\n    | 'left'\n    | 'left-top'\n    | 'left-bottom'\n    | 'right'\n    | 'right-top'\n    | 'right-bottom';\n  /**\n   * @description 是否展示蒙层\n   * @default false\n   */\n  showMask: boolean;\n\n  /**\n   * @description 气泡被遮挡时自动调整位置\n   * @default true\n   */\n  autoAdjustOverflow: boolean;\n\n  /**\n   * @description 菜单列表数据\n   * @default []\n   */\n  list: PopoverListItem[];\n}\n\nexport const PopoverDefaultProps: Partial<IPopoverListProps> = {\n  visible: null,\n  defaultVisible: false,\n  destroyOnClose: false,\n  contentClassName: '',\n  contentStyle: '',\n  showMask: true,\n  placement: 'top',\n  autoAdjustOverflow: true,\n  maskClassName: '',\n  maskStyle: '',\n  content: '',\n  list: [],\n  onVisibleChange() {},\n  onTapItem() {},\n};\n"
  },
  {
    "path": "src/PopoverList/utils.ts",
    "content": "interface Rect {\n  left: number;\n  top: number;\n  right: number;\n  bottom: number;\n  width: number;\n  height: number;\n}\n\ninterface SystemInfo {\n  windowHeight: number;\n  windowWidth: number;\n}\n\nexport function getPopoverStyle(\n  placement: string,\n  autoAdjustOverflow: boolean,\n  size: {\n    containerRect: Rect;\n    childrenRect: Rect;\n    contentRect: Rect;\n    systemInfo: SystemInfo;\n  }\n) {\n  const { containerRect, childrenRect, contentRect, systemInfo } = size;\n  const left = childrenRect.left - containerRect.left;\n  const top = childrenRect.top - containerRect.top;\n  const bottom = containerRect.bottom - childrenRect.bottom;\n  const right = containerRect.right - childrenRect.right;\n  let adjustedPlacement = placement as string;\n  const arrowMargin = 12;\n\n  const contentRectWidth = contentRect.width + arrowMargin;\n  const contentRectHeight = contentRect.height + arrowMargin;\n\n  if (autoAdjustOverflow) {\n    if (adjustedPlacement === 'top') {\n      if (childrenRect.top - contentRectHeight < 0) {\n        adjustedPlacement = 'bottom';\n      }\n    } else if (adjustedPlacement === 'bottom') {\n      if (childrenRect.bottom + contentRectHeight > systemInfo.windowHeight) {\n        adjustedPlacement = 'top';\n      }\n    } else if (adjustedPlacement === 'left') {\n      if (childrenRect.left - contentRectWidth < 0) {\n        adjustedPlacement = 'right';\n      }\n    } else if (adjustedPlacement === 'right') {\n      if (childrenRect.right + contentRectWidth > systemInfo.windowWidth) {\n        adjustedPlacement = 'left';\n      }\n    } else if (adjustedPlacement === 'top-left') {\n      if (childrenRect.top - contentRectHeight < 0) {\n        adjustedPlacement = adjustedPlacement.replace('top', 'bottom');\n      }\n      if (childrenRect.left + contentRectWidth > systemInfo.windowWidth) {\n        adjustedPlacement = adjustedPlacement.replace('left', 'right');\n      }\n    } else if (adjustedPlacement === 'top-right') {\n      if (childrenRect.top - contentRectHeight < 0) {\n        adjustedPlacement = adjustedPlacement.replace('top', 'bottom');\n      }\n      if (childrenRect.right - contentRectWidth < 0) {\n        adjustedPlacement = adjustedPlacement.replace('right', 'left');\n      }\n    } else if (adjustedPlacement === 'bottom-left') {\n      if (childrenRect.bottom + contentRectHeight > systemInfo.windowHeight) {\n        adjustedPlacement = adjustedPlacement.replace('bottom', 'top');\n      }\n      if (childrenRect.left + contentRectWidth > systemInfo.windowWidth) {\n        adjustedPlacement = adjustedPlacement.replace('left', 'right');\n      }\n    } else if (adjustedPlacement === 'bottom-right') {\n      if (childrenRect.bottom + contentRectHeight > systemInfo.windowHeight) {\n        adjustedPlacement = adjustedPlacement.replace('bottom', 'top');\n      }\n      if (childrenRect.right - contentRectWidth < 0) {\n        adjustedPlacement = adjustedPlacement.replace('right', 'left');\n      }\n    } else if (adjustedPlacement === 'left-top') {\n      if (childrenRect.left - contentRectWidth < 0) {\n        adjustedPlacement = adjustedPlacement.replace('left', 'right');\n      }\n      if (childrenRect.top + contentRectHeight > systemInfo.windowHeight) {\n        adjustedPlacement = adjustedPlacement.replace('top', 'bottom');\n      }\n    } else if (adjustedPlacement === 'left-bottom') {\n      if (childrenRect.left - contentRectWidth < 0) {\n        adjustedPlacement = adjustedPlacement.replace('left', 'right');\n      }\n      if (childrenRect.bottom - contentRectHeight < 0) {\n        adjustedPlacement = adjustedPlacement.replace('bottom', 'top');\n      }\n    } else if (adjustedPlacement === 'right-top') {\n      if (childrenRect.right + contentRectWidth > systemInfo.windowWidth) {\n        adjustedPlacement = adjustedPlacement.replace('right', 'left');\n      }\n      if (childrenRect.top + contentRectHeight > systemInfo.windowHeight) {\n        adjustedPlacement = adjustedPlacement.replace('top', 'bottom');\n      }\n    } else if (adjustedPlacement === 'right-bottom') {\n      if (childrenRect.right + contentRectWidth > systemInfo.windowWidth) {\n        adjustedPlacement = adjustedPlacement.replace('right', 'left');\n      }\n      if (childrenRect.bottom - contentRectHeight < 0) {\n        adjustedPlacement = adjustedPlacement.replace('bottom', 'top');\n      }\n    }\n  }\n\n  let popoverContentStyle;\n  if (adjustedPlacement === 'top') {\n    popoverContentStyle = getStyle({\n      left: left + childrenRect.width / 2,\n      top: top - arrowMargin,\n    });\n  } else if (adjustedPlacement === 'bottom') {\n    popoverContentStyle = getStyle({\n      left: left + childrenRect.width / 2,\n      bottom: bottom - arrowMargin,\n    });\n  } else if (adjustedPlacement === 'left') {\n    popoverContentStyle = getStyle({\n      left: left - arrowMargin,\n      top: top + childrenRect.height / 2,\n    });\n  } else if (adjustedPlacement === 'right') {\n    popoverContentStyle = getStyle({\n      right: right - arrowMargin,\n      top: top + childrenRect.height / 2,\n    });\n  } else if (adjustedPlacement === 'top-left') {\n    popoverContentStyle = getStyle({\n      left,\n      top: top - arrowMargin,\n    });\n  } else if (adjustedPlacement === 'top-right') {\n    popoverContentStyle = getStyle({\n      right,\n      top: top - arrowMargin,\n    });\n  } else if (adjustedPlacement === 'bottom-left') {\n    popoverContentStyle = getStyle({\n      left,\n      bottom: bottom - arrowMargin,\n    });\n  } else if (adjustedPlacement === 'bottom-right') {\n    popoverContentStyle = getStyle({\n      right,\n      bottom: bottom - arrowMargin,\n    });\n  } else if (adjustedPlacement === 'left-top') {\n    popoverContentStyle = getStyle({\n      left: left - arrowMargin,\n      top,\n    });\n  } else if (adjustedPlacement === 'left-bottom') {\n    popoverContentStyle = getStyle({\n      left: left - arrowMargin,\n      bottom,\n    });\n  } else if (adjustedPlacement === 'right-top') {\n    popoverContentStyle = getStyle({\n      right: right - arrowMargin,\n      top,\n    });\n  } else if (adjustedPlacement === 'right-bottom') {\n    popoverContentStyle = getStyle({\n      right: right - arrowMargin,\n      bottom,\n    });\n  }\n\n  return {\n    popoverContentStyle,\n    adjustedPlacement,\n  };\n}\n\nfunction getStyle(obj) {\n  return Object.keys(obj)\n    .map((item) => `${item}: ${obj[item]}px`)\n    .join(';');\n}\n"
  },
  {
    "path": "src/PopoverList/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n// 蒙层\n@popover-mask: @color-product-mask;\n// 圆角\n@popover-radius: @corner-radius-md;\n\n@popover-content-width: 192 * @rpx;\n\n//content\n@popover-content-bg: var(--popover-list-content-bg, rgba(0, 0, 0, 0.93));\n@popover-content-color: var(--popover-list-content-color, @COLOR_TEXT_PRIMARY);\n@popover-list-item-bg: var(--popover-list-item-bg, @COLOR_BORDER);\n@popover-badge-color: var(--popover-list-badge-color, #ff411c);\n\n.popover-list-position(@translate-scale, @translate-x, @translate-y) {\n  transform: translate(@translate-x, @translate-y) scale(@translate-scale);\n}\n\n.popover-list-scale-animation(@position) {\n  @open-name: ~'ant-popover-list-open-@{position}';\n  animation-name: @open-name;\n  animation-duration: 300ms;\n  animation-timing-function: cubic-bezier(0.57, -0.22, 0, 1.2);\n  animation-fill-mode: forwards;\n}\n\n.popover-list-scale-animation-close(@position) {\n  @close-name: ~'ant-popover-list-close-@{position}';\n  animation-name: @close-name;\n  animation-duration: 200ms;\n  animation-timing-function: cubic-bezier(0.6, 0, 1, 0.6);\n  animation-fill-mode: forwards;\n}\n\n.ant-popover-list-animation(@position, @translate-x, @translate-y) {\n  @open-name: ~'ant-popover-list-open-@{position}';\n  @close-name: ~'ant-popover-list-close-@{position}';\n\n  @keyframes @open-name {\n    0% {\n      .popover-list-position(0.4, @translate-x, @translate-y);\n      opacity: 0;\n    }\n    100% {\n      .popover-list-position(1, @translate-x, @translate-y);\n      opacity: 1;\n    }\n  }\n  @keyframes @close-name {\n    0% {\n      .popover-list-position(1, @translate-x, @translate-y);\n      opacity: 1;\n    }\n    100% {\n      .popover-list-position(0.4, @translate-x, @translate-y);\n      opacity: 0;\n    }\n  }\n}\n"
  },
  {
    "path": "src/Popup/index.axml",
    "content": "<import-sjs\n  from=\"./index.sjs\"\n  name=\"utils\" />\n\n<view\n  a:if=\"{{ !destroyOnClose || visible || closing }}\"\n  class=\"ant-popup {{ className || '' }}\"\n  style=\"{{ zIndex ? 'z-index:' + zIndex : '' }};{{ style || '' }}\"\n  hidden=\"{{ !destroyOnClose && !visible && !closing }}\">\n  <view\n    a:if=\"{{ showMask }}\"\n    class=\"ant-popup-mask {{ maskClassName || '' }} {{ position }} {{ closing && !visible ? 'ant-popup-mask-closing' : '' }}\"\n    onTap=\"onTapMask\"\n    style=\"{{utils.getCloseStyle(animation, duration, maskStyle)}}\">\n    <slot name=\"mask\" />\n  </view>\n  <view\n    class=\"ant-popup-content ant-popup-{{ animationType }}-{{ position }} {{ closing ? 'ant-popup-' + animationType + '-' + position + '-close' : '' }}\"\n    style=\"{{ utils.getContentStyle(position, animation, duration, width, height) }}\"\n    onAnimationEnd=\"onAnimationEnd\">\n    <view a:if=\"{{ backgroundImage }}\" class=\"ant-popup-content-bg\" style=\"background-image: url({{backgroundImage}});\"/>\n    <!-- #if ALIPAY -->\n    <slot name=\"header\">\n    <!-- #endif -->\n      <view a:if=\"{{ title || showClose || showBack }}\" class=\"ant-popup-content-header\">\n        <view\n          class=\"ant-popup-content-header-icon ant-popup-content-header-icon-back\"\n          a:if=\"{{ showBack }}\"\n          onTap=\"onClickBack\">\n          <!-- #if ALIPAY -->\n          <slot name=\"header-back\">\n          <!-- #endif -->\n            <ant-icon\n              type=\"LeftOutline\" />\n          <!-- #if ALIPAY -->\n          </slot>\n          <!-- #endif -->\n        </view>\n        <view class=\"ant-popup-content-header-title\">\n          <!-- #if ALIPAY -->\n          <slot name=\"header-title\">\n          <!-- #endif -->\n            {{ title }}\n          <!-- #if ALIPAY -->\n          </slot>\n          <!-- #endif -->\n        </view>\n        <view\n          class=\"ant-popup-content-header-icon ant-popup-content-header-icon-close\"\n          a:if=\"{{ showClose }}\"\n          onTap=\"onClickCloseIcon\">\n            <!-- #if ALIPAY -->\n            <slot name=\"header-close\">\n            <!-- #endif -->\n              <ant-icon\n                type=\"CloseOutline\" />\n            <!-- #if ALIPAY -->\n            </slot>\n            <!-- #endif -->\n          </view>\n      </view>\n    <!-- #if ALIPAY -->\n    </slot>\n    <!-- #endif -->\n    <slot />\n    <slot\n      a:if=\"{{ isOldVersion }}\"\n      name=\"content\" />\n  </view>\n</view>\n"
  },
  {
    "path": "src/Popup/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Feedback\n  order: 12\ntoc: 'content'\n---\n\n# Popup\n\nSlides or pops up a custom content area from the screen. It is used to display pop-up windows, information prompts, selection input, switching, and other content. It supports multiple pop-up layers for overlay display.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-popup\": \"antd-mini/es/Popup/index\"\n#endif\n#if WECHAT\n  \"ant-popup\": \"antd-mini/Popup/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n> - `ant-popup` Components must pass `visible` Property controls the show/hide state.`position` Specifies the direction of occurrence, optional `top` `bottom` `left` `right`. The contents of the pop-up window are filled in the form of slots.\n> - `close` The event will be triggered when the icon is closed by clicking the upper right corner or when the layer is closed by clicking the layer.\n> - `clickBack` event is triggered when the back button in the upper left corner is clicked.\n\n```xml\n<ant-popup\n  visible=\"{{visible}}\"\n  position=\"bottom\"\n  title=\"title\"\n  height=\"{{250}}\"\n  width=\"{{250}}\"\n  showClose=\"{{true}}\"\n  showBack=\"{{true}}\"\n#if ALIPAY\n  onClickBack=\"onClickBack\"\n  onClose=\"handlePopupClose\"\n#endif\n#if WECHAT\n  bindclickback=\"onClickBack\"\n  bindclose=\"handlePopupClose\"\n#endif\n>\n  <view style=\"padding: 12px\">\n    A custom content area slides out or pops up from the screen to display pop-up windows, information prompts, selection input, switching, etc.\n  </view>\n</ant-popup>\n```\n\n```js\nPage({\n  data: {\n    visible: true,\n  },\n  onClickBack() {\n#if ALIPAY\n    my.showToast({ content: 'clicked icon', duration: 1000 });\n#endif\n#if WECHAT\n    wx.showToast({ content: 'clicked icon', duration: 1000 });\n#endif\n  },\n  handlePopupClose() {\n    this.setData({\n      visible: false,\n    });\n  },\n});\n```\n\n### Set background map\n\n> `backgroundImage` property, you can set the background for the entire bullet layer.\n\n```xml\n<ant-popup\n  visible=\"{{true}}\"\n  height=\"{{450}}\"\n  className=\"customize-top-image-popup\"\n  backgroundImage=\"https://mdn.alipayobjects.com/huamei_ahikbw/afts/img/A*jVxmQq4bhoUAAAAAAAAAAAAADiWwAQ/original\"\n  position=\"bottom\"\n  showClose=\"{{false}}\">\n  <view class=\"customize-content\">\n    Ea consectetur ipsum consequat exercitation laboris excepteur pariatur\n    excepteur labore dolor cillum tempor esse. Ad adipisicing nostrud fugiat eu\n    mollit. Proident nisi voluptate sunt ea laboris Lorem ullamco deserunt aute\n    incididunt cillum tempor duis est. Elit voluptate laboris laborum anim\n  </view>\n</ant-popup>\n```\n\n### Extra Long Content Scrolling\n\n> If the content in the pop-up window is too long and needs to support scrolling, please use [scroll-view](https://opendocs.alipay.com/mini/component/scroll-view?pathHash=8292073d) component and add the following properties:\n\n```xml\n<ant-popup\n  visible=\"{{true}}\"\n  position=\"bottom\"\n  showClose=\"{{true}}\"\n>\n  <scroll-view\n    scroll-y\n    style=\"padding: 12px; height: 300px\"\n    disable-lower-scroll=\"out-of-bounds\"\n    disable-upper-scroll=\"out-of-bounds\">\n    Ea consectetur ipsum consequat exercitation laboris excepteur pariatur\n    excepteur labore dolor cillum tempor esse. Ad adipisicing nostrud fugiat eu\n    mollit. Proident nisi voluptate sunt ea laboris Lorem ullamco deserunt aute\n    incididunt cillum tempor duis est. Elit voluptate laboris laborum anim\n    exercitation consequat laboris ad. Quis ad enim fugiat.\n  </scroll-view>\n</ant-popup>\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Popup/index'></code>\n\n## API\n\n| Property                         | Description                                                                                                                                                              | Type       | Default Value      |\n| ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- | ----------- |\n| animation                    | Whether to turn on transition animation                                                                                                                                                  | boolean    | true        |\n| animationType                | Animation type, optional`transform` `position`, the default is used`transform`Animation performance is better. However, when there is a fixed positioning or picker-view element inside the pop-up window, there may be a style problem, which can be switched`position`Solve | string     | `transform` |\n| className                    | Class Name                                                                                                                                                              | string     | -           |\n| title                        | Title                                                                                                                                                              | string     | ''          |\n| destroyOnClose               | Unload content when invisible                                                                                                                                                  | boolean    | false       |\n| duration                     | Transition animation duration, in milliseconds                                                                                                                                            | number     | 300         |\n| height                       | height, in position `top` or `bottom` When used, the unit is px. Optional, when not transmitted, it is highly adaptive according to the content area.                                                                        | number     | -           |\n| maskClassName                | Class name of the layer                                                                                                                                                        | string     | -           |\n| maskStyle                    | The style of the layer                                                                                                                                                        | string     | -           |\n| position                     | Pop-up window layout, optional`top` `bottom` `left` `right`                                                                                                                       | string     | `bottom`    |\n| showMask                     | Whether to show the layer                                                                                                                                                      | boolean    | true        |\n| style                        | Style                                                                                                                                                              | string     | -           |\n| visible                      | Whether to display                                                                                                                                                          | boolean    | false       |\n| width                        | The width, in position, is `left` or `right` unit px                                                                                                            | number     | -           |\n| zIndex                       | Pop-up Level                                                                                                                                                          | number     | 998         |\n| backgroundImage              | Background map of the bullet box                                                                                                                                                      | string     | -           |\n| showClose                    | Show icon with bullet box closed                                                                                                                                               | boolean    | false       |\n| showBack                     | Show the icon returned by the bullet box                                                                                                                                               | boolean    | false       |\n| #if ALIPAY onClose           | Click the mask to close and trigger the callback.                                                                                                                                            | () => void | -           |\n| #if ALIPAY onClickBack       | Click the back button to trigger the callback                                                                                                                                            | () => void | -           |\n| #if ALIPAY onAfterShow       | Trigger after full display                                                                                                                                                    | () => void | -           |\n| #if ALIPAY onAfterClose      | Trigger after full shutdown                                                                                                                                                    | () => void | -           |\n| #if WECHAT bindclose         | Click the mask to close and trigger the callback.                                                                                                                                            | () => void | -           |\n| #if WECHAT bindclickbackicon | Click the back button to trigger the callback                                                                                                                                            | () => void | -           |\n| #if WECHAT bindaftershow     | Trigger after full display                                                                                                                                                    | () => void | -           |\n| #if WECHAT bindafterclose    | Trigger after full shutdown                                                                                                                                                    | () => void | -           |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                       | Default Value                                                                                                                    | Dark Mode Default                                                                                                            | Remarks                     |\n| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------ |\n| --popover-list-content-bg    | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.93); color: #ffffff;\">rgba(0, 0, 0, 0.93)</div> | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.93); color: #ffffff;\">rgba(0, 0, 0, 0.93)</div> | Popover List Content Background Color |\n| --popover-list-content-color | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div>                         | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div>                         | Popover List Content Color     |\n| --popover-list-badge-color   | <div style=\"width: 150px; height: 30px; background-color: #ff411c; color: #ffffff;\">#ff411c</div>                         | <div style=\"width: 150px; height: 30px; background-color: #ff411c; color: #ffffff;\">#ff411c</div>                         | Popover List Badge Color     |\n| --popover-list-content-color | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div>                         | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div>                         | Popover list content text color |\n\n## FAQ\n\n### After Popup is opened, what if the page behind the layer can scroll?\n\nPreventing page scrolling after the layer is currently not effective in IDE and emulator, please debug on real machine.\n\n### Popup internal elements need to support scrolling how to deal?\n\nIf you need to scroll in the pop-up window, use the scroll-view component and add the following attributes:\n\n```html\n<popup height=\"{{250}}\" visible=\"{{visible}}\">\n  <scroll-view\n    scroll-y\n    disable-lower-scroll=\"out-of-bounds\"\n    disable-upper-scroll=\"out-of-bounds\"\n  >\n    ...你的内容...\n  </scroll-view>\n</popup>\n```\n\n### How to solve the abnormal display of picker-view inside Popup?\n\nPopup is passed by default. `display:none` Hidden, and picker-view cannot be placed in `display:none` in the components. There are two solutions:\n\n1. Add attribute on picker-view `a:if=\"{{popupVisible}}\"`, the picker-view is displayed when the Popup is displayed.\n2. Set on Popup `destroyOnClose=\"{{true}}\"`to unload content when the Popup is not visible.\n"
  },
  {
    "path": "src/Popup/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-icon\": \"../Icon/index\"\n  }\n}\n"
  },
  {
    "path": "src/Popup/index.less",
    "content": "@import (reference) './variable.less';\n\n@popupPrefix: ant-popup;\n\n.@{popupPrefix} {\n  position: fixed;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  z-index: 998;\n  touch-action: none;\n  &-top-image {\n    width: 100%;\n  }\n  &-mask {\n    width: 100%;\n    height: 100%;\n    background-color: @popup-mask-product;\n    .mask-appear();\n    &.center {\n      .mask-appear(300ms);\n    }\n    &-closing {\n      .mask-close();\n      &.center {\n        .mask-close(300ms);\n      }\n    }\n  }\n  &-content {\n    overflow: hidden;\n    position: fixed;\n    background: @popup-background;\n    color: @popup-color;\n    &-bg {\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      z-index: -1;\n      background-size: cover;\n      background-repeat: no-repeat;\n    }\n    &-header {\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      height: 114rpx;\n      position: relative;\n      &-title {\n        font-family: 500;\n        line-height: 50 * @rpx;\n        font-size: 36 * @rpx;\n        color: @popup-color;\n        text-align: center;\n      }\n      &-icon {\n        width: 48 * @rpx;\n        height: 48 * @rpx;\n        font-size: 42 * @rpx;\n        position: absolute;\n        top: 33 * @rpx;\n        color: @popup-assit-color;\n        display: flex;\n        justify-content: center;\n        align-items: center;\n        &-back {\n          left: 24 * @rpx;\n        }\n        &-close {\n          right: 24 * @rpx;\n        }\n      }\n    }\n  }\n  &-transform {\n    &-top {\n      top: 0;\n      left: 0;\n      right: 0;\n      transform: translateY(-100%);\n      .animation-transform(ant-popup-transform-top);\n      border-radius: 0 0 @popup-radius @popup-radius;\n      &-close {\n        transform: translateY(0);\n        .animation-transform-close(ant-popup-transform-top-close);\n      }\n    }\n    &-right {\n      top: 0;\n      right: 0;\n      bottom: 0;\n      transform: translateX(100%);\n      .animation-transform(ant-popup-transform-right);\n      &-close {\n        transform: translateX(0);\n        .animation-transform-close(ant-popup-transform-right-close);\n      }\n    }\n    &-bottom {\n      left: 0;\n      right: 0;\n      bottom: 0;\n      transform: translateY(100%);\n      .animation-transform(ant-popup-transform-bottom);\n      border-radius: @popup-radius @popup-radius 0 0;\n      &-close {\n        transform: translateY(0);\n        .animation-transform(ant-popup-transform-bottom-close);\n      }\n    }\n    &-left {\n      top: 0;\n      left: 0;\n      bottom: 0;\n      transform: translateX(-100%);\n      .animation-transform(ant-popup-transform-left);\n      &-close {\n        transform: translateX(0);\n        .animation-transform(ant-popup-transform-left-close);\n      }\n    }\n    &-center {\n      top: 50%;\n      left: 50%;\n      transform: translate3d(-50%, -50%, 0) scale(0.6);\n      opacity: 0;\n      .animation-center();\n      border-radius: @popup-radius;\n      background: none;\n      &-close {\n        transform: translate3d(-50%, -50%, 0) scale(1);\n        opacity: 1;\n        .animation-center-close();\n      }\n    }\n  }\n  &-position {\n    &-top {\n      left: 0;\n      right: 0;\n      top: -100%;\n      .animation-transform(ant-popup-position-top);\n      border-radius: 0 0 @popup-radius @popup-radius;\n      &-close {\n        top: 0;\n        .animation-transform(ant-popup-position-top-close);\n      }\n    }\n    &-right {\n      top: 0;\n      bottom: 0;\n      right: -100%;\n      .animation-transform(ant-popup-position-right);\n      &-close {\n        right: 0;\n        .animation-transform(ant-popup-position-right-close);\n      }\n    }\n    &-bottom {\n      left: 0;\n      right: 0;\n      bottom: -100%;\n      .animation-transform(ant-popup-position-bottom);\n      border-radius: @popup-radius @popup-radius 0 0;\n      &-close {\n        bottom: 0;\n        .animation-transform(ant-popup-position-bottom-close);\n      }\n    }\n    &-left {\n      top: 0;\n      bottom: 0;\n      left: -100%;\n      .animation-transform(ant-popup-position-left);\n      &-close {\n        left: 0;\n        .animation-transform(ant-popup-position-left-close);\n      }\n    }\n    &-center {\n      top: 50%;\n      left: 50%;\n      transform: translate3d(-50%, -50%, 0) scale(0.6);\n      opacity: 0;\n      .animation-position-center();\n      border-radius: @popup-radius;\n      background: none;\n      &-close {\n        transform: translate3d(-50%, -50%, 0) scale(1);\n        opacity: 1;\n        .animation-position-center-close();\n      }\n    }\n  }\n}\n\n@keyframes ant-popup-transform-top {\n  0% {\n    transform: translateY(-100%);\n  }\n  100% {\n    transform: translateY(0);\n  }\n}\n\n@keyframes ant-popup-transform-bottom {\n  0% {\n    transform: translateY(100%);\n  }\n  100% {\n    transform: translateY(0);\n  }\n}\n\n@keyframes ant-popup-transform-left {\n  0% {\n    transform: translateX(-100%);\n  }\n  100% {\n    transform: translateX(0);\n  }\n}\n\n@keyframes ant-popup-transform-right {\n  0% {\n    transform: translateX(100%);\n  }\n  100% {\n    transform: translateX(0);\n  }\n}\n\n@keyframes ant-popup-transform-center-scale {\n  0% {\n    transform: translate3d(-50%, -50%, 0) scale(0.6);\n  }\n  100% {\n    transform: translate3d(-50%, -50%, 0) scale(1);\n  }\n}\n\n@keyframes ant-popup-transform-center-opacity {\n  0% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n\n@keyframes ant-popup-transform-top-close {\n  0% {\n    transform: translateY(0);\n  }\n  100% {\n    transform: translateY(-100%);\n  }\n}\n\n@keyframes ant-popup-transform-bottom-close {\n  0% {\n    transform: translateY(0);\n  }\n  100% {\n    transform: translateY(100%);\n  }\n}\n\n@keyframes ant-popup-transform-left-close {\n  0% {\n    transform: translateX(0);\n  }\n  100% {\n    transform: translateX(-100%);\n  }\n}\n\n@keyframes ant-popup-transform-right-close {\n  0% {\n    transform: translateX(0);\n  }\n  100% {\n    transform: translateX(100%);\n  }\n}\n\n@keyframes ant-popup-transform-center-close-scale {\n  0% {\n    transform: translate3d(-50%, -50%, 0) scale(1);\n  }\n  100% {\n    transform: translate3d(-50%, -50%, 0) scale(0.6);\n  }\n}\n\n@keyframes ant-popup-transform-center-close-opacity {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n\n@keyframes ant-popup-position-top {\n  0% {\n    top: -100%;\n  }\n  100% {\n    top: 0;\n  }\n}\n\n@keyframes ant-popup-position-bottom {\n  0% {\n    bottom: -100%;\n  }\n  100% {\n    bottom: 0;\n  }\n}\n\n@keyframes ant-popup-position-left {\n  0% {\n    left: -100%;\n  }\n  100% {\n    left: 0;\n  }\n}\n\n@keyframes ant-popup-position-right {\n  0% {\n    right: -100%;\n  }\n  100% {\n    right: 0;\n  }\n}\n\n@keyframes ant-popup-position-center-scale {\n  0% {\n    transform: translate3d(-50%, -50%, 0) scale(0.6);\n  }\n  100% {\n    transform: translate3d(-50%, -50%, 0) scale(1);\n  }\n}\n\n@keyframes ant-popup-position-center-opacity {\n  0% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n\n@keyframes ant-popup-position-top-close {\n  0% {\n    top: 0;\n  }\n  100% {\n    top: -100%;\n  }\n}\n\n@keyframes ant-popup-position-bottom-close {\n  0% {\n    bottom: 0;\n  }\n  100% {\n    bottom: -100%;\n  }\n}\n\n@keyframes ant-popup-position-left-close {\n  0% {\n    left: 0;\n  }\n  100% {\n    left: -100%;\n  }\n}\n\n@keyframes ant-popup-position-right-close {\n  0% {\n    right: 0;\n  }\n  100% {\n    right: -100%;\n  }\n}\n\n@keyframes ant-popup-position-center-close-scale {\n  0% {\n    transform: translate3d(-50%, -50%, 0) scale(1);\n  }\n  100% {\n    transform: translate3d(-50%, -50%, 0) scale(0.6);\n  }\n}\n\n@keyframes ant-popup-position-center-close-opacity {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n\n@keyframes ant-popup-mask-appear {\n  0% {\n    background-color: @popup-mask-close-bg;\n  }\n  100% {\n    background-color: @popup-mask-product;\n  }\n}\n\n@keyframes ant-popup-mask-close {\n  0% {\n    background-color: @popup-mask-product;\n  }\n  100% {\n    background-color: @popup-mask-close-bg;\n  }\n}\n"
  },
  {
    "path": "src/Popup/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 反馈引导\n  order: 12\ntoc: 'content'\n---\n\n# Popup 弹出层\n\n从屏幕滑出或弹出一块自定义内容区。用于展示弹窗、信息提示、选择输入、切换等内容，支持多个弹出层叠加展示。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-popup\": \"antd-mini/es/Popup/index\"\n#endif\n#if WECHAT\n  \"ant-popup\": \"antd-mini/Popup/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n> - `ant-popup` 组件必须通过 `visible` 属性控制显示/隐藏状态。`position` 指定出现方向，可选 `top` `bottom` `left` `right`。弹窗中的内容通过插槽的形式填入。\n> - `close` 事件会在点击右上角关闭 icon 或点击蒙层关闭时触发。\n> - `clickBack` 事件会在点击左上角返回按钮时触发。\n\n```xml\n<ant-popup\n  visible=\"{{visible}}\"\n  position=\"bottom\"\n  title=\"title\"\n  height=\"{{250}}\"\n  width=\"{{250}}\"\n  showClose=\"{{true}}\"\n  showBack=\"{{true}}\"\n#if ALIPAY\n  onClickBack=\"onClickBack\"\n  onClose=\"handlePopupClose\"\n#endif\n#if WECHAT\n  bindclickback=\"onClickBack\"\n  bindclose=\"handlePopupClose\"\n#endif\n>\n  <view style=\"padding: 12px\">\n    从屏幕滑出或弹出一块自定义内容区，用于展示弹窗、信息提示、选择输入、切换等内容。\n  </view>\n</ant-popup>\n```\n\n```js\nPage({\n  data: {\n    visible: true,\n  },\n  onClickBack() {\n#if ALIPAY\n    my.showToast({ content: 'clicked icon', duration: 1000 });\n#endif\n#if WECHAT\n    wx.showToast({ content: 'clicked icon', duration: 1000 });\n#endif\n  },\n  handlePopupClose() {\n    this.setData({\n      visible: false,\n    });\n  },\n});\n```\n\n### 设置背景图\n\n> `backgroundImage` 属性，可以为整个弹层设置背景。\n\n```xml\n<ant-popup\n  visible=\"{{true}}\"\n  height=\"{{450}}\"\n  className=\"customize-top-image-popup\"\n  backgroundImage=\"https://mdn.alipayobjects.com/huamei_ahikbw/afts/img/A*jVxmQq4bhoUAAAAAAAAAAAAADiWwAQ/original\"\n  position=\"bottom\"\n  showClose=\"{{false}}\">\n  <view class=\"customize-content\">\n    Ea consectetur ipsum consequat exercitation laboris excepteur pariatur\n    excepteur labore dolor cillum tempor esse. Ad adipisicing nostrud fugiat eu\n    mollit. Proident nisi voluptate sunt ea laboris Lorem ullamco deserunt aute\n    incididunt cillum tempor duis est. Elit voluptate laboris laborum anim\n  </view>\n</ant-popup>\n```\n\n### 超长内容滚动\n\n> 如果弹窗内内容过长需要支持滚动，请使用 [scroll-view](https://opendocs.alipay.com/mini/component/scroll-view?pathHash=8292073d) 组件，并添加以下属性：\n\n```xml\n<ant-popup\n  visible=\"{{true}}\"\n  position=\"bottom\"\n  showClose=\"{{true}}\"\n>\n  <scroll-view\n    scroll-y\n    style=\"padding: 12px; height: 300px\"\n    disable-lower-scroll=\"out-of-bounds\"\n    disable-upper-scroll=\"out-of-bounds\">\n    Ea consectetur ipsum consequat exercitation laboris excepteur pariatur\n    excepteur labore dolor cillum tempor esse. Ad adipisicing nostrud fugiat eu\n    mollit. Proident nisi voluptate sunt ea laboris Lorem ullamco deserunt aute\n    incididunt cillum tempor duis est. Elit voluptate laboris laborum anim\n    exercitation consequat laboris ad. Quis ad enim fugiat.\n  </scroll-view>\n</ant-popup>\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Popup/index'></code>\n\n## API\n\n| 属性                         | 说明                                                                                                                                                              | 类型       | 默认值      |\n| ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- | ----------- |\n| animation                    | 是否开启过渡动画                                                                                                                                                  | boolean    | true        |\n| animationType                | 动画类型，可选`transform` `position`，默认使用`transform`动画性能更好。但当弹窗内部存在 fixed 定位或者 picker-view 元素时可能存在样式问题，可切换为`position`解决 | string     | `transform` |\n| className                    | 类名                                                                                                                                                              | string     | -           |\n| title                        | 标题                                                                                                                                                              | string     | ''          |\n| destroyOnClose               | 不可见时卸载内容                                                                                                                                                  | boolean    | false       |\n| duration                     | 过渡动画时长，单位毫秒                                                                                                                                            | number     | -           |\n| height                       | 高度，在 position 为 `top` 或 `bottom` 时使用，单位 px。可选，不传时根据内容区高度自适应。                                                                        | number     | -           |\n| maskClassName                | 蒙层的类名                                                                                                                                                        | string     | -           |\n| maskStyle                    | 蒙层的样式                                                                                                                                                        | string     | -           |\n| position                     | 弹窗布局，可选`top` `bottom` `left` `right`                                                                                                                       | string     | `bottom`    |\n| showMask                     | 是否展示蒙层                                                                                                                                                      | boolean    | true        |\n| style                        | 样式                                                                                                                                                              | string     | -           |\n| visible                      | 是否显示                                                                                                                                                          | boolean    | false       |\n| width                        | 宽度, 在 position 为 `left` 或 `right` 时使用，单位 px                                                                                                            | number     | -           |\n| zIndex                       | 弹窗层级                                                                                                                                                          | number     | 998         |\n| backgroundImage              | 弹框的背景图                                                                                                                                                      | string     | -           |\n| showClose                    | 展示弹框关闭的 icon                                                                                                                                               | boolean    | false       |\n| showBack                     | 展示弹框返回的 icon                                                                                                                                               | boolean    | false       |\n| #if ALIPAY onClose           | 点击蒙层关闭，触发回调                                                                                                                                            | () => void | -           |\n| #if ALIPAY onClickBack       | 点击返回按钮，触发回调                                                                                                                                            | () => void | -           |\n| #if ALIPAY onAfterShow       | 完全展示后触发                                                                                                                                                    | () => void | -           |\n| #if ALIPAY onAfterClose      | 完全关闭后触发                                                                                                                                                    | () => void | -           |\n| #if WECHAT bindclose         | 点击蒙层关闭，触发回调                                                                                                                                            | () => void | -           |\n| #if WECHAT bindclickbackicon | 点击返回按钮，触发回调                                                                                                                                            | () => void | -           |\n| #if WECHAT bindaftershow     | 完全展示后触发                                                                                                                                                    | () => void | -           |\n| #if WECHAT bindafterclose    | 完全关闭后触发                                                                                                                                                    | () => void | -           |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                       | 默认值                                                                                                                    | 深色模式默认值                                                                                                            | 备注                     |\n| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------ |\n| --popover-list-content-bg    | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.93); color: #ffffff;\">rgba(0, 0, 0, 0.93)</div> | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.93); color: #ffffff;\">rgba(0, 0, 0, 0.93)</div> | Popover 列表内容背景颜色 |\n| --popover-list-content-color | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div>                         | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div>                         | Popover 列表内容颜色     |\n| --popover-list-badge-color   | <div style=\"width: 150px; height: 30px; background-color: #ff411c; color: #ffffff;\">#ff411c</div>                         | <div style=\"width: 150px; height: 30px; background-color: #ff411c; color: #ffffff;\">#ff411c</div>                         | Popover 列表徽章颜色     |\n| --popover-list-content-color | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div>                         | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div>                         | Popover 列表内容文字颜色 |\n\n## FAQ\n\n### Popup 打开后，蒙层后面的页面能滚动怎么办？\n\n阻止蒙层后页面滚动目前在 IDE 和模拟器不生效，请在真机上调试。\n\n### Popup 内部元素需要支持滚动怎么处理？\n\n如果弹窗内需要滚动，请使用 scroll-view 组件，并添加以下属性：\n\n```html\n<popup height=\"{{250}}\" visible=\"{{visible}}\">\n  <scroll-view\n    scroll-y\n    disable-lower-scroll=\"out-of-bounds\"\n    disable-upper-scroll=\"out-of-bounds\"\n  >\n    ...你的内容...\n  </scroll-view>\n</popup>\n```\n\n### Popup 内部的 picker-view 显示异常怎么解决？\n\nPopup 默认是通过 `display:none` 隐藏的，而 picker-view 不能放到 `display:none` 的组件里。有以下两种解决方式：\n\n1. 在 picker-view 上添加属性 `a:if=\"{{popupVisible}}\"`，在 Popup 显示时再显示 picker-view。\n2. 在 Popup 上设置 `destroyOnClose=\"{{true}}\"`，在 Popup 不可见时卸载内容。\n"
  },
  {
    "path": "src/Popup/index.sjs.ts",
    "content": "function getContentStyle(position, animation, duration, width, height) {\n  let style = '';\n  if (animation) {\n    if (duration) {\n      style += `-webkit-animation-duration:${duration}ms; animation-duration:${duration}ms;`;\n    }\n  } else {\n    style += `-webkit-animation-duration:0ms; animation-duration:0ms; animation-delay:0ms;`;\n  }\n  if (position === 'top' || position === 'bottom') {\n    if (typeof height !== 'undefined' && height !== null) {\n      style += `height:${height}px`;\n    }\n  }\n  if (position === 'left' || position === 'right') {\n    if (typeof width !== 'undefined' && width !== null) {\n      style += `width:${width}px`;\n    }\n  }\n  return style;\n}\n\nfunction getCloseStyle(animation, duration, maskStyle) {\n  let style = '';\n  if (animation) {\n    if (duration) {\n      style += `-webkit-animation-duration:${duration}ms; animation-duration:${duration}ms;`;\n    }\n  } else {\n    style += `-webkit-animation-duration:0ms; animation-duration:0ms; animation-delay:0ms;`;\n  }\n  if (maskStyle) {\n    style += maskStyle;\n  }\n  return style;\n}\n\nexport default { getContentStyle, getCloseStyle };\n"
  },
  {
    "path": "src/Popup/index.ts",
    "content": "import { isOldSDKVersion } from '../_util/platform';\nimport {\n  Component,\n  getValueFromProps,\n  triggerEventOnly,\n} from '../_util/simply';\nimport { PopupDefaultProps } from './props';\n\nconst isOldVersion = isOldSDKVersion();\n\nComponent({\n  props: PopupDefaultProps,\n  data: {\n    closing: false,\n    isOldVersion,\n  },\n  methods: {\n    onClickCloseIcon() {\n      const { closing } = this.data;\n      if (closing) {\n        return;\n      }\n      triggerEventOnly(this, 'close');\n    },\n    onClickBack() {\n      triggerEventOnly(this, 'clickBack');\n    },\n    onTapMask() {\n      const { closing } = this.data;\n      if (closing) {\n        return;\n      }\n      triggerEventOnly(this, 'close');\n    },\n    onAnimationEnd() {\n      const { closing } = this.data;\n      if (closing) {\n        this.setData({ closing: false });\n      }\n      const [visible, duration, animation] = getValueFromProps(this, [\n        'visible',\n        'duration',\n        'animation',\n      ]);\n      const enableAnimation =\n        animation && (duration > 0 || typeof duration !== 'number');\n      if (enableAnimation) {\n        triggerEventOnly(this, visible ? 'afterShow' : 'afterClose');\n      }\n    },\n  },\n\n  /// #if ALIPAY\n  async deriveDataFromProps(nextProps) {\n    const [visible, duration, animation] = getValueFromProps(this, [\n      'visible',\n      'duration',\n      'animation',\n    ]);\n    const enableAnimation =\n      animation && (duration > 0 || typeof duration !== 'number');\n    if (\n      Boolean(nextProps.visible) !== Boolean(visible) &&\n      enableAnimation &&\n      !nextProps.visible &&\n      !this.data.closing\n    ) {\n      this.setData({ closing: true });\n    }\n  },\n  didUpdate(prevProps) {\n    const [visible, duration, animation] = getValueFromProps(this, [\n      'visible',\n      'duration',\n      'animation',\n    ]);\n    const enableAnimation =\n      animation && (duration > 0 || typeof duration !== 'number');\n    if (prevProps.visible !== visible && !enableAnimation) {\n      triggerEventOnly(this, visible ? 'afterShow' : 'afterClose');\n    }\n  },\n  /// #endif\n  /// #if WECHAT\n  observers: {\n    '**': function (data) {\n      const prevData = this._prevData || this.data;\n      this._prevData = { ...data };\n      const { visible, duration, animation, closing } = data;\n      const enableAnimation =\n        animation && (duration > 0 || typeof duration !== 'number');\n      if (\n        enableAnimation &&\n        prevData.visible !== data.visible &&\n        !visible &&\n        !closing\n      ) {\n        this.setData({ closing: true });\n      }\n      if (prevData.visible !== data.visible && !enableAnimation) {\n        triggerEventOnly(this, visible ? 'afterShow' : 'afterClose');\n      }\n    },\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/Popup/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n/**\n * @description 弹窗，可在其中加入具体内容，展示更多信息供用户使用。\n */\nexport interface IPopupProps extends IBaseProps {\n  /**\n   * @description 是否显示\n   * @default false\n   */\n  visible: boolean;\n  /**\n   * @description 标题\n   * @default ''\n   */\n  title?: string;\n  /**\n   * @description 是否关闭后销毁内部元素\n   * @default false\n   */\n  destroyOnClose: boolean;\n  /**\n   * @description 是否展示蒙层\n   * @default true\n   */\n  showMask: boolean;\n\n  /**\n   * @description 弹窗布局\n   * @default \"bottom\"\n   */\n  position: 'center' | 'top' | 'bottom' | 'left' | 'right';\n  /**\n   * @description 是否开启过渡动画\n   */\n  animation: boolean;\n  /**\n   * @description  动画类型\n   * @default \"transform\"\n   */\n  animationType: 'transform' | 'position';\n  /**\n   * @description 过渡动画时长，单位毫秒\n   */\n  duration?: number;\n  /**\n   * @description 内容区高度，单位px\n   */\n  height: number;\n  /**\n   * @description 内容区宽度，单位px\n   */\n  width: number;\n  /**\n   * @description 遮罩层类名\n   */\n  maskClassName: string;\n  /**\n   * @description 遮罩层样式\n   */\n  maskStyle: string;\n\n  zIndex: number;\n\n  /**\n   * @description 展示弹框关闭的icon\n   * @default false\n   */\n  showClose: boolean;\n  /**\n   * @description 展示弹框返回的icon\n   * @default false\n   */\n  showBack: boolean;\n  /**\n   * @description 弹框的背景图\n   */\n  backgroundImage: string;\n  /**\n   * @description 关闭时回调\n   */\n  onClose?: () => void;\n  /**\n   * @description 完全打开时回调\n   */\n  onAfterShow?: () => void;\n  /**\n   * @description 完全关闭时回调\n   */\n  onAfterClose?: () => void;\n  /**\n   * @description 点击关闭icon时回调\n   */\n  onClickBack?: () => void;\n}\n\nexport const PopupDefaultProps: Partial<IPopupProps> = {\n  visible: false,\n  title: '',\n  destroyOnClose: false,\n  backgroundImage: '',\n  showMask: true,\n  showClose: false,\n  showBack: false,\n  position: 'bottom',\n  // 是否开启动画\n  animation: true,\n  animationType: 'transform',\n  // 动画持续时间\n  duration: null,\n  height: null,\n  width: null,\n  maskClassName: '',\n  maskStyle: '',\n  // 弹窗层级\n  zIndex: 998,\n};\n"
  },
  {
    "path": "src/Popup/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n// popup 背景色\n@popup-background: var(--popup-background, @COLOR_CARD);\n// 产品蒙层\n@popup-mask-product: @color-product-mask;\n// popup 圆角\n@popup-radius: 48 * @rpx;\n\n@popup-color: var(--popup-color, @COLOR_TEXT_PRIMARY);\n\n@popup-assit-color: var(--popup-assit-color, @COLOR_TEXT_ASSIST);\n\n@popup-mask-close-bg: var(--popup-mask-close-bg, @COLOR_BLACK_FADED);\n\n.mask-appear(@duration: 400ms) {\n  animation-fill-mode: forwards;\n  animation-duration: @duration;\n  animation-timing-function: cubic-bezier(0.35, 0, 0.65, 1);\n  animation-name: ant-popup-mask-appear;\n}\n\n.mask-close(@duration: 400ms) {\n  animation-delay: 100ms;\n  animation-fill-mode: forwards;\n  animation-duration: @duration;\n  animation-timing-function: cubic-bezier(0.35, 0, 0.65, 1);\n  animation-name: ant-popup-mask-close;\n}\n\n.animation-transform(@name, @duration: 300ms) {\n  animation-fill-mode: forwards;\n  animation-name: @name;\n  animation-delay: 100ms;\n  animation-duration: @duration;\n  animation-timing-function: cubic-bezier(0, 0.4, 0, 1);\n}\n\n.animation-transform-close(@name, @duration: 300ms) {\n  animation-fill-mode: forwards;\n  animation-name: @name;\n  animation-duration: @duration;\n  animation-timing-function: cubic-bezier(0.6, 0, 1, 0.6);\n}\n\n.animation-center() {\n  animation-fill-mode: forwards;\n  animation-name: ant-popup-transform-center-scale,\n    ant-popup-transform-center-opacity;\n  animation-delay: 100ms, 100ms;\n  animation-duration: 300ms, 200ms;\n  animation-timing-function: cubic-bezier(0.57, -0.22, 0, 1.2),\n    cubic-bezier(0.35, 0, 0.65, 1);\n}\n\n.animation-center-close() {\n  animation-fill-mode: forwards;\n  animation-name: ant-popup-transform-center-close-scale,\n    ant-popup-transform-center-close-opacity;\n  animation-duration: 300ms, 200ms;\n  animation-timing-function: cubic-bezier(0.6, 0, 1, 0.6),\n    cubic-bezier(0.35, 0, 0.65, 1);\n}\n\n.animation-position-center() {\n  animation-fill-mode: forwards;\n  animation-name: ant-popup-position-center-scale,\n    ant-popup-position-center-opacity;\n  animation-delay: 100ms, 100ms;\n  animation-duration: 300ms, 200ms;\n  animation-timing-function: cubic-bezier(0.57, -0.22, 0, 1.2),\n    cubic-bezier(0.35, 0, 0.65, 1);\n}\n\n.animation-position-center-close() {\n  animation-fill-mode: forwards;\n  animation-name: ant-popup-position-center-close-scale,\n    ant-popup-position-center-close-opacity;\n  animation-duration: 300ms, 200ms;\n  animation-timing-function: cubic-bezier(0.6, 0, 1, 0.6),\n    cubic-bezier(0.35, 0, 0.65, 1);\n}\n"
  },
  {
    "path": "src/Postscript/index.axml",
    "content": "<view class=\"ant-postscript {{className}}\" style=\"{{style}}\">\n  <view class=\"ant-postscript-title\" a:if=\"{{title}}\">\n    {{title}}\n  </view>\n\n  <view class=\"ant-postscript-input\">\n    <ant-input\n      value=\"{{content}}\"\n      maxLength=\"{{maxLength}}\"\n      controlled=\"{{ true }}\"\n      allowClear\n      placeholder=\"{{placeholder}}\"\n      placeholderClassName=\"ant-postscript-input-placeholder {{placeholderClassName}}\"\n      onChange=\"handleInput\"\n    />\n  </view>\n\n  <scroll-view\n    class=\"ant-postscript-quick\"\n    a:if=\"{{quickInputs && quickInputs.length}}\"\n    enable-flex=\"true\"\n    scroll-x=\"{{true}}\"\n  >\n    <view\n      class=\"ant-postscript-quick-item\"\n      a:for=\"{{quickInputs}}\"\n      data-value=\"{{item}}\"\n      onTap=\"handleQuickInput\"\n    >\n      {{item}}\n    </view>\n  </scroll-view>\n</view>\n"
  },
  {
    "path": "src/Postscript/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Bizness Components\n  order: 15\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Postscript\n\nUse when additional notes need to be added below the form or content.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-postscript\": \"antd-mini/es/Postscript/index\"\n#endif\n#if WECHAT\n  \"ant-postscript\": \"antd-mini/Postscript/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic Usage\n\n<code src='../../demo/pages/Postscript/index'></code>\n\n## API\n\n### Property\n\n| Property                  | Description             | Type                    | Default Value            |\n| --------------------- | ---------------- | ----------------------- | ----------------- |\n| className             | Class Name             | string                  | -                 |\n| style                 | Style             | string                  | -                 |\n| title                 | Title             | string                  | -                 |\n| maxLength             | Maximum input length     | number                  | Infinity          |\n| quickInputs           | Quick Input Options     | string[]                | []                |\n| placeholder           | Placeholder text       | string                  | \"Bring a word to TA ~' |\n| placeholderClassName  | Placeholder class name       | string                  | -                 |\n| combineSymbol         | Quick Input Connection Symbol | string                  | -                 |\n| #if ALIPAY onChange   | Callback when content changes | (value: string) => void | -                 |\n| #if WECHAT bindchange | Callback when content changes | (value: string) => void | -                 |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                          | Light Mode Default                                                                                    | Dark Mode Default                                                                                    | Remarks         |\n| ------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------ |\n| --postscript-background-color   | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333;\">#ffffff</div>    | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | Background Color     |\n| --postscript-title-color        | <div style=\"width: 150px; height: 30px; background-color: #333; color: #ffffff;\">#333</div>       | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | Title Color     |\n| --postscript-input-color        | <div style=\"width: 150px; height: 30px; background-color: #333; color: #ffffff;\">#333</div>       | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | Enter text color |\n| --postscript-caret-color        | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | caret color   |\n| --postscript-placeholder-color  | <div style=\"width: 150px; height: 30px; background-color: #cccccc; color: #ffffff;\">#cccccc</div> | <div style=\"width: 150px; height: 30px; background-color: #474747; color: #ffffff;\">#474747</div> | Placeholder color   |\n| --postscript-quick-text-color   | <div style=\"width: 150px; height: 30px; background-color: #666; color: #ffffff;\">#666</div>       | <div style=\"width: 150px; height: 30px; background-color: #808080; color: #ffffff;\">#808080</div> | Shortcut Text Color |\n| --postscript-quick-border-color | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #333;\">#eeeeee</div>    | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #ffffff;\">#2b2b2b</div> | Quick border color |\n\n## FAQ\n\n### How do I use the shortcut input stitching function?\n\nSet the combineSymbol attribute to the required connection symbol (such as \"\" or space), and click the shortcut input option to automatically splice with the existing content.\n\nIf you need the shortcut input content to overwrite the existing content, remove the combineSymbol attribute.\n"
  },
  {
    "path": "src/Postscript/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-input\": \"../Input/index\"\n  }\n}\n"
  },
  {
    "path": "src/Postscript/index.less",
    "content": "@import (reference) './variable.less';\n@import (reference) '../style/mixins/hairline.less';\n\n@prefixCls: ant-postscript;\n\n.@{prefixCls} {\n  background: @postscript-background-color;\n  padding: @v-spacing-standard;\n\n  &-title {\n    font-size: @font-size-subtitle;\n    color: @postscript-title-color;\n    margin-bottom: @v-spacing-standard;\n  }\n\n  &-input {\n    position: relative;\n    margin-bottom: @v-spacing-standard;\n    padding: @v-spacing-standard 0;\n    .hairline('bottom', @postscript-quick-border-color);\n    .ant-input-content {\n      font-size: @font-size-subtitle;\n      color: @postscript-input-color;\n      caret-color: @postscript-caret-color;\n    }\n    &-placeholder {\n      font-size: @font-size-content;\n      color: @postscript-placeholder-color;\n    }\n  }\n\n  &-quick {\n    display: flex;\n\n    .ant-postscript-quick-item:last-child {\n      margin-right: 0;\n    }\n    &-item {\n      margin-right: @h-spacing-mini;\n      flex-shrink: 0;\n      padding: @h-spacing-small @h-spacing-standard;\n      border-radius: @corner-radius-circle;\n      font-size: @font-size-content;\n      color: @postscript-quick-text-color;\n      /// #if WECHAT\n      height: fit-content;\n      /// #endif\n      .hairline-radius(@postscript-quick-border-color, @corner-radius-circle);\n\n      &:active {\n        opacity: 0.7;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/Postscript/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 业务组件\n  order: 15\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Postscript 资金附言组件\n\n需要在表单或内容下方添加补充说明时使用。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-postscript\": \"antd-mini/es/Postscript/index\"\n#endif\n#if WECHAT\n  \"ant-postscript\": \"antd-mini/Postscript/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基础用法\n\n<code src='../../demo/pages/Postscript/index'></code>\n\n## API\n\n### 属性\n\n| 属性                  | 说明             | 类型                    | 默认值            |\n| --------------------- | ---------------- | ----------------------- | ----------------- |\n| className             | 类名             | string                  | -                 |\n| style                 | 样式             | string                  | -                 |\n| title                 | 标题             | string                  | -                 |\n| maxLength             | 最大输入长度     | number                  | Infinity          |\n| quickInputs           | 快捷输入选项     | string[]                | []                |\n| placeholder           | 占位符文本       | string                  | '给 TA 带句话吧~' |\n| placeholderClassName  | 占位符类名       | string                  | -                 |\n| combineSymbol         | 快捷输入连接符号 | string                  | -                 |\n| #if ALIPAY onChange   | 内容变化时的回调 | (value: string) => void | -                 |\n| #if WECHAT bindchange | 内容变化时的回调 | (value: string) => void | -                 |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                          | 浅色模式默认值                                                                                    | 深色模式默认值                                                                                    | 备注         |\n| ------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------ |\n| --postscript-background-color   | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333;\">#ffffff</div>    | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | 背景颜色     |\n| --postscript-title-color        | <div style=\"width: 150px; height: 30px; background-color: #333; color: #ffffff;\">#333</div>       | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | 标题颜色     |\n| --postscript-input-color        | <div style=\"width: 150px; height: 30px; background-color: #333; color: #ffffff;\">#333</div>       | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | 输入文字颜色 |\n| --postscript-caret-color        | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | 插入符颜色   |\n| --postscript-placeholder-color  | <div style=\"width: 150px; height: 30px; background-color: #cccccc; color: #ffffff;\">#cccccc</div> | <div style=\"width: 150px; height: 30px; background-color: #474747; color: #ffffff;\">#474747</div> | 占位符颜色   |\n| --postscript-quick-text-color   | <div style=\"width: 150px; height: 30px; background-color: #666; color: #ffffff;\">#666</div>       | <div style=\"width: 150px; height: 30px; background-color: #808080; color: #ffffff;\">#808080</div> | 快捷文本颜色 |\n| --postscript-quick-border-color | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #333;\">#eeeeee</div>    | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #ffffff;\">#2b2b2b</div> | 快捷边框颜色 |\n\n## FAQ\n\n### 如何使用快捷输入拼接功能？\n\n设置 combineSymbol 属性为需要的连接符号(如 \"+\" 或空格),点击快捷输入选项时会自动与已有内容拼接。\n\n如果需要快捷输入内容覆盖已有内容,请移除 combineSymbol 属性。\n"
  },
  {
    "path": "src/Postscript/index.ts",
    "content": "import { Component, getValueFromProps, triggerEvent } from '../_util/simply';\nimport { assertAilpayNativeNotSupport } from '../_util/support';\nimport { PostscriptProps } from './props';\n\nassertAilpayNativeNotSupport('Postscript');\n\nComponent({\n  props: PostscriptProps,\n  data: {\n    content: '',\n  },\n  methods: {\n    checkMaxLength(value) {\n      const maxLength = Number(getValueFromProps(this, 'maxLength') || -1);\n      if (maxLength !== -1 && value.length > maxLength) {\n        return value.slice(0, maxLength);\n      }\n      return value;\n    },\n    handleInput(val) {\n      let value = val;\n      /// #if WECHAT\n      value = val.detail;\n      /// #endif\n      this.setData({ content: value });\n      triggerEvent(this, 'change', value);\n    },\n\n    handleQuickInput(e) {\n      const { value } = e.currentTarget.dataset;\n      const combineSymbol = getValueFromProps(this, 'combineSymbol');\n      const result = this.checkMaxLength(\n        combineSymbol\n          ? `${\n              this.data.content ? `${this.data.content}${combineSymbol}` : ''\n            }${value}`\n          : value\n      );\n      this.setData({ content: result });\n      triggerEvent(this, 'change', result);\n    },\n  },\n});\n"
  },
  {
    "path": "src/Postscript/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\ninterface PostscriptProps extends IBaseProps {\n  /**\n   * @description 标题\n   */\n  title: string,\n  /**\n   * @description 最大输入长度\n   */\n  maxLength: number,\n  /**\n   * @description 快捷输入选项\n   */\n  quickInputs: string[],\n  /**\n   * @description 占位符文本\n   */\n  placeholder: string,\n  /**\n   * @description 占位符类名\n   */\n  placeholderClassName: string,\n  /**\n   * @description 组合符号，存在时快捷输入会通过组合符号拼接\n   */\n  combineSymbol: string,\n  /**\n   * @description 内容变化时的回调\n   */\n  onChange: (value: string) => void,\n}\n\nexport const PostscriptProps: PostscriptProps = {\n  title: '',\n  maxLength: -1,\n  quickInputs: [],\n  placeholder: '给TA带句话吧~',\n  placeholderClassName: '',\n  combineSymbol: '',\n  onChange: () => {},\n}\n"
  },
  {
    "path": "src/Postscript/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n// 背景色\n@postscript-background-color: var(--postscript-background-color, @COLOR_CARD);\n\n// 标题文字颜色\n@postscript-title-color: var(--postscript-title-color, @COLOR_TEXT_PRIMARY);\n\n// 输入框文字颜色\n@postscript-input-color: var(--postscript-input-color, @COLOR_TEXT_PRIMARY);\n\n// 输入框光标颜色\n@postscript-caret-color: var(--postscript-caret-color, @COLOR_BRAND1);\n\n// 占位符文字颜色\n@postscript-placeholder-color: var(--postscript-placeholder-color, @COLOR_TEXT_WEAK);\n\n// 快捷输入项文字颜色\n@postscript-quick-text-color: var(--postscript-quick-text-color, @COLOR_TEXT_SECONDARY);\n\n// 快捷输入项边框颜色\n@postscript-quick-border-color: var(--postscript-quick-border-color, @COLOR_BORDER);\n"
  },
  {
    "path": "src/Progress/index.axml",
    "content": "<view\n  class=\"ant-progress ant-progress-{{ type }} {{ className || '' }}\"\n  style=\"{{ style || '' }};{{ type === 'circle' ? 'width:' + width + 'px;height:' + width + 'px;' : '' }}\">\n  <!-- #if ALIPAY  -->\n  <canvas\n    a:if=\"{{ type === 'circle' }}\"\n    class=\"ant-progress-canvas\"\n    id=\"ant-progress-canvas-{{ $id }}\"\n    width=\"{{ canvasWidth }}\"\n    height=\"{{ canvasWidth }}\" />\n  <!-- #endif -->\n  <!-- #if WECHAT -->\n  <canvas\n    wx:if=\"{{ type === 'circle' }}\"\n    class=\"ant-progress-canvas\"\n    canvas-id=\"ant-progress-canvas\" />\n  <!-- #endif -->\n  <view\n    a:if=\"{{ type === 'line' }}\"\n    class=\"ant-progress-outer\"\n    style=\"{{ strokeWidth ? 'height:' + strokeWidth + 'px;' : '' }}{{ trailColor ? 'background-color:' + trailColor : '' }}\">\n    <view\n      class=\"ant-progress-inner {{ status === 'success' || status === 'exception' ? 'ant-progress-inner-' + status : '' }}\"\n      style=\"width: {{ curProgress }}%; {{ strokeColor ? 'background-color:' + strokeColor : '' }};{{animation ? '' : 'transition: none;'}}\" />\n  </view>\n  <view class=\"ant-progress-indicator\">\n    <!-- #if ALIPAY  -->\n    <slot\n      name=\"indicator\"\n      percent=\"{{ percent }}\">\n    <!-- #endif -->\n      <ant-icon\n        a:if=\"{{ status === 'success' || status === 'exception' }}\"\n        type=\"{{ status === 'success' ? 'CheckCircleFill' : 'CloseCircleFill' }}\"\n        className=\"ant-progress-status-icon ant-progress-status-icon-{{ status }}\" />\n      <block a:else>{{ percent }}%</block>\n    <!-- #if ALIPAY  -->\n    </slot>\n    <!-- #endif -->\n  </view>\n</view>\n"
  },
  {
    "path": "src/Progress/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Feedback\n  order: 12\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Progress\n\nDisplays the progress of user operations and tasks.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-progress\": \"antd-mini/es/Progress/index\"\n#endif\n#if WECHAT\n  \"ant-progress\": \"antd-mini/Progress/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n> The progress bar defaults to a blue bar,`percent` Property to set the current progress. Use `type`Property to set the shape, currently supports bar and ring two forms.\n\n```xml\n<ant-progress percent=\"{{50}}\" />\n<ant-progress type=\"line\" percent=\"{{50}}\" />\n<ant-progress type=\"circle\" percent=\"{{50}}\" />\n```\n\n### Semantic progress bar\n\n> In line mode, semantic status bars for success and failure states are supported by setting `status`Property implementation.\n\n```xml\n<ant-progress status=\"success\" percent=\"100\" />\n<ant-progress status=\"exception\" percent=\"50\" />\n```\n\n### Style Customization\n\n> `strokeWidth` You can set the thickness of the progress bar,`strokeColor` You can set the color of the progress bar,`trailColor` You can set the track color,`style` The style can be highly customized.\n\n```xml\n<ant-progress percent=\"{{50}}\" strokeWidth=\"{{12}}\" />\n<ant-progress percent=\"{{50}}\" strokeColor=\"#00B578\" />\n<ant-progress percent=\"{{50}}\" trailColor=\"#FFCF9F\" />\n<ant-progress percent=\"{{50}}\" style=\"width: 70%\" />\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Progress/index'></code>\n\n## API\n\n| Property        | Description                                                 | Type    | Default Value |\n| ----------- | ---------------------------------------------------- | ------- | ------ |\n| className   | Class Name                                                 | string  | -      |\n| percent     | Percentage                                               | number  | 0      |\n| status      | status, available in line mode only, optional `success` `exception` | string  | -      |\n| strokeColor | Progress bar color                                           | string  | -      |\n| strokeWidth | Width of progress bar, in px                                  | number  | 8      |\n| style       | Style                                                 | string  | -      |\n| trailColor  | Track Color                                             | string  | -      |\n| type        | type, optional `line` `circle`                           | string  | `line` |\n| width       | Circular progress bar canvas width, in px                          | number  | 100    |\n| animation   | Whether to turn on transition animation                                     | boolean | true   |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n\n| Variable name                     | Light Mode Default                                                                                           | Dark Mode Default                                                                                           | Remarks             |\n| -------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ---------------- |\n| --progress-stroke-color    | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div>       | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div>       | Progress bar main color     |\n| --progress-trail-color     | <div style=\"width: 150px; height: 30px; background-color: #f5f5f5; color: #333333;\">#f5f5f5</div>       | <div style=\"width: 150px; height: 30px; background-color: #121212; color: #ffffff;\">#121212</div>       | Progress bar track color   |\n| --progress-success-color   | <div style=\"width: 150px; height: 30px; background-color: #22b35e; color: #ffffff;\">#22b35e</div>       | <div style=\"width: 150px; height: 30px; background-color: #34b368; color: #ffffff;\">#34b368</div>       | Progress bar success color   |\n| --progress-indicator-color | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div>       | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div>       | Progress bar indicator color |\n| --progress-exception-color | <div style=\"width: 150px; height: 30px; background-color: #ff3141; color: #ffffff;\">#ff3141</div>       | <div style=\"width: 150px; height: 30px; background-color: #ff4a58; color: #ffffff;\">#ff4a58</div>       | Progress bar exception color   |\n| --progress-assist-color    | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div>       | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div>       | Progress bar auxiliary color   |\n"
  },
  {
    "path": "src/Progress/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-icon\": \"../Icon/index\"\n  }\n}\n"
  },
  {
    "path": "src/Progress/index.less",
    "content": "@import (reference) './variable.less';\n\n.ant-progress {\n  &-line {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    .ant-progress-outer {\n      background-color: @progress-trail-color;\n      border-radius: @corner-radius-circle;\n      height: 16 * @rpx;\n      overflow: hidden;\n      flex: 1;\n    }\n    .ant-progress-inner {\n      border-radius: @corner-radius-circle;\n      transition: width 0.3s;\n      height: 100%;\n      position: relative;\n      background-color: @progress-stroke-color;\n      &-success {\n        background-color: @progress-success-color;\n      }\n      &-exception {\n        background-color: @progress-exception-color;\n      }\n    }\n    .ant-progress-indicator {\n      margin-left: 16 * @rpx;\n      color: @progress-assist-color;\n      font-size: 26 * @rpx;\n      height: 37 * @rpx;\n      display: flex;\n      align-items: center;\n    }\n    .ant-progress-status-icon {\n      &-success {\n        color: @progress-success-color;\n      }\n      &-exception {\n        color: @progress-exception-color;\n      }\n    }\n  }\n  &-circle {\n    position: relative;\n    > .ant-progress-canvas {\n      width: 100%;\n      height: 100%;\n    }\n    .ant-progress-indicator {\n      font-size: 40 * @rpx;\n      color: @progress-indicator-color;\n      position: absolute;\n      top: 50%;\n      left: 50%;\n      transform: translate3d(-50%, -50%, 0);\n      z-index: 10;\n    }\n  }\n}\n"
  },
  {
    "path": "src/Progress/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 反馈引导\n  order: 12\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Progress 进度条\n\n用于展示用户操作、任务的进度。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-progress\": \"antd-mini/es/Progress/index\"\n#endif\n#if WECHAT\n  \"ant-progress\": \"antd-mini/Progress/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n> 进度条默认为蓝色条形，`percent` 属性来设置当前进度。使用 `type`属性来设置形状，目前支持条形和环形两种形式。\n\n```xml\n<ant-progress percent=\"{{50}}\" />\n<ant-progress type=\"line\" percent=\"{{50}}\" />\n<ant-progress type=\"circle\" percent=\"{{50}}\" />\n```\n\n### 语义化进度条\n\n> line 模式下，支持成功、失败状态的语义化状态条，通过设置 `status`属性实现。\n\n```xml\n<ant-progress status=\"success\" percent=\"100\" />\n<ant-progress status=\"exception\" percent=\"50\" />\n```\n\n### 样式定制\n\n> `strokeWidth` 可以设置进度条的粗细，`strokeColor` 可以设置进度条的颜色，`trailColor` 可以设置轨道颜色，`style` 可以高度定制样式。\n\n```xml\n<ant-progress percent=\"{{50}}\" strokeWidth=\"{{12}}\" />\n<ant-progress percent=\"{{50}}\" strokeColor=\"#00B578\" />\n<ant-progress percent=\"{{50}}\" trailColor=\"#FFCF9F\" />\n<ant-progress percent=\"{{50}}\" style=\"width: 70%\" />\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Progress/index'></code>\n\n## API\n\n| 属性        | 说明                                                 | 类型    | 默认值 |\n| ----------- | ---------------------------------------------------- | ------- | ------ |\n| className   | 类名                                                 | string  | -      |\n| percent     | 百分比                                               | number  | 0      |\n| status      | 状态，仅限 line 模式可用，可选 `success` `exception` | string  | -      |\n| strokeColor | 进度条颜色                                           | string  | -      |\n| strokeWidth | 进度条宽度，单位 px                                  | number  | 8      |\n| style       | 样式                                                 | string  | -      |\n| trailColor  | 轨道颜色                                             | string  | -      |\n| type        | 类型，可选 `line` `circle`                           | string  | `line` |\n| width       | 圆形进度条画布宽度，单位 px                          | number  | 100    |\n| animation   | 是否开启过渡动画                                     | boolean | true   |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n\n| 变量名                     | 浅色模式默认值                                                                                           | 深色模式默认值                                                                                           | 备注             |\n| -------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ---------------- |\n| --progress-stroke-color    | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div>       | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div>       | 进度条主颜色     |\n| --progress-trail-color     | <div style=\"width: 150px; height: 30px; background-color: #f5f5f5; color: #333333;\">#f5f5f5</div>       | <div style=\"width: 150px; height: 30px; background-color: #121212; color: #ffffff;\">#121212</div>       | 进度条轨道颜色   |\n| --progress-success-color   | <div style=\"width: 150px; height: 30px; background-color: #22b35e; color: #ffffff;\">#22b35e</div>       | <div style=\"width: 150px; height: 30px; background-color: #34b368; color: #ffffff;\">#34b368</div>       | 进度条成功颜色   |\n| --progress-indicator-color | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div>       | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div>       | 进度条指示器颜色 |\n| --progress-exception-color | <div style=\"width: 150px; height: 30px; background-color: #ff3141; color: #ffffff;\">#ff3141</div>       | <div style=\"width: 150px; height: 30px; background-color: #ff4a58; color: #ffffff;\">#ff4a58</div>       | 进度条异常颜色   |\n| --progress-assist-color    | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div>       | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div>       | 进度条辅助颜色   |\n"
  },
  {
    "path": "src/Progress/index.ts",
    "content": "import deepEqual from 'fast-deep-equal';\nimport { createCanvasContext } from '../_util/jsapi/create-canvas-context';\nimport { getSystemInfo } from '../_util/jsapi/get-system-info';\nimport { Component, getValueFromProps } from '../_util/simply';\nimport { assertAilpayNativeNotSupport } from '../_util/support';\nimport { ProgressBarDefaultProps } from './props';\n\nassertAilpayNativeNotSupport('Progress');\n\nconst animationFrameDuration = 16;\n\nComponent({\n  props: ProgressBarDefaultProps,\n  data: {\n    curProgress: 0,\n    canvasWidth: 100,\n  },\n  methods: {\n    requestAnimationFrame(fn, duration = animationFrameDuration) {\n      setTimeout(fn, duration);\n    },\n    getDrawColor() {\n      const [strokeColor, trailColor] = getValueFromProps(this, [\n        'strokeColor',\n        'trailColor',\n      ]);\n      const drawColor = {\n        strokeColor: strokeColor || '#1677ff',\n        trailColor: trailColor || '#F5F5F5',\n      };\n      return drawColor;\n    },\n    async getCanvasContext() {\n      if (this.ctx) return;\n      const systemInfo = await getSystemInfo();\n      let { pixelRatio } = systemInfo;\n      const width = getValueFromProps(this, 'width');\n      this.ctx = await createCanvasContext([this.canvasId, this]);\n      this.ctx.imageSmoothingEnabled = true;\n      this.ctx.imageSmoothingQuality = 'high';\n      /// #if WECHAT\n      // 微信小程序不支持 CanvasWidth 参数，此时 pixelRatio 默认为 1\n      pixelRatio = 1;\n      /// #endif\n      this.setData({\n        canvasWidth: width * pixelRatio,\n      });\n    },\n    clearCanvas() {\n      const ctx = this.ctx;\n      const { canvasWidth } = this.data;\n      ctx.clearRect(0, 0, canvasWidth, canvasWidth);\n    },\n    async updateCanvasProgress(prev) {\n      const drawColor = this.getDrawColor();\n      await this.getCanvasContext();\n      let curRad = Math.floor((prev / 100) * 360);\n      const targetRad = Math.floor((this.data.curProgress / 100) * 360);\n      const direction = curRad < targetRad ? 1 : -1;\n      const draw = () => {\n        if (curRad == targetRad) return;\n        const [speed, animation] = getValueFromProps(this, [\n          'speed',\n          'animation',\n        ]);\n        curRad = direction * speed + curRad;\n        if (direction == -1) {\n          curRad = Math.max(curRad, targetRad);\n        } else {\n          curRad = Math.min(curRad, targetRad);\n        }\n        this.clearCanvas();\n        this.drawOrbit(drawColor.trailColor);\n        this.drawProgress(drawColor.strokeColor, curRad);\n        this.ctx.draw(true);\n        this.requestAnimationFrame(\n          draw,\n          animation ? animationFrameDuration : 0\n        );\n      };\n\n      draw();\n    },\n    drawProgress(color, rad) {\n      const ctx = this.ctx;\n      const { canvasWidth } = this.data;\n      const strokeWidth = Number(getValueFromProps(this, 'strokeWidth'));\n      ctx.beginPath();\n      ctx.strokeStyle = color;\n      ctx.lineWidth = strokeWidth;\n      ctx.setLineCap('round');\n      ctx.arc(\n        canvasWidth / 2,\n        canvasWidth / 2,\n        canvasWidth / 2 - strokeWidth,\n        -Math.PI / 2,\n        -Math.PI / 2 + (rad / 360) * 2 * Math.PI,\n        false\n      );\n      ctx.stroke();\n    },\n    drawOrbit(color) {\n      const ctx = this.ctx;\n      const { canvasWidth } = this.data;\n      const strokeWidth = Number(getValueFromProps(this, 'strokeWidth'));\n      ctx.beginPath();\n      ctx.strokeStyle = color;\n      ctx.lineWidth = strokeWidth;\n      ctx.arc(\n        canvasWidth / 2,\n        canvasWidth / 2,\n        canvasWidth / 2 - strokeWidth,\n        0,\n        Math.PI * 2,\n        false\n      );\n      ctx.stroke();\n    },\n    calProgress() {\n      const [p, type] = getValueFromProps(this, ['percent', 'type']);\n      const percent = +p;\n      if (isNaN(percent)) {\n        return this.setData({ curProgress: 0 });\n      }\n      const prevProgress = this.data.curProgress;\n      if (percent === prevProgress) {\n        return;\n      }\n      this.setData({\n        curProgress: percent > 100 ? 100 : percent < 0 ? 0 : percent,\n      });\n      if (type === 'circle') {\n        this.setCanvasId();\n        this.updateCanvasProgress(prevProgress);\n      }\n    },\n    setCanvasId() {\n      this.canvasId = this.$id\n        ? `ant-progress-canvas-${this.$id}`\n        : `ant-progress-canvas`;\n    },\n  },\n\n  ctx: null as any,\n  drawColor: null as any,\n  canvas: null,\n  /// #if ALIPAY\n  didMount() {\n    this.calProgress();\n  },\n  didUpdate(prevProps) {\n    if (deepEqual(this.props, prevProps)) return;\n    this.calProgress();\n  },\n  /// #endif\n\n  /// #if WECHAT\n  attached() {\n    this.calProgress();\n  },\n  observers: {\n    '**': function () {\n      this.calProgress();\n    },\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/Progress/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n/**\n * @description 弹窗，可在其中加入具体内容，展示更多信息供用户使用。\n */\n\nexport interface IProgressBarProps extends IBaseProps {\n  /**\n   * @description 当前进度，范围 0-100\n   * @default 0\n   */\n  percent: number | string;\n\n  /**\n   * @description 模式\n   * @default 'line'\n   */\n  type: 'line' | 'circle';\n  /**\n   * @description 圆形进度条画布宽度，单位 px\n   */\n  width: number;\n  /**\n   * @description 进度条宽度，单位px\n   */\n  strokeWidth: number | string;\n  /**\n   * @description 状态，仅限 line\n   */\n  status: 'success' | 'exception';\n  /**\n   * @description 进度条颜色\n   */\n  strokeColor: string;\n  /**\n   * @description 轨道颜色\n   */\n  trailColor: string;\n  /**\n   * @description 每次绘制进度条推进的角度，默认6deg\n   * @default 6\n   */\n  speed: number;\n  /**\n   * @description 是否开启过渡动画\n   * @default true\n   */\n  animation: boolean;\n}\n\nexport const ProgressBarDefaultProps: Partial<IProgressBarProps> = {\n  percent: 0,\n  type: 'line',\n  width: 100,\n  strokeWidth: 8,\n  status: null,\n  strokeColor: '',\n  trailColor: '',\n  speed: 6,\n  animation: true,\n};\n"
  },
  {
    "path": "src/Progress/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n@progress-stroke-color: var(--progress-stroke-color, @COLOR_BRAND1);\n@progress-trail-color: var(--progress-trail-color, @COLOR_GREY_CARD);\n@progress-success-color: var(--progress-success-color, @COLOR_GREEN);\n@progress-indicator-color: var(--progress-indicator-color, @COLOR_TEXT_PRIMARY);\n@progress-exception-color: var(--progress-exception-color, @COLOR_RED);\n@progress-assist-color: var(--progress-assist-color, @COLOR_TEXT_ASSIST);\n"
  },
  {
    "path": "src/Radio/RadioGroup/index.axml",
    "content": "<import-sjs\n  from=\"../index.sjs\"\n  name=\"componentUtils\" />\n\n<list\n  className=\"ant-radio-group {{ className ? className : '' }} ant-radio-group-{{ position }}\"\n  style=\"{{ style }}\">\n  <radio-group\n    name=\"{{ name }}\"\n    value=\"{{ mixin.value }}\">\n    <view class=\"ant-radio-group-body\">\n      <block a:if=\"{{ position === 'vertical' }}\">\n        <block\n          a:for=\"{{ options }}\"\n          a:for-index=\"index\"\n          a:for-item=\"item\"\n          a:key=\"value\">\n          <list-item>\n            <radio\n              checked=\"{{ componentUtils.getChecked(index, options, mixin.value) }}\"\n              data-index=\"{{ index }}\"\n              value=\"{{ item.value }}\"\n              disabled=\"{{ disabled || item.disabled }}\"\n              color=\"{{ item.color || color }}\"\n              onChange=\"onChange\">\n              <!-- #if ALIPAY -->\n              <slot\n                name=\"label\"\n                value=\"{{ item }}\"\n                index=\"{{ index }}\">\n              <!-- #endif -->\n                <view class=\"ant-radio-group-item-label-default\">\n                  {{ item.label }}\n                </view>\n              <!-- #if ALIPAY -->\n              </slot>\n              <!-- #endif -->\n            </radio>\n          </list-item>\n        </block>\n      </block>\n      <block a:else>\n        <block\n          a:for=\"{{ options }}\"\n          a:for-index=\"index\"\n          a:for-item=\"item\"\n          a:key=\"value\">\n          <radio\n            checked=\"{{ componentUtils.getChecked(index, options, mixin.value) }}\"\n            data-index=\"{{ index }}\"\n            value=\"{{ item.value }}\"\n            disabled=\"{{ disabled || item.disabled }}\"\n            color=\"{{ item.color || color }}\"\n            onChange=\"onChange\">\n            <!-- #if ALIPAY -->\n            <slot\n              name=\"label\"\n              value=\"{{ item }}\"\n              index=\"{{ index }}\">\n            <!-- #endif -->\n              <view class=\"ant-radio-group-item-label-default\">\n                {{ item.label }}\n              </view>\n            <!-- #if ALIPAY -->\n            </slot>\n            <!-- #endif -->\n          </radio>\n        </block>\n      </block>\n    </view>\n  </radio-group>\n</list>\n"
  },
  {
    "path": "src/Radio/RadioGroup/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"list\": \"../../List/index\",\n    \"list-item\": \"../../List/ListItem/index\",\n    \"radio\": \"../index\"\n  }\n}\n"
  },
  {
    "path": "src/Radio/RadioGroup/index.less",
    "content": "@import (reference) '../variable.less';\n\n@radioGroupPrefix: ant-radio-group;\n\n.@{radioGroupPrefix} {\n  &-horizontal {\n    .@{radioGroupPrefix}-body {\n      display: flex;\n      flex-wrap: wrap;\n      justify-content: flex-start;\n\n      .ant-list-item-line {\n        padding-right: 0;\n      }\n\n      .ant-radio-item {\n        flex-flow: 0;\n      }\n\n      .ant-list-item-line::after {\n        display: none;\n      }\n    }\n  }\n\n  &-header:empty,\n  &-footer:empty {\n    display: none;\n  }\n\n  &-header,\n  &-footer {\n    display: flex;\n    align-items: center;\n    padding: @v-spacing-standard @v-spacing-large;\n    line-height: 1.4;\n    font-size: 30 * @rpx;\n    color: @radio-header-color;\n  }\n\n  &-body {\n    position: relative;\n    overflow: hidden;\n    .ant-radio-item-content {\n      .ant-radio-group-item-label-default:not(:nth-child(1)) {\n        display: none;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/Radio/RadioGroup/index.ts",
    "content": "import mixinValue from '../../mixins/value';\nimport { Component, getValueFromProps, triggerEvent } from '../../_util/simply';\nimport { RadioGroupDefaultProps } from './props';\n\nComponent({\n  props: RadioGroupDefaultProps,\n  methods: {\n    onChange(_, e) {\n      let event;\n      /// #if ALIPAY\n      event = e;\n      /// #endif\n      /// #if WECHAT\n      event = _;\n      /// #endif\n      const index = event.currentTarget.dataset.index;\n      const options = getValueFromProps(this, 'options');\n      const value = options[index].value;\n      if (!this.isControlled()) {\n        this.update(value);\n      }\n      triggerEvent(this, 'change', value, event);\n    },\n  },\n  mixins: [mixinValue()],\n});\n"
  },
  {
    "path": "src/Radio/RadioGroup/props.ts",
    "content": "import { IBaseProps } from '../../_util/base';\n\nexport interface IRadioGroupProps extends IBaseProps {\n  value: string;\n  defaultValue: string;\n  name: string;\n  disabled?: boolean;\n  color: string;\n  position: 'horizontal' | 'vertical';\n  onChange?: (value: string, e: any) => void;\n  options: {\n    label?: string;\n    value?: string;\n    disabled?: boolean;\n    color?: string;\n  }[];\n}\n\nexport const RadioGroupDefaultProps: Partial<IRadioGroupProps> = {\n  value: null,\n  defaultValue: null,\n  name: '',\n  disabled: false,\n  color: '',\n  position: 'vertical',\n  options: [],\n};\n"
  },
  {
    "path": "src/Radio/index.axml",
    "content": "<import-sjs\n  from=\"./index.sjs\"\n  name=\"componentUtils\" />\n\n<template name=\"radio\">\n  <view class=\"ant-radio-item-wrap\">\n    <!-- #if ALIPAY -->\n    <radio\n      value=\"{{ value }}\"\n      class=\"ant-radio-item-base\"\n      onChange=\"onChange\"\n      checked=\"{{ mixin.value }}\"\n      disabled=\"{{ disabled }}\" />\n    <!-- #endif -->\n    <!-- #if WECHAT -->\n    <radio\n      value=\"{{ value }}\"\n      class=\"ant-radio-item-base\"\n      checked=\"{{ mixin.value }}\"\n      disabled=\"{{ disabled }}\" />\n    <!-- #endif -->\n    <view class=\"ant-radio-item-fake\">\n      <view\n        class=\"ant-radio-item-fake-{{ componentUtils.getClassName(mixin.value, disabled) }}\"\n        style=\"{{ mixin.value && !disabled && color ? 'background:' + color : '' }}\">\n        <ant-icon\n          a:if=\"{{ mixin.value }}\"\n          type=\"CheckOutline\"\n          className=\"ant-radio-item-fake-{{ componentUtils.getClassName(mixin.value, disabled) }}-icon\" />\n      </view>\n    </view>\n  </view>\n</template>\n\n<!-- #if ALIPAY -->\n<label\n  a:if=\"{{isLabelSupport}}\"\n  class=\"ant-radio-item {{ className || '' }}\"\n  style=\"{{ style }}\">\n<!-- #endif -->\n<!-- #if WECHAT -->\n<label\n  a:if=\"{{isLabelSupport}}\"\n  class=\"ant-radio-item {{ className || '' }}\"\n  style=\"{{ style }}\"\n  bindtap=\"handleTap\">\n<!-- #endif -->\n  <view class=\"ant-radio-item-container\">\n    <template\n      is=\"radio\"\n      data=\"{{\n        value,\n        mixin,\n        disabled,\n        color\n      }}\"\n    />\n    <view class=\"ant-radio-item-content {{ disabled ? 'ant-radio-item-disabled' : '' }}\">\n      <slot />\n    </view>\n  </view>\n</label>\n<view\n  a:else\n  class=\"ant-radio-item {{ className || '' }}\"\n  style=\"{{ style }}\"\n  catchTap=\"handleTap\"\n>\n  <view class=\"ant-radio-item-container\">\n    <template\n      is=\"radio\"\n      data=\"{{\n        value,\n        mixin,\n        disabled,\n        color\n      }}\"\n    />\n    <view class=\"ant-radio-item-content {{ disabled ? 'ant-radio-item-disabled' : '' }}\">\n      <slot />\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "src/Radio/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Information Entry\n  order: 10\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Radio\n\nSingle selection from a set of options.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-radio\": \"antd-mini/es/Radio/index\",\n  \"ant-radio-group\": \"antd-mini/es/Radio/RadioGroup/index\"\n#endif\n#if WECHAT\n  \"ant-radio\": \"antd-mini/Radio/index\",\n  \"ant-radio-group\": \"antd-mini/Radio/RadioGroup/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<ant-radio defaultChecked>Initial value</ant-radio>\n<ant-radio disabled>Disable button 1</ant-radio>\n<ant-radio color=\"red\" defaultChecked>Custom Colors</ant-radio>\n<ant-radio\n#if ALIPAY\n  onChange=\"onChange\"\n#endif\n#if WECHAT\n  bindchange=\"onChange\"\n#endif\n>\n  Basic Usage\n</ant-radio>\n```\n\n```js\nPage({\n  onChange(value, e) {\n    console.log(value, e);\n  },\n});\n```\n\n### Controlled Mode\n\n```xml\n<ant-radio\n  checked=\"{{checked}}\"\n#if ALIPAY\n  onChange=\"handleChange\"\n#endif\n#if WECHAT\n  bindchange=\"handleChange\"\n#endif\n>\n  Controlled Mode\n</ant-radio>\n```\n\n```js\nPage({\n  data: {\n    checked: false,\n  },\n  handleChange(checked) {\n#if WECHAT\n    this.setData({\n      checked: checked.detail,\n    });\n#endif\n#if ALIPAY\n    this.setData({\n      checked,\n    });\n#endif\n  },\n});\n```\n\n### Radio Group\n\n```xml\n<ant-radio-group\n  value=\"{{value}}\"\n  options=\"{{options}}\"\n#if ALIPAY\n  onChange=\"handleRadioGroupChange\"\n#endif\n#if WECHAT\n  bindchange=\"handleRadioGroupChange\"\n#endif\n/>\n\n```\n\n```js\nPage({\n  data: {\n    value: 'banana',\n    options: [\n      { value: 'apple', label: '苹果' },\n      { value: 'orange', label: '橘子' },\n      { value: 'banana', label: '香蕉' },\n    ],\n  },\n  handleRadioGroupChange(value) {\n#if WECHAT\n    this.setData({\n      value: value.detail,\n    });\n#endif\n#if ALIPAY\n    this.setData({\n      value,\n    });\n#endif\n  },\n});\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Radio/index'></code>\n\n## API\n\n| Property                   | Description             | Type                                                                                                  | Default Value |\n| ---------------------- | ---------------- | ----------------------------------------------------------------------------------------------------- | ------ |\n| checked                | Whether selected         | boolean                                                                                               | -      |\n| className              | Class Name             | string                                                                                                | -      |\n| disabled               | Disable         | boolean                                                                                               | false  |\n| color                  | Icon Color         | string                                                                                                | -      |\n| defaultChecked         | Is selected by default     | boolean                                                                                               | false  |\n| style                  | Style             | string                                                                                                | -      |\n| value                  | value carried  | string                                                                                                | -      |\n| #if ALIPAY onChange    | Callback when state changes | `(checked: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void` | -      |\n| #if WECHAT bindchange | Callback when state changes | `(checked: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void` | -      |\n\n### RadioGroup\n\n| Property                   | Description               | Type                                                                                               | Default Value     |\n| ---------------------- | ------------------ | -------------------------------------------------------------------------------------------------- | ---------- |\n| className              | Class Name               | string                                                                                             | -          |\n| color                  | Icon Color           | string                                                                                             | -          |\n| disabled               | Disable           | boolean                                                                                            | false      |\n| defaultValue           | Initial value             | string                                                                                             | -          |\n| label                  | slots, receiving values and indexes | slot                                                                                               | -          |\n| options                | Optional             | `{label?: string; value?: string; disabled?: boolean;}[]`                                          | -          |\n| position               | Layout mode           | string                                                                                             | `vertical` |\n| style                  | Style               | string                                                                                             | -          |\n| value                  | Selected value           | string                                                                                             | -          |\n| #if ALIPAY onChange    | Callback when state changes   | `(value: string, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void` | -          |\n| #if WECHAT bindchange | Callback when state changes   | `(value: string, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void` | -          |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For more information, see ConfigProvider Components.\n\n| Variable name                     | Default Value                                                                                            | Dark Mode Default                                                                                    | Remarks             |\n| -------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------- |\n| --progress-stroke-color    | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | Progress bar main color     |\n| --progress-trail-color     | <div style=\"width: 150px; height: 30px; background-color: #f5f5f5; color: #333333;\">#f5f5f5</div> | <div style=\"width: 150px; height: 30px; background-color: #121212; color: #ffffff;\">#121212</div> | Progress bar track color   |\n| --progress-success-color   | <div style=\"width: 150px; height: 30px; background-color: #22b35e; color: #ffffff;\">#22b35e</div> | <div style=\"width: 150px; height: 30px; background-color: #34b368; color: #ffffff;\">#34b368</div> | Progress bar success color   |\n| --progress-indicator-color | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | Progress bar indicator color |\n| --progress-exception-color | <div style=\"width: 150px; height: 30px; background-color: #ff3141; color: #ffffff;\">#ff3141</div> | <div style=\"width: 150px; height: 30px; background-color: #ff4a58; color: #ffffff;\">#ff4a58</div> | Progress bar exception color   |\n| --progress-assist-color    | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | Progress bar auxiliary color   |\n"
  },
  {
    "path": "src/Radio/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-icon\": \"../Icon/index\"\n  }\n}\n"
  },
  {
    "path": "src/Radio/index.less",
    "content": "@import (reference) './variable.less';\n\n@radioItemPrefix: ant-radio-item;\n\n.@{radioItemPrefix} {\n  color: @radio-text-color;\n  margin-right: 16 * @rpx;\n\n  /// #if WECHAT\n  // 支付宝默认 label 的高度\n  height: 59.6 * @rpx;\n  line-height: 59.6 * @rpx;\n  // 在 label 内嵌一个 view, 微信会变成 block 组件\n  display: inline-block;\n  /// #endif\n\n  &-container {\n    display: flex;\n    align-items: center;\n  }\n\n  &-content {\n    padding-left: 10 * @rpx;\n    text-align: left;\n  }\n  &-wrap {\n    position: relative;\n    width: @radio-size;\n    height: @radio-size;\n    flex: 0 0 @radio-size;\n  }\n  &-base {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n    z-index: 2;\n    opacity: 0;\n  }\n  &-fake {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n    overflow: hidden;\n    pointer-events: none;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    &-icon {\n      background-color: @radio-fake-icon-background-color;\n      border: @radio-border-width solid @radio-border-color;\n      border-radius: @radio-corner-radius;\n      width: 100%;\n      height: 100%;\n      box-sizing: border-box;\n    }\n    &-checkedIcon {\n      border-radius: @radio-corner-radius;\n      background-color: @radio-background-color;\n      width: 100%;\n      height: 100%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      &-icon {\n        color: @radio-icon-color;\n        font-size: 28 * @rpx;\n      }\n    }\n    &-disbaledIcon {\n      box-sizing: border-box;\n      border: @radio-border-width solid @radio-border-color;\n      border-radius: @radio-corner-radius;\n      width: 100%;\n      height: 100%;\n      background-color: @radio-disabled-background;\n    }\n    &-disabledCheckedIcon {\n      box-sizing: border-box;\n      border: @radio-border-width solid @radio-border-color;\n      background-color: @radio-disabled-background;\n      border-radius: @radio-corner-radius;\n      width: 100%;\n      height: 100%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      &-icon {\n        color: @radio-border-color;\n        font-size: 28 * @rpx;\n      }\n    }\n  }\n  &-disabled {\n    opacity: @opacity-disabled;\n  }\n  // .ant-list-item-image-container {\n  //   display: flex;\n  //   justify-content: center;\n  //   align-items: center;\n  // }\n}\n"
  },
  {
    "path": "src/Radio/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 数据录入\n  order: 10\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Radio 单选框\n\n在一组可选项中进行单选。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-radio\": \"antd-mini/es/Radio/index\",\n  \"ant-radio-group\": \"antd-mini/es/Radio/RadioGroup/index\"\n#endif\n#if WECHAT\n  \"ant-radio\": \"antd-mini/Radio/index\",\n  \"ant-radio-group\": \"antd-mini/Radio/RadioGroup/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-radio defaultChecked>初始值</ant-radio>\n<ant-radio disabled>禁用按钮1</ant-radio>\n<ant-radio color=\"red\" defaultChecked>自定义颜色</ant-radio>\n<ant-radio\n#if ALIPAY\n  onChange=\"onChange\"\n#endif\n#if WECHAT\n  bindchange=\"onChange\"\n#endif\n>\n  基础用法\n</ant-radio>\n```\n\n```js\nPage({\n  onChange(value, e) {\n    console.log(value, e);\n  },\n});\n```\n\n### 受控模式\n\n```xml\n<ant-radio\n  checked=\"{{checked}}\"\n#if ALIPAY\n  onChange=\"handleChange\"\n#endif\n#if WECHAT\n  bindchange=\"handleChange\"\n#endif\n>\n  受控模式\n</ant-radio>\n```\n\n```js\nPage({\n  data: {\n    checked: false,\n  },\n  handleChange(checked) {\n#if WECHAT\n    this.setData({\n      checked: checked.detail,\n    });\n#endif\n#if ALIPAY\n    this.setData({\n      checked,\n    });\n#endif\n  },\n});\n```\n\n### Radio 组\n\n```xml\n<ant-radio-group\n  value=\"{{value}}\"\n  options=\"{{options}}\"\n#if ALIPAY\n  onChange=\"handleRadioGroupChange\"\n#endif\n#if WECHAT\n  bindchange=\"handleRadioGroupChange\"\n#endif\n/>\n\n```\n\n```js\nPage({\n  data: {\n    value: 'banana',\n    options: [\n      { value: 'apple', label: '苹果' },\n      { value: 'orange', label: '橘子' },\n      { value: 'banana', label: '香蕉' },\n    ],\n  },\n  handleRadioGroupChange(value) {\n#if WECHAT\n    this.setData({\n      value: value.detail,\n    });\n#endif\n#if ALIPAY\n    this.setData({\n      value,\n    });\n#endif\n  },\n});\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Radio/index'></code>\n\n## API\n\n| 属性                   | 说明             | 类型                                                                                                  | 默认值 |\n| ---------------------- | ---------------- | ----------------------------------------------------------------------------------------------------- | ------ |\n| checked                | 是否选中         | boolean                                                                                               | -      |\n| className              | 类名             | string                                                                                                | -      |\n| disabled               | 是否禁用         | boolean                                                                                               | false  |\n| color                  | 图标颜色         | string                                                                                                | -      |\n| defaultChecked         | 是否默认选中     | boolean                                                                                               | false  |\n| style                  | 样式             | string                                                                                                | -      |\n| value                  | 携带的 value 值  | string                                                                                                | -      |\n| #if ALIPAY onChange    | 状态改变时的回调 | `(checked: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void` | -      |\n| #if WECHAT bindchange | 状态改变时的回调 | `(checked: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void` | -      |\n\n### RadioGroup\n\n| 属性                   | 说明               | 类型                                                                                               | 默认值     |\n| ---------------------- | ------------------ | -------------------------------------------------------------------------------------------------- | ---------- |\n| className              | 类名               | string                                                                                             | -          |\n| color                  | 图标颜色           | string                                                                                             | -          |\n| disabled               | 是否禁用           | boolean                                                                                            | false      |\n| defaultValue           | 初始值             | string                                                                                             | -          |\n| label                  | 插槽，接收值和索引 | slot                                                                                               | -          |\n| options                | 可选项             | `{label?: string; value?: string; disabled?: boolean;}[]`                                          | -          |\n| position               | 布局方式           | string                                                                                             | `vertical` |\n| style                  | 样式               | string                                                                                             | -          |\n| value                  | 选中的值           | string                                                                                             | -          |\n| #if ALIPAY onChange    | 状态改变时的回调   | `(value: string, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void` | -          |\n| #if WECHAT bindchange | 状态改变时的回调   | `(value: string, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void` | -          |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                     | 默认值                                                                                            | 深色模式默认值                                                                                    | 备注             |\n| -------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------- |\n| --progress-stroke-color    | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | 进度条主颜色     |\n| --progress-trail-color     | <div style=\"width: 150px; height: 30px; background-color: #f5f5f5; color: #333333;\">#f5f5f5</div> | <div style=\"width: 150px; height: 30px; background-color: #121212; color: #ffffff;\">#121212</div> | 进度条轨道颜色   |\n| --progress-success-color   | <div style=\"width: 150px; height: 30px; background-color: #22b35e; color: #ffffff;\">#22b35e</div> | <div style=\"width: 150px; height: 30px; background-color: #34b368; color: #ffffff;\">#34b368</div> | 进度条成功颜色   |\n| --progress-indicator-color | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | 进度条指示器颜色 |\n| --progress-exception-color | <div style=\"width: 150px; height: 30px; background-color: #ff3141; color: #ffffff;\">#ff3141</div> | <div style=\"width: 150px; height: 30px; background-color: #ff4a58; color: #ffffff;\">#ff4a58</div> | 进度条异常颜色   |\n| --progress-assist-color    | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | 进度条辅助颜色   |\n"
  },
  {
    "path": "src/Radio/index.sjs.ts",
    "content": "function getClassName(checked, disabled) {\n  if (!checked && !disabled) {\n    return 'icon';\n  }\n  if (checked && !disabled) {\n    return 'checkedIcon';\n  }\n  if (!checked && disabled) {\n    return 'disbaledIcon';\n  }\n  if (checked && disabled) {\n    return 'disabledCheckedIcon';\n  }\n}\n\nfunction getChecked(index, options, value) {\n  if (options[index].value === value) {\n    return true;\n  }\n  return false;\n}\n\nexport default { getClassName, getChecked };\n"
  },
  {
    "path": "src/Radio/index.ts",
    "content": "import mixinValue from '../mixins/value';\nimport { Component, triggerEvent } from '../_util/simply';\nimport { isAilpayNative } from '../_util/support';\nimport { RadioDefaultProps } from './props';\n\nComponent({\n  data: {\n    isLabelSupport: true,\n  },\n  props: RadioDefaultProps,\n  onInit() {\n    this.setData({\n      isLabelSupport: !isAilpayNative(),\n    });\n  },\n  methods: {\n    /// #if ALIPAY\n    onChange(e) {\n      const value = e.detail.value;\n      if (!this.isControlled()) {\n        this.update(value);\n      }\n      triggerEvent(this, 'change', value, e);\n    },\n    /// #endif\n    /// #if WECHAT\n    handleTap(e) {\n      // 只能从 false -> true\n      if (this.getValue()) {\n        return;\n      }\n      if (!this.isControlled()) {\n        this.update(true);\n      }\n      triggerEvent(this, 'change', true, e);\n    },\n\n    /// #endif\n  },\n  mixins: [\n    mixinValue({\n      valueKey: 'checked',\n      defaultValueKey: 'defaultChecked',\n    }),\n  ],\n});\n"
  },
  {
    "path": "src/Radio/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\nexport interface IRadioProps extends IBaseProps {\n  /**\n   * @description 组件值，选中时 change 事件会携带的 value。\n   */\n  value?: string;\n  defaultChecked?: boolean;\n  /**\n   * @description radio 的颜色，同 CSS 色值。\n   */\n  color?: string;\n  checked?: boolean;\n  disabled?: boolean;\n  onChange?: (checked: boolean, e: any) => void;\n}\n\nexport const RadioDefaultProps: Partial<IRadioProps> = {\n  value: null,\n  defaultChecked: null,\n  color: '',\n  checked: null,\n  disabled: false,\n};\n"
  },
  {
    "path": "src/Radio/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n// header 颜色\n@radio-header-color: var(--radio-header-color, @COLOR_TEXT_ASSIST);\n\n/* size | 大小 */\n@radio-size: @icon-size-sm;\n\n/* corner-radius | 圆角 */\n@radio-corner-radius: @corner-radius-circle;\n\n/* border-width | 边框宽度 */\n@radio-border-width: @border-width-standard;\n\n/* color | 边框颜色 */\n@radio-border-color: var(--radio-border-color, @COLOR_TEXT_WEAK);\n\n/* color | check状态背景色 */\n@radio-background-color: var(--radio-background-color, @COLOR_BRAND1);\n\n/* color | disabled状态背景色 */\n@radio-disabled-background: var(--radio-disabled-background, @COLOR_GREY_CARD);\n\n@radio-text-color: var(--radio-text-color, @COLOR_TEXT_PRIMARY);\n\n@radio-fake-icon-background-color: var(\n  --radio-fake-icon-background-color,\n  @COLOR_CARD\n);\n\n@radio-icon-color: var(--radio-icon-color, @COLOR_WHITE);\n"
  },
  {
    "path": "src/RareWordsKeyboard/constants.ts",
    "content": "import { IPinYinMapItem } from './props';\n\n/**\n * 拼音键盘按钮\n */\nexport const PINYIN_MAP: IPinYinMapItem[][] = [\n  // 第一行\n  [\n    { label: 'Q', value: 'Q' },\n    { label: 'W', value: 'W' },\n    { label: 'E', value: 'E' },\n    { label: 'R', value: 'R' },\n    { label: 'T', value: 'T' },\n    { label: 'Y', value: 'Y' },\n    { label: 'U', value: 'U' },\n    { label: 'I', value: 'I' },\n    { label: 'O', value: 'O' },\n    { label: 'P', value: 'P' },\n  ],\n  // 第二行\n  [\n    { label: 'A', value: 'A' },\n    { label: 'S', value: 'S' },\n    { label: 'D', value: 'D' },\n    { label: 'F', value: 'F' },\n    { label: 'G', value: 'G' },\n    { label: 'H', value: 'H' },\n    { label: 'J', value: 'J' },\n    { label: 'K', value: 'K' },\n    { label: 'L', value: 'L' },\n  ],\n  // 第三行\n  [\n    { label: 'Z', value: 'Z' },\n    { label: 'X', value: 'X' },\n    { label: 'C', value: 'C' },\n    { label: 'V', value: 'V' },\n    { label: 'B', value: 'B' },\n    { label: 'N', value: 'N' },\n    { label: 'M', value: 'M' },\n  ],\n];\n"
  },
  {
    "path": "src/RareWordsKeyboard/index.axml",
    "content": "<view\n  key=\"ant-rare-words-input-{{ $id }}\"\n  style=\"{{ style }}\"\n  class=\"ant-rare-words-keyboard {{ className || '' }}\">\n  <view\n    a:if=\"{{ visible }}\"\n    class=\"ant-rare-words-keyboard-modal {{ showMask ? '' : 'hide' }}\"\n    onTap=\"handleHide\"\n    onAppear=\"catchAppearModal\" />\n  <view class=\"ant-rare-words-keyboard-kb {{ visible ? '' : 'hide' }}\">\n    <view class=\"ant-rare-words-keyboard-header\">\n      <view\n        a:if=\"{{ type !== 'handwriting' }}\"\n        class=\"ant-rare-words-keyboard-input_value {{ displayStr.length > 0 && visible ? '' : 'hide' }}\">\n        {{ displayStr }}\n      </view>\n\n      <view class=\"ant-rare-words-keyboard-match_words_wrap\">\n        <view\n          class=\"ant-rare-words-keyboard-match_words {{ showMoreWords ? 'absolute' : '' }}\">\n          <view\n            class=\"ant-rare-words-keyboard-match_words_inner {{ showMoreWords ? 'all' : '' }}\">\n            <view\n              a:if=\"{{ matchWordsList.length === 0 }}\"\n              class=\"ant-rare-words-keyboard-match_words_hidden\">\n              哈\n            </view>\n            <block\n              a:for=\"{{ matchWordsList }}\"\n              a:for-index=\"index\"\n              a:for-item=\"item\">\n              <view\n                class=\"ant-rare-words-keyboard-match_words_item {{ showMoreWords ? 'all' : '' }}\"\n                data-value=\"{{ item.unicodeChar }}\"\n                onTap=\"handleWordClick\">\n                <view class=\"ant-rare-words-keyboard-match_words_item_text\">\n                  {{ item.unicodeChar }}\n                </view>\n              </view>\n            </block>\n\n            <view\n              a:if=\"{{ loading }}\"\n              class=\"ant-rare-words-keyboard-match_words_item_tips loading\">\n              <loading\n                className=\"ant-rare-words-keyboard-loading\"\n                type=\"mini\"\n                size=\"small\"\n                color=\"#666666\" />\n              <!-- display: inline -->\n              <text>加载中</text>\n            </view>\n            <view\n              a:else\n              class=\"ant-rare-words-keyboard-match_words_item_tips\">\n              <!-- display: inline -->\n              <text\n                a:if=\"{{ !!(displayStr === '' && matchWordsList.length === 0) }}\"\n                >请输入生僻字对应的拼音</text\n              >\n              <!-- display: inline -->\n              <text\n                a:if=\"{{ !!(displayStr !== '' && matchWordsList.length === 0) }}\"\n                >更多生僻字完善中，敬请期待</text\n              >\n            </view>\n          </view>\n\n          <view\n            class=\"ant-rare-words-keyboard-match_words_right {{ showMoreWords ? 'sticky' : '' }} {{ matchWordsList.length > maxDisplayNum && !showMoreWords ? 'overflow' : '' }}\"\n            onTap=\"hanleLookMore\">\n            <ant-icon\n              className=\"ant-rare-words-keyboard_down\"\n              type=\"DownOutline\" />\n          </view>\n        </view>\n      </view>\n\n      <view class=\"ant-rare-words-keyboard_main\">\n        <view a:if=\"{{ showErrorPage }}\">\n          <!-- #if ALIPAY -->\n          <slot name=\"resultError\">\n          <!-- #endif -->\n            <view class=\"ant-rare-words-keyboard_error\">\n              <result\n                className=\"ant-rare-words-keyboard_error-result\"\n                image=\"https://mdn.alipayobjects.com/huamei_2fq7mt/afts/img/A*VtvFS4EJl0cAAAAAAAAAAAAADh58AQ/original\"\n                message=\"页面遇到一些小问题\">\n                <view\n                  slot=\"extra\"\n                  class=\"ant-rare-words-keyboard_error-btns\">\n                  <button\n                    type=\"primary\"\n                    size=\"small\"\n                    inline\n                    onTap=\"handleRetry\">\n                    重试\n                  </button>\n                </view>\n              </result>\n            </view>\n          <!-- #if ALIPAY -->\n          </slot>\n          <!-- #endif -->\n        </view>\n        <view\n          a:else\n          class=\"ant-rare-words-keyboard_pinyin\">\n          <block\n            a:for=\"{{ pinyinMaps }}\"\n            a:for-index=\"mapIndex\"\n            a:for-item=\"mapItem\"\n            key=\"{{ mapIndex }}\">\n            <view class=\"ant-rare-words-keyboard_pinyin_row\">\n              <block\n                a:for=\"{{ mapItem }}\"\n                a:for-index=\"index\"\n                a:for-item=\"item\"\n                key=\"{{ item.value }}\">\n                <view\n                  data-value=\"{{ item.value }}\"\n                  class=\"ant-rare-words-keyboard_pinyin_key {{ showMoreWords ? 'all' : '' }}\"\n                  onTap=\"handleKeyClick\">\n                  <view class=\"ant-rare-words-keyboard_pinyin_key_text\">\n                    {{ item.label }}\n                  </view>\n                </view>\n              </block>\n              <view\n                a:if=\"{{ mapIndex === pinyinMaps.length - 1 }}\"\n                class=\"ant-rare-words-keyboard_pinyin_key delete\"\n                onTap=\"handleDelete\">\n                <view class=\"ant-rare-words-keyboard_pinyin_key_text\">\n                  <ant-icon\n                    className=\"ant-rare-words-keyboard_delete\"\n                    type=\"TextDeletionOutline\" />\n                </view>\n              </view>\n            </view>\n          </block>\n        </view>\n      </view>\n    </view>\n    <view\n      a:if=\"{{ safeArea }}\"\n      class=\"ant-rare-words-keyboard-kb_iphonex-safe\" />\n  </view>\n</view>\n"
  },
  {
    "path": "src/RareWordsKeyboard/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Information Entry\n  order: 10\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# RareWordsKeyboard\n\nThe problem of rare characters has always been a difficult point in the society. Due to the development of different standards in different periods, various industries support different Chinese characters, which makes it very difficult to interconnect rare characters and names in Internet business and seriously affects the business handling of rare characters and names personnel. This rare word keyboard can help rare word users solve the problem that they cannot enter their names in the computer world.\n\n## Tip\n\n1. Developers can decide for themselves when to evoke a rare word keyboard.\n2. After entering a rare word, the input of the rare word will be returned through the callback parameter, and the keyboard will be closed.\n\n## Code Sample\n\n### Basic use\n\n<code src='../../demo/pages/RareWordsKeyboard/index'></code>\n\n## API\n\n| Property                   | Description                                  | Type                      | Default Value |\n| ---------------------- | ------------------------------------- | ------------------------- | ------ |\n| visible                | Whether visible                              | boolean                   | false  |\n| type                   | Keyboard type, currently only supported `pinyin`(Pinyin) | string                    | pinyin |\n| showMask               | Whether to show background mask                      | boolean                   | true   |\n| safeArea               | Whether to keep safe distance                      | boolean                   | true   |\n| #if ALIPAY onClose     | Callback triggered when keyboard is closed                  | `() => void`              | -      |\n| #if ALIPAY onChange    | Callback triggered when input completes                  | `(value: string) => void` | -      |\n| #if ALIPAY onError     | Open the callback that is triggered when the keyboard goes wrong              | `(err: Error) => void`    | -      |\n| #if WECHAT bindclose  | Callback triggered when keyboard is closed                  | `() => void`              | -      |\n| #if WECHAT bindchange | Callback triggered when input completes                  | `(value: string) => void` | -      |\n| #if WECHAT binderror  | Open the callback that is triggered when the keyboard goes wrong              | `(err: Error) => void`    | -      |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                        | Default Value                                                                                                                    | Dark Mode Default                                                                                                            | Remarks               |\n| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------ |\n| --rare-words-bg               | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.45); color: #ffffff;\">rgba(0, 0, 0, 0.45)</div> | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.45); color: #ffffff;\">rgba(0, 0, 0, 0.45)</div> | Rare word background color     |\n| --rare-keyboard-bg            | <div style=\"width: 150px; height: 30px; background-color: #d8d8d8; color: #000000;\">#d8d8d8</div>                         | <div style=\"width: 150px; height: 30px; background-color: #4a4a4a; color: #ffffff;\">#4a4a4a</div>                         | Rare word keyboard background color   |\n| --rare-words-keyboard-color   | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div>                         | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #000000;\">#c5cad1</div>                         | Rare word keyboard text color |\n| --rare-words-border-color     | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #000000;\">#eeeeee</div>                         | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #ffffff;\">#2b2b2b</div>                         | Rare word border color     |\n| --rare-words-kb-bg            | <div style=\"width: 150px; height: 30px; background-color: #f5f5f5; color: #000000;\">#f5f5f5</div>                         | <div style=\"width: 150px; height: 30px; background-color: #121212; color: #ffffff;\">#121212</div>                         | Rare word keyboard background color   |\n| --rare-words-pinyin-key-color | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #000000;\">#ffffff</div>                         | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div>                         | Rare word pinyin key color   |\n| --rare-words-inner-bg         | <div style=\"width: 150px; height: 30px; background-color: #cccccc; color: #000000;\">#cccccc</div>                         | <div style=\"width: 150px; height: 30px; background-color: #474747; color: #ffffff;\">#474747</div>                         | Rare word inner background color   |\n| --rare-words-active-color     | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div>                         | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div>                         | Rare word activation status color |\n| --rare-words-pinyin-color     | <div style=\"width: 150px; height: 30px; background-color: #f5f5f5; color: #000000;\">#f5f5f5</div>                         | <div style=\"width: 150px; height: 30px; background-color: #121212; color: #ffffff;\">#121212</div>                         | Rare word pinyin color     |\n| --rare-words-keyboard-bg      | <div style=\"width: 150px; height: 30px; background-color: #4a4a4a; color: #ffffff;\">#4a4a4a</div>                         | <div style=\"width: 150px; height: 30px; background-color: #4a4a4a; color: #ffffff;\">#4a4a4a</div>                         | Rare word keyboard background color   |\n| --rare-words-item-tips-color  | <div style=\"width: 150px; height: 30px; background-color: #666666; color: #ffffff;\">#666666</div>                         | <div style=\"width: 150px; height: 30px; background-color: #808080; color: #ffffff;\">#808080</div>                         | Rare Word Item Prompt Color |\n"
  },
  {
    "path": "src/RareWordsKeyboard/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-icon\": \"../Icon/index\",\n    \"result\": \"../Result/index\",\n    \"button\": \"../Button/index\",\n    \"loading\": \"../Loading/index\"\n  }\n}\n"
  },
  {
    "path": "src/RareWordsKeyboard/index.less",
    "content": "@import (reference) './variable.less';\n\n@keyframes number-input-cursor {\n  0% {\n    opacity: 0;\n  }\n  50% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n\n.ant-rare-words-keyboard {\n  color: @rare-words-keyboard-color;\n  width: 0;\n  height: 0;\n  position: relative;\n  overflow: hidden;\n\n  &-modal {\n    z-index: 998;\n    position: fixed;\n    bottom: 0;\n    left: 0;\n    width: 100vw;\n    height: 100vh;\n    background-color: @rare-words-bg;\n\n    &.hide {\n      visibility: hidden;\n    }\n  }\n\n  &-kb {\n    background: @rare-words-kb-bg;\n    max-height: 1200 * @rpx;\n    min-width: 100vw;\n    position: fixed;\n    bottom: 0;\n    left: 0;\n    transition: all 200ms linear;\n    z-index: 999;\n\n    &.hide {\n      transform: translateY(100%);\n      max-height: 0;\n    }\n\n    &_iphonex-safe {\n      height: calc(constant(safe-area-inset-bottom) - 20 * @rpx);\n      height: calc(env(safe-area-inset-bottom) - 20 * @rpx);\n      width: 100%;\n      background-color: @rare-words-kb-bg;\n    }\n  }\n\n  &_header {\n    background-color: @rare-words-kb-bg;\n  }\n\n  &-input_value {\n    position: absolute;\n    top: -64 * @rpx;\n    left: 0;\n    display: inline-block;\n    height: 64 * @rpx;\n    line-height: 64 * @rpx;\n    border-top-left-radius: 8 * @rpx;\n    border-top-right-radius: 8 * @rpx;\n    background-color: @rare-words-kb-bg;\n    padding-left: 20 * @rpx;\n    padding-right: 20 * @rpx;\n    border: 1 * @rpx solid @rare-words-border-color;\n    border-bottom: 0;\n    letter-spacing: 2 * @rpx;\n    box-sizing: border-box;\n    font-size: 24 * @rpx;\n    color: @rare-words-keyboard-color;\n\n    &.hide {\n      display: none;\n    }\n  }\n\n  &-match_words {\n    display: flex;\n    flex-flow: row nowrap;\n    align-items: flex-start;\n    justify-content: flex-start;\n    padding: 20 * @rpx 24 * @rpx 20 * @rpx 8 * @rpx;\n    background: @rare-words-kb-bg;\n    overflow: hidden;\n    font-family: 'rare-words-font';\n\n    &.absolute {\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      box-sizing: border-box;\n      z-index: 10000;\n      padding-left: 0;\n      overflow: auto;\n    }\n\n    &_wrap {\n      min-height: 96 * @rpx;\n\n      &::before {\n        content: '';\n        display: block;\n        position: absolute;\n        top: 0;\n        left: 0;\n        background: @rare-words-inner-bg;\n        width: 100%;\n        height: 2 * @rpx;\n        transform: scaleY(0.5);\n        transform-origin: 0 0;\n      }\n    }\n\n    &_item_tips {\n      padding-left: 8 * @rpx;\n      font-size: 28 * @rpx;\n      color: @rare-words-item-tips-color;\n      line-height: 34 * @rpx;\n\n      &.loading {\n        display: flex;\n        flex-flow: row nowrap;\n        align-items: center;\n      }\n    }\n\n    &_inner {\n      flex: 1;\n      display: flex;\n      flex-flow: row wrap;\n      align-items: center;\n      justify-content: flex-start;\n      overflow: hidden;\n      height: 56 * @rpx;\n      white-space: nowrap;\n      box-sizing: border-box;\n      margin-right: -32 * @rpx;\n      padding-right: 42 * @rpx;\n\n      &.all {\n        height: auto;\n        margin-top: -20 * @rpx;\n        position: relative;\n        padding-left: 8 * @rpx;\n        padding-right: 42 * @rpx;\n\n        &::after {\n          content: '';\n          display: block;\n          position: absolute;\n          left: -64 * @rpx;\n          bottom: 0;\n          background: @rare-words-inner-bg;\n          width: 100%;\n          height: 2 * @rpx;\n          transform: scaleY(0.5);\n          transform-origin: 0 0;\n        }\n      }\n    }\n\n    &_item {\n      color: @rare-words-inner-bg;\n      width: 73 * @rpx;\n      padding-left: 16 * @rpx;\n      padding-right: 16 * @rpx;\n      box-sizing: border-box;\n\n      &.all {\n        padding-top: 20 * @rpx;\n        padding-bottom: 20 * @rpx;\n        position: relative;\n\n        &::after {\n          content: '';\n          display: block;\n          position: absolute;\n          left: -20 * @rpx;\n          bottom: 0;\n          background: @rare-words-inner-bg;\n          width: 100%;\n          height: 2 * @rpx;\n          transform: scaleY(0.5);\n          transform-origin: 0 0;\n        }\n      }\n\n      &_text {\n        font-size: 42 * @rpx;\n        line-height: 57 * @rpx;\n        user-select: none;\n        color: @rare-words-keyboard-color;\n\n        &:active {\n          color: @rare-words-active-color;\n        }\n\n        &:hover {\n          color: @rare-words-active-color;\n        }\n      }\n    }\n\n    &_hidden {\n      visibility: hidden;\n      position: absolute;\n      top: -19998 * @rpx;\n      left: -19998 * @rpx;\n      width: 73 * @rpx;\n      padding-left: 16 * @rpx;\n      padding-right: 16 * @rpx;\n      box-sizing: border-box;\n    }\n\n    &_right {\n      width: 48 * @rpx;\n      height: 48 * @rpx;\n      display: flex;\n      flex-flow: row nowrap;\n      align-items: center;\n      justify-content: center;\n      position: relative;\n      margin-top: 4 * @rpx;\n      color: @rare-words-keyboard-color;\n\n      &.sticky {\n        position: sticky !important;\n        top: 0 !important;\n        left: 0 !important;\n      }\n\n      &.overflow {\n        &::before {\n          content: '';\n          display: block;\n          width: 10 * @rpx;\n          height: 100%;\n          background: linear-gradient(\n            to right,\n            transparent,\n            @rare-words-keyboard-bg\n          );\n          position: absolute;\n          left: -32 * @rpx;\n        }\n      }\n    }\n  }\n\n  &-loading {\n    min-height: 34 * @rpx;\n    margin-right: 12 * @rpx;\n  }\n\n  &_delete {\n    font-size: 48 * @rpx;\n  }\n\n  &_down {\n    font-size: 48 * @rpx;\n  }\n\n  &_pinyin {\n    background: @rare-words-pinyin-color;\n    padding-top: 16 * @rpx;\n    padding-bottom: 16 * @rpx;\n\n    &_row {\n      display: flex;\n      flex-flow: row nowrap;\n      justify-content: center;\n      background: @rare-words-pinyin-color;\n      margin-bottom: 16 * @rpx;\n\n      &:last-child {\n        margin-bottom: 0;\n      }\n    }\n\n    &_key {\n      position: relative;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      height: 88 * @rpx;\n      width: 63 * @rpx;\n      background: @rare-words-pinyin-key-color;\n      font-size: 36 * @rpx;\n      color: @rare-words-keyboard-color;\n      box-sizing: border-box;\n      border-radius: 8 * @rpx;\n      margin-right: 12 * @rpx;\n      user-select: none;\n\n      &:active {\n        background: @rare-words-active-color;\n        color: @rare-words-pinyin-key-color;\n      }\n\n      &:last-child {\n        margin-right: 0;\n      }\n\n      &.delete {\n        width: 80 * @rpx;\n      }\n    }\n  }\n\n  &_error {\n    background: @rare-words-pinyin-color;\n    padding-top: 30 * @rpx;\n    padding-bottom: 30 * @rpx;\n\n    .ant-result-main {\n      background: none;\n      margin-bottom: 0;\n      padding-top: 40 * @rpx;\n      padding-bottom: 40 * @rpx;\n    }\n\n    .ant-result-message {\n      text-align: center;\n    }\n\n    &-btns {\n      display: flex;\n      flex-flow: row nowrap;\n      align-items: center;\n      justify-content: center;\n    }\n  }\n}\n"
  },
  {
    "path": "src/RareWordsKeyboard/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 数据录入\n  order: 10\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# RareWordsKeyboard 生僻字键盘\n\n生僻字问题一直是社会的一个难点，各行业由于不同时期、不同标准的开发，使得支持的汉字字符不一，导致生僻字姓名在互联网业务中的互联互通十分困难，严重影响了生僻字姓名人员的业务办理；此生僻字键盘能够帮助生僻字用户解决在计算机世界中无法输入姓名的问题。\n\n## Tip\n\n1. 开发者可以自己决定何时唤起生僻字键盘。\n2. 输入完成生僻字后，会通过回调参数返回此次输入的生僻字，并关闭键盘。\n\n## 代码示例\n\n### 基本使用\n\n<code src='../../demo/pages/RareWordsKeyboard/index'></code>\n\n## API\n\n| 属性                   | 说明                                  | 类型                      | 默认值 |\n| ---------------------- | ------------------------------------- | ------------------------- | ------ |\n| visible                | 是否可见                              | boolean                   | false  |\n| type                   | 键盘类型，目前只支持 `pinyin`（拼音） | string                    | pinyin |\n| showMask               | 是否展示背景蒙层                      | boolean                   | true   |\n| safeArea               | 是否保留安全距离                      | boolean                   | true   |\n| #if ALIPAY onClose     | 关闭键盘时触发的回调                  | `() => void`              | -      |\n| #if ALIPAY onChange    | 输入完成时触发的回调                  | `(value: string) => void` | -      |\n| #if ALIPAY onError     | 打开键盘出错时触发的回调              | `(err: Error) => void`    | -      |\n| #if WECHAT bindclose  | 关闭键盘时触发的回调                  | `() => void`              | -      |\n| #if WECHAT bindchange | 输入完成时触发的回调                  | `(value: string) => void` | -      |\n| #if WECHAT binderror  | 打开键盘出错时触发的回调              | `(err: Error) => void`    | -      |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                        | 默认值                                                                                                                    | 深色模式默认值                                                                                                            | 备注               |\n| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------ |\n| --rare-words-bg               | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.45); color: #ffffff;\">rgba(0, 0, 0, 0.45)</div> | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.45); color: #ffffff;\">rgba(0, 0, 0, 0.45)</div> | 稀有字背景颜色     |\n| --rare-keyboard-bg            | <div style=\"width: 150px; height: 30px; background-color: #d8d8d8; color: #000000;\">#d8d8d8</div>                         | <div style=\"width: 150px; height: 30px; background-color: #4a4a4a; color: #ffffff;\">#4a4a4a</div>                         | 稀有字键盘背景色   |\n| --rare-words-keyboard-color   | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div>                         | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #000000;\">#c5cad1</div>                         | 稀有字键盘文字颜色 |\n| --rare-words-border-color     | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #000000;\">#eeeeee</div>                         | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #ffffff;\">#2b2b2b</div>                         | 稀有字边框颜色     |\n| --rare-words-kb-bg            | <div style=\"width: 150px; height: 30px; background-color: #f5f5f5; color: #000000;\">#f5f5f5</div>                         | <div style=\"width: 150px; height: 30px; background-color: #121212; color: #ffffff;\">#121212</div>                         | 稀有字键盘背景色   |\n| --rare-words-pinyin-key-color | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #000000;\">#ffffff</div>                         | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div>                         | 稀有字拼音键颜色   |\n| --rare-words-inner-bg         | <div style=\"width: 150px; height: 30px; background-color: #cccccc; color: #000000;\">#cccccc</div>                         | <div style=\"width: 150px; height: 30px; background-color: #474747; color: #ffffff;\">#474747</div>                         | 稀有字内部背景色   |\n| --rare-words-active-color     | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div>                         | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div>                         | 稀有字激活状态颜色 |\n| --rare-words-pinyin-color     | <div style=\"width: 150px; height: 30px; background-color: #f5f5f5; color: #000000;\">#f5f5f5</div>                         | <div style=\"width: 150px; height: 30px; background-color: #121212; color: #ffffff;\">#121212</div>                         | 稀有字拼音颜色     |\n| --rare-words-keyboard-bg      | <div style=\"width: 150px; height: 30px; background-color: #4a4a4a; color: #ffffff;\">#4a4a4a</div>                         | <div style=\"width: 150px; height: 30px; background-color: #4a4a4a; color: #ffffff;\">#4a4a4a</div>                         | 稀有字键盘背景色   |\n| --rare-words-item-tips-color  | <div style=\"width: 150px; height: 30px; background-color: #666666; color: #ffffff;\">#666666</div>                         | <div style=\"width: 150px; height: 30px; background-color: #808080; color: #ffffff;\">#808080</div>                         | 稀有字项目提示颜色 |\n"
  },
  {
    "path": "src/RareWordsKeyboard/index.ts",
    "content": "import { getInstanceBoundingClientRect } from '../_util/jsapi/get-instance-bounding-client-rect';\nimport { Component, triggerEvent, triggerEventOnly } from '../_util/simply';\nimport { assertAilpayNativeNotSupport } from '../_util/support';\nimport { PINYIN_MAP } from './constants';\nimport { RareWordsKeyboardProps } from './props';\nimport { formatZDatas, loadFontFace, matchWordsRecommend } from './utils';\nimport { ZDATAS } from './zdatas';\n\nconst wordsData = formatZDatas(ZDATAS.datas);\n\nassertAilpayNativeNotSupport('RareWordsKeyboard');\n\nComponent({\n  props: RareWordsKeyboardProps,\n  data: {\n    loading: false,\n    inputValue: [], // 已输入的字符数组\n    displayStr: '', // 已输入的字符串\n    matchWordsList: [], // 候选字列表\n    showMoreWords: false, // 是否展示更多候选字\n    pinyinMaps: PINYIN_MAP, // 拼音键盘\n    maxDisplayNum: 0, // 一行最多展示的字数\n    showErrorPage: false, // 是否展示错误页\n  },\n  methods: {\n    getInstance() {\n      if (this.$id) {\n        return my;\n      }\n      return this;\n    },\n    async getBoundingClientRect(query: string) {\n      return await getInstanceBoundingClientRect(this.getInstance(), query);\n    },\n    // 隐藏键盘，失去焦点\n    handleHide() {\n      this.setData({\n        inputValue: [],\n        matchWordsList: [],\n        displayStr: '',\n        showMoreWords: false,\n      });\n      triggerEventOnly(this, 'close');\n    },\n\n    // 点击键盘key值\n    handleKeyClick(e) {\n      if (this.data.loading) return;\n      const { value = '' } = e.currentTarget.dataset;\n      if (!value) return;\n      const inputValue = [...this.data.inputValue, value];\n      this.setData({\n        inputValue: [...inputValue],\n        ...this.computeMatchWords(inputValue),\n      });\n    },\n\n    // 点击删除\n    handleDelete() {\n      const inputValue = [...this.data.inputValue];\n      if (this.data.inputValue.length === 0) return;\n      inputValue.pop();\n      this.setData({\n        inputValue: [...inputValue],\n        ...this.computeMatchWords(inputValue),\n      });\n    },\n\n    // 计算展示值和候选字列表\n    computeMatchWords(inputValue) {\n      const displayStr = Array.isArray(inputValue)\n        ? inputValue.join('')\n        : inputValue;\n      const curMatchWords = matchWordsRecommend(wordsData, displayStr);\n      return {\n        displayStr,\n        matchWordsList: curMatchWords,\n      };\n    },\n\n    // 点击查看更多\n    hanleLookMore() {\n      if (this.data.matchWordsList.length <= this.data.maxDisplayNum) {\n        this.handleHide();\n        return;\n      }\n      this.setData({\n        showMoreWords: !this.data.showMoreWords,\n      });\n    },\n\n    // 计算每行可以展示的最大字数\n    async computeMaxDisplayNum() {\n      const [singleWords, wordsWrap] = await Promise.all([\n        this.getBoundingClientRect(\n          '.ant-rare-words-keyboard-match_words_hidden'\n        ),\n        this.getBoundingClientRect(\n          '.ant-rare-words-keyboard-match_words_inner'\n        ),\n      ]);\n      if (!wordsWrap?.width || !singleWords?.width) return;\n      const maxDisplayNumInOneLine = parseInt(\n        (wordsWrap?.width / singleWords?.width).toString(),\n        10\n      );\n      this.setData({ maxDisplayNum: maxDisplayNumInOneLine });\n    },\n\n    // 加载字体\n    loadFont() {\n      this.setData({\n        loading: true,\n      });\n      loadFontFace()\n        .then(() => {\n          this.setData({ showErrorPage: false, loading: false });\n        })\n        .catch((err) => {\n          this.setData({ showErrorPage: true, loading: false });\n          triggerEvent(this, 'error', err);\n        });\n    },\n\n    // 点击重试\n    handleRetry() {\n      this.loadFont();\n    },\n\n    handleWordClick(e) {\n      const { value = '' } = e.currentTarget.dataset;\n      if (!value) return;\n      triggerEvent(this, 'change', value);\n      this.handleHide();\n    },\n  },\n  /// #if ALIPAY\n  didMount() {\n    this.loadFont();\n    this.computeMaxDisplayNum();\n  },\n  /// #endif\n  /// #if WECHAT\n  attached() {\n    this.loadFont();\n    this.computeMaxDisplayNum();\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/RareWordsKeyboard/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\nexport interface ICommonError {\n  detail: Error; // 错误详情\n  errorCode: string; // 错误码\n  message: string; // 错误文案\n  onRetry?: () => Promise<void>; // 重试的错误方法\n}\n\nexport enum InputTypes {\n  stroke = 'stroke', // 笔画输入\n  pinyin = 'pinyin', // 拼音输入\n  handwriting = 'handwriting', // 手写输入\n}\n\nexport interface IPinYinMapItem {\n  label: string; // 展示的文案\n  value: string; // 实际输入的值\n  extraClassName?: string; // 额外域名，用来定制样式\n}\n\nexport interface IWordsItem {\n  charId?: string; // 生僻字唯一ID\n  unicodeChar: string; // unicode 字符\n  unicodeCodePoint: string; // unicode 码点\n  unicodeFont: string | null; // 单个字字体文件地址\n  pinYinChars: string[]; // 拼音\n  splitChars: string[]; // 拆字\n  weight?: number | null; // 权重\n  type?: string; // 类型\n  extInfo?: string | null; // 其他信息\n  sort?: number; // 排序得分\n}\n\nexport type IFilterType = 'pinyin' | 'split' | 'all';\n\nexport interface IWordsItem {\n  charId?: string; // 生僻字唯一ID\n  unicodeChar: string; // unicode 字符\n  unicodeCodePoint: string; // unicode 码点\n  unicodeFont: string | null; // 单个字字体文件地址\n  pinYinChars: string[]; // 拼音\n  splitChars: string[]; // 拆字\n  weight?: number | null; // 权重\n  type?: string; // 类型\n  extInfo?: string | null; // 其他信息\n  sort?: number; // 排序得分\n}\n\nexport type IWordsData = IWordsItem[];\n\nexport interface IRareWordsKeyboardProps extends IBaseProps {\n  /**\n   * @title 是否可见\n   */\n  visible?: boolean;\n\n  /**\n   * @title 键盘类型\n   */\n  type?: InputTypes | string;\n\n  /**\n   * @title 是否展示蒙层\n   * @description 默认 true\n   */\n  showMask?: boolean;\n\n  /**\n   * @description 安全距离\n   * @default true\n   */\n  safeArea?: boolean;\n\n  /**\n   * @title 关闭的时候触发的回调\n   */\n  onClose?: () => void;\n\n  /**\n   * @title 输入完成的时候触发的回调\n   */\n  onChange?: (value: string) => void;\n\n  /**\n   * @title 组件错误的时候的回调\n   */\n  onError?: (err: Error) => void;\n}\n\nexport const RareWordsKeyboardProps: Partial<IRareWordsKeyboardProps> = {\n  visible: false,\n  type: 'pinyin',\n  showMask: true,\n  safeArea: true,\n};\n"
  },
  {
    "path": "src/RareWordsKeyboard/utils.ts",
    "content": "import { IWordsData, IFilterType } from './props';\nimport { ZDATAS } from './zdatas';\nimport { loadFontFace as loadFontFaceJSAPI } from '../_util/jsapi/load-font-face';\n\n/**\n * json转字符串\n * @param {string} data 需要转json的字符串\n * @return {object} json 字符串\n */\nexport function safeJSONparse(data: string): object {\n  let result;\n  try {\n    result = JSON.parse(data);\n  } catch {\n    result = {};\n  }\n  return result || {};\n}\n\n/**\n * 判断数组是否为空\n */\nexport function isWordsDataEmpty(arr) {\n  if (!arr) return true;\n  if (!Array.isArray(arr)) return true;\n  if (arr.length === 0) return true;\n  // 数据合法性校验\n  if (!arr?.[0]?.charId) return true;\n  return false;\n}\n\n/**\n * 清除字符串里的数字\n */\nexport function clearNumberInStr(str: string) {\n  return str.replace(/[0-9]/gi, '');\n}\n\n/**\n * 格式化字库数据\n * @param datas ZDatas 数据\n * @return {IWordsData} 字库\n */\nexport function formatZDatas(datas = []) {\n  return datas.map((item) => {\n    return {\n      ...item,\n      pinYinChars: item.pinYinChars.map((i) => i.char),\n      splitChars: item.splitChars.map((i) => i.char),\n    };\n  });\n}\n\n/**\n * 候选字推荐序函数\n * 考虑两个维度，一个是输入值和生僻字的匹配程度，比如你输入YA 雅是完全匹配，炎是模糊匹配，排列的时候肯定”雅“在前面，\n * 如果除了”雅“还有一个”亚“，两个都是完全匹配，这个时候就看哪个字占比高，哪个就排在前面\n * @param {IWordsData} wordsData 字库数据\n * @param {string} inputValue 当前输入的值\n * @param {string} filterKey 过滤依据的key值\n * @return {IWordsData} 返回符合要求并且排序好的候选项列表\n */\nexport function matchWordsRecommend(\n  wordsData: IWordsData = [],\n  inputValue = '',\n  filterKey: IFilterType = 'all'\n) {\n  return wordsSorter(\n    wordsFilter(wordsData, inputValue, filterKey),\n    inputValue,\n    filterKey\n  );\n}\n\n/**\n * 字库过滤，只挑选符合要求的候选字\n * @param {IWordsData} wordsData 字库数据\n * @param {string} inputValue 当前输入的值\n * @param {string} filterKey 过滤依据的key值\n * @return {IWordsData} 返回符合要求并且排序好的候选项列表\n */\nexport function wordsFilter(\n  wordsData: IWordsData = [],\n  inputValue = '',\n  filterKey: IFilterType = 'all'\n): IWordsData {\n  // 字库数据为空降级为使用本地数据\n  if (!wordsData || isWordsDataEmpty(wordsData))\n    wordsData = formatZDatas(ZDATAS.datas);\n  if (!inputValue) return [];\n\n  switch (filterKey) {\n    case 'all':\n      /* eslint-disable-next-line no-case-declarations */\n      const matchPinyinArr = filterByPinyin(wordsData, inputValue);\n      /* eslint-disable-next-line no-case-declarations */\n      const matchSplitArr = filterBySplitWord(wordsData, inputValue);\n      return mergeMatchWordsArr(matchPinyinArr, matchSplitArr);\n    case 'pinyin':\n      return filterByPinyin(wordsData, inputValue);\n    case 'split':\n      return filterBySplitWord(wordsData, inputValue);\n    default:\n      return [];\n      break;\n  }\n}\n\n/**\n * 根据拼音过滤候选项\n * @param {IWordsData} wordsData 字库数据\n * @param {string} inputValue 当前输入的值\n * @return {IWordsData} 返回符合要求并候选项列表\n */\nfunction filterByPinyin(\n  wordsData: IWordsData = [],\n  inputValue = ''\n): IWordsData {\n  const keyTranslate = inputValue.toUpperCase();\n  return wordsData.filter((item) => {\n    const pinYinChars = item?.pinYinChars || [];\n    if (pinYinChars.length === 0) return false;\n    return (\n      pinYinChars.filter((pinyinItem) => {\n        return pinyinItem.indexOf(keyTranslate) > -1;\n      }).length > 0\n    );\n  });\n}\n\n/**\n * 根据拆字过滤候选项\n * @param {IWordsData} wordsData 字库数据\n * @param {string} inputValue 当前输入的值\n * @return {IWordsData} 返回符合要求并候选项列表\n */\nfunction filterBySplitWord(\n  wordsData: IWordsData = [],\n  inputValue = ''\n): IWordsData {\n  return wordsData.filter((item) => {\n    const splitChars = item.splitChars || [];\n    if (splitChars.length === 0) {\n      return false;\n    }\n    return (\n      splitChars.filter((splitItem) => {\n        return splitItem.indexOf(inputValue) > -1;\n      }).length > 0\n    );\n  });\n}\n\n/**\n * 合并多个候选项数组\n * @param {IWordsData} pinyinMatchArr 拼音匹配的候选项\n * @param {IWordsData} splitMatchArr 拼音匹配的候选项\n * @return {IWordsData} 返回合并后的候选项列表\n */\nfunction mergeMatchWordsArr(\n  pinyinMatchArr: IWordsData,\n  splitMatchArr: IWordsData\n) {\n  const unDuplicate = [...pinyinMatchArr, ...splitMatchArr];\n  if (unDuplicate.length === 0) return unDuplicate;\n\n  const results = [];\n  unDuplicate.forEach((item) => {\n    const findDuplicateWords = results.filter((item2) => {\n      return item.unicodeCodePoint === item2.unicodeCodePoint;\n    });\n    if (findDuplicateWords.length === 0) results.push(item);\n  });\n  return results;\n}\n\n/**\n * 候选项排序，用户选择可能性高的候选项排在前面\n * @param {IWordsData} wordsData 字库数据\n * @param {string} inputValue 当前输入的值\n * @param {string} filterKey 过滤依据的key值\n * @return {IWordsData} 返回符合要求并且排序好的候选项列表\n */\nexport function wordsSorter(\n  wordsData: IWordsData,\n  inputValue: string,\n  filterKey: IFilterType = 'all'\n): IWordsData {\n  switch (filterKey) {\n    case 'all':\n      // 当输入值以字母开头使用拼音排序\n      if (/^[a-zA-Z0-9]+$/.test(inputValue)) {\n        return sortByPinyin(wordsData, inputValue);\n      }\n      return sortBySplitWord(wordsData, inputValue);\n    case 'pinyin':\n      return sortByPinyin(wordsData, inputValue);\n    case 'split':\n      return sortBySplitWord(wordsData, inputValue);\n    default:\n      return [];\n      break;\n  }\n}\n\n/**\n * 根据拼音给候选项排序\n * @param {IWordsData} wordsData 字库数据\n * @param {string} inputValue 当前输入的值\n * @return {IWordsData} 返回符合要求并候选项列表\n */\nfunction sortByPinyin(wordsData: IWordsData = [], inputValue = ''): IWordsData {\n  const arr = wordsData.slice();\n  // 清除输入值中的数字\n  const keyTranslate = clearNumberInStr(inputValue.toUpperCase());\n\n  arr.forEach((item) => {\n    let sort = 0;\n    const pinYinChars = (item.pinYinChars || []).map((pinyin) => {\n      return clearNumberInStr(pinyin.toUpperCase());\n    });\n\n    // 拼音完全匹配 + 10000\n    if (pinYinChars.indexOf(keyTranslate) > -1) sort += 10000;\n\n    // 拼音模糊匹配 + 5000\n    if (\n      pinYinChars.filter((splitKey) => splitKey.indexOf(keyTranslate) === 0)\n        .length > 0\n    ) {\n      sort += 5000;\n    }\n\n    // 加上当前字的权重\n    sort += item.weight || 0;\n\n    /* eslint-disable no-param-reassign */\n    item.sort = sort;\n  });\n\n  // 根据最终排序值排序\n  arr.sort((item1, item2) => (item2.sort || 0) - (item1.sort || 0));\n\n  return arr;\n}\n\n/**\n * 根据拆字给候选项排序\n * @param {IWordsData} wordsData 字库数据\n * @param {string} inputValue 当前输入的值\n * @return {IWordsData} 返回符合要求并候选项列表\n */\nfunction sortBySplitWord(\n  wordsData: IWordsData = [],\n  inputValue = ''\n): IWordsData {\n  const arr = wordsData.slice();\n\n  arr.forEach((item) => {\n    let sort = 0;\n    const p = item.splitChars || [];\n\n    // 拆字完全匹配 + 10000\n    if (p.indexOf(inputValue) > -1) sort += 10000;\n\n    // 拆字模糊匹配 + 5000\n    if (p.filter((splitKey) => splitKey.indexOf(inputValue) === 0).length > 0) {\n      sort += 5000;\n    }\n\n    // 加上当前字的权重\n    sort += item.weight || 0;\n\n    /* eslint-disable no-param-reassign */\n    item.sort = sort;\n  });\n\n  // 根据最终排序值排序\n  arr.sort((item1, item2) => (item2.sort || 0) - (item1.sort || 0));\n  return arr;\n}\n\n/**\n * 加载远程字体\n */\nexport async function loadFontFace() {\n  const fontName = `url(\"${ZDATAS.fontUrl}\")`;\n  return loadFontFaceJSAPI({\n    family: 'rare-words-font',\n    source: fontName,\n  });\n}\n"
  },
  {
    "path": "src/RareWordsKeyboard/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n@rare-words-keyboard-color: var(\n  --rare-words-keyboard-color,\n  @COLOR_TEXT_PRIMARY\n);\n@rare-words-bg: var(--rare-words-bg, rgba(0, 0, 0, 0.45));\n@rare-words-kb-bg: var(--rare-words-kb-bg, @COLOR_BACKGROUND);\n@rare-words-border-color: var(--rare-words-border-color, @COLOR_BORDER);\n@rare-words-inner-bg: var(--rare-words-inner-bg, @COLOR_TEXT_WEAK);\n@rare-words-active-color: var(--rare-words-active-color, @COLOR_BRAND1);\n@rare-words-pinyin-color: var(--rare-words-pinyin-color, @COLOR_BACKGROUND);\n@rare-words-pinyin-key-color: var(--rare-words-pinyin-key-color, @COLOR_WHITE);\n@rare-words-item-tips-color: var(\n  --rare-words-item-tips-color,\n  @COLOR_TEXT_SECONDARY\n);\n@rare-words-keyboard-bg: var(--rare-words-keyboard-bg, #4a4a4a);\n"
  },
  {
    "path": "src/RareWordsKeyboard/zdatas.ts",
    "content": "export const ZDATAS = {\n  version: '1.0.4',\n  fontUrl: 'https://mdn.alipayobjects.com/huamei_2fq7mt/afts/file/A*wBbQRYCq_p4AAAAAAAAAAAAADh58AQ/RareWordsFonts.ttf',\n  datas: [{\"charId\":\"d88cab\",\"unicodeChar\":\"𮧵\",\"unicodeCodePoint\":\"2E9F5\",\"pinYinChars\":[{\"char\":\"WEI3\"}],\"splitChars\":[{\"char\":\"韦华\"}],\"weight\":\"10\"},{\"charId\":\"84c3c9\",\"unicodeChar\":\"𬀩\",\"unicodeCodePoint\":\"2C029\",\"pinYinChars\":[{\"char\":\"WEI3\"}],\"splitChars\":[{\"char\":\"日韦\"}],\"weight\":\"10\"},{\"charId\":\"2006a3\",\"unicodeChar\":\"𤩽\",\"unicodeCodePoint\":\"24A7D\",\"pinYinChars\":[{\"char\":\"HUAN2\"}],\"splitChars\":[{\"char\":\"王献\"}],\"weight\":\"10\"},{\"charId\":\"b93b09\",\"unicodeChar\":\"㑇\",\"unicodeCodePoint\":\"3447\",\"pinYinChars\":[{\"char\":\"ZHOU1\"}],\"splitChars\":[{\"char\":\"亻刍\"},{\"char\":\"人刍\"}],\"weight\":\"10\"},{\"charId\":\"4e9967\",\"unicodeChar\":\"𣲗\",\"unicodeCodePoint\":\"23C97\",\"pinYinChars\":[{\"char\":\"WEI2\"}],\"splitChars\":[{\"char\":\"氵韦\"},{\"char\":\"水韦\"}],\"weight\":\"10\"},{\"charId\":\"91f144\",\"unicodeChar\":\"𰵞\",\"unicodeCodePoint\":\"30D5E\",\"pinYinChars\":[{\"char\":\"YONG1\"}],\"splitChars\":[{\"char\":\"讠永\"},{\"char\":\"言永\"}],\"weight\":\"10\"},{\"charId\":\"00267b\",\"unicodeChar\":\"𠇔\",\"unicodeCodePoint\":\"201D4\",\"pinYinChars\":[{\"char\":\"TUO1\"}],\"splitChars\":[{\"char\":\"亻毛\"},{\"char\":\"人毛\"}],\"weight\":\"10\"},{\"charId\":\"a50d8e\",\"unicodeChar\":\"冄\",\"unicodeCodePoint\":\"5184\",\"pinYinChars\":[{\"char\":\"RAN2\"}],\"splitChars\":[],\"weight\":\"8\"},{\"charId\":\"264ae4\",\"unicodeChar\":\"䒟\",\"unicodeCodePoint\":\"449F\",\"pinYinChars\":[{\"char\":\"DAN1\"}],\"splitChars\":[{\"char\":\"艹丹\"},{\"char\":\"草丹\"}],\"weight\":\"8\"},{\"charId\":\"0dbd6a\",\"unicodeChar\":\"𡛓\",\"unicodeCodePoint\":\"216D3\",\"pinYinChars\":[{\"char\":\"RAN3\"}],\"splitChars\":[{\"char\":\"女丹\"}],\"weight\":\"10\"},{\"charId\":\"bc8447\",\"unicodeChar\":\"𡝗\",\"unicodeCodePoint\":\"21757\",\"pinYinChars\":[{\"char\":\"JUN1\"},{\"char\":\"QUN2\"}],\"splitChars\":[{\"char\":\"女君\"}],\"weight\":\"10\"},{\"charId\":\"f6db38\",\"unicodeChar\":\"𪻐\",\"unicodeCodePoint\":\"2AED0\",\"pinYinChars\":[{\"char\":\"CONG1\"}],\"splitChars\":[{\"char\":\"王从\"}],\"weight\":\"10\"},{\"charId\":\"4b5c44\",\"unicodeChar\":\"𫰡\",\"unicodeCodePoint\":\"2BC21\",\"pinYinChars\":[{\"char\":\"HUA4\"}],\"splitChars\":[{\"char\":\"女华\"}],\"weight\":\"10\"},{\"charId\":\"8ee75e\",\"unicodeChar\":\"䴖\",\"unicodeCodePoint\":\"4D16\",\"pinYinChars\":[{\"char\":\"JING1\"}],\"splitChars\":[{\"char\":\"青鸟\"}],\"weight\":\"10\"},{\"charId\":\"b575d0\",\"unicodeChar\":\"𠅤\",\"unicodeCodePoint\":\"20164\",\"pinYinChars\":[{\"char\":\"XI1\"}],\"splitChars\":[{\"char\":\"亠思\"},{\"char\":\"二思\"},{\"char\":\"亩心\"}],\"weight\":\"10\"},{\"charId\":\"e95ed7\",\"unicodeChar\":\"𪨧\",\"unicodeCodePoint\":\"2AA27\",\"pinYinChars\":[{\"char\":\"LUN2\"}],\"splitChars\":[{\"char\":\"山仑\"}],\"weight\":\"10\"},{\"charId\":\"a6819c\",\"unicodeChar\":\"𰎝\",\"unicodeCodePoint\":\"3039D\",\"pinYinChars\":[{\"char\":\"JUN1\"},{\"char\":\"HUN2\"}],\"splitChars\":[{\"char\":\"山军\"}],\"weight\":\"10\"},{\"charId\":\"1968a4\",\"unicodeChar\":\"𫰍\",\"unicodeCodePoint\":\"2BC0D\",\"pinYinChars\":[{\"char\":\"WEI2\"},{\"char\":\"WEI3\"}],\"splitChars\":[{\"char\":\"女韦\"}],\"weight\":\"10\"},{\"charId\":\"b7232e\",\"unicodeChar\":\"㺭\",\"unicodeCodePoint\":\"3EAD\",\"pinYinChars\":[{\"char\":\"ZI3\"}],\"splitChars\":[{\"char\":\"王子\"}],\"weight\":\"10\"},{\"charId\":\"96477d\",\"unicodeChar\":\"𬳳\",\"unicodeCodePoint\":\"2CCF3\",\"pinYinChars\":[{\"char\":\"FAN1\"}],\"splitChars\":[{\"char\":\"马风\"}],\"weight\":\"10\"},{\"charId\":\"2930db\",\"unicodeChar\":\"𫍽\",\"unicodeCodePoint\":\"2B37D\",\"pinYinChars\":[{\"char\":\"XUAN1\"}],\"splitChars\":[{\"char\":\"讠睘\"},{\"char\":\"言睘\"}],\"weight\":\"10\"},{\"charId\":\"1658b6\",\"unicodeChar\":\"禤\",\"unicodeCodePoint\":\"79A4\",\"pinYinChars\":[{\"char\":\"XUAN1\"}],\"splitChars\":[{\"char\":\"衣四羽\"}],\"weight\":\"8\"},{\"charId\":\"c48f08\",\"unicodeChar\":\"𮣳\",\"unicodeCodePoint\":\"2E8F3\",\"pinYinChars\":[{\"char\":\"HONG2\"},{\"char\":\"GONG1\"}],\"splitChars\":[{\"char\":\"钅厷\"},{\"char\":\"金厷\"}],\"weight\":\"10\"},{\"charId\":\"ecefb5\",\"unicodeChar\":\"晔\",\"unicodeCodePoint\":\"6654\",\"pinYinChars\":[{\"char\":\"YE4\"}],\"splitChars\":[{\"char\":\"日华\"}],\"weight\":\"8\"},{\"charId\":\"4b8f40\",\"unicodeChar\":\"堃\",\"unicodeCodePoint\":\"5803\",\"pinYinChars\":[{\"char\":\"KUN1\"}],\"splitChars\":[{\"char\":\"方方土\"}],\"weight\":\"10\"},{\"charId\":\"1fd65a\",\"unicodeChar\":\"䜣\",\"unicodeCodePoint\":\"4723\",\"pinYinChars\":[{\"char\":\"XI1\"},{\"char\":\"XIN1\"},{\"char\":\"YIN2\"}],\"splitChars\":[{\"char\":\"讠斤\"},{\"char\":\"言斤\"}],\"weight\":\"10\"},{\"charId\":\"064f5d\",\"unicodeChar\":\"𬴂\",\"unicodeCodePoint\":\"2CD02\",\"pinYinChars\":[{\"char\":\"FEI1\"}],\"splitChars\":[{\"char\":\"马非\"}],\"weight\":\"10\"},{\"charId\":\"a74408\",\"unicodeChar\":\"𰤕\",\"unicodeCodePoint\":\"30915\",\"pinYinChars\":[{\"char\":\"LI4\"},{\"char\":\"LUO4\"}],\"splitChars\":[{\"char\":\"白乐\"}],\"weight\":\"10\"},{\"charId\":\"b3c669\",\"unicodeChar\":\"𬍤\",\"unicodeCodePoint\":\"2C364\",\"pinYinChars\":[{\"char\":\"XUN2\"}],\"splitChars\":[{\"char\":\"王寻\"}],\"weight\":\"10\"},{\"charId\":\"913adc\",\"unicodeChar\":\"𪲔\",\"unicodeCodePoint\":\"2AC94\",\"pinYinChars\":[{\"char\":\"LI4\"}],\"splitChars\":[{\"char\":\"木丽\"}],\"weight\":\"10\"},{\"charId\":\"1ef9de\",\"unicodeChar\":\"𬱵\",\"unicodeCodePoint\":\"2CC75\",\"pinYinChars\":[{\"char\":\"WEI3\"}],\"splitChars\":[{\"char\":\"风韦\"}],\"weight\":\"10\"},{\"charId\":\"03e311\",\"unicodeChar\":\"𪿖\",\"unicodeCodePoint\":\"2AFD6\",\"pinYinChars\":[{\"char\":\"TAN2\"}],\"splitChars\":[{\"char\":\"石玄\"}],\"weight\":\"10\"},{\"charId\":\"9dc76c\",\"unicodeChar\":\"𨭉\",\"unicodeCodePoint\":\"28B49\",\"pinYinChars\":[{\"char\":\"BAN1\"}],\"splitChars\":[{\"char\":\"斌金\"}],\"weight\":\"10\"},{\"charId\":\"9a6923\",\"unicodeChar\":\"𰾫\",\"unicodeCodePoint\":\"30FAB\",\"pinYinChars\":[{\"char\":\"JIAN4\"}],\"splitChars\":[{\"char\":\"钅监\"},{\"char\":\"金监\"}],\"weight\":\"10\"},{\"charId\":\"d18a6f\",\"unicodeChar\":\"㛠\",\"unicodeCodePoint\":\"36E0\",\"pinYinChars\":[{\"char\":\"JIAN1\"},{\"char\":\"XIAN2\"}],\"splitChars\":[{\"char\":\"女间\"}],\"weight\":\"8\"},{\"charId\":\"db6725\",\"unicodeChar\":\"𫗇\",\"unicodeCodePoint\":\"2B5C7\",\"pinYinChars\":[{\"char\":\"YU4\"},{\"char\":\"XUE2\"}],\"splitChars\":[{\"char\":\"风日\"}],\"weight\":\"8\"},{\"charId\":\"7b7ee0\",\"unicodeChar\":\"𱃚\",\"unicodeCodePoint\":\"310DA\",\"pinYinChars\":[{\"char\":\"XIE2\"},{\"char\":\"LIE4\"},{\"char\":\"LI4\"}],\"splitChars\":[{\"char\":\"风劦\"}],\"weight\":\"8\"},{\"charId\":\"2bce53\",\"unicodeChar\":\"㐵\",\"unicodeCodePoint\":\"3435\",\"pinYinChars\":[{\"char\":\"RU2\"}],\"splitChars\":[{\"char\":\"亻于\"}],\"weight\":\"8\"},{\"charId\":\"2c64ee\",\"unicodeChar\":\"𬬬\",\"unicodeCodePoint\":\"2CB2C\",\"pinYinChars\":[{\"char\":\"WEI2\"}],\"splitChars\":[{\"char\":\"钅韦\"},{\"char\":\"金韦\"}],\"weight\":\"10\"},{\"charId\":\"62877c\",\"unicodeChar\":\"𫢒\",\"unicodeCodePoint\":\"2B892\",\"pinYinChars\":[{\"char\":\"LONG2\"},{\"char\":\"LONG3\"},{\"char\":\"LONG4\"}],\"splitChars\":[{\"char\":\"亻龙\"}],\"weight\":\"8\"},{\"charId\":\"d4153a\",\"unicodeChar\":\"𫢸\",\"unicodeCodePoint\":\"2B8B8\",\"pinYinChars\":[{\"char\":\"DAN4\"}],\"splitChars\":[{\"char\":\"亻单\"}],\"weight\":\"8\"},{\"charId\":\"cc2b4b\",\"unicodeChar\":\"𱎞\",\"unicodeCodePoint\":\"3139E\",\"pinYinChars\":[{\"char\":\"WEI4\"}],\"splitChars\":[{\"char\":\"亻卫\"}],\"weight\":\"8\"},{\"charId\":\"81998b\",\"unicodeChar\":\"㑳\",\"unicodeCodePoint\":\"3473\",\"pinYinChars\":[{\"char\":\"ZHOU4\"}],\"splitChars\":[{\"char\":\"亻芻\"}],\"weight\":\"8\"},{\"charId\":\"d49bf3\",\"unicodeChar\":\"𠊟\",\"unicodeCodePoint\":\"2029F\",\"pinYinChars\":[{\"char\":\"MIN3\"}],\"splitChars\":[{\"char\":\"亻黾\"}],\"weight\":\"8\"},{\"charId\":\"b26bb6\",\"unicodeChar\":\"㮾\",\"unicodeCodePoint\":\"3BBE\",\"pinYinChars\":[{\"char\":\"LANG3\"}],\"splitChars\":[{\"char\":\"朗木\"}],\"weight\":\"8\"},{\"charId\":\"ddf4aa\",\"unicodeChar\":\"𣑮\",\"unicodeCodePoint\":\"2346E\",\"pinYinChars\":[{\"char\":\"NAN2\"}],\"splitChars\":[{\"char\":\"木舟\"}],\"weight\":\"8\"},{\"charId\":\"157d20\",\"unicodeChar\":\"𱣉\",\"unicodeCodePoint\":\"318C9\",\"pinYinChars\":[{\"char\":\"CONG1\"},{\"char\":\"ZONG1\"}],\"splitChars\":[{\"char\":\"木丛\"}],\"weight\":\"8\"},{\"charId\":\"d7bc9c\",\"unicodeChar\":\"\",\"unicodeCodePoint\":\"3190F\",\"pinYinChars\":[{\"char\":\"PENG2\"}],\"splitChars\":[{\"char\":\"林林\"}],\"weight\":\"8\"},{\"charId\":\"7dee10\",\"unicodeChar\":\"𡌶\",\"unicodeCodePoint\":\"21336\",\"pinYinChars\":[{\"char\":\"BAN4\"}],\"splitChars\":[{\"char\":\"土並\"}],\"weight\":\"8\"},{\"charId\":\"da00b5\",\"unicodeChar\":\"𱮺\",\"unicodeCodePoint\":\"31BBA\",\"pinYinChars\":[{\"char\":\"TIAN1\"},{\"char\":\"ZHEN1\"}],\"splitChars\":[{\"char\":\"王贞\"}],\"weight\":\"8\"},{\"charId\":\"5e785e\",\"unicodeChar\":\"𪛞\",\"unicodeCodePoint\":\"2A6DE\",\"pinYinChars\":[{\"char\":\"RONG2\"}],\"splitChars\":[{\"char\":\"王荣\"}],\"weight\":\"8\"},{\"charId\":\"246507\",\"unicodeChar\":\"𬱟\",\"unicodeCodePoint\":\"2CC5F\",\"pinYinChars\":[{\"char\":\"WEI2\"}],\"splitChars\":[{\"char\":\"危页\"}],\"weight\":\"10\"},{\"charId\":\"65fb41\",\"unicodeChar\":\"𫞦\",\"unicodeCodePoint\":\"2B7A6\",\"pinYinChars\":[{\"char\":\"JI4\"},{\"char\":\"ZI1\"}],\"splitChars\":[{\"char\":\"王齐\"}],\"weight\":\"8\"},{\"charId\":\"22b6df\",\"unicodeChar\":\"㐱\",\"unicodeCodePoint\":\"3431\",\"pinYinChars\":[{\"char\":\"ZHEN1\"}],\"splitChars\":[],\"weight\":\"8\"},{\"charId\":\"75c1f2\",\"unicodeChar\":\"𫖮\",\"unicodeCodePoint\":\"2B5AE\",\"pinYinChars\":[{\"char\":\"YI3\"}],\"splitChars\":[{\"char\":\"岂页\"}],\"weight\":\"8\"},{\"charId\":\"f97ba6\",\"unicodeChar\":\"𫖯\",\"unicodeCodePoint\":\"2B5AF\",\"pinYinChars\":[{\"char\":\"FU3\"},{\"char\":\"TAO1\"},{\"char\":\"TIAO44\"}],\"splitChars\":[{\"char\":\"兆页\"}],\"weight\":\"8\"},{\"charId\":\"997e29\",\"unicodeChar\":\"𲊿\",\"unicodeCodePoint\":\"322BF\",\"pinYinChars\":[{\"char\":\"XIAN3\"}],\"splitChars\":[{\"char\":\"显页\"}],\"weight\":\"8\"},{\"charId\":\"784534\",\"unicodeChar\":\"𱪿\",\"unicodeCodePoint\":\"31ABF \",\"pinYinChars\":[{\"char\":\"XUN1\"}],\"splitChars\":[{\"char\":\"动灬\"}],\"weight\":\"8\"},{\"charId\":\"7e3793\",\"unicodeChar\":\"䓫\",\"unicodeCodePoint\":\"44EB\",\"pinYinChars\":[{\"char\":\"QI2\"}],\"splitChars\":[{\"char\":\"艹奇\"}],\"weight\":\"8\"},{\"charId\":\"5b55cd\",\"unicodeChar\":\"燚\",\"unicodeCodePoint\":\"71DA\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"火火火火\"}],\"weight\":\"8\"},{\"charId\":\"2337c3\",\"unicodeChar\":\"𬎆\",\"unicodeCodePoint\":\"2C386\",\"pinYinChars\":[{\"char\":\"YING2\"}],\"splitChars\":[{\"char\":\"王莹\"}],\"weight\":\"10\"},{\"charId\":\"95e719\",\"unicodeChar\":\"𮭦\",\"unicodeCodePoint\":\"2EB66\",\"pinYinChars\":[{\"char\":\"CHEN2\"}],\"splitChars\":[{\"char\":\"岑鸟\"}],\"weight\":\"8\"},{\"charId\":\"4e7341\",\"unicodeChar\":\"䴙\",\"unicodeCodePoint\":\"4D19\",\"pinYinChars\":[{\"char\":\"PI4\"}],\"splitChars\":[{\"char\":\"辟鸟\"}],\"weight\":\"8\"},{\"charId\":\"a0c29d\",\"unicodeChar\":\"䴔\",\"unicodeCodePoint\":\"4D14\",\"pinYinChars\":[{\"char\":\"JIAO1\"}],\"splitChars\":[{\"char\":\"交鸟\"}],\"weight\":\"8\"},{\"charId\":\"b01882\",\"unicodeChar\":\"䝼\",\"unicodeCodePoint\":\"477C\",\"pinYinChars\":[{\"char\":\"QING2\"}],\"splitChars\":[{\"char\":\"貝青\"},{\"char\":\"贝青\"}],\"weight\":\"8\"},{\"charId\":\"b84eaf\",\"unicodeChar\":\"𩇕\",\"unicodeCodePoint\":\"291D5\",\"pinYinChars\":[{\"char\":\"JING4\"}],\"splitChars\":[{\"char\":\"青彡\"},{\"char\":\"靑彡\"}],\"weight\":\"8\"},{\"charId\":\"060dd4\",\"unicodeChar\":\"𬘬\",\"unicodeCodePoint\":\"2C62C\",\"pinYinChars\":[{\"char\":\"QING1\"},{\"char\":\"ZHENG1\"}],\"splitChars\":[{\"char\":\"纟青\"}],\"weight\":\"8\"},{\"charId\":\"971908\",\"unicodeChar\":\"𰵧\",\"unicodeCodePoint\":\"30D67\",\"pinYinChars\":[{\"char\":\"ZHI4\"}],\"splitChars\":[{\"char\":\"讠志\"}],\"weight\":\"8\"},{\"charId\":\"cd0140\",\"unicodeChar\":\"𰬫\",\"unicodeCodePoint\":\"30B2B\",\"pinYinChars\":[{\"char\":\"ZHI4\"}],\"splitChars\":[{\"char\":\"纟致\"}],\"weight\":\"8\"},{\"charId\":\"9427be\",\"unicodeChar\":\"𬀪\",\"unicodeCodePoint\":\"2C02A\",\"pinYinChars\":[{\"char\":\"XIAN1\"}],\"splitChars\":[{\"char\":\"日见\"}],\"weight\":\"8\"},{\"charId\":\"012f02\",\"unicodeChar\":\"㶥\",\"unicodeCodePoint\":\"3DA5\",\"pinYinChars\":[{\"char\":\"GAN1\"}],\"splitChars\":[{\"char\":\"火干\"}],\"weight\":\"8\"},{\"charId\":\"2efd07\",\"unicodeChar\":\"㶲\",\"unicodeCodePoint\":\"3DB2\",\"pinYinChars\":[{\"char\":\"YONG4\"}],\"splitChars\":[{\"char\":\"火用\"}],\"weight\":\"8\"},{\"charId\":\"f0f70c\",\"unicodeChar\":\"㷧\",\"unicodeCodePoint\":\"3DE7\",\"pinYinChars\":[{\"char\":\"YUAN2\"}],\"splitChars\":[{\"char\":\"火原\"}],\"weight\":\"8\"},{\"charId\":\"7f9254\",\"unicodeChar\":\"𤎌\",\"unicodeCodePoint\":\"2438C\",\"pinYinChars\":[{\"char\":\"TANG2\"}],\"splitChars\":[{\"char\":\"火堂\"}],\"weight\":\"8\"},{\"charId\":\"f76202\",\"unicodeChar\":\"𪸕\",\"unicodeCodePoint\":\"2AE15\",\"pinYinChars\":[{\"char\":\"XI4\"}],\"splitChars\":[{\"char\":\"火气\"}],\"weight\":\"8\"},{\"charId\":\"0729be\",\"unicodeChar\":\"𬊈\",\"unicodeCodePoint\":\"2C288\",\"pinYinChars\":[{\"char\":\"XUN2\"}],\"splitChars\":[{\"char\":\"火寻\"}],\"weight\":\"8\"},{\"charId\":\"b443a7\",\"unicodeChar\":\"𬊤\",\"unicodeCodePoint\":\"2C2A4\",\"pinYinChars\":[{\"char\":\"CHAN3\"},{\"char\":\"DAN1\"},{\"char\":\"CHAN4\"}],\"splitChars\":[{\"char\":\"火单\"}],\"weight\":\"8\"},{\"charId\":\"e01b87\",\"unicodeChar\":\"𫞡\",\"unicodeCodePoint\":\"2B7A1\",\"pinYinChars\":[{\"char\":\"RONG2\"}],\"splitChars\":[{\"char\":\"火荣\"}],\"weight\":\"8\"},{\"charId\":\"b0f9cb\",\"unicodeChar\":\"𤆵\",\"unicodeCodePoint\":\"241B5\",\"pinYinChars\":[{\"char\":\"PA1\"}],\"splitChars\":[{\"char\":\"火巴\"}],\"weight\":\"8\"},{\"charId\":\"c04d91\",\"unicodeChar\":\"𫟹\",\"unicodeCodePoint\":\"2B7F9\",\"pinYinChars\":[{\"char\":\"HONG2\"}],\"splitChars\":[{\"char\":\"钅共\"}],\"weight\":\"8\"},{\"charId\":\"c97fbd\",\"unicodeChar\":\"𥖄\",\"unicodeCodePoint\":\"25584\",\"pinYinChars\":[{\"char\":\"XIAN4\"}],\"splitChars\":[{\"char\":\"石羡\"}],\"weight\":\"10\"},{\"charId\":\"2b2ec1\",\"unicodeChar\":\"𨱇\",\"unicodeCodePoint\":\"28C47\",\"pinYinChars\":[{\"char\":\"QIU2\"}],\"splitChars\":[{\"char\":\"钅求\"}],\"weight\":\"8\"},{\"charId\":\"597805\",\"unicodeChar\":\"𡵓\",\"unicodeCodePoint\":\"21D53\",\"pinYinChars\":[{\"char\":\"HONG2\"}],\"splitChars\":[{\"char\":\"山厷\"}],\"weight\":\"8\"},{\"charId\":\"4f3c62\",\"unicodeChar\":\"竑\",\"unicodeCodePoint\":\"7AD1\",\"pinYinChars\":[{\"char\":\"HONG2\"}],\"splitChars\":[{\"char\":\"立厷\"}],\"weight\":\"8\"},{\"charId\":\"199018\",\"unicodeChar\":\"䫺\",\"unicodeCodePoint\":\"4AFA\",\"pinYinChars\":[{\"char\":\"HONG2\"},{\"char\":\"HOU4\"}],\"splitChars\":[{\"char\":\"厷风\"}],\"weight\":\"8\"},{\"charId\":\"7d9ae0\",\"unicodeChar\":\"珣\",\"unicodeCodePoint\":\"73E3\",\"pinYinChars\":[{\"char\":\"XUN2\"}],\"splitChars\":[{\"char\":\"王旬\"}],\"weight\":\"8\"},{\"charId\":\"903102\",\"unicodeChar\":\"焜\",\"unicodeCodePoint\":\"711C\",\"pinYinChars\":[{\"char\":\"KUN1\"}],\"splitChars\":[{\"char\":\"火昆\"}],\"weight\":\"8\"},{\"charId\":\"0045c0\",\"unicodeChar\":\"𤨾\",\"unicodeCodePoint\":\"24A3E\",\"pinYinChars\":[{\"char\":\"KUN1\"}],\"splitChars\":[{\"char\":\"王山昆\"}],\"weight\":\"8\"},{\"charId\":\"e4ca07\",\"unicodeChar\":\"㛇\",\"unicodeCodePoint\":\"36C7\",\"pinYinChars\":[{\"char\":\"ZHUANG1\"}],\"splitChars\":[{\"char\":\"女庄\"}],\"weight\":\"8\"},{\"charId\":\"ae78ce\",\"unicodeChar\":\"琤\",\"unicodeCodePoint\":\"7424\",\"pinYinChars\":[{\"char\":\"CHENG1\"}],\"splitChars\":[{\"char\":\"王争\"}],\"weight\":\"8\"},{\"charId\":\"81355f\",\"unicodeChar\":\"玥\",\"unicodeCodePoint\":\"73A5\",\"pinYinChars\":[{\"char\":\"YUE4\"}],\"splitChars\":[{\"char\":\"王月\"}],\"weight\":\"8\"},{\"charId\":\"5c4e1f\",\"unicodeChar\":\"旻\",\"unicodeCodePoint\":\"65FB\",\"pinYinChars\":[{\"char\":\"MIN2\"}],\"splitChars\":[{\"char\":\"日文\"}],\"weight\":\"8\"},{\"charId\":\"5b5ed6\",\"unicodeChar\":\"䳟\",\"unicodeCodePoint\":\"4CDF\",\"pinYinChars\":[{\"char\":\"MING2\"}],\"splitChars\":[{\"char\":\"明鸟\"}],\"weight\":\"8\"},{\"charId\":\"fd164b\",\"unicodeChar\":\"𬭣\",\"unicodeCodePoint\":\"2CB63\",\"pinYinChars\":[{\"char\":\"XIAN4\"}],\"splitChars\":[{\"char\":\"钅泉\"},{\"char\":\"金泉\"}],\"weight\":\"8\"},{\"charId\":\"a70a3a\",\"unicodeChar\":\"璟\",\"unicodeCodePoint\":\"749F\",\"pinYinChars\":[{\"char\":\"JING3\"}],\"splitChars\":[{\"char\":\"王景\"}],\"weight\":\"8\"},{\"charId\":\"5921bf\",\"unicodeChar\":\"𨪪\",\"unicodeCodePoint\":\"28AAA\",\"pinYinChars\":[{\"char\":\"RONG2\"}],\"splitChars\":[{\"char\":\"钅荣\"},{\"char\":\"金荣\"}],\"weight\":\"8\"},{\"charId\":\"7cb879\",\"unicodeChar\":\"𤧞\",\"unicodeCodePoint\":\"249DE\",\"pinYinChars\":[{\"char\":\"MEI3\"}],\"splitChars\":[{\"char\":\"王美\"}],\"weight\":\"8\"},{\"charId\":\"6b0040\",\"unicodeChar\":\"垚\",\"unicodeCodePoint\":\"579A\",\"pinYinChars\":[{\"char\":\"YAO2\"}],\"splitChars\":[{\"char\":\"土土土\"}],\"weight\":\"8\"},{\"charId\":\"0ce2a5\",\"unicodeChar\":\"𫘧\",\"unicodeCodePoint\":\"2B627\",\"pinYinChars\":[{\"char\":\"LU4\"}],\"splitChars\":[{\"char\":\"马录\"}],\"weight\":\"8\"},{\"charId\":\"774a78\",\"unicodeChar\":\"㭎\",\"unicodeCodePoint\":\"3B4E\",\"pinYinChars\":[{\"char\":\"GANG1\"}],\"splitChars\":[{\"char\":\"木冈\"}],\"weight\":\"8\"},{\"charId\":\"30b346\",\"unicodeChar\":\"㧏\",\"unicodeCodePoint\":\"39CF\",\"pinYinChars\":[{\"char\":\"GANG1\"}],\"splitChars\":[{\"char\":\"扌冈\"}],\"weight\":\"8\"},{\"charId\":\"a37b92\",\"unicodeChar\":\"𨓈\",\"unicodeCodePoint\":\"284C8\",\"pinYinChars\":[{\"char\":\"KUO4\"}],\"splitChars\":[],\"weight\":\"8\"},{\"charId\":\"121889\",\"unicodeChar\":\"煇\",\"unicodeCodePoint\":\"7147\",\"pinYinChars\":[{\"char\":\"HUI1\"},{\"char\":\"YUN44\"},{\"char\":\"XUN1\"}],\"splitChars\":[{\"char\":\"火军\"}],\"weight\":\"8\"},{\"charId\":\"82846f\",\"unicodeChar\":\"㧑\",\"unicodeCodePoint\":\"39D1\",\"pinYinChars\":[{\"char\":\"HUI1\"}],\"splitChars\":[{\"char\":\"扌为\"}],\"weight\":\"8\"},{\"charId\":\"2baf46\",\"unicodeChar\":\"彧\",\"unicodeCodePoint\":\"5F67\",\"pinYinChars\":[{\"char\":\"YU4\"}],\"splitChars\":[],\"weight\":\"8\"},{\"charId\":\"72ddd3\",\"unicodeChar\":\"𨰻\",\"unicodeCodePoint\":\"28C3B\",\"pinYinChars\":[{\"char\":\"YU4\"},{\"char\":\"BAO3\"}],\"splitChars\":[{\"char\":\"金金金金\"}],\"weight\":\"8\"},{\"charId\":\"dd3cd3\",\"unicodeChar\":\"𤰉\",\"unicodeCodePoint\":\"24C09\",\"pinYinChars\":[{\"char\":\"LA2\"},{\"char\":\"YONG1\"}],\"splitChars\":[{\"char\":\"足用\"}],\"weight\":\"8\"},{\"charId\":\"f78a86\",\"unicodeChar\":\"𤰙\",\"unicodeCodePoint\":\"24C19\",\"pinYinChars\":[{\"char\":\"LA1\"},{\"char\":\"GE2\"},{\"char\":\"KE1\"}],\"splitChars\":[{\"char\":\"九田\"}],\"weight\":\"8\"},{\"charId\":\"66c867\",\"unicodeChar\":\"䶮\",\"unicodeCodePoint\":\"4DAE\",\"pinYinChars\":[{\"char\":\"YAN3\"}],\"splitChars\":[{\"char\":\"龙天\"}],\"weight\":\"10\"},{\"charId\":\"9def2c\",\"unicodeChar\":\"𠡠\",\"unicodeCodePoint\":\"20860\",\"pinYinChars\":[{\"char\":\"CHI1\"}],\"splitChars\":[{\"char\":\"来力\"}],\"weight\":\"8\"},{\"charId\":\"dbf23c\",\"unicodeChar\":\"𫝫\",\"unicodeCodePoint\":\"2B76B\",\"pinYinChars\":[{\"char\":\"LAI1\"},{\"char\":\"LAI4\"}],\"splitChars\":[{\"char\":\"女来\"}],\"weight\":\"8\"},{\"charId\":\"2da6b3\",\"unicodeChar\":\"㙟\",\"unicodeCodePoint\":\"365F\",\"pinYinChars\":[{\"char\":\"LANG3\"}],\"splitChars\":[{\"char\":\"土朗\"}],\"weight\":\"8\"},{\"charId\":\"081b01\",\"unicodeChar\":\"𰵝\",\"unicodeCodePoint\":\"30D5D\",\"pinYinChars\":[{\"char\":\"HE2\"}],\"splitChars\":[{\"char\":\"讠禾\"}],\"weight\":\"8\"},{\"charId\":\"2e2e4f\",\"unicodeChar\":\"䄻\",\"unicodeCodePoint\":\"413B\",\"pinYinChars\":[{\"char\":\"CHAO2\"},{\"char\":\"TAO2\"},{\"char\":\"ZHAO4\"}],\"splitChars\":[{\"char\":\"禾兆\"}],\"weight\":\"8\"},{\"charId\":\"8eff88\",\"unicodeChar\":\"𤧟\",\"unicodeCodePoint\":\"249DF\",\"pinYinChars\":[{\"char\":\"TING2\"}],\"splitChars\":[{\"char\":\"王亭\"}],\"weight\":\"8\"},{\"charId\":\"7fd1d4\",\"unicodeChar\":\"䁎\",\"unicodeCodePoint\":\"404E\",\"pinYinChars\":[{\"char\":\"TING2\"},{\"char\":\"CHENG2\"}],\"splitChars\":[{\"char\":\"目亭\"}],\"weight\":\"8\"},{\"charId\":\"36d00c\",\"unicodeChar\":\"㚢\",\"unicodeCodePoint\":\"36A2\",\"pinYinChars\":[{\"char\":\"NV3\"},{\"char\":\"NU2\"},{\"char\":\"WU3\"}],\"splitChars\":[{\"char\":\"亻女\"}],\"weight\":\"8\"},{\"charId\":\"85360b\",\"unicodeChar\":\"𫔭\",\"unicodeCodePoint\":\"2B52D\",\"pinYinChars\":[{\"char\":\"KAI1\"}],\"splitChars\":[{\"char\":\"门开\"}],\"weight\":\"8\"},{\"charId\":\"b47214\",\"unicodeChar\":\"𬮿\",\"unicodeCodePoint\":\"2CBBF\",\"pinYinChars\":[{\"char\":\"AI2\"},{\"char\":\"QI1\"},{\"char\":\"GAI1\"}],\"splitChars\":[{\"char\":\"阝岂\"}],\"weight\":\"8\"},{\"charId\":\"fa6662\",\"unicodeChar\":\"㢨\",\"unicodeCodePoint\":\"38A8\",\"pinYinChars\":[{\"char\":\"HAN4\"}],\"splitChars\":[{\"char\":\"弓干\"}],\"weight\":\"8\"},{\"charId\":\"9bb1f9\",\"unicodeChar\":\"𫘛\",\"unicodeCodePoint\":\"2B61B\",\"pinYinChars\":[{\"char\":\"HAN4\"},{\"char\":\"HAN2\"}],\"splitChars\":[{\"char\":\"马干\"}],\"weight\":\"8\"},{\"charId\":\"97fa5d\",\"unicodeChar\":\"𤆬\",\"unicodeCodePoint\":\"241AC\",\"pinYinChars\":[{\"char\":\"QU3\"}],\"splitChars\":[{\"char\":\"毛灬\"}],\"weight\":\"8\"},{\"charId\":\"94faf7\",\"unicodeChar\":\"𪨰\",\"unicodeCodePoint\":\"2AA30\",\"pinYinChars\":[{\"char\":\"QU1\"}],\"splitChars\":[{\"char\":\"山曲\"}],\"weight\":\"8\"},{\"charId\":\"3b3969\",\"unicodeChar\":\"𪜔\",\"unicodeCodePoint\":\"2A714\",\"pinYinChars\":[{\"char\":\"QU3\"}],\"splitChars\":[{\"char\":\"九曲\"}],\"weight\":\"8\"},{\"charId\":\"a5f3cc\",\"unicodeChar\":\"𫔀\",\"unicodeCodePoint\":\"2B500\",\"pinYinChars\":[{\"char\":\"LIAN44\"}],\"splitChars\":[{\"char\":\"钅柬\"},{\"char\":\"金柬\"}],\"weight\":\"8\"},{\"charId\":\"d7d7b1\",\"unicodeChar\":\"樑\",\"unicodeCodePoint\":\"6A11\",\"pinYinChars\":[{\"char\":\"LIANG1\"}],\"splitChars\":[],\"weight\":\"8\"},{\"charId\":\"17d572\",\"unicodeChar\":\"𬴀\",\"unicodeCodePoint\":\"2CD00\",\"pinYinChars\":[{\"char\":\"LIANG2\"}],\"splitChars\":[{\"char\":\"马良\"}],\"weight\":\"8\"},{\"charId\":\"1bf322\",\"unicodeChar\":\"𬍛\",\"unicodeCodePoint\":\"2C35B\",\"pinYinChars\":[{\"char\":\"LI4\"}],\"splitChars\":[{\"char\":\"王乐\"}],\"weight\":\"10\"},{\"charId\":\"f96822\",\"unicodeChar\":\"𬤐\",\"unicodeCodePoint\":\"2C910\",\"pinYinChars\":[{\"char\":\"GE1\"}],\"splitChars\":[{\"char\":\"讠哥\"}],\"weight\":\"8\"},{\"charId\":\"d1508c\",\"unicodeChar\":\"𱯍\",\"unicodeCodePoint\":\"31BCD\",\"pinYinChars\":[{\"char\":\"GE1\"}],\"splitChars\":[{\"char\":\"王哥\"}],\"weight\":\"8\"},{\"charId\":\"755ea6\",\"unicodeChar\":\"𬮤\",\"unicodeCodePoint\":\"2CBA4\",\"pinYinChars\":[{\"char\":\"XIA2\"},{\"char\":\"GE2\"},{\"char\":\"HE2\"}],\"splitChars\":[{\"char\":\"门合\"}],\"weight\":\"8\"},{\"charId\":\"7e4d31\",\"unicodeChar\":\"𬮦\",\"unicodeCodePoint\":\"2CBA6\",\"pinYinChars\":[{\"char\":\"GUAN1\"}],\"splitChars\":[{\"char\":\"门关\"}],\"weight\":\"8\"},{\"charId\":\"12f378\",\"unicodeChar\":\"𬭚\",\"unicodeCodePoint\":\"2CB5A\",\"pinYinChars\":[{\"char\":\"CHUN2\"}],\"splitChars\":[{\"char\":\"钅享\"}],\"weight\":\"8\"},{\"charId\":\"e0c603\",\"unicodeChar\":\"䵍\",\"unicodeCodePoint\":\"4D4D\",\"pinYinChars\":[{\"char\":\"TUN2\"}],\"splitChars\":[{\"char\":\"黄享\"}],\"weight\":\"8\"},{\"charId\":\"6cf248\",\"unicodeChar\":\"䴓\",\"unicodeCodePoint\":\"4D13\",\"pinYinChars\":[{\"char\":\"SHI1\"}],\"splitChars\":[{\"char\":\"帀鸟\"}],\"weight\":\"8\"},{\"charId\":\"5552a2\",\"unicodeChar\":\"𣛮\",\"unicodeCodePoint\":\"236EE\",\"pinYinChars\":[{\"char\":\"SHENG1\"}],\"splitChars\":[{\"char\":\"木盛\"}],\"weight\":\"8\"},{\"charId\":\"f80e2f\",\"unicodeChar\":\"𢒉\",\"unicodeCodePoint\":\"22489\",\"pinYinChars\":[{\"char\":\"SHAN3\"}],\"splitChars\":[{\"char\":\"彡且\"}],\"weight\":\"8\"},{\"charId\":\"0b35aa\",\"unicodeChar\":\"𬬺\",\"unicodeCodePoint\":\"2CB3A\",\"pinYinChars\":[{\"char\":\"CHU2\"},{\"char\":\"ZU1\"},{\"char\":\"JU3\"},{\"char\":\"XU2\"}],\"splitChars\":[{\"char\":\"钅且\"}],\"weight\":\"8\"},{\"charId\":\"5ab6cf\",\"unicodeChar\":\"𬞟\",\"unicodeCodePoint\":\"2C79F\",\"pinYinChars\":[{\"char\":\"PIN2\"},{\"char\":\"PING2\"}],\"splitChars\":[{\"char\":\"艹频\"}],\"weight\":\"8\"},{\"charId\":\"cda910\",\"unicodeChar\":\"㛃\",\"unicodeCodePoint\":\"36C3\",\"pinYinChars\":[{\"char\":\"JIE2\"}],\"splitChars\":[{\"char\":\"㓞女\"}],\"weight\":\"10\"},{\"charId\":\"18f13e\",\"unicodeChar\":\"𬍡\",\"unicodeCodePoint\":\"2C361\",\"pinYinChars\":[{\"char\":\"DANG4\"}],\"splitChars\":[{\"char\":\"汤玉\"}],\"weight\":\"8\"},{\"charId\":\"61fbef\",\"unicodeChar\":\"𱔐\",\"unicodeCodePoint\":\"31510\",\"pinYinChars\":[{\"char\":\"QI3\"}],\"splitChars\":[{\"char\":\"啟口\"}],\"weight\":\"8\"},{\"charId\":\"57a0a1\",\"unicodeChar\":\"𪠽\",\"unicodeCodePoint\":\"2A83D\",\"pinYinChars\":[{\"char\":\"DANG1\"}],\"splitChars\":[{\"char\":\"口当\"}],\"weight\":\"8\"},{\"charId\":\"50d365\",\"unicodeChar\":\"㗊\",\"unicodeCodePoint\":\"35CA\",\"pinYinChars\":[{\"char\":\"LEI2\"},{\"char\":\"JI2\"}],\"splitChars\":[],\"weight\":\"8\"},{\"charId\":\"cd99fb\",\"unicodeChar\":\"㞧\",\"unicodeCodePoint\":\"37A7\",\"pinYinChars\":[{\"char\":\"HUI4\"}],\"splitChars\":[{\"char\":\"山乃\"}],\"weight\":\"8\"},{\"charId\":\"752b10\",\"unicodeChar\":\"㞭\",\"unicodeCodePoint\":\"37AD\",\"pinYinChars\":[{\"char\":\"DAI2\"}],\"splitChars\":[{\"char\":\"大山\"}],\"weight\":\"8\"},{\"charId\":\"daba78\",\"unicodeChar\":\"𡷫\",\"unicodeCodePoint\":\"21DEB\",\"pinYinChars\":[{\"char\":\"CHENG2\"}],\"splitChars\":[{\"char\":\"山成\"}],\"weight\":\"8\"},{\"charId\":\"593f33\",\"unicodeChar\":\"𫵷\",\"unicodeCodePoint\":\"2BD77\",\"pinYinChars\":[{\"char\":\"LAI4\"},{\"char\":\"LI4\"}],\"splitChars\":[{\"char\":\"山历\"}],\"weight\":\"8\"},{\"charId\":\"3796ee\",\"unicodeChar\":\"𬱖\",\"unicodeCodePoint\":\"2CC56\",\"pinYinChars\":[{\"char\":\"DI2\"}],\"splitChars\":[{\"char\":\"由页\"}],\"weight\":\"10\"},{\"charId\":\"d98817\",\"unicodeChar\":\"𰎠\",\"unicodeCodePoint\":\"303A0\",\"pinYinChars\":[{\"char\":\"YAN2\"}],\"splitChars\":[{\"char\":\"山严\"}],\"weight\":\"8\"},{\"charId\":\"22759d\",\"unicodeChar\":\"𪨶\",\"unicodeCodePoint\":\"2AA36\",\"pinYinChars\":[{\"char\":\"SHE1\"}],\"splitChars\":[{\"char\":\"山大车\"}],\"weight\":\"8\"},{\"charId\":\"974f5d\",\"unicodeChar\":\"𪩘\",\"unicodeCodePoint\":\"2AA58\",\"pinYinChars\":[{\"char\":\"YAN3\"}],\"splitChars\":[{\"char\":\"山献\"}],\"weight\":\"8\"},{\"charId\":\"278c8f\",\"unicodeChar\":\"𬍑\",\"unicodeCodePoint\":\"2C351\",\"pinYinChars\":[{\"char\":\"SHAN1\"}],\"splitChars\":[],\"weight\":\"8\"},{\"charId\":\"c9cc46\",\"unicodeChar\":\"𫵳\",\"unicodeCodePoint\":\"2BD73\",\"pinYinChars\":[{\"char\":\"JI1\"}],\"splitChars\":[{\"char\":\"山几\"}],\"weight\":\"8\"},{\"charId\":\"fa95d0\",\"unicodeChar\":\"𡹇\",\"unicodeCodePoint\":\"21E47\",\"pinYinChars\":[{\"char\":\"LIN2\"}],\"splitChars\":[{\"char\":\"山林\"}],\"weight\":\"8\"},{\"charId\":\"24acd3\",\"unicodeChar\":\"𰎐\",\"unicodeCodePoint\":\"30390\",\"pinYinChars\":[{\"char\":\"LU2\"}],\"splitChars\":[{\"char\":\"山卢\"}],\"weight\":\"8\"},{\"charId\":\"80d8d5\",\"unicodeChar\":\"𡸃\",\"unicodeCodePoint\":\"21E03\",\"pinYinChars\":[{\"char\":\"QIAN1\"}],\"splitChars\":[{\"char\":\"山佥\"}],\"weight\":\"8\"},{\"charId\":\"33ea1d\",\"unicodeChar\":\"㳇\",\"unicodeCodePoint\":\"3CC7\",\"pinYinChars\":[{\"char\":\"FU2\"},{\"char\":\"FU4\"}],\"splitChars\":[{\"char\":\"氵父\"}],\"weight\":\"8\"},{\"charId\":\"205583\",\"unicodeChar\":\"𣲘\",\"unicodeCodePoint\":\"23C98\",\"pinYinChars\":[{\"char\":\"WU3\"}],\"splitChars\":[{\"char\":\"氵无\"}],\"weight\":\"8\"},{\"charId\":\"18e173\",\"unicodeChar\":\"𬜬\",\"unicodeCodePoint\":\"2C72C\",\"pinYinChars\":[{\"char\":\"MAN4\"}],\"splitChars\":[{\"char\":\"艹问\"},{\"char\":\"草问\"}],\"weight\":\"10\"},{\"charId\":\"1c3f6b\",\"unicodeChar\":\"𬇕\",\"unicodeCodePoint\":\"2C1D5\",\"pinYinChars\":[{\"char\":\"WAN4\"},{\"char\":\"MAN4\"}],\"splitChars\":[{\"char\":\"氵万\"}],\"weight\":\"8\"},{\"charId\":\"816ac4\",\"unicodeChar\":\"𬇙\",\"unicodeCodePoint\":\"2C1D9\",\"pinYinChars\":[{\"char\":\"PEI4\"}],\"splitChars\":[{\"char\":\"氵贝\"}],\"weight\":\"8\"},{\"charId\":\"2528dd\",\"unicodeChar\":\"𰛥\",\"unicodeCodePoint\":\"3.06E+07\",\"pinYinChars\":[{\"char\":\"AI2\"}],\"splitChars\":[{\"char\":\"氵岂\"}],\"weight\":\"8\"},{\"charId\":\"0f89b2\",\"unicodeChar\":\"𬇹\",\"unicodeCodePoint\":\"2C1F9\",\"pinYinChars\":[{\"char\":\"GUO2\"}],\"splitChars\":[{\"char\":\"氵国\"}],\"weight\":\"8\"},{\"charId\":\"6e9449\",\"unicodeChar\":\"㳠\",\"unicodeCodePoint\":\"3CE0\",\"pinYinChars\":[{\"char\":\"TA4\"}],\"splitChars\":[{\"char\":\"氵达\"}],\"weight\":\"8\"},{\"charId\":\"2fd545\",\"unicodeChar\":\"𬈜\",\"unicodeCodePoint\":\"2C21C\",\"pinYinChars\":[{\"char\":\"YING2\"}],\"splitChars\":[{\"char\":\"氵荥\"}],\"weight\":\"8\"},{\"charId\":\"f87ad0\",\"unicodeChar\":\"𤊟\",\"unicodeCodePoint\":\"2429F\",\"pinYinChars\":[{\"char\":\"TING3\"}],\"splitChars\":[{\"char\":\"火定\"}],\"weight\":\"8\"},{\"charId\":\"04abd1\",\"unicodeChar\":\"𰞔\",\"unicodeCodePoint\":\"30794\",\"pinYinChars\":[{\"char\":\"MI4\"}],\"splitChars\":[{\"char\":\"火名\"}],\"weight\":\"8\"},{\"charId\":\"1738a3\",\"unicodeChar\":\"𬊍\",\"unicodeCodePoint\":\"2C28D\",\"pinYinChars\":[{\"char\":\"CHOU2\"}],\"splitChars\":[{\"char\":\"火寿\"}],\"weight\":\"8\"},{\"charId\":\"185e8f\",\"unicodeChar\":\"䦷\",\"unicodeCodePoint\":\"49B7\",\"pinYinChars\":[{\"char\":\"CHUAI4\"}],\"splitChars\":[{\"char\":\"门坐\"}],\"weight\":\"8\"},{\"charId\":\"5f7627\",\"unicodeChar\":\"䦶\",\"unicodeCodePoint\":\"49B3\",\"pinYinChars\":[{\"char\":\"ZHENG4\"},{\"char\":\"ZHI4\"}],\"splitChars\":[{\"char\":\"门争\"}],\"weight\":\"8\"},{\"charId\":\"b74cec\",\"unicodeChar\":\"㻌\",\"unicodeCodePoint\":\"3ECC\",\"pinYinChars\":[{\"char\":\"TU2\"},{\"char\":\"SHU1\"}],\"splitChars\":[{\"char\":\"王余\"}],\"weight\":\"8\"},{\"charId\":\"52f09e\",\"unicodeChar\":\"𫲦\",\"unicodeCodePoint\":\"2BCA6\",\"pinYinChars\":[{\"char\":\"MAN3\"}],\"splitChars\":[{\"char\":\"子兑\"}],\"weight\":\"10\"},{\"charId\":\"44775c\",\"unicodeChar\":\"㻑\",\"unicodeCodePoint\":\"3ED1\",\"pinYinChars\":[{\"char\":\"JI4\"}],\"splitChars\":[{\"char\":\"王季\"}],\"weight\":\"8\"},{\"charId\":\"155a4c\",\"unicodeChar\":\"㻴\",\"unicodeCodePoint\":\"3EF4\",\"pinYinChars\":[{\"char\":\"MAN4\"}],\"splitChars\":[{\"char\":\"王曼\"}],\"weight\":\"8\"},{\"charId\":\"796a7e\",\"unicodeChar\":\"㻿\",\"unicodeCodePoint\":\"3EFF\",\"pinYinChars\":[{\"char\":\"SHU3\"}],\"splitChars\":[],\"weight\":\"8\"},{\"charId\":\"359bde\",\"unicodeChar\":\"𨱎\",\"unicodeCodePoint\":\"28C4E\",\"pinYinChars\":[{\"char\":\"TOU1\"}],\"splitChars\":[{\"char\":\"钅俞\"}],\"weight\":\"8\"},{\"charId\":\"fd1326\",\"unicodeChar\":\"𨱑\",\"unicodeCodePoint\":\"28C51\",\"pinYinChars\":[{\"char\":\"HUANG2\"}],\"splitChars\":[{\"char\":\"钅黄\"}],\"weight\":\"8\"},{\"charId\":\"94733c\",\"unicodeChar\":\"𰽚\",\"unicodeCodePoint\":\"30F5A\",\"pinYinChars\":[{\"char\":\"KUANG4\"}],\"splitChars\":[{\"char\":\"钅广\"}],\"weight\":\"8\"},{\"charId\":\"f1dd1c\",\"unicodeChar\":\"𬬱\",\"unicodeCodePoint\":\"2CB31\",\"pinYinChars\":[{\"char\":\"JIN1\"}],\"splitChars\":[{\"char\":\"钅斤\"}],\"weight\":\"8\"},{\"charId\":\"9b123e\",\"unicodeChar\":\"𬬲\",\"unicodeCodePoint\":\"2CB32\",\"pinYinChars\":[{\"char\":\"PI1\"},{\"char\":\"ZHAO1\"}],\"splitChars\":[{\"char\":\"钅爪\"}],\"weight\":\"8\"},{\"charId\":\"72757b\",\"unicodeChar\":\"𱂐\",\"unicodeCodePoint\":\"31090\",\"pinYinChars\":[{\"char\":\"YUN4\"}],\"splitChars\":[{\"char\":\"音员\"}],\"weight\":\"10\"},{\"charId\":\"299be8\",\"unicodeChar\":\"𰽥\",\"unicodeCodePoint\":\"30F65\",\"pinYinChars\":[{\"char\":\"BING3\"}],\"splitChars\":[{\"char\":\"钅丙\"}],\"weight\":\"8\"},{\"charId\":\"a25c47\",\"unicodeChar\":\"𰽦\",\"unicodeCodePoint\":\"30F66\",\"pinYinChars\":[{\"char\":\"LONG2\"}],\"splitChars\":[{\"char\":\"钅龙\"}],\"weight\":\"8\"},{\"charId\":\"4d9080\",\"unicodeChar\":\"𲇷\",\"unicodeCodePoint\":\"321F7\",\"pinYinChars\":[{\"char\":\"LIAN4\"}],\"splitChars\":[{\"char\":\"钅东\"}],\"weight\":\"8\"},{\"charId\":\"f610f4\",\"unicodeChar\":\"𬬸\",\"unicodeCodePoint\":\"2CB38\",\"pinYinChars\":[{\"char\":\"SHU4\"}],\"splitChars\":[{\"char\":\"钅术\"}],\"weight\":\"8\"},{\"charId\":\"e7a9b2\",\"unicodeChar\":\"𬬿\",\"unicodeCodePoint\":\"2CB3F\",\"pinYinChars\":[{\"char\":\"ZHAO1\"}],\"splitChars\":[{\"char\":\"钅召\"}],\"weight\":\"8\"},{\"charId\":\"fd1073\",\"unicodeChar\":\"𬭎\",\"unicodeCodePoint\":\"92D0\",\"pinYinChars\":[{\"char\":\"HONG2\"}],\"splitChars\":[{\"char\":\"钅宏\"}],\"weight\":\"8\"},{\"charId\":\"9.97E+31\",\"unicodeChar\":\"𲊿\",\"unicodeCodePoint\":\"322BF\",\"pinYinChars\":[],\"splitChars\":[],\"weight\":\"8\"},{\"charId\":\"ef6f47\",\"unicodeChar\":\"𲂎\",\"unicodeCodePoint\":\"3208E\",\"pinYinChars\":[{\"char\":\"ZHA3\"}],\"splitChars\":[{\"char\":\"讠工白\"}],\"weight\":\"8\"},{\"charId\":\"9eb748\",\"unicodeChar\":\"𡌴\",\"unicodeCodePoint\":\"21334\",\"pinYinChars\":[{\"char\":\"ZHI2\"}],\"splitChars\":[{\"char\":\"直土\"}],\"weight\":\"8\"},{\"charId\":\"531db2\",\"unicodeChar\":\"𰙕\",\"unicodeCodePoint\":\"30655\",\"pinYinChars\":[{\"char\":\"LOU4\"}],\"splitChars\":[{\"char\":\"娄欠\"}],\"weight\":\"8\"},{\"charId\":\"1b73f192\",\"unicodeChar\":\"㩳\",\"unicodeCodePoint\":\"3A73\",\"pinYinChars\":[{\"char\":\"SONG3\"}],\"splitChars\":[{\"char\":\"扌雙\"}],\"weight\":10},{\"charId\":\"7d569613\",\"unicodeChar\":\"㧟\",\"unicodeCodePoint\":\"39DF\",\"pinYinChars\":[{\"char\":\"KUAI3\"}],\"splitChars\":[{\"char\":\"扌汇\"}],\"weight\":10},{\"charId\":\"4e3a02fc\",\"unicodeChar\":\"㤘\",\"unicodeCodePoint\":\"3918\",\"pinYinChars\":[{\"char\":\"ZHOU4\"}],\"splitChars\":[{\"char\":\"忄刍\"}],\"weight\":10},{\"charId\":\"07c9da10\",\"unicodeChar\":\"㥮\",\"unicodeCodePoint\":\"396E\",\"pinYinChars\":[{\"char\":\"ZHOU4\"}],\"splitChars\":[{\"char\":\"忄芻\"}],\"weight\":10},{\"charId\":\"7e6ae317\",\"unicodeChar\":\"㘎\",\"unicodeCodePoint\":\"360E\",\"pinYinChars\":[{\"char\":\"HAN3\"}],\"splitChars\":[{\"char\":\"口敢\"}],\"weight\":10},{\"charId\":\"4e929a56\",\"unicodeChar\":\"㘚\",\"unicodeCodePoint\":\"361A\",\"pinYinChars\":[{\"char\":\"HAN3\"}],\"splitChars\":[{\"char\":\"口敢\"}],\"weight\":10},{\"charId\":\"70954621\",\"unicodeChar\":\"𠃌\",\"unicodeCodePoint\":\"200CC\",\"pinYinChars\":[{\"char\":\"GUN3\"}],\"splitChars\":[{\"char\":\"乙\"}],\"weight\":10},{\"charId\":\"8bc0e94c\",\"unicodeChar\":\"𠂇\",\"unicodeCodePoint\":\"20087\",\"pinYinChars\":[{\"char\":\"ZUO3\"}],\"splitChars\":[{\"char\":\"一丿\"}],\"weight\":10},{\"charId\":\"fe470155\",\"unicodeChar\":\"䓖\",\"unicodeCodePoint\":\"44D6\",\"pinYinChars\":[{\"char\":\"QIONG\"}],\"splitChars\":[{\"char\":\"艹穷\"}],\"weight\":10},{\"charId\":\"74aabee4\",\"unicodeChar\":\"㧐\",\"unicodeCodePoint\":\"39D0\",\"pinYinChars\":[{\"char\":\"SONG3\"}],\"splitChars\":[{\"char\":\"扌双\"}],\"weight\":10},{\"charId\":\"7d73c595\",\"unicodeChar\":\"䥇\",\"unicodeCodePoint\":\"4947\",\"pinYinChars\":[{\"char\":\"SHAN4\"}],\"splitChars\":[{\"char\":\"金扇\"}],\"weight\":10},{\"charId\":\"4167fbfa\",\"unicodeChar\":\"䙡\",\"unicodeCodePoint\":\"4661\",\"pinYinChars\":[{\"char\":\"KUI4\"}],\"splitChars\":[{\"char\":\"衤貴\"}],\"weight\":10},{\"charId\":\"8caf9937\",\"unicodeChar\":\"䁖\",\"unicodeCodePoint\":\"4056\",\"pinYinChars\":[{\"char\":\"LOU2\"}],\"splitChars\":[{\"char\":\"目娄\"}],\"weight\":10},{\"charId\":\"888d2965\",\"unicodeChar\":\"䅟\",\"unicodeCodePoint\":\"415F\",\"pinYinChars\":[{\"char\":\"CAN3\"}],\"splitChars\":[{\"char\":\"禾参\"}],\"weight\":10},{\"charId\":\"db1153cb\",\"unicodeChar\":\"䴘\",\"unicodeCodePoint\":\"4D18\",\"pinYinChars\":[{\"char\":\"TI1\"}],\"splitChars\":[{\"char\":\"厂鸟\"}],\"weight\":10},{\"charId\":\"345c6d8e\",\"unicodeChar\":\"䴗\",\"unicodeCodePoint\":\"4D17\",\"pinYinChars\":[{\"char\":\"JU2\"}],\"splitChars\":[{\"char\":\"目鸟\"}],\"weight\":10},{\"charId\":\"33db9798\",\"unicodeChar\":\"䦃\",\"unicodeCodePoint\":\"4983\",\"pinYinChars\":[{\"char\":\"ZHUO1\"}],\"splitChars\":[{\"char\":\"钅著\"}],\"weight\":10},{\"charId\":\"9ea994c5\",\"unicodeChar\":\"䥽\",\"unicodeCodePoint\":\"497D\",\"pinYinChars\":[{\"char\":\"PO1\"}],\"splitChars\":[{\"char\":\"钅发\"}],\"weight\":10},{\"charId\":\"c9498569\",\"unicodeChar\":\"䱷\",\"unicodeCodePoint\":\"4C77\",\"pinYinChars\":[{\"char\":\"YU2\"}],\"splitChars\":[{\"char\":\"虍攵\"}],\"weight\":10},{\"charId\":\"79b36e82\",\"unicodeChar\":\"䦟\",\"unicodeCodePoint\":\"499F\",\"pinYinChars\":[{\"char\":\"CHUAI4\"}],\"splitChars\":[{\"char\":\"門坐\"}],\"weight\":10},{\"charId\":\"243cb32b\",\"unicodeChar\":\"䦛\",\"unicodeCodePoint\":\"499B\",\"pinYinChars\":[{\"char\":\"ZHENG4\"}],\"splitChars\":[{\"char\":\"門争\"}],\"weight\":10},{\"charId\":\"d20b56e0\",\"unicodeChar\":\"䏝\",\"unicodeCodePoint\":\"43DD\",\"pinYinChars\":[{\"char\":\"ZHUAN1\"}],\"splitChars\":[{\"char\":\"月专\"}],\"weight\":10},{\"charId\":\"f5ef5618\",\"unicodeChar\":\"䲠\",\"unicodeCodePoint\":\"4CA0\",\"pinYinChars\":[{\"char\":\"CHUN1\"}],\"splitChars\":[{\"char\":\"鱼春\"}],\"weight\":10},{\"charId\":\"8b68b1ba\",\"unicodeChar\":\"䲣\",\"unicodeCodePoint\":\"4CA3\",\"pinYinChars\":[{\"char\":\"YU2\"}],\"splitChars\":[{\"char\":\"虍攵\"}],\"weight\":10},{\"charId\":\"585c08a3\",\"unicodeChar\":\"䲟\",\"unicodeCodePoint\":\"4C9F\",\"pinYinChars\":[{\"char\":\"YIN4\"}],\"splitChars\":[{\"char\":\"鱼印\"}],\"weight\":10},{\"charId\":\"8d03da93\",\"unicodeChar\":\"𤇾\",\"unicodeCodePoint\":\"241FE\",\"pinYinChars\":[{\"char\":\"YING2\"}],\"splitChars\":[{\"char\":\"火冖\"}],\"weight\":10},{\"charId\":\"07ba210c\",\"unicodeChar\":\"䴕\",\"unicodeCodePoint\":\"4D15\",\"pinYinChars\":[{\"char\":\"LIE4\"}],\"splitChars\":[{\"char\":\"列鸟\"}],\"weight\":10},{\"charId\":\"5bc1145e\",\"unicodeChar\":\"䲢\",\"unicodeCodePoint\":\"4CA2\",\"pinYinChars\":[{\"char\":\"TENG2\"}],\"splitChars\":[{\"char\":\"月鱼\"},{\"char\":\"朕鱼\"}],\"weight\":10},{\"charId\":\"d91fcc8d\",\"unicodeChar\":\"𠅀\",\"unicodeCodePoint\":\"20140\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"幸云\"},{\"char\":\"執云\"}],\"weight\":10},{\"charId\":\"3f8043ef\",\"unicodeChar\":\"𠂔\",\"unicodeCodePoint\":\"20094\",\"pinYinChars\":[{\"char\":\"ZI3\"}],\"splitChars\":[{\"char\":\"丿丿\"}],\"weight\":10},{\"charId\":\"3b6475f4\",\"unicodeChar\":\"𠁣\",\"unicodeCodePoint\":\"20063\",\"pinYinChars\":[{\"char\":\"JI4\"}],\"splitChars\":[{\"char\":\"丨彐\"}],\"weight\":10},{\"charId\":\"3f8c5a09\",\"unicodeChar\":\"𠁭\",\"unicodeCodePoint\":\"2006D\",\"pinYinChars\":[{\"char\":\"QI2\"}],\"splitChars\":[{\"char\":\"个个\"}],\"weight\":10},{\"charId\":\"72609326\",\"unicodeChar\":\"𠀐\",\"unicodeCodePoint\":\"20010\",\"pinYinChars\":[{\"char\":\"KUI4\"}],\"splitChars\":[{\"char\":\"中一\"}],\"weight\":10},{\"charId\":\"1bf1318b\",\"unicodeChar\":\"𠇁\",\"unicodeCodePoint\":\"201C1\",\"pinYinChars\":[{\"char\":\"YIN3\"}],\"splitChars\":[{\"char\":\"亻引\"}],\"weight\":10},{\"charId\":\"8897e4a8\",\"unicodeChar\":\"𠆧\",\"unicodeCodePoint\":\"201A7\",\"pinYinChars\":[{\"char\":\"REN2\"}],\"splitChars\":[{\"char\":\"亻人\"}],\"weight\":10},{\"charId\":\"81f7eb3b\",\"unicodeChar\":\"𠆫\",\"unicodeCodePoint\":\"201AB\",\"pinYinChars\":[{\"char\":\"CAI2\"}],\"splitChars\":[{\"char\":\"亻才\"}],\"weight\":10},{\"charId\":\"897ed12f\",\"unicodeChar\":\"𠅯\",\"unicodeCodePoint\":\"2016F\",\"pinYinChars\":[{\"char\":\"HE4\"}],\"splitChars\":[{\"char\":\"亦亦\"}],\"weight\":10},{\"charId\":\"90905dc5\",\"unicodeChar\":\"𠎄\",\"unicodeCodePoint\":\"20384\",\"pinYinChars\":[{\"char\":\"DUN1\"}],\"splitChars\":[{\"char\":\"亻敦\"}],\"weight\":10},{\"charId\":\"078bd327\",\"unicodeChar\":\"𠋈\",\"unicodeCodePoint\":\"202C8\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"亻奕\"}],\"weight\":10},{\"charId\":\"c3f335f7\",\"unicodeChar\":\"𠋄\",\"unicodeCodePoint\":\"202C4\",\"pinYinChars\":[{\"char\":\"JIANG1\"}],\"splitChars\":[{\"char\":\"亻姜\"}],\"weight\":10},{\"charId\":\"347d0d36\",\"unicodeChar\":\"𠋆\",\"unicodeCodePoint\":\"202C6\",\"pinYinChars\":[{\"char\":\"CHEN4\"}],\"splitChars\":[{\"char\":\"亻亲\"}],\"weight\":10},{\"charId\":\"85b5db1e\",\"unicodeChar\":\"𠉏\",\"unicodeCodePoint\":\"2024F\",\"pinYinChars\":[{\"char\":\"FENG1\"}],\"splitChars\":[{\"char\":\"亻夆\"}],\"weight\":10},{\"charId\":\"9009a5a9\",\"unicodeChar\":\"𠉍\",\"unicodeCodePoint\":\"2024D\",\"pinYinChars\":[{\"char\":\"XI3\"}],\"splitChars\":[{\"char\":\"亻困\"}],\"weight\":10},{\"charId\":\"d27b8973\",\"unicodeChar\":\"𠈗\",\"unicodeCodePoint\":\"20217\",\"pinYinChars\":[{\"char\":\"GENG4\"}],\"splitChars\":[{\"char\":\"亻亘\"}],\"weight\":10},{\"charId\":\"9e300520\",\"unicodeChar\":\"𠇷\",\"unicodeCodePoint\":\"201F7\",\"pinYinChars\":[{\"char\":\"SHENG1\"}],\"splitChars\":[{\"char\":\"亻生\"}],\"weight\":10},{\"charId\":\"d11ec51c\",\"unicodeChar\":\"𠇟\",\"unicodeCodePoint\":\"201DF\",\"pinYinChars\":[{\"char\":\"YONG3\"}],\"splitChars\":[{\"char\":\"亻永\"}],\"weight\":10},{\"charId\":\"d0b56608\",\"unicodeChar\":\"𠇆\",\"unicodeCodePoint\":\"201C6\",\"pinYinChars\":[{\"char\":\"YANG3\"}],\"splitChars\":[{\"char\":\"亻帀\"}],\"weight\":10},{\"charId\":\"dd17057d\",\"unicodeChar\":\"𠏋\",\"unicodeCodePoint\":\"203CB\",\"pinYinChars\":[{\"char\":\"YU3\"}],\"splitChars\":[{\"char\":\"亻愚\"}],\"weight\":10},{\"charId\":\"d0609815\",\"unicodeChar\":\"𠎠\",\"unicodeCodePoint\":\"203A0\",\"pinYinChars\":[{\"char\":\"JING3\"}],\"splitChars\":[{\"char\":\"亻景\"}],\"weight\":10},{\"charId\":\"e431c42c\",\"unicodeChar\":\"𠎉\",\"unicodeCodePoint\":\"20389\",\"pinYinChars\":[{\"char\":\"YUN2\"}],\"splitChars\":[{\"char\":\"亻雲\"}],\"weight\":10},{\"charId\":\"1a37d843\",\"unicodeChar\":\"𠘱\",\"unicodeCodePoint\":\"20631\",\"pinYinChars\":[{\"char\":\"ZHEN3\"}],\"splitChars\":[{\"char\":\"几彡\"}],\"weight\":10},{\"charId\":\"41079cda\",\"unicodeChar\":\"𠘳\",\"unicodeCodePoint\":\"20633\",\"pinYinChars\":[{\"char\":\"YOU1\"}],\"splitChars\":[{\"char\":\"几山\"}],\"weight\":10},{\"charId\":\"dc3cbe10\",\"unicodeChar\":\"𠘖\",\"unicodeCodePoint\":\"20616\",\"pinYinChars\":[{\"char\":\"ZHI4\"}],\"splitChars\":[{\"char\":\"冫質\"}],\"weight\":10},{\"charId\":\"2ea42b2f\",\"unicodeChar\":\"𠘰\",\"unicodeCodePoint\":\"20630\",\"pinYinChars\":[{\"char\":\"CHU4\"}],\"splitChars\":[{\"char\":\"几乂\"}],\"weight\":10},{\"charId\":\"6580ed28\",\"unicodeChar\":\"𠘎\",\"unicodeCodePoint\":\"2060E\",\"pinYinChars\":[{\"char\":\"HUI4\"}],\"splitChars\":[{\"char\":\"冫會\"}],\"weight\":10},{\"charId\":\"949c9fc3\",\"unicodeChar\":\"𠗚\",\"unicodeCodePoint\":\"205DA\",\"pinYinChars\":[{\"char\":\"CUI4\"}],\"splitChars\":[{\"char\":\"冫卒\"}],\"weight\":10},{\"charId\":\"263348f4\",\"unicodeChar\":\"𠘂\",\"unicodeCodePoint\":\"20602\",\"pinYinChars\":[{\"char\":\"SOU1\"}],\"splitChars\":[{\"char\":\"冫欠\"}],\"weight\":10},{\"charId\":\"7d54417c\",\"unicodeChar\":\"𠖓\",\"unicodeCodePoint\":\"20593\",\"pinYinChars\":[{\"char\":\"SI1\"}],\"splitChars\":[{\"char\":\"冖思\"}],\"weight\":10},{\"charId\":\"4c0d9343\",\"unicodeChar\":\"𠗕\",\"unicodeCodePoint\":\"205D5\",\"pinYinChars\":[{\"char\":\"JUN4\"}],\"splitChars\":[{\"char\":\"冫夋\"}],\"weight\":10},{\"charId\":\"5f5eb1c0\",\"unicodeChar\":\"𠊰\",\"unicodeCodePoint\":\"202B0\",\"pinYinChars\":[{\"char\":\"GUA1\"}],\"splitChars\":[{\"char\":\"亻咼\"}],\"weight\":10},{\"charId\":\"0d5b5d69\",\"unicodeChar\":\"𠊙\",\"unicodeCodePoint\":\"20299\",\"pinYinChars\":[{\"char\":\"YI2\"}],\"splitChars\":[{\"char\":\"亻宜\"}],\"weight\":10},{\"charId\":\"29a1bfb9\",\"unicodeChar\":\"𠉛\",\"unicodeCodePoint\":\"2025B\",\"pinYinChars\":[{\"char\":\"CHENG2\"}],\"splitChars\":[{\"char\":\"亻成\"}],\"weight\":10},{\"charId\":\"d70c90e7\",\"unicodeChar\":\"𠒼\",\"unicodeCodePoint\":\"204BC\",\"pinYinChars\":[{\"char\":\"HUANG4\"}],\"splitChars\":[{\"char\":\"光晃\"}],\"weight\":10},{\"charId\":\"559c009a\",\"unicodeChar\":\"𠓙\",\"unicodeCodePoint\":\"204D9\",\"pinYinChars\":[{\"char\":\"XIONG4\"}],\"splitChars\":[{\"char\":\"先先\"}],\"weight\":10},{\"charId\":\"fdcba676\",\"unicodeChar\":\"𠑰\",\"unicodeCodePoint\":\"20470\",\"pinYinChars\":[{\"char\":\"XIN1\"}],\"splitChars\":[{\"char\":\"舍舍\"}],\"weight\":10},{\"charId\":\"9f93c9ac\",\"unicodeChar\":\"𠒒\",\"unicodeCodePoint\":\"20492\",\"pinYinChars\":[{\"char\":\"YIN3\"}],\"splitChars\":[{\"char\":\"先引\"}],\"weight\":10},{\"charId\":\"35814e86\",\"unicodeChar\":\"𠑐\",\"unicodeCodePoint\":\"20450\",\"pinYinChars\":[{\"char\":\"YAO2\"}],\"splitChars\":[{\"char\":\"倉倉\"}],\"weight\":10},{\"charId\":\"06a82d27\",\"unicodeChar\":\"𠪙\",\"unicodeCodePoint\":\"20A99\",\"pinYinChars\":[{\"char\":\"XI3\"}],\"splitChars\":[{\"char\":\"厂異\"}],\"weight\":10},{\"charId\":\"d002dceb\",\"unicodeChar\":\"𠙦\",\"unicodeCodePoint\":\"20666\",\"pinYinChars\":[{\"char\":\"QIONG2\"}],\"splitChars\":[{\"char\":\"𤇾凡\"}],\"weight\":10},{\"charId\":\"2e45be5b\",\"unicodeChar\":\"𠭦\",\"unicodeCodePoint\":\"20B66\",\"pinYinChars\":[{\"char\":\"BAO4\"}],\"splitChars\":[{\"char\":\"八叟\"}],\"weight\":10},{\"charId\":\"e8bacb02\",\"unicodeChar\":\"𠝳\",\"unicodeCodePoint\":\"20773\",\"pinYinChars\":[{\"char\":\"YUAN2\"}],\"splitChars\":[{\"char\":\"宣刂\"}],\"weight\":10},{\"charId\":\"03f31cc9\",\"unicodeChar\":\"𠔼\",\"unicodeCodePoint\":\"2053C\",\"pinYinChars\":[{\"char\":\"MAO1\"}],\"splitChars\":[{\"char\":\"冂一\"}],\"weight\":10},{\"charId\":\"e70fbb0d\",\"unicodeChar\":\"𠻨\",\"unicodeCodePoint\":\"20EE8\",\"pinYinChars\":[{\"char\":\"QIN3\"}],\"splitChars\":[{\"char\":\"口堇\"}],\"weight\":10},{\"charId\":\"632029e3\",\"unicodeChar\":\"𠔑\",\"unicodeCodePoint\":\"20511\",\"pinYinChars\":[{\"char\":\"HAI4\"}],\"splitChars\":[{\"char\":\"分分\"}],\"weight\":10},{\"charId\":\"ae84f763\",\"unicodeChar\":\"𠔳\",\"unicodeCodePoint\":\"20533\",\"pinYinChars\":[{\"char\":\"LIAN2\"}],\"splitChars\":[{\"char\":\"产兼\"}],\"weight\":10},{\"charId\":\"24c1cce7\",\"unicodeChar\":\"𠓾\",\"unicodeCodePoint\":\"204FE\",\"pinYinChars\":[{\"char\":\"QUAN2\"}],\"splitChars\":[{\"char\":\"全全\"}],\"weight\":10},{\"charId\":\"3bb6c5ab\",\"unicodeChar\":\"𠣉\",\"unicodeCodePoint\":\"208C9\",\"pinYinChars\":[{\"char\":\"WAN4\"}],\"splitChars\":[{\"char\":\"需勉\"}],\"weight\":10},{\"charId\":\"8d5eee4c\",\"unicodeChar\":\"𠢃\",\"unicodeCodePoint\":\"20883\",\"pinYinChars\":[{\"char\":\"TANG2\"}],\"splitChars\":[{\"char\":\"昜力\"}],\"weight\":10},{\"charId\":\"63e80bbf\",\"unicodeChar\":\"𠡇\",\"unicodeCodePoint\":\"20847\",\"pinYinChars\":[{\"char\":\"TAI2\"}],\"splitChars\":[{\"char\":\"台力\"}],\"weight\":10},{\"charId\":\"68649b74\",\"unicodeChar\":\"𠞭\",\"unicodeCodePoint\":\"207AD\",\"pinYinChars\":[{\"char\":\"LOU2\"}],\"splitChars\":[{\"char\":\"婁刂\"}],\"weight\":10},{\"charId\":\"51ba2cb3\",\"unicodeChar\":\"𠳤\",\"unicodeCodePoint\":\"20CE4\",\"pinYinChars\":[{\"char\":\"BU4\"}],\"splitChars\":[{\"char\":\"口步\"}],\"weight\":10},{\"charId\":\"692f1947\",\"unicodeChar\":\"𠳇\",\"unicodeCodePoint\":\"20CC7\",\"pinYinChars\":[{\"char\":\"YU3\"}],\"splitChars\":[{\"char\":\"听口\"}],\"weight\":10},{\"charId\":\"6b897d0f\",\"unicodeChar\":\"𠯦\",\"unicodeCodePoint\":\"20BE6\",\"pinYinChars\":[{\"char\":\"QIE1\"}],\"splitChars\":[{\"char\":\"口切\"}],\"weight\":10},{\"charId\":\"02a2ba00\",\"unicodeChar\":\"𠯫\",\"unicodeCodePoint\":\"20BEB\",\"pinYinChars\":[{\"char\":\"GE1\"}],\"splitChars\":[{\"char\":\"口戈\"}],\"weight\":10},{\"charId\":\"345ffae2\",\"unicodeChar\":\"𠯆\",\"unicodeCodePoint\":\"20BC6\",\"pinYinChars\":[{\"char\":\"NV3\"}],\"splitChars\":[{\"char\":\"口女\"}],\"weight\":10},{\"charId\":\"d313071e\",\"unicodeChar\":\"𠳿\",\"unicodeCodePoint\":\"20CFF\",\"pinYinChars\":[{\"char\":\"WEI1\"}],\"splitChars\":[{\"char\":\"口尾\"}],\"weight\":10},{\"charId\":\"c689288d\",\"unicodeChar\":\"𠴇\",\"unicodeCodePoint\":\"20D07\",\"pinYinChars\":[{\"char\":\"BIN1\"}],\"splitChars\":[{\"char\":\"口兵\"}],\"weight\":10},{\"charId\":\"78db9d6c\",\"unicodeChar\":\"𠳼\",\"unicodeCodePoint\":\"20CFC\",\"pinYinChars\":[{\"char\":\"SONG4\"}],\"splitChars\":[{\"char\":\"口宋\"}],\"weight\":10},{\"charId\":\"e2e25b66\",\"unicodeChar\":\"𠳭\",\"unicodeCodePoint\":\"20CED\",\"pinYinChars\":[{\"char\":\"KE4\"}],\"splitChars\":[{\"char\":\"口克\"}],\"weight\":10},{\"charId\":\"1505eb03\",\"unicodeChar\":\"𠰑\",\"unicodeCodePoint\":\"20C11\",\"pinYinChars\":[{\"char\":\"PO3\"}],\"splitChars\":[{\"char\":\"口干\"}],\"weight\":10},{\"charId\":\"a10ecc3f\",\"unicodeChar\":\"𠰚\",\"unicodeCodePoint\":\"20C1A\",\"pinYinChars\":[{\"char\":\"SHI4\"}],\"splitChars\":[{\"char\":\"口尔\"}],\"weight\":10},{\"charId\":\"a6e6cc48\",\"unicodeChar\":\"𠧚\",\"unicodeCodePoint\":\"209DA\",\"pinYinChars\":[{\"char\":\"CHI4\"}],\"splitChars\":[{\"char\":\"占人\"}],\"weight\":10},{\"charId\":\"cc21d3f9\",\"unicodeChar\":\"𠣖\",\"unicodeCodePoint\":\"208D6\",\"pinYinChars\":[{\"char\":\"XUAN2\"}],\"splitChars\":[{\"char\":\"勹玄\"}],\"weight\":10},{\"charId\":\"11ece514\",\"unicodeChar\":\"𠤏\",\"unicodeCodePoint\":\"2090F\",\"pinYinChars\":[{\"char\":\"BAO3\"}],\"splitChars\":[{\"char\":\"匕十\"}],\"weight\":10},{\"charId\":\"bf027d27\",\"unicodeChar\":\"𠮵\",\"unicodeCodePoint\":\"20BB5\",\"pinYinChars\":[{\"char\":\"MANG4\"}],\"splitChars\":[{\"char\":\"口上\"}],\"weight\":10},{\"charId\":\"6daae90d\",\"unicodeChar\":\"𠲍\",\"unicodeCodePoint\":\"20C8D\",\"pinYinChars\":[{\"char\":\"DIU1\"}],\"splitChars\":[{\"char\":\"口丢\"}],\"weight\":10},{\"charId\":\"c0a14dbc\",\"unicodeChar\":\"𠰻\",\"unicodeCodePoint\":\"20C3B\",\"pinYinChars\":[{\"char\":\"WAI4\"}],\"splitChars\":[{\"char\":\"口外\"}],\"weight\":10},{\"charId\":\"11c27279\",\"unicodeChar\":\"𠰼\",\"unicodeCodePoint\":\"20C3C\",\"pinYinChars\":[{\"char\":\"PO1\"}],\"splitChars\":[{\"char\":\"口巿\"}],\"weight\":10},{\"charId\":\"54a9cdc2\",\"unicodeChar\":\"𠰧\",\"unicodeCodePoint\":\"20C27\",\"pinYinChars\":[{\"char\":\"YU4\"}],\"splitChars\":[{\"char\":\"口玉\"}],\"weight\":10},{\"charId\":\"b4eb4fe4\",\"unicodeChar\":\"𠰮\",\"unicodeCodePoint\":\"20C2E\",\"pinYinChars\":[{\"char\":\"SHENG1\"}],\"splitChars\":[{\"char\":\"口生\"}],\"weight\":10},{\"charId\":\"b642a941\",\"unicodeChar\":\"𠵖\",\"unicodeCodePoint\":\"20D56\",\"pinYinChars\":[{\"char\":\"JIAN1\"}],\"splitChars\":[{\"char\":\"口戔\"}],\"weight\":10},{\"charId\":\"993a410e\",\"unicodeChar\":\"𠵕\",\"unicodeCodePoint\":\"20D55\",\"pinYinChars\":[{\"char\":\"MU4\"}],\"splitChars\":[{\"char\":\"口坴\"}],\"weight\":10},{\"charId\":\"5908d88a\",\"unicodeChar\":\"𠷶\",\"unicodeCodePoint\":\"20DF6\",\"pinYinChars\":[{\"char\":\"LONG2\"}],\"splitChars\":[{\"char\":\"口生\"}],\"weight\":10},{\"charId\":\"d5dae330\",\"unicodeChar\":\"𠷺\",\"unicodeCodePoint\":\"20DFA\",\"pinYinChars\":[{\"char\":\"BO2\"}],\"splitChars\":[{\"char\":\"口勃\"}],\"weight\":10},{\"charId\":\"16e8a1ef\",\"unicodeChar\":\"𠷨\",\"unicodeCodePoint\":\"20DE8\",\"pinYinChars\":[{\"char\":\"BIAN3\"}],\"splitChars\":[{\"char\":\"口扁\"}],\"weight\":10},{\"charId\":\"7eb01c21\",\"unicodeChar\":\"𠷯\",\"unicodeCodePoint\":\"20DEF\",\"pinYinChars\":[{\"char\":\"MEI2\"}],\"splitChars\":[{\"char\":\"口眉\"}],\"weight\":10},{\"charId\":\"ed8c466f\",\"unicodeChar\":\"𠶗\",\"unicodeCodePoint\":\"20D97\",\"pinYinChars\":[{\"char\":\"ZHI2\"}],\"splitChars\":[{\"char\":\"口直\"}],\"weight\":10},{\"charId\":\"94ac68b3\",\"unicodeChar\":\"𠵻\",\"unicodeCodePoint\":\"20D7B\",\"pinYinChars\":[{\"char\":\"ZONG1\"}],\"splitChars\":[{\"char\":\"口宗\"}],\"weight\":10},{\"charId\":\"09243c21\",\"unicodeChar\":\"𠵼\",\"unicodeCodePoint\":\"20D7C\",\"pinYinChars\":[{\"char\":\"MENG1\"}],\"splitChars\":[{\"char\":\"口孟\"}],\"weight\":10},{\"charId\":\"8d0edf08\",\"unicodeChar\":\"𠲮\",\"unicodeCodePoint\":\"20CAE\",\"pinYinChars\":[{\"char\":\"JING4\"}],\"splitChars\":[{\"char\":\"口巠\"}],\"weight\":10},{\"charId\":\"9f30ebf2\",\"unicodeChar\":\"𠴢\",\"unicodeCodePoint\":\"20D22\",\"pinYinChars\":[{\"char\":\"SHENG1\"}],\"splitChars\":[{\"char\":\"口声\"}],\"weight\":10},{\"charId\":\"3553b4a1\",\"unicodeChar\":\"𠴱\",\"unicodeCodePoint\":\"20D31\",\"pinYinChars\":[{\"char\":\"XI1\"}],\"splitChars\":[{\"char\":\"口固\"}],\"weight\":10},{\"charId\":\"6449e176\",\"unicodeChar\":\"𠷥\",\"unicodeCodePoint\":\"20DE5\",\"pinYinChars\":[{\"char\":\"TING2\"}],\"splitChars\":[{\"char\":\"口亭\"}],\"weight\":10},{\"charId\":\"ab3ba5e8\",\"unicodeChar\":\"𠷋\",\"unicodeCodePoint\":\"20DCB\",\"pinYinChars\":[{\"char\":\"HOU4\"}],\"splitChars\":[{\"char\":\"口厚\"}],\"weight\":10},{\"charId\":\"5478f58d\",\"unicodeChar\":\"𠷁\",\"unicodeCodePoint\":\"20DC1\",\"pinYinChars\":[{\"char\":\"QIAN2\"}],\"splitChars\":[{\"char\":\"口前\"}],\"weight\":10},{\"charId\":\"5ec32402\",\"unicodeChar\":\"𠷈\",\"unicodeCodePoint\":\"20DC8\",\"pinYinChars\":[{\"char\":\"LV4\"}],\"splitChars\":[{\"char\":\"口律\"}],\"weight\":10},{\"charId\":\"933e6916\",\"unicodeChar\":\"𠸂\",\"unicodeCodePoint\":\"20E02\",\"pinYinChars\":[{\"char\":\"TU1\"}],\"splitChars\":[{\"char\":\"口突\"}],\"weight\":10},{\"charId\":\"e92194a2\",\"unicodeChar\":\"𠺕\",\"unicodeCodePoint\":\"20E95\",\"pinYinChars\":[{\"char\":\"LIU1\"}],\"splitChars\":[{\"char\":\"口留\"}],\"weight\":10},{\"charId\":\"98128a48\",\"unicodeChar\":\"𠺋\",\"unicodeCodePoint\":\"20E8B\",\"pinYinChars\":[{\"char\":\"QUE1\"}],\"splitChars\":[{\"char\":\"口缺\"}],\"weight\":10},{\"charId\":\"c6f7193e\",\"unicodeChar\":\"𠹔\",\"unicodeCodePoint\":\"20E54\",\"pinYinChars\":[{\"char\":\"TANG2\"}],\"splitChars\":[{\"char\":\"口唐\"}],\"weight\":10},{\"charId\":\"d17d57c1\",\"unicodeChar\":\"𠹖\",\"unicodeCodePoint\":\"20E56\",\"pinYinChars\":[{\"char\":\"CHAN3\"}],\"splitChars\":[{\"char\":\"口展\"}],\"weight\":10},{\"charId\":\"e68d6314\",\"unicodeChar\":\"𠹌\",\"unicodeCodePoint\":\"20E4C\",\"pinYinChars\":[{\"char\":\"NENG3\"}],\"splitChars\":[{\"char\":\"口能\"}],\"weight\":10},{\"charId\":\"34e5d968\",\"unicodeChar\":\"𠸍\",\"unicodeCodePoint\":\"20E0D\",\"pinYinChars\":[{\"char\":\"MEI3\"}],\"splitChars\":[{\"char\":\"口美\"}],\"weight\":10},{\"charId\":\"713cdca6\",\"unicodeChar\":\"𠸸\",\"unicodeCodePoint\":\"20E38\",\"pinYinChars\":[{\"char\":\"CHUN2\"}],\"splitChars\":[{\"char\":\"口唇\"}],\"weight\":10},{\"charId\":\"e7c28dae\",\"unicodeChar\":\"𠸄\",\"unicodeCodePoint\":\"20E04\",\"pinYinChars\":[{\"char\":\"YING1\"}],\"splitChars\":[{\"char\":\"口英\"}],\"weight\":10},{\"charId\":\"202a72fb\",\"unicodeChar\":\"𡊼\",\"unicodeCodePoint\":\"212BC\",\"pinYinChars\":[{\"char\":\"GONG3\"}],\"splitChars\":[{\"char\":\"巩土\"}],\"weight\":10},{\"charId\":\"58cffe22\",\"unicodeChar\":\"𡊟\",\"unicodeCodePoint\":\"2129F\",\"pinYinChars\":[{\"char\":\"PO1\"}],\"splitChars\":[{\"char\":\"土目\"}],\"weight\":10},{\"charId\":\"da84b1c6\",\"unicodeChar\":\"𡊵\",\"unicodeCodePoint\":\"212B5\",\"pinYinChars\":[{\"char\":\"TUO2\"}],\"splitChars\":[{\"char\":\"石土\"}],\"weight\":10},{\"charId\":\"1eebb15c\",\"unicodeChar\":\"𡊔\",\"unicodeCodePoint\":\"21294\",\"pinYinChars\":[{\"char\":\"SHI4\"}],\"splitChars\":[{\"char\":\"土市\"}],\"weight\":10},{\"charId\":\"37d31fa7\",\"unicodeChar\":\"𡊛\",\"unicodeCodePoint\":\"2129B\",\"pinYinChars\":[{\"char\":\"MO4\"}],\"splitChars\":[{\"char\":\"土去\"}],\"weight\":10},{\"charId\":\"790035ce\",\"unicodeChar\":\"𡊍\",\"unicodeCodePoint\":\"2128D\",\"pinYinChars\":[{\"char\":\"SHU1\"}],\"splitChars\":[{\"char\":\"土术\"}],\"weight\":10},{\"charId\":\"e875a183\",\"unicodeChar\":\"𡉺\",\"unicodeCodePoint\":\"2127A\",\"pinYinChars\":[{\"char\":\"ZUAN1\"}],\"splitChars\":[{\"char\":\"土水\"}],\"weight\":10},{\"charId\":\"86c6b346\",\"unicodeChar\":\"𡉼\",\"unicodeCodePoint\":\"2127C\",\"pinYinChars\":[{\"char\":\"SHENG1\"}],\"splitChars\":[{\"char\":\"升土\"}],\"weight\":10},{\"charId\":\"9c1b1b3f\",\"unicodeChar\":\"𡉁\",\"unicodeCodePoint\":\"21241\",\"pinYinChars\":[{\"char\":\"DONG\"}],\"splitChars\":[{\"char\":\"土乃\"}],\"weight\":10},{\"charId\":\"63cde096\",\"unicodeChar\":\"𡉀\",\"unicodeCodePoint\":\"21240\",\"pinYinChars\":[{\"char\":\"QUAN2\"}],\"splitChars\":[{\"char\":\"八土\"}],\"weight\":10},{\"charId\":\"d45445f9\",\"unicodeChar\":\"𡇷\",\"unicodeCodePoint\":\"211F7\",\"pinYinChars\":[{\"char\":\"TAI4\"}],\"splitChars\":[{\"char\":\"八各\"}],\"weight\":10},{\"charId\":\"7c4e2a2c\",\"unicodeChar\":\"𡄻\",\"unicodeCodePoint\":\"2113B\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"壹咨\"}],\"weight\":10},{\"charId\":\"51a3b2e4\",\"unicodeChar\":\"𡁠\",\"unicodeCodePoint\":\"21060\",\"pinYinChars\":[{\"char\":\"ER3\"}],\"splitChars\":[{\"char\":\"口爾\"}],\"weight\":10},{\"charId\":\"84185f5f\",\"unicodeChar\":\"𡂠\",\"unicodeCodePoint\":\"210A0\",\"pinYinChars\":[{\"char\":\"QIE4\"}],\"splitChars\":[{\"char\":\"口蔡\"}],\"weight\":10},{\"charId\":\"34c5bea6\",\"unicodeChar\":\"𡀂\",\"unicodeCodePoint\":\"21002\",\"pinYinChars\":[{\"char\":\"LEI2\"}],\"splitChars\":[{\"char\":\"口雷\"}],\"weight\":10},{\"charId\":\"a756cb44\",\"unicodeChar\":\"𡀃\",\"unicodeCodePoint\":\"21003\",\"pinYinChars\":[{\"char\":\"ZHEN1\"}],\"splitChars\":[{\"char\":\"口斟\"}],\"weight\":10},{\"charId\":\"28b37eda\",\"unicodeChar\":\"𠿟\",\"unicodeCodePoint\":\"20FDF\",\"pinYinChars\":[{\"char\":\"WO4\"}],\"splitChars\":[{\"char\":\"臼口\"}],\"weight\":10},{\"charId\":\"9a2acf98\",\"unicodeChar\":\"𠻤\",\"unicodeCodePoint\":\"20EE4\",\"pinYinChars\":[{\"char\":\"YAN3\"}],\"splitChars\":[{\"char\":\"口寅\"}],\"weight\":10},{\"charId\":\"907c67aa\",\"unicodeChar\":\"𠻜\",\"unicodeCodePoint\":\"20EDC\",\"pinYinChars\":[{\"char\":\"CUI4\"}],\"splitChars\":[{\"char\":\"口率\"}],\"weight\":10},{\"charId\":\"de6a0f6a\",\"unicodeChar\":\"𠻞\",\"unicodeCodePoint\":\"20EDE\",\"pinYinChars\":[{\"char\":\"KANG3\"}],\"splitChars\":[{\"char\":\"口康\"}],\"weight\":10},{\"charId\":\"8cd8e759\",\"unicodeChar\":\"𠺝\",\"unicodeCodePoint\":\"20E9D\",\"pinYinChars\":[{\"char\":\"GE1\"}],\"splitChars\":[{\"char\":\"口格\"}],\"weight\":10},{\"charId\":\"58706eb9\",\"unicodeChar\":\"𠺖\",\"unicodeCodePoint\":\"20E96\",\"pinYinChars\":[{\"char\":\"MU3\"}],\"splitChars\":[{\"char\":\"口畝\"}],\"weight\":10},{\"charId\":\"d3014b6c\",\"unicodeChar\":\"𠺗\",\"unicodeCodePoint\":\"20E97\",\"pinYinChars\":[{\"char\":\"MI2\"}],\"splitChars\":[{\"char\":\"口迷\"}],\"weight\":10},{\"charId\":\"5730c633\",\"unicodeChar\":\"𡓕\",\"unicodeCodePoint\":\"214D5\",\"pinYinChars\":[{\"char\":\"XUN1\"}],\"splitChars\":[{\"char\":\"土勳\"}],\"weight\":10},{\"charId\":\"28d8593a\",\"unicodeChar\":\"𡑭\",\"unicodeCodePoint\":\"2146D\",\"pinYinChars\":[{\"char\":\"HUI4\"}],\"splitChars\":[{\"char\":\"土會\"}],\"weight\":10},{\"charId\":\"391e556f\",\"unicodeChar\":\"𡒇\",\"unicodeCodePoint\":\"21487\",\"pinYinChars\":[{\"char\":\"ZONG1\"}],\"splitChars\":[{\"char\":\"土𡕰\"}],\"weight\":10},{\"charId\":\"57757f79\",\"unicodeChar\":\"𡐋\",\"unicodeCodePoint\":\"2140B\",\"pinYinChars\":[{\"char\":\"ZAO1\"}],\"splitChars\":[{\"char\":\"土曹\"}],\"weight\":10},{\"charId\":\"f71d23d7\",\"unicodeChar\":\"𡐤\",\"unicodeCodePoint\":\"21424\",\"pinYinChars\":[{\"char\":\"QI4\"}],\"splitChars\":[{\"char\":\"土絜\"}],\"weight\":10},{\"charId\":\"1b05dcc1\",\"unicodeChar\":\"𡘪\",\"unicodeCodePoint\":\"2162A\",\"pinYinChars\":[{\"char\":\"MANG2\"}],\"splitChars\":[{\"char\":\"大身\"}],\"weight\":10},{\"charId\":\"bf9781ce\",\"unicodeChar\":\"𡚌\",\"unicodeCodePoint\":\"2168C\",\"pinYinChars\":[{\"char\":\"HAO4\"}],\"splitChars\":[{\"char\":\"天天\"}],\"weight\":10},{\"charId\":\"c9e72325\",\"unicodeChar\":\"𡏛\",\"unicodeCodePoint\":\"213DB\",\"pinYinChars\":[{\"char\":\"XI1\"}],\"splitChars\":[{\"char\":\"土奚\"}],\"weight\":10},{\"charId\":\"15ac9947\",\"unicodeChar\":\"𡏒\",\"unicodeCodePoint\":\"213D2\",\"pinYinChars\":[{\"char\":\"GEN1\"}],\"splitChars\":[{\"char\":\"根土\"}],\"weight\":10},{\"charId\":\"9f090547\",\"unicodeChar\":\"𡏅\",\"unicodeCodePoint\":\"213C5\",\"pinYinChars\":[{\"char\":\"LANG2\"}],\"splitChars\":[{\"char\":\"郎土\"}],\"weight\":10},{\"charId\":\"e3066ad5\",\"unicodeChar\":\"𡎆\",\"unicodeCodePoint\":\"21386\",\"pinYinChars\":[{\"char\":\"DUN1\"}],\"splitChars\":[{\"char\":\"土盾\"}],\"weight\":10},{\"charId\":\"a85bdf86\",\"unicodeChar\":\"𡌼\",\"unicodeCodePoint\":\"2133C\",\"pinYinChars\":[{\"char\":\"QI2\"}],\"splitChars\":[{\"char\":\"放土\"}],\"weight\":10},{\"charId\":\"4a396ee4\",\"unicodeChar\":\"𡍆\",\"unicodeCodePoint\":\"21346\",\"pinYinChars\":[{\"char\":\"FEN1\"}],\"splitChars\":[{\"char\":\"土芬\"}],\"weight\":10},{\"charId\":\"3e9ae2f5\",\"unicodeChar\":\"𡌭\",\"unicodeCodePoint\":\"2132D\",\"pinYinChars\":[{\"char\":\"DUO1\"}],\"splitChars\":[{\"char\":\"叕土\"}],\"weight\":10},{\"charId\":\"bb501fd8\",\"unicodeChar\":\"𡋭\",\"unicodeCodePoint\":\"212ED\",\"pinYinChars\":[{\"char\":\"BEI4\"}],\"splitChars\":[{\"char\":\"北土\"}],\"weight\":10},{\"charId\":\"8854234e\",\"unicodeChar\":\"𡋯\",\"unicodeCodePoint\":\"212EF\",\"pinYinChars\":[{\"char\":\"BO2\"}],\"splitChars\":[{\"char\":\"土孛\"}],\"weight\":10},{\"charId\":\"5a06919b\",\"unicodeChar\":\"𡋣\",\"unicodeCodePoint\":\"212E3\",\"pinYinChars\":[{\"char\":\"WA1\"}],\"splitChars\":[{\"char\":\"土圭\"}],\"weight\":10},{\"charId\":\"99d4e007\",\"unicodeChar\":\"𡛈\",\"unicodeCodePoint\":\"216C8\",\"pinYinChars\":[{\"char\":\"SHENG1\"}],\"splitChars\":[{\"char\":\"女升\"}],\"weight\":10},{\"charId\":\"31d1a853\",\"unicodeChar\":\"𡛥\",\"unicodeCodePoint\":\"216E5\",\"pinYinChars\":[{\"char\":\"CHA4\"}],\"splitChars\":[{\"char\":\"女它\"}],\"weight\":10},{\"charId\":\"b21af7bc\",\"unicodeChar\":\"𡛙\",\"unicodeCodePoint\":\"216D9\",\"pinYinChars\":[{\"char\":\"YAO3\"}],\"splitChars\":[{\"char\":\"女幼\"}],\"weight\":10},{\"charId\":\"e2e61ad3\",\"unicodeChar\":\"𡛅\",\"unicodeCodePoint\":\"216C5\",\"pinYinChars\":[{\"char\":\"YIN3\"}],\"splitChars\":[{\"char\":\"女引\"}],\"weight\":10},{\"charId\":\"44121cdc\",\"unicodeChar\":\"𡚽\",\"unicodeCodePoint\":\"216BD\",\"pinYinChars\":[{\"char\":\"HAO4\"}],\"splitChars\":[{\"char\":\"丑女\"}],\"weight\":10},{\"charId\":\"bbfa8744\",\"unicodeChar\":\"𡚸\",\"unicodeCodePoint\":\"216B8\",\"pinYinChars\":[{\"char\":\"YAO1\"}],\"splitChars\":[{\"char\":\"女么\"}],\"weight\":10},{\"charId\":\"6a01cf22\",\"unicodeChar\":\"𡚳\",\"unicodeCodePoint\":\"216B3\",\"pinYinChars\":[{\"char\":\"DU4\"}],\"splitChars\":[{\"char\":\"女土\"}],\"weight\":10},{\"charId\":\"54ee7232\",\"unicodeChar\":\"𡚴\",\"unicodeCodePoint\":\"216B4\",\"pinYinChars\":[{\"char\":\"XIAN1\"}],\"splitChars\":[{\"char\":\"山女\"}],\"weight\":10},{\"charId\":\"82088914\",\"unicodeChar\":\"𡗩\",\"unicodeCodePoint\":\"215E9\",\"pinYinChars\":[{\"char\":\"ZHUAN4\"}],\"splitChars\":[{\"char\":\"火大\"}],\"weight\":10},{\"charId\":\"c4b05080\",\"unicodeChar\":\"𡖞\",\"unicodeCodePoint\":\"2159E\",\"pinYinChars\":[{\"char\":\"CHAN1\"}],\"splitChars\":[{\"char\":\"多占\"}],\"weight\":10},{\"charId\":\"6b44c996\",\"unicodeChar\":\"𡕷\",\"unicodeCodePoint\":\"21577\",\"pinYinChars\":[{\"char\":\"XIONG4\"}],\"splitChars\":[{\"char\":\"刀夂\"}],\"weight\":10},{\"charId\":\"69300089\",\"unicodeChar\":\"𫫌\",\"unicodeCodePoint\":\"2BACC\",\"pinYinChars\":[{\"char\":\"SHAO2\"}],\"splitChars\":[{\"char\":\"咅召\"}],\"weight\":10},{\"charId\":\"279d50c5\",\"unicodeChar\":\"𭇻\",\"unicodeCodePoint\":\"2D1FB\",\"pinYinChars\":[{\"char\":\"MI3\"}],\"splitChars\":[{\"char\":\"口芋\"}],\"weight\":10},{\"charId\":\"ba32e663\",\"unicodeChar\":\"𫭗\",\"unicodeCodePoint\":\"2BB57\",\"pinYinChars\":[{\"char\":\"PA4\"}],\"splitChars\":[{\"char\":\"土八\"}],\"weight\":10},{\"charId\":\"c730487e\",\"unicodeChar\":\"𪠋\",\"unicodeCodePoint\":\"2A80B\",\"pinYinChars\":[{\"char\":\"ZHI2\"}],\"splitChars\":[{\"char\":\"厂直\"}],\"weight\":10},{\"charId\":\"530868eb\",\"unicodeChar\":\"𪠸\",\"unicodeCodePoint\":\"2A838\",\"pinYinChars\":[{\"char\":\"YO\"}],\"splitChars\":[{\"char\":\"口乐\"}],\"weight\":10},{\"charId\":\"24b5380f\",\"unicodeChar\":\"𪠵\",\"unicodeCodePoint\":\"2A835\",\"pinYinChars\":[{\"char\":\"TUAN\"}],\"splitChars\":[{\"char\":\"口仑\"}],\"weight\":10},{\"charId\":\"13adcae0\",\"unicodeChar\":\"𪣯\",\"unicodeCodePoint\":\"2A8EF\",\"pinYinChars\":[{\"char\":\"YI2\"}],\"splitChars\":[{\"char\":\"土宜\"}],\"weight\":10},{\"charId\":\"58c33376\",\"unicodeChar\":\"𫭾\",\"unicodeCodePoint\":\"2BB7E\",\"pinYinChars\":[{\"char\":\"JIN1\"}],\"splitChars\":[{\"char\":\"土金\"}],\"weight\":10},{\"charId\":\"646f3517\",\"unicodeChar\":\"𫭴\",\"unicodeCodePoint\":\"2BB74\",\"pinYinChars\":[{\"char\":\"LI\"}],\"splitChars\":[{\"char\":\"利土\"}],\"weight\":10},{\"charId\":\"01208af5\",\"unicodeChar\":\"𪣕\",\"unicodeCodePoint\":\"2A8D5\",\"pinYinChars\":[{\"char\":\"KE4\"}],\"splitChars\":[{\"char\":\"土克\"}],\"weight\":10},{\"charId\":\"af5aafa8\",\"unicodeChar\":\"𦏷\",\"unicodeCodePoint\":\"263F7\",\"pinYinChars\":[{\"char\":\"XIAO1\"}],\"splitChars\":[{\"char\":\"大羽\"}],\"weight\":10},{\"charId\":\"929d6c17\",\"unicodeChar\":\"𪢲\",\"unicodeCodePoint\":\"2A8B2\",\"pinYinChars\":[{\"char\":\"HAN4\"}],\"splitChars\":[{\"char\":\"土又\"}],\"weight\":10},{\"charId\":\"8e56bc01\",\"unicodeChar\":\"𪥢\",\"unicodeCodePoint\":\"2A962\",\"pinYinChars\":[{\"char\":\"XIE4\"}],\"splitChars\":[{\"char\":\"火大\"}],\"weight\":10},{\"charId\":\"8111f357\",\"unicodeChar\":\"𫮪\",\"unicodeCodePoint\":\"2BBAA\",\"pinYinChars\":[{\"char\":\"WO1\"}],\"splitChars\":[{\"char\":\"土窝\"}],\"weight\":10},{\"charId\":\"978f2e5b\",\"unicodeChar\":\"𪤖\",\"unicodeCodePoint\":\"2A916\",\"pinYinChars\":[{\"char\":\"QIANG3\"}],\"splitChars\":[{\"char\":\"土將\"}],\"weight\":10},{\"charId\":\"1f46414a\",\"unicodeChar\":\"𪣹\",\"unicodeCodePoint\":\"2A8F9\",\"pinYinChars\":[{\"char\":\"TING2\"}],\"splitChars\":[{\"char\":\"土亭\"}],\"weight\":10},{\"charId\":\"6853fc5f\",\"unicodeChar\":\"𫱭\",\"unicodeCodePoint\":\"2BC6D\",\"pinYinChars\":[{\"char\":\"WEN2\"}],\"splitChars\":[{\"char\":\"女雯\"}],\"weight\":10},{\"charId\":\"6730271b\",\"unicodeChar\":\"𫱡\",\"unicodeCodePoint\":\"2BC61\",\"pinYinChars\":[{\"char\":\"ZHUANG1\"}],\"splitChars\":[{\"char\":\"女莊\"}],\"weight\":10},{\"charId\":\"c3517797\",\"unicodeChar\":\"𫱛\",\"unicodeCodePoint\":\"2BC5B\",\"pinYinChars\":[{\"char\":\"YANG4\"}],\"splitChars\":[{\"char\":\"女恙\"}],\"weight\":10},{\"charId\":\"c53bbab7\",\"unicodeChar\":\"𪦈\",\"unicodeCodePoint\":\"2A988\",\"pinYinChars\":[{\"char\":\"YAN4\"}],\"splitChars\":[{\"char\":\"女匽\"}],\"weight\":10},{\"charId\":\"a3e946ed\",\"unicodeChar\":\"𪦀\",\"unicodeCodePoint\":\"2A980\",\"pinYinChars\":[{\"char\":\"FANG1\"}],\"splitChars\":[{\"char\":\"女芳\"}],\"weight\":10},{\"charId\":\"3001f9a0\",\"unicodeChar\":\"𫰯\",\"unicodeCodePoint\":\"2BC2F\",\"pinYinChars\":[{\"char\":\"KUN4\"}],\"splitChars\":[{\"char\":\"女困\"}],\"weight\":10},{\"charId\":\"c25191ce\",\"unicodeChar\":\"𫰭\",\"unicodeCodePoint\":\"2BC2D\",\"pinYinChars\":[{\"char\":\"CE4\"}],\"splitChars\":[{\"char\":\"女赤\"}],\"weight\":10},{\"charId\":\"0ea898f8\",\"unicodeChar\":\"𫰤\",\"unicodeCodePoint\":\"2BC24\",\"pinYinChars\":[{\"char\":\"MI3\"}],\"splitChars\":[{\"char\":\"女米\"}],\"weight\":10},{\"charId\":\"63faa5f1\",\"unicodeChar\":\"𦫚\",\"unicodeCodePoint\":\"26ADA\",\"pinYinChars\":[{\"char\":\"KU\"}],\"splitChars\":[{\"char\":\"夸色\"}],\"weight\":10},{\"charId\":\"dd995f4e\",\"unicodeChar\":\"𪥳\",\"unicodeCodePoint\":\"2A973\",\"pinYinChars\":[{\"char\":\"DIAO4\"}],\"splitChars\":[{\"char\":\"女吊\"}],\"weight\":10},{\"charId\":\"9f8eab17\",\"unicodeChar\":\"𫰞\",\"unicodeCodePoint\":\"2BC1E\",\"pinYinChars\":[{\"char\":\"LIE4\"}],\"splitChars\":[{\"char\":\"女列\"}],\"weight\":10},{\"charId\":\"1febe4ee\",\"unicodeChar\":\"𫰝\",\"unicodeCodePoint\":\"2BC1D\",\"pinYinChars\":[{\"char\":\"ZAI4\"}],\"splitChars\":[{\"char\":\"女再\"}],\"weight\":10},{\"charId\":\"e3402c2c\",\"unicodeChar\":\"𭖂\",\"unicodeCodePoint\":\"2D582\",\"pinYinChars\":[{\"char\":\"WU1\"}],\"splitChars\":[{\"char\":\"山于\"}],\"weight\":10},{\"charId\":\"af4b8cef\",\"unicodeChar\":\"𪧷\",\"unicodeCodePoint\":\"2A9F7\",\"pinYinChars\":[{\"char\":\"LE4\"}],\"splitChars\":[{\"char\":\"夕寸\"}],\"weight\":10},{\"charId\":\"71d5217a\",\"unicodeChar\":\"𫲘\",\"unicodeCodePoint\":\"2BC98\",\"pinYinChars\":[{\"char\":\"LONG2\"}],\"splitChars\":[{\"char\":\"女龍\"}],\"weight\":10},{\"charId\":\"17c475c8\",\"unicodeChar\":\"𪦬\",\"unicodeCodePoint\":\"2A9AC\",\"pinYinChars\":[{\"char\":\"XIAN2\"}],\"splitChars\":[{\"char\":\"女賢\"}],\"weight\":10},{\"charId\":\"7a0960b9\",\"unicodeChar\":\"𫲊\",\"unicodeCodePoint\":\"2BC8A\",\"pinYinChars\":[{\"char\":\"XUN1\"}],\"splitChars\":[{\"char\":\"女熏\"}],\"weight\":10},{\"charId\":\"102febae\",\"unicodeChar\":\"𪦫\",\"unicodeCodePoint\":\"2A9AB\",\"pinYinChars\":[{\"char\":\"GE2\"}],\"splitChars\":[{\"char\":\"女閣\"}],\"weight\":10},{\"charId\":\"6dba6c84\",\"unicodeChar\":\"𫲇\",\"unicodeCodePoint\":\"2BC87\",\"pinYinChars\":[{\"char\":\"RONG2\"}],\"splitChars\":[{\"char\":\"女蓉\"}],\"weight\":10},{\"charId\":\"61cb8b66\",\"unicodeChar\":\"𫱵\",\"unicodeCodePoint\":\"2BC75\",\"pinYinChars\":[{\"char\":\"ZUN1\"}],\"splitChars\":[{\"char\":\"女尊\"}],\"weight\":10},{\"charId\":\"ca89b753\",\"unicodeChar\":\"𫵻\",\"unicodeCodePoint\":\"2BD7B\",\"pinYinChars\":[{\"char\":\"AN1\"}],\"splitChars\":[{\"char\":\"山安\"}],\"weight\":10},{\"charId\":\"6ff1507e\",\"unicodeChar\":\"𪨯\",\"unicodeCodePoint\":\"2AA2F\",\"pinYinChars\":[{\"char\":\"CHENG2\"}],\"splitChars\":[{\"char\":\"成山\"}],\"weight\":10},{\"charId\":\"68ef83b3\",\"unicodeChar\":\"𭖑\",\"unicodeCodePoint\":\"2D591\",\"pinYinChars\":[{\"char\":\"BI4\"}],\"splitChars\":[{\"char\":\"山必\"}],\"weight\":10},{\"charId\":\"8dac89dd\",\"unicodeChar\":\"𡜱\",\"unicodeCodePoint\":\"21731\",\"pinYinChars\":[{\"char\":\"JI4\"}],\"splitChars\":[{\"char\":\"女忌\"}],\"weight\":10},{\"charId\":\"9badcf9c\",\"unicodeChar\":\"𡜬\",\"unicodeCodePoint\":\"2172C\",\"pinYinChars\":[{\"char\":\"YI1\"}],\"splitChars\":[{\"char\":\"女伊\"}],\"weight\":10},{\"charId\":\"59c90e7e\",\"unicodeChar\":\"𡜦\",\"unicodeCodePoint\":\"21726\",\"pinYinChars\":[{\"char\":\"HUI4\"}],\"splitChars\":[{\"char\":\"卉女\"}],\"weight\":10},{\"charId\":\"20e533a6\",\"unicodeChar\":\"𡛺\",\"unicodeCodePoint\":\"216FA\",\"pinYinChars\":[{\"char\":\"MAO2\"}],\"splitChars\":[{\"char\":\"矛女\"}],\"weight\":10},{\"charId\":\"a52a5091\",\"unicodeChar\":\"𡝚\",\"unicodeCodePoint\":\"2175A\",\"pinYinChars\":[{\"char\":\"CHENG2\"}],\"splitChars\":[{\"char\":\"女呈\"}],\"weight\":10},{\"charId\":\"9a7f1405\",\"unicodeChar\":\"𡝐\",\"unicodeCodePoint\":\"21750\",\"pinYinChars\":[{\"char\":\"CHA2\"}],\"splitChars\":[{\"char\":\"女余\"}],\"weight\":10},{\"charId\":\"ed851bec\",\"unicodeChar\":\"𡛰\",\"unicodeCodePoint\":\"216F0\",\"pinYinChars\":[{\"char\":\"ZHI3\"}],\"splitChars\":[{\"char\":\"女只\"}],\"weight\":10},{\"charId\":\"101e5137\",\"unicodeChar\":\"𡛯\",\"unicodeCodePoint\":\"216EF\",\"pinYinChars\":[{\"char\":\"FU2\"}],\"splitChars\":[{\"char\":\"女弗\"}],\"weight\":10},{\"charId\":\"0e440def\",\"unicodeChar\":\"𡛮\",\"unicodeCodePoint\":\"216EE\",\"pinYinChars\":[{\"char\":\"YOU4\"}],\"splitChars\":[{\"char\":\"女右\"}],\"weight\":10},{\"charId\":\"7553fdf2\",\"unicodeChar\":\"𡞻\",\"unicodeCodePoint\":\"217BB\",\"pinYinChars\":[{\"char\":\"YIN1\"}],\"splitChars\":[{\"char\":\"女土\"}],\"weight\":10},{\"charId\":\"0f899955\",\"unicodeChar\":\"𡞹\",\"unicodeCodePoint\":\"217B9\",\"pinYinChars\":[{\"char\":\"JIAN4\"}],\"splitChars\":[{\"char\":\"女建\"}],\"weight\":10},{\"charId\":\"626d349e\",\"unicodeChar\":\"𬁎\",\"unicodeCodePoint\":\"2C04E\",\"pinYinChars\":[{\"char\":\"YONG3\"}],\"splitChars\":[{\"char\":\"日容\"}],\"weight\":10},{\"charId\":\"989715a9\",\"unicodeChar\":\"𡠀\",\"unicodeCodePoint\":\"21800\",\"pinYinChars\":[{\"char\":\"GAO3\"}],\"splitChars\":[{\"char\":\"女高\"}],\"weight\":10},{\"charId\":\"6dc595e0\",\"unicodeChar\":\"𡟾\",\"unicodeCodePoint\":\"217FE\",\"pinYinChars\":[{\"char\":\"TING2\"}],\"splitChars\":[{\"char\":\"女庭\"}],\"weight\":10},{\"charId\":\"7d38fb80\",\"unicodeChar\":\"𡡡\",\"unicodeCodePoint\":\"21861\",\"pinYinChars\":[{\"char\":\"JING3\"}],\"splitChars\":[{\"char\":\"女景\"}],\"weight\":10},{\"charId\":\"7ac0cc84\",\"unicodeChar\":\"𡡠\",\"unicodeCodePoint\":\"21860\",\"pinYinChars\":[{\"char\":\"CHE4\"}],\"splitChars\":[{\"char\":\"女攵\"}],\"weight\":10},{\"charId\":\"f331e11f\",\"unicodeChar\":\"𡡒\",\"unicodeCodePoint\":\"21852\",\"pinYinChars\":[{\"char\":\"SI1\"}],\"splitChars\":[{\"char\":\"女斯\"}],\"weight\":10},{\"charId\":\"403ae7e2\",\"unicodeChar\":\"𡡑\",\"unicodeCodePoint\":\"21851\",\"pinYinChars\":[{\"char\":\"ZENG1\"}],\"splitChars\":[{\"char\":\"女曾\"}],\"weight\":10},{\"charId\":\"653a74e8\",\"unicodeChar\":\"𡟇\",\"unicodeCodePoint\":\"217C7\",\"pinYinChars\":[{\"char\":\"YUAN2\"}],\"splitChars\":[{\"char\":\"女彖\"}],\"weight\":10},{\"charId\":\"2aaf47d1\",\"unicodeChar\":\"𡟄\",\"unicodeCodePoint\":\"217C4\",\"pinYinChars\":[{\"char\":\"YU4\"}],\"splitChars\":[{\"char\":\"女昱\"}],\"weight\":10},{\"charId\":\"8613c583\",\"unicodeChar\":\"𡜾\",\"unicodeCodePoint\":\"2173E\",\"pinYinChars\":[{\"char\":\"XU4\"}],\"splitChars\":[{\"char\":\"女序\"}],\"weight\":10},{\"charId\":\"8d7d1ced\",\"unicodeChar\":\"𡜲\",\"unicodeCodePoint\":\"21732\",\"pinYinChars\":[{\"char\":\"GAO4\"}],\"splitChars\":[{\"char\":\"女告\"}],\"weight\":10},{\"charId\":\"14243b0f\",\"unicodeChar\":\"𪰕\",\"unicodeCodePoint\":\"2AC15\",\"pinYinChars\":[{\"char\":\"SHUN4\"}],\"splitChars\":[{\"char\":\"日矢\"}],\"weight\":10},{\"charId\":\"ab831c12\",\"unicodeChar\":\"𡞫\",\"unicodeCodePoint\":\"217AB\",\"pinYinChars\":[{\"char\":\"NAI4\"}],\"splitChars\":[{\"char\":\"女柰\"}],\"weight\":10},{\"charId\":\"cb8a8e3b\",\"unicodeChar\":\"𡞙\",\"unicodeCodePoint\":\"21799\",\"pinYinChars\":[{\"char\":\"MIE4\"}],\"splitChars\":[{\"char\":\"女盲\"}],\"weight\":10},{\"charId\":\"a71df32e\",\"unicodeChar\":\"𡞇\",\"unicodeCodePoint\":\"21787\",\"pinYinChars\":[{\"char\":\"PENG2\"}],\"splitChars\":[{\"char\":\"女朋\"}],\"weight\":10},{\"charId\":\"f783f1b5\",\"unicodeChar\":\"𡞀\",\"unicodeCodePoint\":\"21780\",\"pinYinChars\":[{\"char\":\"CHANG2\"}],\"splitChars\":[{\"char\":\"女尚\"}],\"weight\":10},{\"charId\":\"fa6b9fbf\",\"unicodeChar\":\"𡟥\",\"unicodeCodePoint\":\"217E5\",\"pinYinChars\":[{\"char\":\"QU3\"}],\"splitChars\":[{\"char\":\"女禹\"}],\"weight\":10},{\"charId\":\"4c0a609c\",\"unicodeChar\":\"𡟟\",\"unicodeCodePoint\":\"217DF\",\"pinYinChars\":[{\"char\":\"CONG1\"}],\"splitChars\":[{\"char\":\"女怱\"}],\"weight\":10},{\"charId\":\"75a45a26\",\"unicodeChar\":\"𡟚\",\"unicodeCodePoint\":\"217DA\",\"pinYinChars\":[{\"char\":\"YING2\"}],\"splitChars\":[{\"char\":\"女盈\"}],\"weight\":10},{\"charId\":\"5095e2f2\",\"unicodeChar\":\"𡟊\",\"unicodeCodePoint\":\"217CA\",\"pinYinChars\":[{\"char\":\"QIU1\"}],\"splitChars\":[{\"char\":\"女秋\"}],\"weight\":10},{\"charId\":\"8a84edde\",\"unicodeChar\":\"𡝍\",\"unicodeCodePoint\":\"2174D\",\"pinYinChars\":[{\"char\":\"QIE4\"}],\"splitChars\":[{\"char\":\"女豕\"}],\"weight\":10},{\"charId\":\"b9a86d84\",\"unicodeChar\":\"𪰡\",\"unicodeCodePoint\":\"2AC21\",\"pinYinChars\":[{\"char\":\"QUAN2\"}],\"splitChars\":[{\"char\":\"日全\"}],\"weight\":10},{\"charId\":\"34266e8e\",\"unicodeChar\":\"𡝆\",\"unicodeCodePoint\":\"21746\",\"pinYinChars\":[{\"char\":\"JIONG3\"}],\"splitChars\":[{\"char\":\"女冏\"}],\"weight\":10},{\"charId\":\"0a56fae1\",\"unicodeChar\":\"𡝃\",\"unicodeCodePoint\":\"21743\",\"pinYinChars\":[{\"char\":\"BU4\"}],\"splitChars\":[{\"char\":\"女步\"}],\"weight\":10},{\"charId\":\"3651aec3\",\"unicodeChar\":\"𡢾\",\"unicodeCodePoint\":\"218BE\",\"pinYinChars\":[{\"char\":\"JIN1\"}],\"splitChars\":[{\"char\":\"女禁\"}],\"weight\":10},{\"charId\":\"2db7d78b\",\"unicodeChar\":\"𡢨\",\"unicodeCodePoint\":\"218A8\",\"pinYinChars\":[{\"char\":\"CHENG1\"}],\"splitChars\":[{\"char\":\"女聖\"}],\"weight\":10},{\"charId\":\"1ab997f7\",\"unicodeChar\":\"𡢒\",\"unicodeCodePoint\":\"21892\",\"pinYinChars\":[{\"char\":\"JU3\"}],\"splitChars\":[{\"char\":\"女豆\"}],\"weight\":10},{\"charId\":\"acc57b8f\",\"unicodeChar\":\"𬃧\",\"unicodeCodePoint\":\"2C0E7\",\"pinYinChars\":[{\"char\":\"GUAN1\"}],\"splitChars\":[{\"char\":\"木冠\"}],\"weight\":10},{\"charId\":\"006806a2\",\"unicodeChar\":\"𡢄\",\"unicodeCodePoint\":\"21884\",\"pinYinChars\":[{\"char\":\"MIN3\"}],\"splitChars\":[{\"char\":\"女閔\"}],\"weight\":10},{\"charId\":\"c415bbca\",\"unicodeChar\":\"𬃡\",\"unicodeCodePoint\":\"2C0E1\",\"pinYinChars\":[{\"char\":\"WEN3\"}],\"splitChars\":[{\"char\":\"木急\"}],\"weight\":10},{\"charId\":\"bfbe8db9\",\"unicodeChar\":\"𬃠\",\"unicodeCodePoint\":\"2C0E0\",\"pinYinChars\":[{\"char\":\"XI1\"}],\"splitChars\":[{\"char\":\"木盆\"}],\"weight\":10},{\"charId\":\"eb229dc8\",\"unicodeChar\":\"𡤕\",\"unicodeCodePoint\":\"21915\",\"pinYinChars\":[{\"char\":\"XIA2\"}],\"splitChars\":[{\"char\":\"女霞\"}],\"weight\":10},{\"charId\":\"c3c73d31\",\"unicodeChar\":\"𡣺\",\"unicodeCodePoint\":\"218FA\",\"pinYinChars\":[{\"char\":\"HUI4\"}],\"splitChars\":[{\"char\":\"女慧\"}],\"weight\":10},{\"charId\":\"8d059ad6\",\"unicodeChar\":\"𪲀\",\"unicodeCodePoint\":\"2AC80\",\"pinYinChars\":[{\"char\":\"QIU1\"}],\"splitChars\":[{\"char\":\"木丘\"}],\"weight\":10},{\"charId\":\"bce7e919\",\"unicodeChar\":\"𡱌\",\"unicodeCodePoint\":\"21C4C\",\"pinYinChars\":[{\"char\":\"HUAN2\"}],\"splitChars\":[{\"char\":\"尸亘\"}],\"weight\":10},{\"charId\":\"07713fc4\",\"unicodeChar\":\"𬃟\",\"unicodeCodePoint\":\"2C0DF\",\"pinYinChars\":[{\"char\":\"PING2\"}],\"splitChars\":[{\"char\":\"木苹\"}],\"weight\":10},{\"charId\":\"c16ac70e\",\"unicodeChar\":\"𬃝\",\"unicodeCodePoint\":\"2C0DD\",\"pinYinChars\":[{\"char\":\"MAO2\"}],\"splitChars\":[{\"char\":\"木苗\"}],\"weight\":10},{\"charId\":\"510bafba\",\"unicodeChar\":\"𡫀\",\"unicodeCodePoint\":\"21AC0\",\"pinYinChars\":[{\"char\":\"JI1\"}],\"splitChars\":[{\"char\":\"宀敫\"}],\"weight\":10},{\"charId\":\"0939883e\",\"unicodeChar\":\"𬃆\",\"unicodeCodePoint\":\"2C0C6\",\"pinYinChars\":[{\"char\":\"YUE4\"}],\"splitChars\":[{\"char\":\"木岳\"}],\"weight\":10},{\"charId\":\"2e74609b\",\"unicodeChar\":\"𡩯\",\"unicodeCodePoint\":\"21A6F\",\"pinYinChars\":[{\"char\":\"AN1\"}],\"splitChars\":[{\"char\":\"宀电\"}],\"weight\":10},{\"charId\":\"a54f6ec3\",\"unicodeChar\":\"𡠧\",\"unicodeCodePoint\":\"21827\",\"pinYinChars\":[{\"char\":\"JI1\"}],\"splitChars\":[{\"char\":\"其女\"}],\"weight\":10},{\"charId\":\"4ef12afa\",\"unicodeChar\":\"𬂫\",\"unicodeCodePoint\":\"2C0AB\",\"pinYinChars\":[{\"char\":\"CHUI2\"}],\"splitChars\":[{\"char\":\"𠂤木\"}],\"weight\":10},{\"charId\":\"8c45569d\",\"unicodeChar\":\"𡠤\",\"unicodeCodePoint\":\"21824\",\"pinYinChars\":[{\"char\":\"QIANG2\"}],\"splitChars\":[{\"char\":\"女强\"}],\"weight\":10},{\"charId\":\"1e1975d3\",\"unicodeChar\":\"𪲉\",\"unicodeCodePoint\":\"2AC89\",\"pinYinChars\":[{\"char\":\"HOU4\"}],\"splitChars\":[{\"char\":\"木后\"}],\"weight\":10},{\"charId\":\"a2672076\",\"unicodeChar\":\"𪲇\",\"unicodeCodePoint\":\"2AC87\",\"pinYinChars\":[{\"char\":\"QU1\"}],\"splitChars\":[{\"char\":\"木曲\"}],\"weight\":10},{\"charId\":\"c6def8c2\",\"unicodeChar\":\"𡡶\",\"unicodeCodePoint\":\"21876\",\"pinYinChars\":[{\"char\":\"WAN3\"}],\"splitChars\":[{\"char\":\"女宛\"}],\"weight\":10},{\"charId\":\"28744e23\",\"unicodeChar\":\"𡡬\",\"unicodeCodePoint\":\"2186C\",\"pinYinChars\":[{\"char\":\"DUN1\"}],\"splitChars\":[{\"char\":\"女敦\"}],\"weight\":10},{\"charId\":\"faf8e6a9\",\"unicodeChar\":\"𡡥\",\"unicodeCodePoint\":\"21865\",\"pinYinChars\":[{\"char\":\"QU2\"}],\"splitChars\":[{\"char\":\"女渠\"}],\"weight\":10},{\"charId\":\"295cc2d2\",\"unicodeChar\":\"𡣮\",\"unicodeCodePoint\":\"218EE\",\"pinYinChars\":[{\"char\":\"CAI4\"}],\"splitChars\":[{\"char\":\"女蔡\"}],\"weight\":10},{\"charId\":\"d412c51f\",\"unicodeChar\":\"𪱻\",\"unicodeCodePoint\":\"2AC7B\",\"pinYinChars\":[{\"char\":\"BEN3\"}],\"splitChars\":[{\"char\":\"木本\"}],\"weight\":10},{\"charId\":\"c31bb229\",\"unicodeChar\":\"𡣝\",\"unicodeCodePoint\":\"218DD\",\"pinYinChars\":[{\"char\":\"CUI4\"}],\"splitChars\":[{\"char\":\"女翠\"}],\"weight\":10},{\"charId\":\"e250287d\",\"unicodeChar\":\"𡣗\",\"unicodeCodePoint\":\"218D7\",\"pinYinChars\":[{\"char\":\"JIA1\"}],\"splitChars\":[{\"char\":\"女嘉\"}],\"weight\":10},{\"charId\":\"36cee484\",\"unicodeChar\":\"𡣈\",\"unicodeCodePoint\":\"218C8\",\"pinYinChars\":[{\"char\":\"SHU4\"}],\"splitChars\":[{\"char\":\"女署\"}],\"weight\":10},{\"charId\":\"2e73457d\",\"unicodeChar\":\"𡢿\",\"unicodeCodePoint\":\"218BF\",\"pinYinChars\":[{\"char\":\"NONG2\"}],\"splitChars\":[{\"char\":\"女農\"}],\"weight\":10},{\"charId\":\"76eb31c2\",\"unicodeChar\":\"𪲖\",\"unicodeCodePoint\":\"2AC96\",\"pinYinChars\":[{\"char\":\"BAO3\"}],\"splitChars\":[{\"char\":\"木呆\"}],\"weight\":10},{\"charId\":\"1a42ef55\",\"unicodeChar\":\"𡠭\",\"unicodeCodePoint\":\"2182D\",\"pinYinChars\":[{\"char\":\"XUE3\"}],\"splitChars\":[{\"char\":\"女雪\"}],\"weight\":10},{\"charId\":\"81b9b288\",\"unicodeChar\":\"𬈂\",\"unicodeCodePoint\":\"2C202\",\"pinYinChars\":[{\"char\":\"MENG4\"}],\"splitChars\":[{\"char\":\"氵孟\"}],\"weight\":10},{\"charId\":\"e1d0ce89\",\"unicodeChar\":\"𡵖\",\"unicodeCodePoint\":\"21D56\",\"pinYinChars\":[{\"char\":\"SE4\"}],\"splitChars\":[{\"char\":\"山火\"}],\"weight\":10},{\"charId\":\"b773f141\",\"unicodeChar\":\"𪶐\",\"unicodeCodePoint\":\"2AD90\",\"pinYinChars\":[{\"char\":\"AN4\"}],\"splitChars\":[{\"char\":\"氵岸\"}],\"weight\":10},{\"charId\":\"adbb54ff\",\"unicodeChar\":\"𡳞\",\"unicodeCodePoint\":\"21CDE\",\"pinYinChars\":[{\"char\":\"LIN4\"}],\"splitChars\":[{\"char\":\"尸粦\"}],\"weight\":10},{\"charId\":\"789129fb\",\"unicodeChar\":\"𡱝\",\"unicodeCodePoint\":\"21C5D\",\"pinYinChars\":[{\"char\":\"XI1\"}],\"splitChars\":[{\"char\":\"尸羊\"}],\"weight\":10},{\"charId\":\"a0596a55\",\"unicodeChar\":\"𡱘\",\"unicodeCodePoint\":\"21C58\",\"pinYinChars\":[{\"char\":\"GUANG1\"}],\"splitChars\":[{\"char\":\"尸光\"}],\"weight\":10},{\"charId\":\"3903a0fa\",\"unicodeChar\":\"𡸔\",\"unicodeCodePoint\":\"21E14\",\"pinYinChars\":[{\"char\":\"XIE2\"}],\"splitChars\":[{\"char\":\"山圭\"}],\"weight\":10},{\"charId\":\"db2d74f5\",\"unicodeChar\":\"𡸌\",\"unicodeCodePoint\":\"21E0C\",\"pinYinChars\":[{\"char\":\"ZHU4\"}],\"splitChars\":[{\"char\":\"山住\"}],\"weight\":10},{\"charId\":\"82e72eb1\",\"unicodeChar\":\"𡷰\",\"unicodeCodePoint\":\"21DF0\",\"pinYinChars\":[{\"char\":\"CHEN2\"}],\"splitChars\":[{\"char\":\"山辰\"}],\"weight\":10},{\"charId\":\"76ac853f\",\"unicodeChar\":\"𡷥\",\"unicodeCodePoint\":\"21DE5\",\"pinYinChars\":[{\"char\":\"GAO4\"}],\"splitChars\":[{\"char\":\"告山\"}],\"weight\":10},{\"charId\":\"ab37627d\",\"unicodeChar\":\"𡷗\",\"unicodeCodePoint\":\"21DD7\",\"pinYinChars\":[{\"char\":\"HUAN4\"}],\"splitChars\":[{\"char\":\"山完\"}],\"weight\":10},{\"charId\":\"ef24aec8\",\"unicodeChar\":\"𡷖\",\"unicodeCodePoint\":\"21DD6\",\"pinYinChars\":[{\"char\":\"CHE1\"}],\"splitChars\":[{\"char\":\"山車\"}],\"weight\":10},{\"charId\":\"b0ed461b\",\"unicodeChar\":\"𪵬\",\"unicodeCodePoint\":\"2AD6C\",\"pinYinChars\":[{\"char\":\"FAN4\"}],\"splitChars\":[{\"char\":\"氵几\"},{\"char\":\"氵凢\"}],\"weight\":10},{\"charId\":\"fdcf6944\",\"unicodeChar\":\"𡥘\",\"unicodeCodePoint\":\"21958\",\"pinYinChars\":[{\"char\":\"HAO3\"}],\"splitChars\":[{\"char\":\"母子\"}],\"weight\":10},{\"charId\":\"abd04ccd\",\"unicodeChar\":\"𪵘\",\"unicodeCodePoint\":\"2AD58\",\"pinYinChars\":[{\"char\":\"HUO3\"}],\"splitChars\":[{\"char\":\"毛火\"}],\"weight\":10},{\"charId\":\"4586c981\",\"unicodeChar\":\"𬆿\",\"unicodeCodePoint\":\"2C1BF\",\"pinYinChars\":[{\"char\":\"WU4\"}],\"splitChars\":[{\"char\":\"毛勿\"}],\"weight\":10},{\"charId\":\"a619d549\",\"unicodeChar\":\"𡤭\",\"unicodeCodePoint\":\"2192D\",\"pinYinChars\":[{\"char\":\"DANG3\"}],\"splitChars\":[{\"char\":\"女黨\"}],\"weight\":10},{\"charId\":\"712dc80c\",\"unicodeChar\":\"𡤜\",\"unicodeCodePoint\":\"2191C\",\"pinYinChars\":[{\"char\":\"ZI1\"}],\"splitChars\":[{\"char\":\"壹姿\"}],\"weight\":10},{\"charId\":\"8d099996\",\"unicodeChar\":\"𬆭\",\"unicodeCodePoint\":\"2C1AD\",\"pinYinChars\":[{\"char\":\"GU3\"}],\"splitChars\":[{\"char\":\"士冖示殳\"}],\"weight\":10},{\"charId\":\"99491513\",\"unicodeChar\":\"𡤙\",\"unicodeCodePoint\":\"21919\",\"pinYinChars\":[{\"char\":\"NA4\"}],\"splitChars\":[{\"char\":\"女聶\"}],\"weight\":10},{\"charId\":\"e11a5430\",\"unicodeChar\":\"𡶏\",\"unicodeCodePoint\":\"21D8F\",\"pinYinChars\":[{\"char\":\"KU1\"}],\"splitChars\":[{\"char\":\"山出\"}],\"weight\":10},{\"charId\":\"c4cd0683\",\"unicodeChar\":\"𬄿\",\"unicodeCodePoint\":\"2C13F\",\"pinYinChars\":[{\"char\":\"CONG2\"}],\"splitChars\":[{\"char\":\"木取\"}],\"weight\":10},{\"charId\":\"2fd4fcd7\",\"unicodeChar\":\"𭬎\",\"unicodeCodePoint\":\"2DB0E\",\"pinYinChars\":[{\"char\":\"YONG1\"}],\"splitChars\":[{\"char\":\"木雍\"}],\"weight\":10},{\"charId\":\"6b663564\",\"unicodeChar\":\"𡵻\",\"unicodeCodePoint\":\"21D7B\",\"pinYinChars\":[{\"char\":\"KANG1\"}],\"splitChars\":[{\"char\":\"山亢\"}],\"weight\":10},{\"charId\":\"acae6209\",\"unicodeChar\":\"𪳶\",\"unicodeCodePoint\":\"2ACF6\",\"pinYinChars\":[{\"char\":\"HAN2\"}],\"splitChars\":[{\"char\":\"木寒\"}],\"weight\":10},{\"charId\":\"7b5f45a7\",\"unicodeChar\":\"𡵬\",\"unicodeCodePoint\":\"21D6C\",\"pinYinChars\":[{\"char\":\"MU4\"}],\"splitChars\":[{\"char\":\"山木\"}],\"weight\":10},{\"charId\":\"b8f4f89c\",\"unicodeChar\":\"𡵚\",\"unicodeCodePoint\":\"21D5A\",\"pinYinChars\":[{\"char\":\"JIE4\"}],\"splitChars\":[{\"char\":\"山介\"}],\"weight\":10},{\"charId\":\"504e504b\",\"unicodeChar\":\"𪸙\",\"unicodeCodePoint\":\"2AE19\",\"pinYinChars\":[{\"char\":\"WEI4\"}],\"splitChars\":[{\"char\":\"火未\"}],\"weight\":10},{\"charId\":\"8b3c287c\",\"unicodeChar\":\"𬉼\",\"unicodeCodePoint\":\"2C27C\",\"pinYinChars\":[{\"char\":\"OU1\"}],\"splitChars\":[{\"char\":\"火区\"}],\"weight\":10},{\"charId\":\"47de99ea\",\"unicodeChar\":\"𪸒\",\"unicodeCodePoint\":\"2AE12\",\"pinYinChars\":[{\"char\":\"HU4\"}],\"splitChars\":[{\"char\":\"火互\"}],\"weight\":10},{\"charId\":\"413c14d2\",\"unicodeChar\":\"𪸑\",\"unicodeCodePoint\":\"2AE11\",\"pinYinChars\":[{\"char\":\"YUAN2\"}],\"splitChars\":[{\"char\":\"火元\"}],\"weight\":10},{\"charId\":\"f3f17ada\",\"unicodeChar\":\"𡸮\",\"unicodeCodePoint\":\"21E2E\",\"pinYinChars\":[{\"char\":\"LU4\"}],\"splitChars\":[{\"char\":\"山录\"}],\"weight\":10},{\"charId\":\"be26f832\",\"unicodeChar\":\"𪸀\",\"unicodeCodePoint\":\"2AE00\",\"pinYinChars\":[{\"char\":\"XIA2\"}],\"splitChars\":[{\"char\":\"氵霞\"}],\"weight\":10},{\"charId\":\"90f662bb\",\"unicodeChar\":\"𪷸\",\"unicodeCodePoint\":\"2ADF8\",\"pinYinChars\":[{\"char\":\"QING4\"}],\"splitChars\":[{\"char\":\"氵慶\"}],\"weight\":10},{\"charId\":\"6284d947\",\"unicodeChar\":\"𢁂\",\"unicodeCodePoint\":\"22042\",\"pinYinChars\":[{\"char\":\"JI1\"}],\"splitChars\":[{\"char\":\"其巳\"}],\"weight\":10},{\"charId\":\"7fec1fa8\",\"unicodeChar\":\"𪷱\",\"unicodeCodePoint\":\"2ADF1\",\"pinYinChars\":[{\"char\":\"SAI4\"}],\"splitChars\":[{\"char\":\"氵赛\"}],\"weight\":10},{\"charId\":\"6cb5a4f7\",\"unicodeChar\":\"𡾱\",\"unicodeCodePoint\":\"21FB1\",\"pinYinChars\":[{\"char\":\"MI2\"}],\"splitChars\":[{\"char\":\"山彌\"}],\"weight\":10},{\"charId\":\"da10a47e\",\"unicodeChar\":\"𡽜\",\"unicodeCodePoint\":\"21F5C\",\"pinYinChars\":[{\"char\":\"GU3\"}],\"splitChars\":[{\"char\":\"山言\"}],\"weight\":10},{\"charId\":\"8ce5ba4d\",\"unicodeChar\":\"𡽌\",\"unicodeCodePoint\":\"21F4C\",\"pinYinChars\":[{\"char\":\"GU3\"}],\"splitChars\":[{\"char\":\"鼓山\"}],\"weight\":10},{\"charId\":\"68fa9b0a\",\"unicodeChar\":\"𡽂\",\"unicodeCodePoint\":\"21F42\",\"pinYinChars\":[{\"char\":\"GU3\"}],\"splitChars\":[{\"char\":\"山鼓\"}],\"weight\":10},{\"charId\":\"dac8a512\",\"unicodeChar\":\"𡷑\",\"unicodeCodePoint\":\"21DD1\",\"pinYinChars\":[{\"char\":\"CI4\"}],\"splitChars\":[{\"char\":\"山次\"}],\"weight\":10},{\"charId\":\"9714ac3b\",\"unicodeChar\":\"𡷎\",\"unicodeCodePoint\":\"21DCE\",\"pinYinChars\":[{\"char\":\"YU3\"}],\"splitChars\":[{\"char\":\"山宇\"}],\"weight\":10},{\"charId\":\"b20079a9\",\"unicodeChar\":\"𪷖\",\"unicodeCodePoint\":\"2ADD6\",\"pinYinChars\":[{\"char\":\"RAN2\"}],\"splitChars\":[{\"char\":\"氵然\"}],\"weight\":10},{\"charId\":\"80afeb41\",\"unicodeChar\":\"𡶵\",\"unicodeCodePoint\":\"21DB5\",\"pinYinChars\":[{\"char\":\"HONG2\"}],\"splitChars\":[{\"char\":\"山共\"}],\"weight\":10},{\"charId\":\"3e403df3\",\"unicodeChar\":\"𬈳\",\"unicodeCodePoint\":\"2C233\",\"pinYinChars\":[{\"char\":\"WEN2\"}],\"splitChars\":[{\"char\":\"氵雯\"}],\"weight\":10},{\"charId\":\"87ab5176\",\"unicodeChar\":\"𬈲\",\"unicodeCodePoint\":\"2C232\",\"pinYinChars\":[{\"char\":\"QI2\"}],\"splitChars\":[{\"char\":\"氵琪\"}],\"weight\":10},{\"charId\":\"f39a46e6\",\"unicodeChar\":\"𡶑\",\"unicodeCodePoint\":\"21D91\",\"pinYinChars\":[{\"char\":\"GAN1\"}],\"splitChars\":[{\"char\":\"山甘\"}],\"weight\":10},{\"charId\":\"d7e8c06d\",\"unicodeChar\":\"𡶐\",\"unicodeCodePoint\":\"21D90\",\"pinYinChars\":[{\"char\":\"QIE2\"}],\"splitChars\":[{\"char\":\"山加\"}],\"weight\":10},{\"charId\":\"4df91204\",\"unicodeChar\":\"𪶹\",\"unicodeCodePoint\":\"2ADB9\",\"pinYinChars\":[{\"char\":\"TI2\"}],\"splitChars\":[{\"char\":\"氵庭\"}],\"weight\":10},{\"charId\":\"2cc55639\",\"unicodeChar\":\"𬈠\",\"unicodeCodePoint\":\"2C220\",\"pinYinChars\":[{\"char\":\"FU2\"}],\"splitChars\":[{\"char\":\"氵畐\"}],\"weight\":10},{\"charId\":\"9ad3cfff\",\"unicodeChar\":\"𡺨\",\"unicodeCodePoint\":\"21EA8\",\"pinYinChars\":[{\"char\":\"WEI3\"}],\"splitChars\":[{\"char\":\"山韋\"}],\"weight\":10},{\"charId\":\"c1bc3ffb\",\"unicodeChar\":\"𡺠\",\"unicodeCodePoint\":\"21EA0\",\"pinYinChars\":[{\"char\":\"HUN2\"}],\"splitChars\":[{\"char\":\"山軍\"}],\"weight\":10},{\"charId\":\"18e6a788\",\"unicodeChar\":\"𪶦\",\"unicodeCodePoint\":\"2ADA6\",\"pinYinChars\":[{\"char\":\"GUN3\"}],\"splitChars\":[{\"char\":\"氵哀\"}],\"weight\":10},{\"charId\":\"cc825d9b\",\"unicodeChar\":\"𡺑\",\"unicodeCodePoint\":\"21E91\",\"pinYinChars\":[{\"char\":\"DIE2\"}],\"splitChars\":[{\"char\":\"山枼\"}],\"weight\":10},{\"charId\":\"04ece4ed\",\"unicodeChar\":\"𡺍\",\"unicodeCodePoint\":\"21E8D\",\"pinYinChars\":[{\"char\":\"ZHONG1\"}],\"splitChars\":[{\"char\":\"山重\"}],\"weight\":10},{\"charId\":\"490ddc88\",\"unicodeChar\":\"𡺀\",\"unicodeCodePoint\":\"21E80\",\"pinYinChars\":[{\"char\":\"KE4\"}],\"splitChars\":[{\"char\":\"山客\"}],\"weight\":10},{\"charId\":\"2edaf42e\",\"unicodeChar\":\"𡹾\",\"unicodeCodePoint\":\"21E7E\",\"pinYinChars\":[{\"char\":\"BING3\"}],\"splitChars\":[{\"char\":\"山丙\"}],\"weight\":10},{\"charId\":\"5da5645b\",\"unicodeChar\":\"𡹬\",\"unicodeCodePoint\":\"21E6C\",\"pinYinChars\":[{\"char\":\"TUO2\"}],\"splitChars\":[{\"char\":\"山咼\"}],\"weight\":10},{\"charId\":\"16523ac7\",\"unicodeChar\":\"𪹊\",\"unicodeCodePoint\":\"2AE4A\",\"pinYinChars\":[{\"char\":\"YU2\"}],\"splitChars\":[{\"char\":\"火俞\"}],\"weight\":10},{\"charId\":\"f009338b\",\"unicodeChar\":\"𢄈\",\"unicodeCodePoint\":\"22108\",\"pinYinChars\":[{\"char\":\"YIN1\"}],\"splitChars\":[{\"char\":\"巾音\"}],\"weight\":10},{\"charId\":\"16c313d3\",\"unicodeChar\":\"𪹁\",\"unicodeCodePoint\":\"2AE41\",\"pinYinChars\":[{\"char\":\"MENG3\"}],\"splitChars\":[{\"char\":\"火孟\"}],\"weight\":10},{\"charId\":\"90fdbbf7\",\"unicodeChar\":\"𪸼\",\"unicodeCodePoint\":\"2AE3C\",\"pinYinChars\":[{\"char\":\"ZHOU1\"}],\"splitChars\":[{\"char\":\"火周\"}],\"weight\":10},{\"charId\":\"c2bb4237\",\"unicodeChar\":\"𢃡\",\"unicodeCodePoint\":\"220E1\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"巾易\"}],\"weight\":10},{\"charId\":\"031c266c\",\"unicodeChar\":\"𬊝\",\"unicodeCodePoint\":\"2C29D\",\"pinYinChars\":[{\"char\":\"JIN1\"}],\"splitChars\":[{\"char\":\"火金\"}],\"weight\":10},{\"charId\":\"8912316f\",\"unicodeChar\":\"𢃇\",\"unicodeCodePoint\":\"220C7\",\"pinYinChars\":[{\"char\":\"LI3\"}],\"splitChars\":[{\"char\":\"巾里\"}],\"weight\":10},{\"charId\":\"4aa3eea8\",\"unicodeChar\":\"𢂔\",\"unicodeCodePoint\":\"22094\",\"pinYinChars\":[{\"char\":\"HONG2\"}],\"splitChars\":[{\"char\":\"巾共\"}],\"weight\":10},{\"charId\":\"e9bb02af\",\"unicodeChar\":\"𢁾\",\"unicodeCodePoint\":\"2207E\",\"pinYinChars\":[{\"char\":\"CHAO1\"}],\"splitChars\":[{\"char\":\"巾召\"}],\"weight\":10},{\"charId\":\"e2a30084\",\"unicodeChar\":\"𪸵\",\"unicodeCodePoint\":\"2AE35\",\"pinYinChars\":[{\"char\":\"WU3\"}],\"splitChars\":[{\"char\":\"火武\"}],\"weight\":10},{\"charId\":\"d5b30b6c\",\"unicodeChar\":\"𪸴\",\"unicodeCodePoint\":\"2AE34\",\"pinYinChars\":[{\"char\":\"QI2\"}],\"splitChars\":[{\"char\":\"火奇\"}],\"weight\":10},{\"charId\":\"d4887948\",\"unicodeChar\":\"𬊑\",\"unicodeCodePoint\":\"2C291\",\"pinYinChars\":[{\"char\":\"CHUAN4\"}],\"splitChars\":[{\"char\":\"火串\"}],\"weight\":10},{\"charId\":\"a34fa601\",\"unicodeChar\":\"𡼪\",\"unicodeCodePoint\":\"21F2A\",\"pinYinChars\":[{\"char\":\"DA2\"}],\"splitChars\":[{\"char\":\"山答\"}],\"weight\":10},{\"charId\":\"e8cf5b53\",\"unicodeChar\":\"𬊌\",\"unicodeCodePoint\":\"2C28C\",\"pinYinChars\":[{\"char\":\"ZHI4\"}],\"splitChars\":[{\"char\":\"火志\"}],\"weight\":10},{\"charId\":\"3a8c1bb2\",\"unicodeChar\":\"𡻯\",\"unicodeCodePoint\":\"21EEF\",\"pinYinChars\":[{\"char\":\"QIANG3\"}],\"splitChars\":[{\"char\":\"山爽\"}],\"weight\":10},{\"charId\":\"549b5021\",\"unicodeChar\":\"𬊋\",\"unicodeCodePoint\":\"2C28B\",\"pinYinChars\":[{\"char\":\"QIU2\"}],\"splitChars\":[{\"char\":\"火求\"}],\"weight\":10},{\"charId\":\"1dd59445\",\"unicodeChar\":\"𡺸\",\"unicodeCodePoint\":\"21EB8\",\"pinYinChars\":[{\"char\":\"QI2\"}],\"splitChars\":[{\"char\":\"山耆\"}],\"weight\":10},{\"charId\":\"9fc5bde4\",\"unicodeChar\":\"𪸫\",\"unicodeCodePoint\":\"2AE2B\",\"pinYinChars\":[{\"char\":\"GENG1\"}],\"splitChars\":[{\"char\":\"火更\"}],\"weight\":10},{\"charId\":\"f95fdf8a\",\"unicodeChar\":\"𡺯\",\"unicodeCodePoint\":\"21EAF\",\"pinYinChars\":[{\"char\":\"YAO2\"}],\"splitChars\":[{\"char\":\"山䍃\"}],\"weight\":10},{\"charId\":\"0533cb78\",\"unicodeChar\":\"𡺭\",\"unicodeCodePoint\":\"21EAD\",\"pinYinChars\":[{\"char\":\"HONG2\"}],\"splitChars\":[{\"char\":\"山貢\"}],\"weight\":10},{\"charId\":\"3536992f\",\"unicodeChar\":\"𪸥\",\"unicodeCodePoint\":\"2AE25\",\"pinYinChars\":[{\"char\":\"ER3\"}],\"splitChars\":[{\"char\":\"火耳\"}],\"weight\":10},{\"charId\":\"2d683ac7\",\"unicodeChar\":\"𪸞\",\"unicodeCodePoint\":\"2AE1E\",\"pinYinChars\":[{\"char\":\"XIAN3\"}],\"splitChars\":[{\"char\":\"火尔\"}],\"weight\":10},{\"charId\":\"5a4dfa7b\",\"unicodeChar\":\"𪸛\",\"unicodeCodePoint\":\"2AE1B\",\"pinYinChars\":[{\"char\":\"YU4\"}],\"splitChars\":[{\"char\":\"火玉\"}],\"weight\":10},{\"charId\":\"cd085af2\",\"unicodeChar\":\"𬊱\",\"unicodeCodePoint\":\"2C2B1\",\"pinYinChars\":[{\"char\":\"DI4\"}],\"splitChars\":[{\"char\":\"火帝\"}],\"weight\":10},{\"charId\":\"5b136f5f\",\"unicodeChar\":\"𪹏\",\"unicodeCodePoint\":\"2AE4F\",\"pinYinChars\":[{\"char\":\"MEI3\"}],\"splitChars\":[{\"char\":\"火美\"}],\"weight\":10},{\"charId\":\"0c69e0de\",\"unicodeChar\":\"𫵿\",\"unicodeCodePoint\":\"2BD7F\",\"pinYinChars\":[{\"char\":\"XIU4\"}],\"splitChars\":[{\"char\":\"山秀\"}],\"weight\":10},{\"charId\":\"da0e0a17\",\"unicodeChar\":\"𪩚\",\"unicodeCodePoint\":\"2AA5A\",\"pinYinChars\":[{\"char\":\"HUI4\"}],\"splitChars\":[{\"char\":\"山會\"}],\"weight\":10},{\"charId\":\"bcffe4ff\",\"unicodeChar\":\"𪩉\",\"unicodeCodePoint\":\"2AA49\",\"pinYinChars\":[{\"char\":\"FU1\"}],\"splitChars\":[{\"char\":\"山尃\"}],\"weight\":10},{\"charId\":\"97c2d7cb\",\"unicodeChar\":\"𪩂\",\"unicodeCodePoint\":\"2AA42\",\"pinYinChars\":[{\"char\":\"NAN2\"}],\"splitChars\":[{\"char\":\"山南\"}],\"weight\":10},{\"charId\":\"1a6baec6\",\"unicodeChar\":\"𫷋\",\"unicodeCodePoint\":\"2BDCB\",\"pinYinChars\":[{\"char\":\"KAI3\"}],\"splitChars\":[{\"char\":\"巾豈\"}],\"weight\":10},{\"charId\":\"1c14a76e\",\"unicodeChar\":\"𪫍\",\"unicodeCodePoint\":\"2AACD\",\"pinYinChars\":[{\"char\":\"ZHI4\"}],\"splitChars\":[{\"char\":\"彳志\"}],\"weight\":10},{\"charId\":\"21baab2b\",\"unicodeChar\":\"𪫋\",\"unicodeCodePoint\":\"2AACB\",\"pinYinChars\":[{\"char\":\"WEN2\"}],\"splitChars\":[{\"char\":\"彳文\"}],\"weight\":10},{\"charId\":\"88172759\",\"unicodeChar\":\"𫶣\",\"unicodeCodePoint\":\"2BDA3\",\"pinYinChars\":[{\"char\":\"HENG2\"}],\"splitChars\":[{\"char\":\"山衡\"}],\"weight\":10},{\"charId\":\"2e9e37fb\",\"unicodeChar\":\"𪫧\",\"unicodeCodePoint\":\"2AAE7\",\"pinYinChars\":[{\"char\":\"KE3\"}],\"splitChars\":[{\"char\":\"忄可\"}],\"weight\":10},{\"charId\":\"d96da2ad\",\"unicodeChar\":\"𪭤\",\"unicodeCodePoint\":\"2AB64\",\"pinYinChars\":[{\"char\":\"ZHENG4\"}],\"splitChars\":[{\"char\":\"扌正\"}],\"weight\":10},{\"charId\":\"46b95487\",\"unicodeChar\":\"𫼚\",\"unicodeCodePoint\":\"2BF1A\",\"pinYinChars\":[{\"char\":\"LA1\"}],\"splitChars\":[{\"char\":\"扌六\"}],\"weight\":10},{\"charId\":\"5953e029\",\"unicodeChar\":\"𫼖\",\"unicodeCodePoint\":\"2BF16\",\"pinYinChars\":[{\"char\":\"JIU3\"}],\"splitChars\":[{\"char\":\"扌久\"}],\"weight\":10},{\"charId\":\"a2458e86\",\"unicodeChar\":\"𫻑\",\"unicodeCodePoint\":\"2BED1\",\"pinYinChars\":[{\"char\":\"KUI4\"}],\"splitChars\":[{\"char\":\"忄匱\"}],\"weight\":10},{\"charId\":\"ad218451\",\"unicodeChar\":\"𫷷\",\"unicodeCodePoint\":\"2BDF7\",\"pinYinChars\":[{\"char\":\"XIN1\"}],\"splitChars\":[{\"char\":\"广钦\"}],\"weight\":10},{\"charId\":\"1c2c7f57\",\"unicodeChar\":\"𪪎\",\"unicodeCodePoint\":\"2AA8E\",\"pinYinChars\":[{\"char\":\"ZHENG4\"}],\"splitChars\":[{\"char\":\"广正\"}],\"weight\":10},{\"charId\":\"8dd4a5a9\",\"unicodeChar\":\"𪬃\",\"unicodeCodePoint\":\"2AB03\",\"pinYinChars\":[{\"char\":\"YI2\"}],\"splitChars\":[{\"char\":\"忄宜\"}],\"weight\":10},{\"charId\":\"5bafa81f\",\"unicodeChar\":\"𪫹\",\"unicodeCodePoint\":\"2AAF9\",\"pinYinChars\":[{\"char\":\"YU4\"}],\"splitChars\":[{\"char\":\"忄谷\"}],\"weight\":10},{\"charId\":\"e989ddc1\",\"unicodeChar\":\"𪫷\",\"unicodeCodePoint\":\"2AAF7\",\"pinYinChars\":[{\"char\":\"CHOU2\"}],\"splitChars\":[{\"char\":\"寿心\"}],\"weight\":10},{\"charId\":\"94588bb9\",\"unicodeChar\":\"𪫮\",\"unicodeCodePoint\":\"2AAEE\",\"pinYinChars\":[{\"char\":\"MO4\"}],\"splitChars\":[{\"char\":\"忄百\"}],\"weight\":10},{\"charId\":\"ce104446\",\"unicodeChar\":\"𪭶\",\"unicodeCodePoint\":\"2AB76\",\"pinYinChars\":[{\"char\":\"CHUAN4\"}],\"splitChars\":[{\"char\":\"扌串\"}],\"weight\":10},{\"charId\":\"e362bfb6\",\"unicodeChar\":\"𫼯\",\"unicodeCodePoint\":\"2BF2F\",\"pinYinChars\":[{\"char\":\"BIAN1\"}],\"splitChars\":[{\"char\":\"扌边\"}],\"weight\":10},{\"charId\":\"2ed8a23b\",\"unicodeChar\":\"𪯢\",\"unicodeCodePoint\":\"2ABE2\",\"pinYinChars\":[{\"char\":\"HUAN1\"}],\"splitChars\":[{\"char\":\"文文\"}],\"weight\":10},{\"charId\":\"b91d7b9d\",\"unicodeChar\":\"𫾪\",\"unicodeCodePoint\":\"2BFAA\",\"pinYinChars\":[{\"char\":\"JI2\"}],\"splitChars\":[{\"char\":\"吉攵\"}],\"weight\":10},{\"charId\":\"637c0bfa\",\"unicodeChar\":\"𪮾\",\"unicodeCodePoint\":\"2ABBE\",\"pinYinChars\":[{\"char\":\"JUN1\"}],\"splitChars\":[{\"char\":\"扌木\"}],\"weight\":10},{\"charId\":\"21311a3d\",\"unicodeChar\":\"𪰌\",\"unicodeCodePoint\":\"2AC0C\",\"pinYinChars\":[{\"char\":\"MAO2\"}],\"splitChars\":[{\"char\":\"日毛\"}],\"weight\":10},{\"charId\":\"ecf3f718\",\"unicodeChar\":\"𢬶\",\"unicodeCodePoint\":\"22B36\",\"pinYinChars\":[{\"char\":\"JIN4\"}],\"splitChars\":[{\"char\":\"扌𠬶\"}],\"weight\":10},{\"charId\":\"409f2a74\",\"unicodeChar\":\"𢬢\",\"unicodeCodePoint\":\"22B22\",\"pinYinChars\":[{\"char\":\"DIAO4\"}],\"splitChars\":[{\"char\":\"扌吊\"}],\"weight\":10},{\"charId\":\"15109578\",\"unicodeChar\":\"𢬐\",\"unicodeCodePoint\":\"22B10\",\"pinYinChars\":[{\"char\":\"XU4\"}],\"splitChars\":[{\"char\":\"扌旭\"}],\"weight\":10},{\"charId\":\"19c300dd\",\"unicodeChar\":\"𢫓\",\"unicodeCodePoint\":\"22AD3\",\"pinYinChars\":[{\"char\":\"NU3\"}],\"splitChars\":[{\"char\":\"扌奴\"}],\"weight\":10},{\"charId\":\"1e5455c1\",\"unicodeChar\":\"𢪧\",\"unicodeCodePoint\":\"22AA7\",\"pinYinChars\":[{\"char\":\"YE4\"}],\"splitChars\":[{\"char\":\"扌牛\"}],\"weight\":10},{\"charId\":\"4dae1a99\",\"unicodeChar\":\"𢳀\",\"unicodeCodePoint\":\"22CC0\",\"pinYinChars\":[{\"char\":\"MO2\"}],\"splitChars\":[{\"char\":\"扌麻\"}],\"weight\":10},{\"charId\":\"29c9f679\",\"unicodeChar\":\"𢲡\",\"unicodeCodePoint\":\"22CA1\",\"pinYinChars\":[{\"char\":\"NA2\"}],\"splitChars\":[{\"char\":\"扌拿\"}],\"weight\":10},{\"charId\":\"53c82736\",\"unicodeChar\":\"𢱍\",\"unicodeCodePoint\":\"22C4D\",\"pinYinChars\":[{\"char\":\"WAN3\"}],\"splitChars\":[{\"char\":\"扌勉\"}],\"weight\":10},{\"charId\":\"0ebfa06b\",\"unicodeChar\":\"𢱈\",\"unicodeCodePoint\":\"22C48\",\"pinYinChars\":[{\"char\":\"JIA4\"}],\"splitChars\":[{\"char\":\"扌叚\"}],\"weight\":10},{\"charId\":\"29ee6122\",\"unicodeChar\":\"𢩱\",\"unicodeCodePoint\":\"22A71\",\"pinYinChars\":[{\"char\":\"BANG4\"}],\"splitChars\":[{\"char\":\"扌才\"}],\"weight\":10},{\"charId\":\"d8f8a44c\",\"unicodeChar\":\"𢸔\",\"unicodeCodePoint\":\"22E14\",\"pinYinChars\":[{\"char\":\"PAN2\"}],\"splitChars\":[{\"char\":\"扌盤\"}],\"weight\":10},{\"charId\":\"a4e51b0e\",\"unicodeChar\":\"𢾑\",\"unicodeCodePoint\":\"22F91\",\"pinYinChars\":[{\"char\":\"YAN3\"}],\"splitChars\":[{\"char\":\"音攴\"}],\"weight\":10},{\"charId\":\"6698974a\",\"unicodeChar\":\"𣅮\",\"unicodeCodePoint\":\"2316E\",\"pinYinChars\":[{\"char\":\"SHENG1\"}],\"splitChars\":[{\"char\":\"日升\"}],\"weight\":10},{\"charId\":\"47524fb7\",\"unicodeChar\":\"𣅡\",\"unicodeCodePoint\":\"23161\",\"pinYinChars\":[{\"char\":\"JUE2\"}],\"splitChars\":[{\"char\":\"日夬\"}],\"weight\":10},{\"charId\":\"0bcfb6b0\",\"unicodeChar\":\"𣅟\",\"unicodeCodePoint\":\"2315F\",\"pinYinChars\":[{\"char\":\"DAN1\"}],\"splitChars\":[{\"char\":\"日冘\"}],\"weight\":10},{\"charId\":\"f05c1b3f\",\"unicodeChar\":\"𣄿\",\"unicodeCodePoint\":\"2313F\",\"pinYinChars\":[{\"char\":\"TING3\"}],\"splitChars\":[{\"char\":\"日丁\"}],\"weight\":10},{\"charId\":\"6abce19c\",\"unicodeChar\":\"𬒔\",\"unicodeCodePoint\":\"2C494\",\"pinYinChars\":[{\"char\":\"GENG3\"}],\"splitChars\":[{\"char\":\"石肯\"}],\"weight\":10},{\"charId\":\"ce52f786\",\"unicodeChar\":\"𢸍\",\"unicodeCodePoint\":\"22E0D\",\"pinYinChars\":[{\"char\":\"ZHEN4\"}],\"splitChars\":[{\"char\":\"扌震\"}],\"weight\":10},{\"charId\":\"ec193bcf\",\"unicodeChar\":\"𢷪\",\"unicodeCodePoint\":\"22DEA\",\"pinYinChars\":[{\"char\":\"KUI2\"}],\"splitChars\":[{\"char\":\"扌魁\"}],\"weight\":10},{\"charId\":\"98f69656\",\"unicodeChar\":\"𢶉\",\"unicodeCodePoint\":\"22D89\",\"pinYinChars\":[{\"char\":\"PO4\"}],\"splitChars\":[{\"char\":\"扌雹\"}],\"weight\":10},{\"charId\":\"1f62e500\",\"unicodeChar\":\"𢳧\",\"unicodeCodePoint\":\"22CE7\",\"pinYinChars\":[{\"char\":\"KANG3\"}],\"splitChars\":[{\"char\":\"扌康\"}],\"weight\":10},{\"charId\":\"0f9100db\",\"unicodeChar\":\"𢾄\",\"unicodeCodePoint\":\"22F84\",\"pinYinChars\":[{\"char\":\"YU2\"}],\"splitChars\":[{\"char\":\"俞攵\"}],\"weight\":10},{\"charId\":\"cfbdcda4\",\"unicodeChar\":\"𢼣\",\"unicodeCodePoint\":\"22F23\",\"pinYinChars\":[{\"char\":\"QIA4\"}],\"splitChars\":[{\"char\":\"吉攴\"}],\"weight\":10},{\"charId\":\"ebf236e7\",\"unicodeChar\":\"𢰸\",\"unicodeCodePoint\":\"22C38\",\"pinYinChars\":[{\"char\":\"GUO1\"}],\"splitChars\":[{\"char\":\"扌咼\"}],\"weight\":10},{\"charId\":\"2606fc29\",\"unicodeChar\":\"𢰲\",\"unicodeCodePoint\":\"22C32\",\"pinYinChars\":[{\"char\":\"MEI2\"}],\"splitChars\":[{\"char\":\"扌眉\"}],\"weight\":10},{\"charId\":\"f5cedd13\",\"unicodeChar\":\"𣇋\",\"unicodeCodePoint\":\"231CB\",\"pinYinChars\":[{\"char\":\"YUE4\"}],\"splitChars\":[{\"char\":\"日兑\"}],\"weight\":10},{\"charId\":\"d1c0c19b\",\"unicodeChar\":\"𣆳\",\"unicodeCodePoint\":\"231B3\",\"pinYinChars\":[{\"char\":\"GENG3\"}],\"splitChars\":[{\"char\":\"日更\"}],\"weight\":10},{\"charId\":\"a82e3bcc\",\"unicodeChar\":\"𫁪\",\"unicodeCodePoint\":\"2B06A\",\"pinYinChars\":[{\"char\":\"LI4\"}],\"splitChars\":[{\"char\":\"立立\"}],\"weight\":10},{\"charId\":\"9ac604be\",\"unicodeChar\":\"𣆲\",\"unicodeCodePoint\":\"231B2\",\"pinYinChars\":[{\"char\":\"QIN4\"}],\"splitChars\":[{\"char\":\"日𠬶\"}],\"weight\":10},{\"charId\":\"e5cb37ad\",\"unicodeChar\":\"𣆟\",\"unicodeCodePoint\":\"2319F\",\"pinYinChars\":[{\"char\":\"XIE1\"}],\"splitChars\":[{\"char\":\"此旦\"}],\"weight\":10},{\"charId\":\"2264667e\",\"unicodeChar\":\"𣉥\",\"unicodeCodePoint\":\"23265\",\"pinYinChars\":[{\"char\":\"YIN1\"}],\"splitChars\":[{\"char\":\"日殷\"}],\"weight\":10},{\"charId\":\"ea57c009\",\"unicodeChar\":\"𣎅\",\"unicodeCodePoint\":\"23385\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"月曷\"}],\"weight\":10},{\"charId\":\"4f32b6d3\",\"unicodeChar\":\"𣍾\",\"unicodeCodePoint\":\"2337E\",\"pinYinChars\":[{\"char\":\"LIANG3\"}],\"splitChars\":[{\"char\":\"月雨\"}],\"weight\":10},{\"charId\":\"6d19eeb7\",\"unicodeChar\":\"𬓤\",\"unicodeCodePoint\":\"2C4E4\",\"pinYinChars\":[{\"char\":\"CHI3\"}],\"splitChars\":[{\"char\":\"禾尺\"}],\"weight\":10},{\"charId\":\"7f5fa2b2\",\"unicodeChar\":\"𮂱\",\"unicodeCodePoint\":\"2E0B1\",\"pinYinChars\":[{\"char\":\"JI1\"}],\"splitChars\":[{\"char\":\"禾尤\"}],\"weight\":10},{\"charId\":\"b701f9ac\",\"unicodeChar\":\"𣍆\",\"unicodeCodePoint\":\"23346\",\"pinYinChars\":[{\"char\":\"NING2\"}],\"splitChars\":[{\"char\":\"殸曰\"}],\"weight\":10},{\"charId\":\"b227c361\",\"unicodeChar\":\"𣌸\",\"unicodeCodePoint\":\"23338\",\"pinYinChars\":[{\"char\":\"JI2\"}],\"splitChars\":[{\"char\":\"日即\"}],\"weight\":10},{\"charId\":\"54c2671c\",\"unicodeChar\":\"𫁵\",\"unicodeCodePoint\":\"2B075\",\"pinYinChars\":[{\"char\":\"DOU3\"}],\"splitChars\":[{\"char\":\"竹斗\"}],\"weight\":10},{\"charId\":\"98a63877\",\"unicodeChar\":\"𬔱\",\"unicodeCodePoint\":\"2C531\",\"pinYinChars\":[{\"char\":\"ZHI1\"}],\"splitChars\":[{\"char\":\"竹之\"}],\"weight\":10},{\"charId\":\"fffd6cc5\",\"unicodeChar\":\"𬒺\",\"unicodeCodePoint\":\"2C4BA\",\"pinYinChars\":[{\"char\":\"SHU1\"}],\"splitChars\":[{\"char\":\"礻足\"}],\"weight\":10},{\"charId\":\"f23abfd9\",\"unicodeChar\":\"𫀊\",\"unicodeCodePoint\":\"2B00A\",\"pinYinChars\":[{\"char\":\"YI1\"}],\"splitChars\":[{\"char\":\"礻衣\"}],\"weight\":10},{\"charId\":\"046ddbbb\",\"unicodeChar\":\"𬒮\",\"unicodeCodePoint\":\"2C4AE\",\"pinYinChars\":[{\"char\":\"MEI4\"}],\"splitChars\":[{\"char\":\"礻夬\"}],\"weight\":10},{\"charId\":\"2a2f39c3\",\"unicodeChar\":\"𪿢\",\"unicodeCodePoint\":\"2AFE2\",\"pinYinChars\":[{\"char\":\"PI4\"}],\"splitChars\":[{\"char\":\"石辛\"}],\"weight\":10},{\"charId\":\"6ae66a85\",\"unicodeChar\":\"𣅾\",\"unicodeCodePoint\":\"2317E\",\"pinYinChars\":[{\"char\":\"XI1\"}],\"splitChars\":[{\"char\":\"冉日\"}],\"weight\":10},{\"charId\":\"f255c200\",\"unicodeChar\":\"𣈥\",\"unicodeCodePoint\":\"23225\",\"pinYinChars\":[{\"char\":\"TU2\"}],\"splitChars\":[{\"char\":\"日俞\"}],\"weight\":10},{\"charId\":\"5d53a28c\",\"unicodeChar\":\"𬒙\",\"unicodeCodePoint\":\"2C499\",\"pinYinChars\":[{\"char\":\"MEI3\"}],\"splitChars\":[{\"char\":\"石美\"}],\"weight\":10},{\"charId\":\"279e1e8b\",\"unicodeChar\":\"𣈇\",\"unicodeCodePoint\":\"23207\",\"pinYinChars\":[{\"char\":\"AN4\"}],\"splitChars\":[{\"char\":\"不明\"}],\"weight\":10},{\"charId\":\"985eff13\",\"unicodeChar\":\"𣈄\",\"unicodeCodePoint\":\"23204\",\"pinYinChars\":[{\"char\":\"CAI3\"}],\"splitChars\":[{\"char\":\"日采\"}],\"weight\":10},{\"charId\":\"0d9c4474\",\"unicodeChar\":\"𣇼\",\"unicodeCodePoint\":\"231FC\",\"pinYinChars\":[{\"char\":\"ZONG1\"}],\"splitChars\":[{\"char\":\"日宗\"}],\"weight\":10},{\"charId\":\"1b90243b\",\"unicodeChar\":\"𬓉\",\"unicodeCodePoint\":\"2C4C9\",\"pinYinChars\":[{\"char\":\"CHUANG1\"}],\"splitChars\":[{\"char\":\"礻春\"}],\"weight\":10},{\"charId\":\"3ca8a3df\",\"unicodeChar\":\"𬘓\",\"unicodeCodePoint\":\"2C613\",\"pinYinChars\":[{\"char\":\"XUN2\"}],\"splitChars\":[{\"char\":\"纟川\"}],\"weight\":10},{\"charId\":\"40b86fb4\",\"unicodeChar\":\"𣏾\",\"unicodeCodePoint\":\"233FE\",\"pinYinChars\":[{\"char\":\"GE1\"}],\"splitChars\":[{\"char\":\"木戈\"}],\"weight\":10},{\"charId\":\"2a9511ff\",\"unicodeChar\":\"𫃻\",\"unicodeCodePoint\":\"2B0FB\",\"pinYinChars\":[{\"char\":\"RONG2\"}],\"splitChars\":[{\"char\":\"糹容\"}],\"weight\":10},{\"charId\":\"10625797\",\"unicodeChar\":\"𣏪\",\"unicodeCodePoint\":\"233EA\",\"pinYinChars\":[{\"char\":\"SHU\"}],\"splitChars\":[{\"char\":\"木双\"}],\"weight\":10},{\"charId\":\"e4e0400f\",\"unicodeChar\":\"𫃥\",\"unicodeCodePoint\":\"2B0E5\",\"pinYinChars\":[{\"char\":\"TI2\"}],\"splitChars\":[{\"char\":\"糹足\"}],\"weight\":10},{\"charId\":\"a69971f5\",\"unicodeChar\":\"𬖴\",\"unicodeCodePoint\":\"2C5B4\",\"pinYinChars\":[{\"char\":\"JI4\"}],\"splitChars\":[{\"char\":\"米祭\"}],\"weight\":10},{\"charId\":\"2221132e\",\"unicodeChar\":\"𣐿\",\"unicodeCodePoint\":\"2343F\",\"pinYinChars\":[{\"char\":\"YI1\"}],\"splitChars\":[{\"char\":\"木衣\"}],\"weight\":10},{\"charId\":\"2a9fa533\",\"unicodeChar\":\"𣔌\",\"unicodeCodePoint\":\"2350C\",\"pinYinChars\":[{\"char\":\"TI\"}],\"splitChars\":[{\"char\":\"木条\"}],\"weight\":10},{\"charId\":\"f6c1e36c\",\"unicodeChar\":\"𬖔\",\"unicodeCodePoint\":\"2C594\",\"pinYinChars\":[{\"char\":\"ZU1\"}],\"splitChars\":[{\"char\":\"米术\"}],\"weight\":10},{\"charId\":\"baffc347\",\"unicodeChar\":\"𣓉\",\"unicodeCodePoint\":\"234C9\",\"pinYinChars\":[{\"char\":\"SHA4\"}],\"splitChars\":[{\"char\":\"木疌\"}],\"weight\":10},{\"charId\":\"f18ee9f1\",\"unicodeChar\":\"𣓃\",\"unicodeCodePoint\":\"234C3\",\"pinYinChars\":[{\"char\":\"NEI4\"}],\"splitChars\":[{\"char\":\"木芮\"}],\"weight\":10},{\"charId\":\"faaf3340\",\"unicodeChar\":\"𫂕\",\"unicodeCodePoint\":\"2B095\",\"pinYinChars\":[{\"char\":\"BEI4\"}],\"splitChars\":[{\"char\":\"竹倍\"}],\"weight\":10},{\"charId\":\"229ace1a\",\"unicodeChar\":\"𣌓\",\"unicodeCodePoint\":\"23313\",\"pinYinChars\":[{\"char\":\"HUAN1\"}],\"splitChars\":[{\"char\":\"日雚\"}],\"weight\":10},{\"charId\":\"df427b6e\",\"unicodeChar\":\"𫂇\",\"unicodeCodePoint\":\"2B087\",\"pinYinChars\":[{\"char\":\"DI1\"}],\"splitChars\":[{\"char\":\"竹的\"}],\"weight\":10},{\"charId\":\"28ba7a62\",\"unicodeChar\":\"𣋄\",\"unicodeCodePoint\":\"232C4\",\"pinYinChars\":[{\"char\":\"TUN1\"}],\"splitChars\":[{\"char\":\"昔享\"}],\"weight\":10},{\"charId\":\"2fda6c1a\",\"unicodeChar\":\"𬕅\",\"unicodeCodePoint\":\"2C545\",\"pinYinChars\":[{\"char\":\"LI4\"}],\"splitChars\":[{\"char\":\"竹位\"}],\"weight\":10},{\"charId\":\"6c62d4c5\",\"unicodeChar\":\"𣎴\",\"unicodeCodePoint\":\"233B4\",\"pinYinChars\":[{\"char\":\"NIE4\"}],\"splitChars\":[{\"char\":\"一个\"}],\"weight\":10},{\"charId\":\"2ad809e1\",\"unicodeChar\":\"𫀷\",\"unicodeCodePoint\":\"2B037\",\"pinYinChars\":[{\"char\":\"REN3\"}],\"splitChars\":[{\"char\":\"禾忍\"}],\"weight\":10},{\"charId\":\"c551064c\",\"unicodeChar\":\"𣐯\",\"unicodeCodePoint\":\"2342F\",\"pinYinChars\":[{\"char\":\"CHONG2\"}],\"splitChars\":[{\"char\":\"出木\"}],\"weight\":10},{\"charId\":\"8199b361\",\"unicodeChar\":\"𬔴\",\"unicodeCodePoint\":\"2C534\",\"pinYinChars\":[{\"char\":\"MO4\"}],\"splitChars\":[{\"char\":\"竹未\"}],\"weight\":10},{\"charId\":\"96aeaa88\",\"unicodeChar\":\"𣐎\",\"unicodeCodePoint\":\"2340E\",\"pinYinChars\":[{\"char\":\"WA3\"}],\"splitChars\":[{\"char\":\"木瓦\"}],\"weight\":10},{\"charId\":\"02187ef4\",\"unicodeChar\":\"𣐋\",\"unicodeCodePoint\":\"2340B\",\"pinYinChars\":[{\"char\":\"YU4\"}],\"splitChars\":[{\"char\":\"木戉\"}],\"weight\":10},{\"charId\":\"3c0b0672\",\"unicodeChar\":\"𣐅\",\"unicodeCodePoint\":\"23405\",\"pinYinChars\":[{\"char\":\"REN4\"}],\"splitChars\":[{\"char\":\"木壬\"}],\"weight\":10},{\"charId\":\"3cdfff75\",\"unicodeChar\":\"𫂡\",\"unicodeCodePoint\":\"2B0A1\",\"pinYinChars\":[{\"char\":\"JI2\"}],\"splitChars\":[{\"char\":\"竹棘\"}],\"weight\":10},{\"charId\":\"17193775\",\"unicodeChar\":\"𫅧\",\"unicodeCodePoint\":\"2B167\",\"pinYinChars\":[{\"char\":\"XIANG2\"}],\"splitChars\":[{\"char\":\"羽羊\"}],\"weight\":10},{\"charId\":\"2a47d6d7\",\"unicodeChar\":\"𫅦\",\"unicodeCodePoint\":\"2B166\",\"pinYinChars\":[{\"char\":\"XIANG2\"}],\"splitChars\":[{\"char\":\"屰羽\"}],\"weight\":10},{\"charId\":\"d2a30a49\",\"unicodeChar\":\"𫄻\",\"unicodeCodePoint\":\"2B13B\",\"pinYinChars\":[{\"char\":\"DUI4\"}],\"splitChars\":[{\"char\":\"缶隹\"}],\"weight\":10},{\"charId\":\"b19fbe8e\",\"unicodeChar\":\"𫄷\",\"unicodeCodePoint\":\"2B137\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"纟意\"}],\"weight\":10},{\"charId\":\"169be139\",\"unicodeChar\":\"𣔯\",\"unicodeCodePoint\":\"2352F\",\"pinYinChars\":[{\"char\":\"ZHU3\"}],\"splitChars\":[{\"char\":\"木雨\"}],\"weight\":10},{\"charId\":\"953c287e\",\"unicodeChar\":\"𬘱\",\"unicodeCodePoint\":\"2C631\",\"pinYinChars\":[{\"char\":\"YAO1\"}],\"splitChars\":[{\"char\":\"纟要\"}],\"weight\":10},{\"charId\":\"670030de\",\"unicodeChar\":\"𣝡\",\"unicodeCodePoint\":\"23761\",\"pinYinChars\":[{\"char\":\"YANG3\"}],\"splitChars\":[{\"char\":\"木養\"}],\"weight\":10},{\"charId\":\"332b8d7f\",\"unicodeChar\":\"𣜯\",\"unicodeCodePoint\":\"2372F\",\"pinYinChars\":[{\"char\":\"XU\"}],\"splitChars\":[{\"char\":\"木萱\"}],\"weight\":10},{\"charId\":\"c767a21a\",\"unicodeChar\":\"𫄨\",\"unicodeCodePoint\":\"2B128\",\"pinYinChars\":[{\"char\":\"CHI1\"}],\"splitChars\":[{\"char\":\"纟希\"}],\"weight\":10},{\"charId\":\"0c1a8f93\",\"unicodeChar\":\"𫄧\",\"unicodeCodePoint\":\"2B127\",\"pinYinChars\":[{\"char\":\"YAN2\"}],\"splitChars\":[{\"char\":\"纟延\"}],\"weight\":10},{\"charId\":\"b7e05d52\",\"unicodeChar\":\"𣚺\",\"unicodeCodePoint\":\"236BA\",\"pinYinChars\":[{\"char\":\"XIANG4\"}],\"splitChars\":[{\"char\":\"未母\"}],\"weight\":10},{\"charId\":\"c8af1cdf\",\"unicodeChar\":\"𬘩\",\"unicodeCodePoint\":\"2C629\",\"pinYinChars\":[{\"char\":\"TING1\"}],\"splitChars\":[{\"char\":\"纟廷\"}],\"weight\":10},{\"charId\":\"71f854c4\",\"unicodeChar\":\"𣒖\",\"unicodeCodePoint\":\"23496\",\"pinYinChars\":[{\"char\":\"KE4\"}],\"splitChars\":[{\"char\":\"木克\"}],\"weight\":10},{\"charId\":\"f3adce28\",\"unicodeChar\":\"𬘨\",\"unicodeCodePoint\":\"2C628\",\"pinYinChars\":[{\"char\":\"ZHI1\"}],\"splitChars\":[{\"char\":\"纟志\"}],\"weight\":10},{\"charId\":\"f265f52b\",\"unicodeChar\":\"𣑬\",\"unicodeCodePoint\":\"2346C\",\"pinYinChars\":[{\"char\":\"ZAO3\"}],\"splitChars\":[{\"char\":\"木早\"}],\"weight\":10},{\"charId\":\"80752b0d\",\"unicodeChar\":\"𬘟\",\"unicodeCodePoint\":\"2C61F\",\"pinYinChars\":[{\"char\":\"XIAN4\"}],\"splitChars\":[{\"char\":\"纟西\"}],\"weight\":10},{\"charId\":\"37e09f3b\",\"unicodeChar\":\"𣘚\",\"unicodeCodePoint\":\"2361A\",\"pinYinChars\":[{\"char\":\"SHUAI4\"}],\"splitChars\":[{\"char\":\"木率\"}],\"weight\":10},{\"charId\":\"77fb7488\",\"unicodeChar\":\"𣘎\",\"unicodeCodePoint\":\"2360E\",\"pinYinChars\":[{\"char\":\"QI\"}],\"splitChars\":[{\"char\":\"木羌\"}],\"weight\":10},{\"charId\":\"b418c7ef\",\"unicodeChar\":\"𣗼\",\"unicodeCodePoint\":\"235FC\",\"pinYinChars\":[{\"char\":\"YUAN2\"}],\"splitChars\":[{\"char\":\"木員\"}],\"weight\":10},{\"charId\":\"af0d120b\",\"unicodeChar\":\"𣗹\",\"unicodeCodePoint\":\"235F9\",\"pinYinChars\":[{\"char\":\"YANG4\"}],\"splitChars\":[{\"char\":\"木恙\"}],\"weight\":10},{\"charId\":\"ed9e7382\",\"unicodeChar\":\"𮉡\",\"unicodeCodePoint\":\"2E261\",\"pinYinChars\":[{\"char\":\"LU1\"}],\"splitChars\":[{\"char\":\"纟卢\"}],\"weight\":10},{\"charId\":\"f9eba5c0\",\"unicodeChar\":\"𣖮\",\"unicodeCodePoint\":\"235AE\",\"pinYinChars\":[{\"char\":\"ANG4\"}],\"splitChars\":[{\"char\":\"木盎\"}],\"weight\":10},{\"charId\":\"7d164d9b\",\"unicodeChar\":\"𫈄\",\"unicodeCodePoint\":\"2B204\",\"pinYinChars\":[{\"char\":\"YI3\"}],\"splitChars\":[{\"char\":\"艹似\"}],\"weight\":10},{\"charId\":\"7b2b566e\",\"unicodeChar\":\"𣢹\",\"unicodeCodePoint\":\"238B9\",\"pinYinChars\":[{\"char\":\"QIAN4\"}],\"splitChars\":[{\"char\":\"耒欠\"}],\"weight\":10},{\"charId\":\"b92d0e0f\",\"unicodeChar\":\"𫇱\",\"unicodeCodePoint\":\"2B1F1\",\"pinYinChars\":[{\"char\":\"ZI3\"}],\"splitChars\":[{\"char\":\"艹仔\"}],\"weight\":10},{\"charId\":\"6c432180\",\"unicodeChar\":\"𬜦\",\"unicodeCodePoint\":\"2C726\",\"pinYinChars\":[{\"char\":\"HUI4\"}],\"splitChars\":[{\"char\":\"艹卉\"}],\"weight\":10},{\"charId\":\"5c58154f\",\"unicodeChar\":\"𬜢\",\"unicodeCodePoint\":\"2C722\",\"pinYinChars\":[{\"char\":\"JIU3\"}],\"splitChars\":[{\"char\":\"艹久\"}],\"weight\":10},{\"charId\":\"e7293124\",\"unicodeChar\":\"𬜡\",\"unicodeCodePoint\":\"2C721\",\"pinYinChars\":[{\"char\":\"YUE4\"}],\"splitChars\":[{\"char\":\"艹山\"}],\"weight\":10},{\"charId\":\"8cfedfd0\",\"unicodeChar\":\"𫆣\",\"unicodeCodePoint\":\"2B1A3\",\"pinYinChars\":[{\"char\":\"GU4\"}],\"splitChars\":[{\"char\":\"月固\"}],\"weight\":10},{\"charId\":\"6401db77\",\"unicodeChar\":\"𬚟\",\"unicodeCodePoint\":\"2C69F\",\"pinYinChars\":[{\"char\":\"YA3\"}],\"splitChars\":[{\"char\":\"耳隹\"}],\"weight\":10},{\"charId\":\"11353011\",\"unicodeChar\":\"𫆅\",\"unicodeCodePoint\":\"2B185\",\"pinYinChars\":[{\"char\":\"SHENG4\"}],\"splitChars\":[{\"char\":\"耳呈\"}],\"weight\":10},{\"charId\":\"4e86caab\",\"unicodeChar\":\"𢏫\",\"unicodeCodePoint\":\"223EB\",\"pinYinChars\":[{\"char\":\"TAO1\"}],\"splitChars\":[{\"char\":\"弓支\"}],\"weight\":10},{\"charId\":\"ec9c2253\",\"unicodeChar\":\"𢏤\",\"unicodeCodePoint\":\"223E4\",\"pinYinChars\":[{\"char\":\"XUN4\"}],\"splitChars\":[{\"char\":\"弓夋\"}],\"weight\":10},{\"charId\":\"5f19643b\",\"unicodeChar\":\"𢎪\",\"unicodeCodePoint\":\"223AA\",\"pinYinChars\":[{\"char\":\"DAN4\"}],\"splitChars\":[{\"char\":\"弓几\"}],\"weight\":10},{\"charId\":\"12d3743b\",\"unicodeChar\":\"𢎘\",\"unicodeCodePoint\":\"22398\",\"pinYinChars\":[{\"char\":\"HAN4\"}],\"splitChars\":[{\"char\":\"乙乙\"}],\"weight\":10},{\"charId\":\"20596b72\",\"unicodeChar\":\"𢍂\",\"unicodeCodePoint\":\"22342\",\"pinYinChars\":[{\"char\":\"BI2\"}],\"splitChars\":[{\"char\":\"自廾\"}],\"weight\":10},{\"charId\":\"ec94d0a1\",\"unicodeChar\":\"𢌜\",\"unicodeCodePoint\":\"2231C\",\"pinYinChars\":[{\"char\":\"TING2\"}],\"splitChars\":[{\"char\":\"廴手\"}],\"weight\":10},{\"charId\":\"7c0b4272\",\"unicodeChar\":\"𢌚\",\"unicodeCodePoint\":\"2231A\",\"pinYinChars\":[{\"char\":\"CHAN1\"}],\"splitChars\":[{\"char\":\"廴山\"}],\"weight\":10},{\"charId\":\"19f4ba1b\",\"unicodeChar\":\"𢋄\",\"unicodeCodePoint\":\"222C4\",\"pinYinChars\":[{\"char\":\"JUAN3\"}],\"splitChars\":[{\"char\":\"广雋\"}],\"weight\":10},{\"charId\":\"fa081e11\",\"unicodeChar\":\"𬊸\",\"unicodeCodePoint\":\"2C2B8\",\"pinYinChars\":[{\"char\":\"YU4\"}],\"splitChars\":[{\"char\":\"火昱\"}],\"weight\":10},{\"charId\":\"c6c858a3\",\"unicodeChar\":\"𢒰\",\"unicodeCodePoint\":\"224B0\",\"pinYinChars\":[{\"char\":\"YU4\"}],\"splitChars\":[{\"char\":\"有或\"}],\"weight\":10},{\"charId\":\"22999c40\",\"unicodeChar\":\"𢈚\",\"unicodeCodePoint\":\"2221A\",\"pinYinChars\":[{\"char\":\"LV3\"}],\"splitChars\":[{\"char\":\"广吕\"}],\"weight\":10},{\"charId\":\"c1ca93b6\",\"unicodeChar\":\"𢈇\",\"unicodeCodePoint\":\"22207\",\"pinYinChars\":[{\"char\":\"SHEN3\"}],\"splitChars\":[{\"char\":\"广先\"}],\"weight\":10},{\"charId\":\"8c0aaa4a\",\"unicodeChar\":\"𢆶\",\"unicodeCodePoint\":\"221B6\",\"pinYinChars\":[{\"char\":\"YOU1\"}],\"splitChars\":[{\"char\":\"幺幺\"}],\"weight\":10},{\"charId\":\"da14aab0\",\"unicodeChar\":\"𢄏\",\"unicodeCodePoint\":\"2210F\",\"pinYinChars\":[{\"char\":\"MO4\"}],\"splitChars\":[{\"char\":\"宀巾\"}],\"weight\":10},{\"charId\":\"ff099da9\",\"unicodeChar\":\"𢊯\",\"unicodeCodePoint\":\"222AF\",\"pinYinChars\":[{\"char\":\"WEI3\"}],\"splitChars\":[{\"char\":\"广爲\"}],\"weight\":10},{\"charId\":\"4c1ea390\",\"unicodeChar\":\"𢉦\",\"unicodeCodePoint\":\"22266\",\"pinYinChars\":[{\"char\":\"JUN1\"}],\"splitChars\":[{\"char\":\"广軍\"}],\"weight\":10},{\"charId\":\"b711f736\",\"unicodeChar\":\"𢈻\",\"unicodeCodePoint\":\"2223B\",\"pinYinChars\":[{\"char\":\"JIE2\"}],\"splitChars\":[{\"char\":\"广疌\"}],\"weight\":10},{\"charId\":\"3d249ce8\",\"unicodeChar\":\"𬍒\",\"unicodeCodePoint\":\"2C352\",\"pinYinChars\":[{\"char\":\"YUN2\"}],\"splitChars\":[{\"char\":\"王云\"}],\"weight\":10},{\"charId\":\"14104119\",\"unicodeChar\":\"𢙇\",\"unicodeCodePoint\":\"22647\",\"pinYinChars\":[{\"char\":\"YI3\"}],\"splitChars\":[{\"char\":\"忄衣\"}],\"weight\":10},{\"charId\":\"5e9b0edf\",\"unicodeChar\":\"𢙅\",\"unicodeCodePoint\":\"22645\",\"pinYinChars\":[{\"char\":\"XI2\"}],\"splitChars\":[{\"char\":\"合心\"}],\"weight\":10},{\"charId\":\"7baa5a17\",\"unicodeChar\":\"𢘝\",\"unicodeCodePoint\":\"2261D\",\"pinYinChars\":[{\"char\":\"NI3\"}],\"splitChars\":[{\"char\":\"忄尔\"}],\"weight\":10},{\"charId\":\"75f80b3b\",\"unicodeChar\":\"𢘅\",\"unicodeCodePoint\":\"22605\",\"pinYinChars\":[{\"char\":\"MAO4\"}],\"splitChars\":[{\"char\":\"矛心\"}],\"weight\":10},{\"charId\":\"a7332cd7\",\"unicodeChar\":\"𪻛\",\"unicodeCodePoint\":\"2AEDB\",\"pinYinChars\":[{\"char\":\"TONG2\"}],\"splitChars\":[{\"char\":\"王同\"}],\"weight\":10},{\"charId\":\"6994940f\",\"unicodeChar\":\"𪻘\",\"unicodeCodePoint\":\"2AED8\",\"pinYinChars\":[{\"char\":\"GEN4\"}],\"splitChars\":[{\"char\":\"王亘\"}],\"weight\":10},{\"charId\":\"63edc3c8\",\"unicodeChar\":\"𢗨\",\"unicodeCodePoint\":\"225E8\",\"pinYinChars\":[{\"char\":\"DUAN3\"}],\"splitChars\":[{\"char\":\"水心\"}],\"weight\":10},{\"charId\":\"0bb4cf7e\",\"unicodeChar\":\"𬍬\",\"unicodeCodePoint\":\"2C36C\",\"pinYinChars\":[{\"char\":\"XING4\"}],\"splitChars\":[{\"char\":\"王幸\"}],\"weight\":10},{\"charId\":\"bb62b7e2\",\"unicodeChar\":\"𢗦\",\"unicodeCodePoint\":\"225E6\",\"pinYinChars\":[{\"char\":\"XI1\"}],\"splitChars\":[{\"char\":\"木心\"}],\"weight\":10},{\"charId\":\"98ad7662\",\"unicodeChar\":\"𬍫\",\"unicodeCodePoint\":\"2C36B\",\"pinYinChars\":[{\"char\":\"JIE2\"}],\"splitChars\":[{\"char\":\"王疌\"}],\"weight\":10},{\"charId\":\"f86a380f\",\"unicodeChar\":\"𢗝\",\"unicodeCodePoint\":\"225DD\",\"pinYinChars\":[{\"char\":\"HENG2\"}],\"splitChars\":[{\"char\":\"忄互\"}],\"weight\":10},{\"charId\":\"c84d6c3a\",\"unicodeChar\":\"𪻧\",\"unicodeCodePoint\":\"2AEE7\",\"pinYinChars\":[{\"char\":\"MU4\"}],\"splitChars\":[{\"char\":\"王坴\"}],\"weight\":10},{\"charId\":\"4c429bbb\",\"unicodeChar\":\"𪻦\",\"unicodeCodePoint\":\"2AEE6\",\"pinYinChars\":[{\"char\":\"NAI4\"}],\"splitChars\":[{\"char\":\"王奈\"}],\"weight\":10},{\"charId\":\"82e5e7ae\",\"unicodeChar\":\"𢖵\",\"unicodeCodePoint\":\"225B5\",\"pinYinChars\":[{\"char\":\"RU4\"}],\"splitChars\":[{\"char\":\"忄女\"}],\"weight\":10},{\"charId\":\"7a1c1886\",\"unicodeChar\":\"𢖳\",\"unicodeCodePoint\":\"225B3\",\"pinYinChars\":[{\"char\":\"XU1\"}],\"splitChars\":[{\"char\":\"忄于\"}],\"weight\":10},{\"charId\":\"2bf71963\",\"unicodeChar\":\"𢚁\",\"unicodeCodePoint\":\"22681\",\"pinYinChars\":[{\"char\":\"JI4\"}],\"splitChars\":[{\"char\":\"忄忌\"}],\"weight\":10},{\"charId\":\"4473318b\",\"unicodeChar\":\"𢚀\",\"unicodeCodePoint\":\"22680\",\"pinYinChars\":[{\"char\":\"XIAN4\"}],\"splitChars\":[{\"char\":\"忄延\"}],\"weight\":10},{\"charId\":\"428db1db\",\"unicodeChar\":\"𢕻\",\"unicodeCodePoint\":\"2257B\",\"pinYinChars\":[{\"char\":\"SHAN4\"}],\"splitChars\":[{\"char\":\"彳詹\"}],\"weight\":10},{\"charId\":\"ebd9bb33\",\"unicodeChar\":\"𢔪\",\"unicodeCodePoint\":\"2252A\",\"pinYinChars\":[{\"char\":\"ZHU1\"}],\"splitChars\":[{\"char\":\"彳者\"}],\"weight\":10},{\"charId\":\"66043034\",\"unicodeChar\":\"𢓵\",\"unicodeCodePoint\":\"224F5\",\"pinYinChars\":[{\"char\":\"XIU4\"}],\"splitChars\":[{\"char\":\"彳秀\"}],\"weight\":10},{\"charId\":\"368e87c0\",\"unicodeChar\":\"𢓱\",\"unicodeCodePoint\":\"224F1\",\"pinYinChars\":[{\"char\":\"FENG1\"}],\"splitChars\":[{\"char\":\"彳夆\"}],\"weight\":10},{\"charId\":\"ba5467f5\",\"unicodeChar\":\"𢓰\",\"unicodeCodePoint\":\"224F0\",\"pinYinChars\":[{\"char\":\"TUO3\"}],\"splitChars\":[{\"char\":\"彳妥\"}],\"weight\":10},{\"charId\":\"19bb8fae\",\"unicodeChar\":\"𢎎\",\"unicodeCodePoint\":\"2238E\",\"pinYinChars\":[{\"char\":\"SU4\"}],\"splitChars\":[{\"char\":\"厶式\"}],\"weight\":10},{\"charId\":\"71ce3984\",\"unicodeChar\":\"𪹯\",\"unicodeCodePoint\":\"2AE6F\",\"pinYinChars\":[{\"char\":\"JI2\"}],\"splitChars\":[{\"char\":\"火集\"}],\"weight\":10},{\"charId\":\"bbed61e2\",\"unicodeChar\":\"𢓨\",\"unicodeCodePoint\":\"224E8\",\"pinYinChars\":[{\"char\":\"YE4\"}],\"splitChars\":[{\"char\":\"彳因\"}],\"weight\":10},{\"charId\":\"f087fbd0\",\"unicodeChar\":\"𢓥\",\"unicodeCodePoint\":\"224E5\",\"pinYinChars\":[{\"char\":\"HUANG3\"}],\"splitChars\":[{\"char\":\"彳光\"}],\"weight\":10},{\"charId\":\"ff449199\",\"unicodeChar\":\"𢓕\",\"unicodeCodePoint\":\"224D5\",\"pinYinChars\":[{\"char\":\"YIN2\"}],\"splitChars\":[{\"char\":\"彳占\"}],\"weight\":10},{\"charId\":\"419e6630\",\"unicodeChar\":\"𢓆\",\"unicodeCodePoint\":\"224C6\",\"pinYinChars\":[{\"char\":\"WAN2\"}],\"splitChars\":[{\"char\":\"彳元\"}],\"weight\":10},{\"charId\":\"69a0b1f8\",\"unicodeChar\":\"𪻕\",\"unicodeCodePoint\":\"2AED5\",\"pinYinChars\":[{\"char\":\"GU3\"}],\"splitChars\":[{\"char\":\"王古\"}],\"weight\":10},{\"charId\":\"a8b4ef1b\",\"unicodeChar\":\"𪻓\",\"unicodeCodePoint\":\"2AED3\",\"pinYinChars\":[{\"char\":\"HUO3\"}],\"splitChars\":[{\"char\":\"王火\"}],\"weight\":10},{\"charId\":\"abdc3284\",\"unicodeChar\":\"𪻎\",\"unicodeCodePoint\":\"2AECE\",\"pinYinChars\":[{\"char\":\"JUN2\"}],\"splitChars\":[{\"char\":\"王匀\"}],\"weight\":10},{\"charId\":\"42772831\",\"unicodeChar\":\"𢖠\",\"unicodeCodePoint\":\"225A0\",\"pinYinChars\":[{\"char\":\"YING1\"}],\"splitChars\":[{\"char\":\"彳嬰\"}],\"weight\":10},{\"charId\":\"d0f90cbe\",\"unicodeChar\":\"𢖝\",\"unicodeCodePoint\":\"2259D\",\"pinYinChars\":[{\"char\":\"XIAN4\"}],\"splitChars\":[{\"char\":\"彳韭\"}],\"weight\":10},{\"charId\":\"26432991\",\"unicodeChar\":\"𢖏\",\"unicodeCodePoint\":\"2258F\",\"pinYinChars\":[{\"char\":\"SU4\"}],\"splitChars\":[{\"char\":\"彳賣\"}],\"weight\":10},{\"charId\":\"171e448b\",\"unicodeChar\":\"𢦤\",\"unicodeCodePoint\":\"229A4\",\"pinYinChars\":[{\"char\":\"ZANG1\"}],\"splitChars\":[{\"char\":\"片戈\"}],\"weight\":10},{\"charId\":\"1e1c4237\",\"unicodeChar\":\"𪻳\",\"unicodeCodePoint\":\"2AEF3\",\"pinYinChars\":[{\"char\":\"NAN2\"}],\"splitChars\":[{\"char\":\"王南\"}],\"weight\":10},{\"charId\":\"8efc70df\",\"unicodeChar\":\"𢥘\",\"unicodeCodePoint\":\"22958\",\"pinYinChars\":[{\"char\":\"XIE2\"}],\"splitChars\":[{\"char\":\"忄冏(巂)\"}],\"weight\":10},{\"charId\":\"8be4d031\",\"unicodeChar\":\"𢥏\",\"unicodeCodePoint\":\"2294F\",\"pinYinChars\":[{\"char\":\"YING2\"}],\"splitChars\":[{\"char\":\"忄營\"}],\"weight\":10},{\"charId\":\"43c3d797\",\"unicodeChar\":\"𪻱\",\"unicodeCodePoint\":\"2AEF1\",\"pinYinChars\":[{\"char\":\"HAN2\"}],\"splitChars\":[{\"char\":\"王函\"}],\"weight\":10},{\"charId\":\"ea7a9aa8\",\"unicodeChar\":\"𢤲\",\"unicodeCodePoint\":\"22932\",\"pinYinChars\":[{\"char\":\"LONG2\"}],\"splitChars\":[{\"char\":\"龍心\"}],\"weight\":10},{\"charId\":\"84887a51\",\"unicodeChar\":\"𪻬\",\"unicodeCodePoint\":\"2AEEC\",\"pinYinChars\":[{\"char\":\"YUE4\"}],\"splitChars\":[{\"char\":\"王岳\"}],\"weight\":10},{\"charId\":\"b7a2d4fd\",\"unicodeChar\":\"𢣤\",\"unicodeCodePoint\":\"228E4\",\"pinYinChars\":[{\"char\":\"CHUANG2\"}],\"splitChars\":[{\"char\":\"忄熏\"}],\"weight\":10},{\"charId\":\"57d1f714\",\"unicodeChar\":\"𢣐\",\"unicodeCodePoint\":\"228D0\",\"pinYinChars\":[{\"char\":\"BIN1\"}],\"splitChars\":[{\"char\":\"忄賓\"}],\"weight\":10},{\"charId\":\"fa37c668\",\"unicodeChar\":\"𪼄\",\"unicodeCodePoint\":\"2AF04\",\"pinYinChars\":[{\"char\":\"YUAN2\"}],\"splitChars\":[{\"char\":\"王袁\"}],\"weight\":10},{\"charId\":\"97d8b461\",\"unicodeChar\":\"𢡁\",\"unicodeCodePoint\":\"22841\",\"pinYinChars\":[{\"char\":\"XI1\"}],\"splitChars\":[{\"char\":\"忄羽(翕)\"}],\"weight\":10},{\"charId\":\"168097e1\",\"unicodeChar\":\"𬎌\",\"unicodeCodePoint\":\"2C38C\",\"pinYinChars\":[{\"char\":\"YUN2\"}],\"splitChars\":[{\"char\":\"王雲\"}],\"weight\":10},{\"charId\":\"223bc65c\",\"unicodeChar\":\"𪼕\",\"unicodeCodePoint\":\"2AF15\",\"pinYinChars\":[{\"char\":\"ZU2\"}],\"splitChars\":[{\"char\":\"王族\"}],\"weight\":10},{\"charId\":\"673cd07d\",\"unicodeChar\":\"𭹰\",\"unicodeCodePoint\":\"2DE70\",\"pinYinChars\":[{\"char\":\"QU2\"}],\"splitChars\":[{\"char\":\"王處\"}],\"weight\":10},{\"charId\":\"f2e62a16\",\"unicodeChar\":\"𢠘\",\"unicodeCodePoint\":\"22818\",\"pinYinChars\":[{\"char\":\"MAO4\"}],\"splitChars\":[{\"char\":\"林(夕)心\"}],\"weight\":10},{\"charId\":\"10cdabe0\",\"unicodeChar\":\"𪼑\",\"unicodeCodePoint\":\"2AF11\",\"pinYinChars\":[{\"char\":\"JIAN1\"}],\"splitChars\":[{\"char\":\"王堅\"}],\"weight\":10},{\"charId\":\"7bb7a5e7\",\"unicodeChar\":\"𬎅\",\"unicodeCodePoint\":\"2C385\",\"pinYinChars\":[{\"char\":\"XUE3\"}],\"splitChars\":[{\"char\":\"王雪\"}],\"weight\":10},{\"charId\":\"b3266425\",\"unicodeChar\":\"𪼐\",\"unicodeCodePoint\":\"2AF10\",\"pinYinChars\":[{\"char\":\"SHUANG3\"}],\"splitChars\":[{\"char\":\"王爽\"}],\"weight\":10},{\"charId\":\"2b43dc64\",\"unicodeChar\":\"𢝜\",\"unicodeCodePoint\":\"2275C\",\"pinYinChars\":[{\"char\":\"TING3\"}],\"splitChars\":[{\"char\":\"忄亭\"}],\"weight\":10},{\"charId\":\"2b56e679\",\"unicodeChar\":\"𬍣\",\"unicodeCodePoint\":\"2C363\",\"pinYinChars\":[{\"char\":\"RU2\"}],\"splitChars\":[{\"char\":\"王如\"}],\"weight\":10},{\"charId\":\"2f45c4ba\",\"unicodeChar\":\"𢝆\",\"unicodeCodePoint\":\"22746\",\"pinYinChars\":[{\"char\":\"ZHONG4\"}],\"splitChars\":[{\"char\":\"忄重\"}],\"weight\":10},{\"charId\":\"3fe5bf23\",\"unicodeChar\":\"𢝁\",\"unicodeCodePoint\":\"22741\",\"pinYinChars\":[{\"char\":\"HONG1\"}],\"splitChars\":[{\"char\":\"忄言\"}],\"weight\":10},{\"charId\":\"378070c8\",\"unicodeChar\":\"𢜽\",\"unicodeCodePoint\":\"2273D\",\"pinYinChars\":[{\"char\":\"KUI2\"}],\"splitChars\":[{\"char\":\"忄癸\"}],\"weight\":10},{\"charId\":\"6e7d06c9\",\"unicodeChar\":\"𬍠\",\"unicodeCodePoint\":\"2C360\",\"pinYinChars\":[{\"char\":\"YI1\"}],\"splitChars\":[{\"char\":\"王衣\"}],\"weight\":10},{\"charId\":\"13d1e9b7\",\"unicodeChar\":\"𢜱\",\"unicodeCodePoint\":\"22731\",\"pinYinChars\":[{\"char\":\"QI4\"}],\"splitChars\":[{\"char\":\"忄耳\"}],\"weight\":10},{\"charId\":\"85920848\",\"unicodeChar\":\"𢜛\",\"unicodeCodePoint\":\"2271B\",\"pinYinChars\":[{\"char\":\"XIN1\"}],\"splitChars\":[{\"char\":\"欣心\"}],\"weight\":10},{\"charId\":\"4f652721\",\"unicodeChar\":\"𪻪\",\"unicodeCodePoint\":\"2AEEA\",\"pinYinChars\":[{\"char\":\"MING2\"}],\"splitChars\":[{\"char\":\"王明\"}],\"weight\":10},{\"charId\":\"d1feb714\",\"unicodeChar\":\"𪼃\",\"unicodeCodePoint\":\"2AF03\",\"pinYinChars\":[{\"char\":\"JIN1\"}],\"splitChars\":[{\"char\":\"王泰\"}],\"weight\":10},{\"charId\":\"102285c0\",\"unicodeChar\":\"𪻿\",\"unicodeCodePoint\":\"2AEFF\",\"pinYinChars\":[{\"char\":\"DU4\"}],\"splitChars\":[{\"char\":\"王度\"}],\"weight\":10},{\"charId\":\"275c118a\",\"unicodeChar\":\"𢛵\",\"unicodeCodePoint\":\"226F5\",\"pinYinChars\":[{\"char\":\"ZANG2\"}],\"splitChars\":[{\"char\":\"忄争\"}],\"weight\":10},{\"charId\":\"de7ad002\",\"unicodeChar\":\"𪻾\",\"unicodeCodePoint\":\"2AEFE\",\"pinYinChars\":[{\"char\":\"YAN4\"}],\"splitChars\":[{\"char\":\"王彦\"}],\"weight\":10},{\"charId\":\"f6db47ea\",\"unicodeChar\":\"𢛔\",\"unicodeCodePoint\":\"226D4\",\"pinYinChars\":[{\"char\":\"DONG1\"}],\"splitChars\":[{\"char\":\"忄東\"}],\"weight\":10},{\"charId\":\"13e842dd\",\"unicodeChar\":\"𢚢\",\"unicodeCodePoint\":\"226A2\",\"pinYinChars\":[{\"char\":\"GAI3\"}],\"splitChars\":[{\"char\":\"改心\"}],\"weight\":10},{\"charId\":\"9858e0c4\",\"unicodeChar\":\"𪻷\",\"unicodeCodePoint\":\"2AEF7\",\"pinYinChars\":[{\"char\":\"RUO4\"}],\"splitChars\":[{\"char\":\"王若\"}],\"weight\":10},{\"charId\":\"1a929807\",\"unicodeChar\":\"𬍴\",\"unicodeCodePoint\":\"2C374\",\"pinYinChars\":[{\"char\":\"ZOU4\"}],\"splitChars\":[{\"char\":\"王奏\"}],\"weight\":10},{\"charId\":\"377105fe\",\"unicodeChar\":\"𪼥\",\"unicodeCodePoint\":\"2AF25\",\"pinYinChars\":[{\"char\":\"LIAN2\"}],\"splitChars\":[{\"char\":\"王廉\"}],\"weight\":10},{\"charId\":\"d02f632e\",\"unicodeChar\":\"𪼤\",\"unicodeCodePoint\":\"2AF24\",\"pinYinChars\":[{\"char\":\"ZHAN1\"}],\"splitChars\":[{\"char\":\"王詹\"}],\"weight\":10},{\"charId\":\"47aeb205\",\"unicodeChar\":\"𪼣\",\"unicodeCodePoint\":\"2AF23\",\"pinYinChars\":[{\"char\":\"AO4\"}],\"splitChars\":[{\"char\":\"王奥\"}],\"weight\":10},{\"charId\":\"4fd20bd2\",\"unicodeChar\":\"𬎃\",\"unicodeCodePoint\":\"2C383\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"王益\"}],\"weight\":10},{\"charId\":\"838fed41\",\"unicodeChar\":\"𬍽\",\"unicodeCodePoint\":\"2C37D\",\"pinYinChars\":[{\"char\":\"YUAN2\"}],\"splitChars\":[{\"char\":\"王員\"}],\"weight\":10},{\"charId\":\"072e3b52\",\"unicodeChar\":\"𢨮\",\"unicodeCodePoint\":\"22A2E\",\"pinYinChars\":[{\"char\":\"YI1\"}],\"splitChars\":[{\"char\":\"户千\"}],\"weight\":10},{\"charId\":\"68f5e46b\",\"unicodeChar\":\"𢧇\",\"unicodeCodePoint\":\"229C7\",\"pinYinChars\":[{\"char\":\"SHU2\"}],\"splitChars\":[{\"char\":\"𢦏八夊\"}],\"weight\":10},{\"charId\":\"c4fe61f6\",\"unicodeChar\":\"𢧂\",\"unicodeCodePoint\":\"229C2\",\"pinYinChars\":[{\"char\":\"POU3\"}],\"splitChars\":[{\"char\":\"咅戈\"}],\"weight\":10},{\"charId\":\"3aafa5f4\",\"unicodeChar\":\"𪼬\",\"unicodeCodePoint\":\"2AF2C\",\"pinYinChars\":[{\"char\":\"LING2\"}],\"splitChars\":[{\"char\":\"王霖\"}],\"weight\":10},{\"charId\":\"3ee41be6\",\"unicodeChar\":\"𤊻\",\"unicodeCodePoint\":\"242BB\",\"pinYinChars\":[{\"char\":\"FOU1\"}],\"splitChars\":[{\"char\":\"火冒\"}],\"weight\":10},{\"charId\":\"558d77b2\",\"unicodeChar\":\"𤊴\",\"unicodeCodePoint\":\"242B4\",\"pinYinChars\":[{\"char\":\"FU4\"}],\"splitChars\":[{\"char\":\"火石\"}],\"weight\":10},{\"charId\":\"d7a0aa12\",\"unicodeChar\":\"𤈍\",\"unicodeCodePoint\":\"2420D\",\"pinYinChars\":[{\"char\":\"XI\"}],\"splitChars\":[{\"char\":\"火向\"}],\"weight\":10},{\"charId\":\"8d42ec70\",\"unicodeChar\":\"𤌭\",\"unicodeCodePoint\":\"2432D\",\"pinYinChars\":[{\"char\":\"ZH\"}],\"splitChars\":[{\"char\":\"火真\"}],\"weight\":10},{\"charId\":\"de00ee24\",\"unicodeChar\":\"𤌧\",\"unicodeCodePoint\":\"24327\",\"pinYinChars\":[{\"char\":\"SANG1\"}],\"splitChars\":[{\"char\":\"火桑\"}],\"weight\":10},{\"charId\":\"8913c2a1\",\"unicodeChar\":\"𫐼\",\"unicodeCodePoint\":\"2B43C\",\"pinYinChars\":[{\"char\":\"PANG2\"}],\"splitChars\":[{\"char\":\"辶旁\"}],\"weight\":10},{\"charId\":\"3c325687\",\"unicodeChar\":\"𤐶\",\"unicodeCodePoint\":\"24436\",\"pinYinChars\":[{\"char\":\"HAO2\"}],\"splitChars\":[{\"char\":\"火豪\"}],\"weight\":10},{\"charId\":\"2907c8f7\",\"unicodeChar\":\"𤏻\",\"unicodeCodePoint\":\"243FB\",\"pinYinChars\":[{\"char\":\"XIE2\"}],\"splitChars\":[{\"char\":\"辛又\"}],\"weight\":10},{\"charId\":\"a3f3ed7e\",\"unicodeChar\":\"𤏸\",\"unicodeCodePoint\":\"243F8\",\"pinYinChars\":[{\"char\":\"ZHUO2\"}],\"splitChars\":[{\"char\":\"火著\"}],\"weight\":10},{\"charId\":\"4c2ec65e\",\"unicodeChar\":\"𤘧\",\"unicodeCodePoint\":\"24627\",\"pinYinChars\":[{\"char\":\"GUI3\"}],\"splitChars\":[{\"char\":\"牛牛\"}],\"weight\":10},{\"charId\":\"f037ecb0\",\"unicodeChar\":\"𤗜\",\"unicodeCodePoint\":\"245DC\",\"pinYinChars\":[{\"char\":\"JIA3\"}],\"splitChars\":[{\"char\":\"片叚\"}],\"weight\":10},{\"charId\":\"84f618e3\",\"unicodeChar\":\"𤔣\",\"unicodeCodePoint\":\"24523\",\"pinYinChars\":[{\"char\":\"BAO4\"}],\"splitChars\":[{\"char\":\"爪叟\"}],\"weight\":10},{\"charId\":\"2d2b0944\",\"unicodeChar\":\"𫑳\",\"unicodeCodePoint\":\"2B473\",\"pinYinChars\":[{\"char\":\"WAN2\"}],\"splitChars\":[{\"char\":\"酉丸\"}],\"weight\":10},{\"charId\":\"8fff98f8\",\"unicodeChar\":\"𤌷\",\"unicodeCodePoint\":\"24337\",\"pinYinChars\":[{\"char\":\"XI4\"}],\"splitChars\":[{\"char\":\"火心(恚)\"}],\"weight\":10},{\"charId\":\"ff793509\",\"unicodeChar\":\"𫑡\",\"unicodeCodePoint\":\"2B461\",\"pinYinChars\":[{\"char\":\"MENG2\"}],\"splitChars\":[{\"char\":\"黾阝\"}],\"weight\":10},{\"charId\":\"87b34aa9\",\"unicodeChar\":\"𤌴\",\"unicodeCodePoint\":\"24334\",\"pinYinChars\":[{\"char\":\"JI\"}],\"splitChars\":[{\"char\":\"火桀\"}],\"weight\":10},{\"charId\":\"b873746c\",\"unicodeChar\":\"𫑟\",\"unicodeCodePoint\":\"2B45F\",\"pinYinChars\":[{\"char\":\"YAN2\"}],\"splitChars\":[{\"char\":\"言阝\"}],\"weight\":10},{\"charId\":\"d23c0d1e\",\"unicodeChar\":\"𫐐\",\"unicodeCodePoint\":\"2B410\",\"pinYinChars\":[{\"char\":\"NI2\"}],\"splitChars\":[{\"char\":\"车兒\"}],\"weight\":10},{\"charId\":\"23d2516a\",\"unicodeChar\":\"𤌙\",\"unicodeCodePoint\":\"24319\",\"pinYinChars\":[{\"char\":\"TA1\"}],\"splitChars\":[{\"char\":\"火塌𦐇\"}],\"weight\":10},{\"charId\":\"1670c696\",\"unicodeChar\":\"𤋙\",\"unicodeCodePoint\":\"242D9\",\"pinYinChars\":[{\"char\":\"MIAO2\"}],\"splitChars\":[{\"char\":\"火苗\"}],\"weight\":10},{\"charId\":\"301be90c\",\"unicodeChar\":\"𤎥\",\"unicodeCodePoint\":\"243A5\",\"pinYinChars\":[{\"char\":\"TAN3\"}],\"splitChars\":[{\"char\":\"帛炎\"}],\"weight\":10},{\"charId\":\"84729ef3\",\"unicodeChar\":\"𤍓\",\"unicodeCodePoint\":\"24353\",\"pinYinChars\":[{\"char\":\"SHU4\"}],\"splitChars\":[{\"char\":\"野火\"}],\"weight\":10},{\"charId\":\"84a4b23f\",\"unicodeChar\":\"𫐣\",\"unicodeCodePoint\":\"2B423\",\"pinYinChars\":[{\"char\":\"BING3\"}],\"splitChars\":[{\"char\":\"辶丙\"}],\"weight\":10},{\"charId\":\"315a4ced\",\"unicodeChar\":\"㐷\",\"unicodeCodePoint\":\"3437\",\"pinYinChars\":[{\"char\":\"MA4\"}],\"splitChars\":[{\"char\":\"亻马\"}],\"weight\":10},{\"charId\":\"70451245\",\"unicodeChar\":\"𤣰\",\"unicodeCodePoint\":\"248F0\",\"pinYinChars\":[{\"char\":\"BU3\"}],\"splitChars\":[{\"char\":\"王土\"}],\"weight\":10},{\"charId\":\"ba674aba\",\"unicodeChar\":\"𬬹\",\"unicodeCodePoint\":\"2CB39\",\"pinYinChars\":[{\"char\":\"SHEN2\"}],\"splitChars\":[{\"char\":\"钅申\"}],\"weight\":10},{\"charId\":\"4468bacb\",\"unicodeChar\":\"㐸\",\"unicodeCodePoint\":\"3438\",\"pinYinChars\":[{\"char\":\"CI4\"}],\"splitChars\":[{\"char\":\"亻欠\"}],\"weight\":10},{\"charId\":\"b3ccb855\",\"unicodeChar\":\"㐨\",\"unicodeCodePoint\":\"3428\",\"pinYinChars\":[{\"char\":\"XU4\"}],\"splitChars\":[{\"char\":\"予予\"}],\"weight\":10},{\"charId\":\"5f09b2dc\",\"unicodeChar\":\"𬬵\",\"unicodeCodePoint\":\"2CB35\",\"pinYinChars\":[{\"char\":\"CHEN2\"}],\"splitChars\":[{\"char\":\"钅冘\"}],\"weight\":10},{\"charId\":\"48752227\",\"unicodeChar\":\"𤞶\",\"unicodeCodePoint\":\"247B6\",\"pinYinChars\":[{\"char\":\"HAN1\"}],\"splitChars\":[{\"char\":\"犭罕\"}],\"weight\":10},{\"charId\":\"4932bdfd\",\"unicodeChar\":\"𬬭\",\"unicodeCodePoint\":\"2CB2D\",\"pinYinChars\":[{\"char\":\"LUN2\"}],\"splitChars\":[{\"char\":\"钅仑\"}],\"weight\":10},{\"charId\":\"9ed44dd3\",\"unicodeChar\":\"㐅\",\"unicodeCodePoint\":\"3405\",\"pinYinChars\":[{\"char\":\"WU3\"}],\"splitChars\":[{\"char\":\"丿丶\"}],\"weight\":10},{\"charId\":\"0a4d7fcb\",\"unicodeChar\":\"𤤥\",\"unicodeCodePoint\":\"24925\",\"pinYinChars\":[{\"char\":\"TI\"}],\"splitChars\":[{\"char\":\"王失\"}],\"weight\":10},{\"charId\":\"6ede676c\",\"unicodeChar\":\"𬫯\",\"unicodeCodePoint\":\"2CAEF\",\"pinYinChars\":[{\"char\":\"MAO4\"}],\"splitChars\":[{\"char\":\"金茂\"}],\"weight\":10},{\"charId\":\"108c838b\",\"unicodeChar\":\"𫒩\",\"unicodeCodePoint\":\"2B4A9\",\"pinYinChars\":[{\"char\":\"BANG3\"}],\"splitChars\":[{\"char\":\"金奉\"}],\"weight\":10},{\"charId\":\"8467e965\",\"unicodeChar\":\"𤥢\",\"unicodeCodePoint\":\"24962\",\"pinYinChars\":[{\"char\":\"HAO4\"}],\"splitChars\":[{\"char\":\"王告\"}],\"weight\":10},{\"charId\":\"f9266de0\",\"unicodeChar\":\"𤥒\",\"unicodeCodePoint\":\"24952\",\"pinYinChars\":[{\"char\":\"XI1\"}],\"splitChars\":[{\"char\":\"王西\"}],\"weight\":10},{\"charId\":\"a372f1c7\",\"unicodeChar\":\"𬬩\",\"unicodeCodePoint\":\"2CB29\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"钅弋\"}],\"weight\":10},{\"charId\":\"7758f333\",\"unicodeChar\":\"𤥇\",\"unicodeCodePoint\":\"24947\",\"pinYinChars\":[{\"char\":\"ZH\"}],\"splitChars\":[{\"char\":\"王至\"}],\"weight\":10},{\"charId\":\"d2bfccc8\",\"unicodeChar\":\"㑎\",\"unicodeCodePoint\":\"344E\",\"pinYinChars\":[{\"char\":\"NAO3\"}],\"splitChars\":[{\"char\":\"亻山\"}],\"weight\":10},{\"charId\":\"03ade7f3\",\"unicodeChar\":\"㐾\",\"unicodeCodePoint\":\"343E\",\"pinYinChars\":[{\"char\":\"YUAN2\"}],\"splitChars\":[{\"char\":\"亻元\"}],\"weight\":10},{\"charId\":\"bb987d1b\",\"unicodeChar\":\"𤣹\",\"unicodeCodePoint\":\"248F9\",\"pinYinChars\":[{\"char\":\"FA3\"}],\"splitChars\":[{\"char\":\"王尹\"}],\"weight\":10},{\"charId\":\"a177f783\",\"unicodeChar\":\"𬬻\",\"unicodeCodePoint\":\"2CB3B\",\"pinYinChars\":[{\"char\":\"LU2\"}],\"splitChars\":[{\"char\":\"钅卢\"}],\"weight\":10},{\"charId\":\"d2314db6\",\"unicodeChar\":\"𤞞\",\"unicodeCodePoint\":\"2479E\",\"pinYinChars\":[{\"char\":\"YU4\"}],\"splitChars\":[{\"char\":\"犭谷\"}],\"weight\":10},{\"charId\":\"7e7d6bba\",\"unicodeChar\":\"𤝲\",\"unicodeCodePoint\":\"24772\",\"pinYinChars\":[{\"char\":\"WU2\"}],\"splitChars\":[{\"char\":\"犭吴\"}],\"weight\":10},{\"charId\":\"be317725\",\"unicodeChar\":\"𤛱\",\"unicodeCodePoint\":\"246F1\",\"pinYinChars\":[{\"char\":\"ZHI4\"}],\"splitChars\":[{\"char\":\"臼牛\"}],\"weight\":10},{\"charId\":\"131cba72\",\"unicodeChar\":\"𤤛\",\"unicodeCodePoint\":\"2491B\",\"pinYinChars\":[{\"char\":\"ZH\"}],\"splitChars\":[{\"char\":\"王主\"}],\"weight\":10},{\"charId\":\"cc4e4b4c\",\"unicodeChar\":\"𫒞\",\"unicodeCodePoint\":\"2B49E\",\"pinYinChars\":[{\"char\":\"JIE4\"}],\"splitChars\":[{\"char\":\"金戒\"}],\"weight\":10},{\"charId\":\"abea88bd\",\"unicodeChar\":\"𤤌\",\"unicodeCodePoint\":\"2490C\",\"pinYinChars\":[{\"char\":\"CH\"}],\"splitChars\":[{\"char\":\"王冗\"}],\"weight\":10},{\"charId\":\"76136498\",\"unicodeChar\":\"𫒝\",\"unicodeCodePoint\":\"2B49D\",\"pinYinChars\":[{\"char\":\"GENG1\"}],\"splitChars\":[{\"char\":\"金更\"}],\"weight\":10},{\"charId\":\"368657ff\",\"unicodeChar\":\"𤤄\",\"unicodeCodePoint\":\"24904\",\"pinYinChars\":[{\"char\":\"MO4\"}],\"splitChars\":[{\"char\":\"王殳\"}],\"weight\":10},{\"charId\":\"ba9cdb1e\",\"unicodeChar\":\"𤤂\",\"unicodeCodePoint\":\"24902\",\"pinYinChars\":[{\"char\":\"YU2\"}],\"splitChars\":[{\"char\":\"王予\"}],\"weight\":10},{\"charId\":\"c4bce773\",\"unicodeChar\":\"𤔅\",\"unicodeCodePoint\":\"24505\",\"pinYinChars\":[{\"char\":\"DI\"}],\"splitChars\":[{\"char\":\"爪失\"}],\"weight\":10},{\"charId\":\"db0e147b\",\"unicodeChar\":\"𬬔\",\"unicodeCodePoint\":\"2CB14\",\"pinYinChars\":[{\"char\":\"YI2\"}],\"splitChars\":[{\"char\":\"金疑\"}],\"weight\":10},{\"charId\":\"080aea3f\",\"unicodeChar\":\"𫓔\",\"unicodeCodePoint\":\"2B4D4\",\"pinYinChars\":[{\"char\":\"YI3\"}],\"splitChars\":[{\"char\":\"金義\"}],\"weight\":10},{\"charId\":\"eca34e9f\",\"unicodeChar\":\"𫓐\",\"unicodeCodePoint\":\"2B4D0\",\"pinYinChars\":[{\"char\":\"LI3\"}],\"splitChars\":[{\"char\":\"金豊(豆)\"}],\"weight\":10},{\"charId\":\"8fb71ebf\",\"unicodeChar\":\"㙞\",\"unicodeCodePoint\":\"365E\",\"pinYinChars\":[{\"char\":\"NIE4\"}],\"splitChars\":[{\"char\":\"土臬\"}],\"weight\":10},{\"charId\":\"5331e9ca\",\"unicodeChar\":\"𬭝\",\"unicodeCodePoint\":\"2CB5D\",\"pinYinChars\":[{\"char\":\"SAN3\"}],\"splitChars\":[{\"char\":\"钅参\"}],\"weight\":10},{\"charId\":\"db09dfed\",\"unicodeChar\":\"㙍\",\"unicodeCodePoint\":\"364D\",\"pinYinChars\":[{\"char\":\"DUO1\"}],\"splitChars\":[{\"char\":\"土叕\"}],\"weight\":10},{\"charId\":\"02d8433f\",\"unicodeChar\":\"𬭛\",\"unicodeCodePoint\":\"2CB5B\",\"pinYinChars\":[{\"char\":\"BO1\"}],\"splitChars\":[{\"char\":\"钅波\"}],\"weight\":10},{\"charId\":\"72b58059\",\"unicodeChar\":\"㙘\",\"unicodeCodePoint\":\"3658\",\"pinYinChars\":[{\"char\":\"YAO1\"}],\"splitChars\":[{\"char\":\"土要\"}],\"weight\":10},{\"charId\":\"1d454d7c\",\"unicodeChar\":\"𤦃\",\"unicodeCodePoint\":\"24983\",\"pinYinChars\":[{\"char\":\"LAI2\"}],\"splitChars\":[{\"char\":\"來玉\"}],\"weight\":10},{\"charId\":\"60376967\",\"unicodeChar\":\"𤥿\",\"unicodeCodePoint\":\"2497F\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"王夜\"}],\"weight\":10},{\"charId\":\"b6c786c6\",\"unicodeChar\":\"𤨖\",\"unicodeCodePoint\":\"24A16\",\"pinYinChars\":[{\"char\":\"SU4\"}],\"splitChars\":[{\"char\":\"王邑\"}],\"weight\":10},{\"charId\":\"e84cc369\",\"unicodeChar\":\"𬭓\",\"unicodeCodePoint\":\"2CB53\",\"pinYinChars\":[{\"char\":\"TIAN3\"}],\"splitChars\":[{\"char\":\"钅典\"}],\"weight\":10},{\"charId\":\"283f173b\",\"unicodeChar\":\"㘰\",\"unicodeCodePoint\":\"3630\",\"pinYinChars\":[{\"char\":\"ZHEN1\"}],\"splitChars\":[{\"char\":\"土斗\"}],\"weight\":10},{\"charId\":\"cba2bed7\",\"unicodeChar\":\"㗑\",\"unicodeCodePoint\":\"35D1\",\"pinYinChars\":[{\"char\":\"BEI\"}],\"splitChars\":[{\"char\":\"口拜\"}],\"weight\":10},{\"charId\":\"1560ef85\",\"unicodeChar\":\"𤧶\",\"unicodeCodePoint\":\"249F6\",\"pinYinChars\":[{\"char\":\"XIA4\"}],\"splitChars\":[{\"char\":\"王夏\"}],\"weight\":10},{\"charId\":\"139a8c1a\",\"unicodeChar\":\"𫓷\",\"unicodeCodePoint\":\"2B4F7\",\"pinYinChars\":[{\"char\":\"XUAN2\"}],\"splitChars\":[{\"char\":\"钅疋\"}],\"weight\":10},{\"charId\":\"fde800e1\",\"unicodeChar\":\"𤧴\",\"unicodeCodePoint\":\"249F4\",\"pinYinChars\":[{\"char\":\"GONG3\"}],\"splitChars\":[{\"char\":\"王恭\"}],\"weight\":10},{\"charId\":\"e8cd81cf\",\"unicodeChar\":\"𤧥\",\"unicodeCodePoint\":\"249E5\",\"pinYinChars\":[{\"char\":\"BI4\"}],\"splitChars\":[{\"char\":\"珀玉\"}],\"weight\":10},{\"charId\":\"127e7677\",\"unicodeChar\":\"𤧛\",\"unicodeCodePoint\":\"249DB\",\"pinYinChars\":[{\"char\":\"DI4\"}],\"splitChars\":[{\"char\":\"王帝\"}],\"weight\":10},{\"charId\":\"1ec35745\",\"unicodeChar\":\"㙦\",\"unicodeCodePoint\":\"3666\",\"pinYinChars\":[{\"char\":\"XIE2\"}],\"splitChars\":[{\"char\":\"斜土\"}],\"weight\":10},{\"charId\":\"c2b26223\",\"unicodeChar\":\"㙩\",\"unicodeCodePoint\":\"3669\",\"pinYinChars\":[{\"char\":\"LIAO2\"}],\"splitChars\":[{\"char\":\"土尞\"}],\"weight\":10},{\"charId\":\"cd90313c\",\"unicodeChar\":\"㕊\",\"unicodeCodePoint\":\"354A\",\"pinYinChars\":[{\"char\":\"FU1\"}],\"splitChars\":[{\"char\":\"厂甫\"}],\"weight\":10},{\"charId\":\"44a8737c\",\"unicodeChar\":\"𬭋\",\"unicodeCodePoint\":\"2CB4B\",\"pinYinChars\":[{\"char\":\"JIE4\"}],\"splitChars\":[{\"char\":\"钅戒\"}],\"weight\":10},{\"charId\":\"24fc84d0\",\"unicodeChar\":\"㕤\",\"unicodeCodePoint\":\"3564\",\"pinYinChars\":[{\"char\":\"QUI2\"}],\"splitChars\":[{\"char\":\"口九\"}],\"weight\":10},{\"charId\":\"8589bcb7\",\"unicodeChar\":\"𤤸\",\"unicodeCodePoint\":\"24938\",\"pinYinChars\":[{\"char\":\"DUO4\"}],\"splitChars\":[{\"char\":\"王朵\"}],\"weight\":10},{\"charId\":\"e603a027\",\"unicodeChar\":\"鿏\",\"unicodeCodePoint\":\"9FCF\",\"pinYinChars\":[{\"char\":\"MAI4\"}],\"splitChars\":[{\"char\":\"钅麦\"}],\"weight\":10},{\"charId\":\"81a681fe\",\"unicodeChar\":\"㕅\",\"unicodeCodePoint\":\"3545\",\"pinYinChars\":[{\"char\":\"JIA2\"}],\"splitChars\":[{\"char\":\"厂甲\"}],\"weight\":10},{\"charId\":\"0509ff0b\",\"unicodeChar\":\"𤤧\",\"unicodeCodePoint\":\"24927\",\"pinYinChars\":[{\"char\":\"YOU2\"}],\"splitChars\":[{\"char\":\"王由\"}],\"weight\":10},{\"charId\":\"d9ad0f75\",\"unicodeChar\":\"𤤦\",\"unicodeCodePoint\":\"24926\",\"pinYinChars\":[{\"char\":\"TIAN2\"}],\"splitChars\":[{\"char\":\"王田\"}],\"weight\":10},{\"charId\":\"f91b62c6\",\"unicodeChar\":\"㓦\",\"unicodeCodePoint\":\"34E6\",\"pinYinChars\":[{\"char\":\"BAI1\"}],\"splitChars\":[{\"char\":\"百刂\"}],\"weight\":10},{\"charId\":\"3ccb9c1f\",\"unicodeChar\":\"𤥴\",\"unicodeCodePoint\":\"24974\",\"pinYinChars\":[{\"char\":\"ZH\"}],\"splitChars\":[{\"char\":\"王志\"}],\"weight\":10},{\"charId\":\"9efc15c3\",\"unicodeChar\":\"𤥰\",\"unicodeCodePoint\":\"24970\",\"pinYinChars\":[{\"char\":\"MAO4\"}],\"splitChars\":[{\"char\":\"王皃\"}],\"weight\":10},{\"charId\":\"16792336\",\"unicodeChar\":\"𤥨\",\"unicodeCodePoint\":\"24968\",\"pinYinChars\":[{\"char\":\"ZHU\"}],\"splitChars\":[{\"char\":\"王豕\"}],\"weight\":10},{\"charId\":\"fc26929e\",\"unicodeChar\":\"𤦬\",\"unicodeCodePoint\":\"249AC\",\"pinYinChars\":[{\"char\":\"NI\"}],\"splitChars\":[{\"char\":\"王念\"}],\"weight\":10},{\"charId\":\"6b7e41b4\",\"unicodeChar\":\"㑲\",\"unicodeCodePoint\":\"3472\",\"pinYinChars\":[{\"char\":\"NAN2\"}],\"splitChars\":[{\"char\":\"亻南\"}],\"weight\":10},{\"charId\":\"9e413e9e\",\"unicodeChar\":\"㑗\",\"unicodeCodePoint\":\"3457\",\"pinYinChars\":[{\"char\":\"SHEN1\"}],\"splitChars\":[{\"char\":\"亻身\"}],\"weight\":10},{\"charId\":\"bf55cc36\",\"unicodeChar\":\"㑚\",\"unicodeCodePoint\":\"345A\",\"pinYinChars\":[{\"char\":\"NUO2\"}],\"splitChars\":[{\"char\":\"亻那\"}],\"weight\":10},{\"charId\":\"2e9373d9\",\"unicodeChar\":\"𤦤\",\"unicodeCodePoint\":\"249A4\",\"pinYinChars\":[{\"char\":\"NI2\"}],\"splitChars\":[{\"char\":\"王兒\"}],\"weight\":10},{\"charId\":\"0a065d47\",\"unicodeChar\":\"𤦎\",\"unicodeCodePoint\":\"2498E\",\"pinYinChars\":[{\"char\":\"LUN2\"}],\"splitChars\":[{\"char\":\"王侖\"}],\"weight\":10},{\"charId\":\"3ad71770\",\"unicodeChar\":\"㗄\",\"unicodeCodePoint\":\"35C4\",\"pinYinChars\":[{\"char\":\"MAN4\"}],\"splitChars\":[{\"char\":\"口方\"}],\"weight\":10},{\"charId\":\"71fa3852\",\"unicodeChar\":\"𫓶\",\"unicodeCodePoint\":\"2B4F6\",\"pinYinChars\":[{\"char\":\"XUAN1\"}],\"splitChars\":[{\"char\":\"钅肙\"}],\"weight\":10},{\"charId\":\"9dc154aa\",\"unicodeChar\":\"㕸\",\"unicodeCodePoint\":\"3578\",\"pinYinChars\":[{\"char\":\"LI4\"}],\"splitChars\":[{\"char\":\"口立\"}],\"weight\":10},{\"charId\":\"501ecfc7\",\"unicodeChar\":\"㖒\",\"unicodeCodePoint\":\"3592\",\"pinYinChars\":[{\"char\":\"TI2\"}],\"splitChars\":[{\"char\":\"口弟\"}],\"weight\":10},{\"charId\":\"5fc3f8da\",\"unicodeChar\":\"㜬\",\"unicodeCodePoint\":\"372C\",\"pinYinChars\":[{\"char\":\"ZHAN1\"}],\"splitChars\":[{\"char\":\"女詹\"}],\"weight\":10},{\"charId\":\"9a45ebcb\",\"unicodeChar\":\"𫔻\",\"unicodeCodePoint\":\"2B53B\",\"pinYinChars\":[{\"char\":\"WEN2\"}],\"splitChars\":[{\"char\":\"阝文\"}],\"weight\":10},{\"charId\":\"a58c5227\",\"unicodeChar\":\"㜊\",\"unicodeCodePoint\":\"370A\",\"pinYinChars\":[{\"char\":\"ZHAN3\"}],\"splitChars\":[{\"char\":\"女展\"}],\"weight\":10},{\"charId\":\"a9770070\",\"unicodeChar\":\"㜣\",\"unicodeCodePoint\":\"3723\",\"pinYinChars\":[{\"char\":\"RAN3\"}],\"splitChars\":[{\"char\":\"女然\"}],\"weight\":10},{\"charId\":\"4c995a74\",\"unicodeChar\":\"㛾\",\"unicodeCodePoint\":\"36FE\",\"pinYinChars\":[{\"char\":\"XIAN2\"}],\"splitChars\":[{\"char\":\"女咸\"}],\"weight\":10},{\"charId\":\"f2573af4\",\"unicodeChar\":\"㜁\",\"unicodeCodePoint\":\"3701\",\"pinYinChars\":[{\"char\":\"ZHA1\"}],\"splitChars\":[{\"char\":\"女查\"}],\"weight\":10},{\"charId\":\"13d9b2b2\",\"unicodeChar\":\"𤨧\",\"unicodeCodePoint\":\"24A27\",\"pinYinChars\":[{\"char\":\"PIAO4\"}],\"splitChars\":[{\"char\":\"王票\"}],\"weight\":10},{\"charId\":\"d542e144\",\"unicodeChar\":\"㛦\",\"unicodeCodePoint\":\"36E6\",\"pinYinChars\":[{\"char\":\"LAN2\"}],\"splitChars\":[{\"char\":\"女林\"}],\"weight\":10},{\"charId\":\"b7f3f283\",\"unicodeChar\":\"𬮇\",\"unicodeCodePoint\":\"2CB87\",\"pinYinChars\":[{\"char\":\"LU1\"}],\"splitChars\":[{\"char\":\"門犬\"}],\"weight\":10},{\"charId\":\"37288121\",\"unicodeChar\":\"㛫\",\"unicodeCodePoint\":\"36EB\",\"pinYinChars\":[{\"char\":\"XI1\"}],\"splitChars\":[{\"char\":\"女易\"}],\"weight\":10},{\"charId\":\"0e341def\",\"unicodeChar\":\"𤫁\",\"unicodeCodePoint\":\"24AC1\",\"pinYinChars\":[{\"char\":\"YING2\"}],\"splitChars\":[{\"char\":\"王螢\"}],\"weight\":10},{\"charId\":\"50050a60\",\"unicodeChar\":\"㛡\",\"unicodeCodePoint\":\"36E1\",\"pinYinChars\":[{\"char\":\"WAN2\"}],\"splitChars\":[{\"char\":\"女完\"}],\"weight\":10},{\"charId\":\"36a31957\",\"unicodeChar\":\"𤪼\",\"unicodeCodePoint\":\"24ABC\",\"pinYinChars\":[{\"char\":\"LIAN2\"}],\"splitChars\":[{\"char\":\"王蓮\"}],\"weight\":10},{\"charId\":\"42390e76\",\"unicodeChar\":\"𫔎\",\"unicodeCodePoint\":\"2B50E\",\"pinYinChars\":[{\"char\":\"JUE2\"}],\"splitChars\":[{\"char\":\"钅矞\"}],\"weight\":10},{\"charId\":\"ebfe587a\",\"unicodeChar\":\"㛢\",\"unicodeCodePoint\":\"36E2\",\"pinYinChars\":[{\"char\":\"XIU4\"}],\"splitChars\":[{\"char\":\"女秀\"}],\"weight\":10},{\"charId\":\"00af8f00\",\"unicodeChar\":\"𬭼\",\"unicodeCodePoint\":\"2CB7C\",\"pinYinChars\":[{\"char\":\"SUI4\"}],\"splitChars\":[{\"char\":\"钅遂\"}],\"weight\":10},{\"charId\":\"c7f417cb\",\"unicodeChar\":\"𤪺\",\"unicodeCodePoint\":\"24ABA\",\"pinYinChars\":[{\"char\":\"SH\"}],\"splitChars\":[{\"char\":\"王審\"}],\"weight\":10},{\"charId\":\"bd7bcc6e\",\"unicodeChar\":\"𤪤\",\"unicodeCodePoint\":\"24AA4\",\"pinYinChars\":[{\"char\":\"RONG2\"}],\"splitChars\":[{\"char\":\"王榮\"}],\"weight\":10},{\"charId\":\"aabbaccd\",\"unicodeChar\":\"㛚\",\"unicodeCodePoint\":\"36DA\",\"pinYinChars\":[{\"char\":\"TONG3\"}],\"splitChars\":[{\"char\":\"女甬\"}],\"weight\":10},{\"charId\":\"f144e836\",\"unicodeChar\":\"𤪟\",\"unicodeCodePoint\":\"24A9F\",\"pinYinChars\":[{\"char\":\"PU2\"}],\"splitChars\":[{\"char\":\"王僕\"}],\"weight\":10},{\"charId\":\"bbd5385f\",\"unicodeChar\":\"𤪌\",\"unicodeCodePoint\":\"24A8C\",\"pinYinChars\":[{\"char\":\"QI2\"}],\"splitChars\":[{\"char\":\"王糸\"}],\"weight\":10},{\"charId\":\"b3dea7ca\",\"unicodeChar\":\"㝋\",\"unicodeCodePoint\":\"374B\",\"pinYinChars\":[{\"char\":\"LIAO3\"}],\"splitChars\":[{\"char\":\"宀了\"}],\"weight\":10},{\"charId\":\"4a16ed6d\",\"unicodeChar\":\"㛈\",\"unicodeCodePoint\":\"36C8\",\"pinYinChars\":[{\"char\":\"KAO3\"}],\"splitChars\":[{\"char\":\"女考\"}],\"weight\":10},{\"charId\":\"f715daf2\",\"unicodeChar\":\"㛉\",\"unicodeCodePoint\":\"36C9\",\"pinYinChars\":[{\"char\":\"XI3\"}],\"splitChars\":[{\"char\":\"女西\"}],\"weight\":10},{\"charId\":\"2a7721d1\",\"unicodeChar\":\"𬭩\",\"unicodeCodePoint\":\"2CB69\",\"pinYinChars\":[{\"char\":\"WENG1\"}],\"splitChars\":[{\"char\":\"钅翁\"}],\"weight\":10},{\"charId\":\"04ece3df\",\"unicodeChar\":\"㛅\",\"unicodeCodePoint\":\"36C5\",\"pinYinChars\":[{\"char\":\"ER4\"}],\"splitChars\":[{\"char\":\"女耳\"}],\"weight\":10},{\"charId\":\"c6266887\",\"unicodeChar\":\"㛄\",\"unicodeCodePoint\":\"36C4\",\"pinYinChars\":[{\"char\":\"YI1\"}],\"splitChars\":[{\"char\":\"女衣\"}],\"weight\":10},{\"charId\":\"39663f1e\",\"unicodeChar\":\"㚵\",\"unicodeCodePoint\":\"36B5\",\"pinYinChars\":[{\"char\":\"DONG1\"}],\"splitChars\":[{\"char\":\"女冬\"}],\"weight\":10},{\"charId\":\"ec78e73f\",\"unicodeChar\":\"𤦹\",\"unicodeCodePoint\":\"249B9\",\"pinYinChars\":[{\"char\":\"ZHEN1\"}],\"splitChars\":[{\"char\":\"王貞\"}],\"weight\":10},{\"charId\":\"4d4469f8\",\"unicodeChar\":\"㘵\",\"unicodeCodePoint\":\"3635\",\"pinYinChars\":[{\"char\":\"BU4\"}],\"splitChars\":[{\"char\":\"土布\"}],\"weight\":10},{\"charId\":\"3de36186\",\"unicodeChar\":\"㚱\",\"unicodeCodePoint\":\"36B1\",\"pinYinChars\":[{\"char\":\"QIU1\"}],\"splitChars\":[{\"char\":\"女丘\"}],\"weight\":10},{\"charId\":\"01846104\",\"unicodeChar\":\"㚴\",\"unicodeCodePoint\":\"36B4\",\"pinYinChars\":[{\"char\":\"BU4\"}],\"splitChars\":[{\"char\":\"女布\"}],\"weight\":10},{\"charId\":\"cbf4ec8a\",\"unicodeChar\":\"㚬\",\"unicodeCodePoint\":\"36AC\",\"pinYinChars\":[{\"char\":\"JUN1\"}],\"splitChars\":[{\"char\":\"女匀\"}],\"weight\":10},{\"charId\":\"ef1c0e8a\",\"unicodeChar\":\"𤩥\",\"unicodeCodePoint\":\"24A65\",\"pinYinChars\":[{\"char\":\"SH\"}],\"splitChars\":[{\"char\":\"王舜\"}],\"weight\":10},{\"charId\":\"35061cd3\",\"unicodeChar\":\"㚰\",\"unicodeCodePoint\":\"36B0\",\"pinYinChars\":[{\"char\":\"PEI1\"}],\"splitChars\":[{\"char\":\"女丕\"}],\"weight\":10},{\"charId\":\"4ba59e32\",\"unicodeChar\":\"𤩢\",\"unicodeCodePoint\":\"24A62\",\"pinYinChars\":[{\"char\":\"GAO1\"}],\"splitChars\":[{\"char\":\"王十\"}],\"weight\":10},{\"charId\":\"5a17d078\",\"unicodeChar\":\"𤩝\",\"unicodeCodePoint\":\"24A5D\",\"pinYinChars\":[{\"char\":\"QI\"}],\"splitChars\":[{\"char\":\"王喬\"}],\"weight\":10},{\"charId\":\"725495a6\",\"unicodeChar\":\"㚥\",\"unicodeCodePoint\":\"36A5\",\"pinYinChars\":[{\"char\":\"YU2\"}],\"splitChars\":[{\"char\":\"女于\"}],\"weight\":10},{\"charId\":\"a6d68337\",\"unicodeChar\":\"𤩛\",\"unicodeCodePoint\":\"24A5B\",\"pinYinChars\":[{\"char\":\"SUI4\"}],\"splitChars\":[{\"char\":\"王最\"}],\"weight\":10},{\"charId\":\"4fbf373d\",\"unicodeChar\":\"𤩊\",\"unicodeCodePoint\":\"24A4A\",\"pinYinChars\":[{\"char\":\"YAO2\"}],\"splitChars\":[{\"char\":\"王堯\"}],\"weight\":10},{\"charId\":\"9b94ad56\",\"unicodeChar\":\"𤩄\",\"unicodeCodePoint\":\"24A44\",\"pinYinChars\":[{\"char\":\"ZHUAN4\"}],\"splitChars\":[{\"char\":\"王巽\"}],\"weight\":10},{\"charId\":\"32b03aca\",\"unicodeChar\":\"㛓\",\"unicodeCodePoint\":\"36D3\",\"pinYinChars\":[{\"char\":\"XI1\"}],\"splitChars\":[{\"char\":\"女希\"}],\"weight\":10},{\"charId\":\"b1139738\",\"unicodeChar\":\"㛖\",\"unicodeCodePoint\":\"36D6\",\"pinYinChars\":[{\"char\":\"SUO1\"}],\"splitChars\":[{\"char\":\"女夋\"}],\"weight\":10},{\"charId\":\"2506967b\",\"unicodeChar\":\"㭠\",\"unicodeCodePoint\":\"3B60\",\"pinYinChars\":[{\"char\":\"XIAN3\"}],\"splitChars\":[{\"char\":\"木先\"}],\"weight\":10},{\"charId\":\"aaae2b60\",\"unicodeChar\":\"𬱣\",\"unicodeCodePoint\":\"2CC63\",\"pinYinChars\":[{\"char\":\"CEN2\"}],\"splitChars\":[{\"char\":\"山(岑)页\"}],\"weight\":10},{\"charId\":\"71ac1eb3\",\"unicodeChar\":\"㬳\",\"unicodeCodePoint\":\"3B33\",\"pinYinChars\":[{\"char\":\"WU3\"}],\"splitChars\":[{\"char\":\"月午\"}],\"weight\":10},{\"charId\":\"d292fefd\",\"unicodeChar\":\"㭁\",\"unicodeCodePoint\":\"3B41\",\"pinYinChars\":[{\"char\":\"RENG1\"}],\"splitChars\":[{\"char\":\"木乃\"}],\"weight\":10},{\"charId\":\"7eda61bb\",\"unicodeChar\":\"𤫞\",\"unicodeCodePoint\":\"24ADE\",\"pinYinChars\":[{\"char\":\"TIAN2\"}],\"splitChars\":[{\"char\":\"王寶(寳)\"}],\"weight\":10},{\"charId\":\"dfff0f1e\",\"unicodeChar\":\"㬊\",\"unicodeCodePoint\":\"3B0A\",\"pinYinChars\":[{\"char\":\"HUAN3\"}],\"splitChars\":[{\"char\":\"日爰\"}],\"weight\":10},{\"charId\":\"ef33c162\",\"unicodeChar\":\"𤫉\",\"unicodeCodePoint\":\"24AC9\",\"pinYinChars\":[{\"char\":\"XIE4\"}],\"splitChars\":[{\"char\":\"王燮\"}],\"weight\":10},{\"charId\":\"8fa02248\",\"unicodeChar\":\"㫃\",\"unicodeCodePoint\":\"3AC3\",\"pinYinChars\":[{\"char\":\"YAN3\"}],\"splitChars\":[{\"char\":\"方人\"}],\"weight\":10},{\"charId\":\"b010f3c6\",\"unicodeChar\":\"㩄\",\"unicodeCodePoint\":\"3A44\",\"pinYinChars\":[{\"char\":\"SHAI1\"}],\"splitChars\":[{\"char\":\"扌思\"}],\"weight\":10},{\"charId\":\"1618dda4\",\"unicodeChar\":\"㧥\",\"unicodeCodePoint\":\"39E5\",\"pinYinChars\":[{\"char\":\"XIAN3\"}],\"splitChars\":[{\"char\":\"扌先\"}],\"weight\":10},{\"charId\":\"67078107\",\"unicodeChar\":\"㥔\",\"unicodeCodePoint\":\"3954\",\"pinYinChars\":[{\"char\":\"YU4\"}],\"splitChars\":[{\"char\":\"忄育\"}],\"weight\":10},{\"charId\":\"e349640a\",\"unicodeChar\":\"𫕻\",\"unicodeCodePoint\":\"2B57B\",\"pinYinChars\":[{\"char\":\"QING1\"}],\"splitChars\":[{\"char\":\"青青\"}],\"weight\":10},{\"charId\":\"12aba12d\",\"unicodeChar\":\"𨛍\",\"unicodeCodePoint\":\"286CD\",\"pinYinChars\":[{\"char\":\"SHAO4\"}],\"splitChars\":[{\"char\":\"肖阝\"}],\"weight\":10},{\"charId\":\"83be24aa\",\"unicodeChar\":\"𫕴\",\"unicodeCodePoint\":\"2B574\",\"pinYinChars\":[{\"char\":\"AI3\"}],\"splitChars\":[{\"char\":\"雨竭\"}],\"weight\":10},{\"charId\":\"b2de90f2\",\"unicodeChar\":\"𫕩\",\"unicodeCodePoint\":\"2B569\",\"pinYinChars\":[{\"char\":\"HONG2\"}],\"splitChars\":[{\"char\":\"雨虹\"}],\"weight\":10},{\"charId\":\"cae35725\",\"unicodeChar\":\"㤏\",\"unicodeCodePoint\":\"390F\",\"pinYinChars\":[{\"char\":\"TONG2\"}],\"splitChars\":[{\"char\":\"忄冬\"}],\"weight\":10},{\"charId\":\"6bd43aa9\",\"unicodeChar\":\"㢍\",\"unicodeCodePoint\":\"388D\",\"pinYinChars\":[{\"char\":\"YING3\"}],\"splitChars\":[{\"char\":\"广英\"}],\"weight\":10},{\"charId\":\"95474864\",\"unicodeChar\":\"𬯼\",\"unicodeCodePoint\":\"2CBFC\",\"pinYinChars\":[{\"char\":\"LI4\"}],\"splitChars\":[{\"char\":\"雨利\"}],\"weight\":10},{\"charId\":\"744636f5\",\"unicodeChar\":\"㢀\",\"unicodeCodePoint\":\"3880\",\"pinYinChars\":[{\"char\":\"CI4\"}],\"splitChars\":[{\"char\":\"广朿\"}],\"weight\":10},{\"charId\":\"b866998d\",\"unicodeChar\":\"𤩼\",\"unicodeCodePoint\":\"24A7C\",\"pinYinChars\":[{\"char\":\"SU\"}],\"splitChars\":[{\"char\":\"王月(遀)\"}],\"weight\":10},{\"charId\":\"5b030383\",\"unicodeChar\":\"𫕠\",\"unicodeCodePoint\":\"2B560\",\"pinYinChars\":[{\"char\":\"BA1\"}],\"splitChars\":[{\"char\":\"雨巴\"}],\"weight\":10},{\"charId\":\"a0ce305d\",\"unicodeChar\":\"㠉\",\"unicodeCodePoint\":\"3809\",\"pinYinChars\":[{\"char\":\"TONG2\"}],\"splitChars\":[{\"char\":\"山童\"}],\"weight\":10},{\"charId\":\"f1025eee\",\"unicodeChar\":\"𤩶\",\"unicodeCodePoint\":\"24A76\",\"pinYinChars\":[{\"char\":\"PU2\"}],\"splitChars\":[{\"char\":\"王業\"}],\"weight\":10},{\"charId\":\"cdbee1a2\",\"unicodeChar\":\"㟤\",\"unicodeCodePoint\":\"37E4\",\"pinYinChars\":[{\"char\":\"LU4\"}],\"splitChars\":[{\"char\":\"山录\"}],\"weight\":10},{\"charId\":\"9fc91272\",\"unicodeChar\":\"𤩲\",\"unicodeCodePoint\":\"24A72\",\"pinYinChars\":[{\"char\":\"GE2\"}],\"splitChars\":[{\"char\":\"王葛\"}],\"weight\":10},{\"charId\":\"f63a7e15\",\"unicodeChar\":\"𫕛\",\"unicodeCodePoint\":\"2B55B\",\"pinYinChars\":[{\"char\":\"GUA1\"}],\"splitChars\":[{\"char\":\"舌隹\"}],\"weight\":10},{\"charId\":\"0d216ffa\",\"unicodeChar\":\"㟪\",\"unicodeCodePoint\":\"37EA\",\"pinYinChars\":[{\"char\":\"WEI1\"}],\"splitChars\":[{\"char\":\"山畏\"}],\"weight\":10},{\"charId\":\"7e3ae3c4\",\"unicodeChar\":\"𤩱\",\"unicodeCodePoint\":\"24A71\",\"pinYinChars\":[{\"char\":\"DIAN4\"}],\"splitChars\":[{\"char\":\"殿玉\"}],\"weight\":10},{\"charId\":\"265f91eb\",\"unicodeChar\":\"𬉦\",\"unicodeCodePoint\":\"2C266\",\"pinYinChars\":[{\"char\":\"HAN4\"}],\"splitChars\":[{\"char\":\"氵俞\"}],\"weight\":10},{\"charId\":\"93b166e5\",\"unicodeChar\":\"㟏\",\"unicodeCodePoint\":\"37CF\",\"pinYinChars\":[{\"char\":\"HAN2\"}],\"splitChars\":[{\"char\":\"山含\"}],\"weight\":10},{\"charId\":\"84aa6f34\",\"unicodeChar\":\"𤩭\",\"unicodeCodePoint\":\"24A6D\",\"pinYinChars\":[{\"char\":\"HAO4\"}],\"splitChars\":[{\"char\":\"王號\"}],\"weight\":10},{\"charId\":\"49758563\",\"unicodeChar\":\"㟖\",\"unicodeCodePoint\":\"37D6\",\"pinYinChars\":[{\"char\":\"LONG4\"}],\"splitChars\":[{\"char\":\"山弄\"}],\"weight\":10},{\"charId\":\"9c750514\",\"unicodeChar\":\"㟍\",\"unicodeCodePoint\":\"37CD\",\"pinYinChars\":[{\"char\":\"LANG2\"}],\"splitChars\":[{\"char\":\"山良\"}],\"weight\":10},{\"charId\":\"8257bbe6\",\"unicodeChar\":\"𬯀\",\"unicodeCodePoint\":\"2CBC0\",\"pinYinChars\":[{\"char\":\"JI1\"}],\"splitChars\":[{\"char\":\"阝齐\"}],\"weight\":10},{\"charId\":\"5a91a187\",\"unicodeChar\":\"㞩\",\"unicodeCodePoint\":\"37A9\",\"pinYinChars\":[{\"char\":\"LAN2\"}],\"splitChars\":[{\"char\":\"山凡\"}],\"weight\":10},{\"charId\":\"be9ae7dc\",\"unicodeChar\":\"㵿\",\"unicodeCodePoint\":\"3D7F\",\"pinYinChars\":[{\"char\":\"XIAO4\"}],\"splitChars\":[{\"char\":\"氵白\"}],\"weight\":10},{\"charId\":\"516caab0\",\"unicodeChar\":\"㵘\",\"unicodeCodePoint\":\"3D58\",\"pinYinChars\":[{\"char\":\"MAN4\"}],\"splitChars\":[{\"char\":\"水水\"}],\"weight\":10},{\"charId\":\"e67a98c4\",\"unicodeChar\":\"㴓\",\"unicodeCodePoint\":\"3D13\",\"pinYinChars\":[{\"char\":\"SHAI1\"}],\"splitChars\":[{\"char\":\"氵思\"}],\"weight\":10},{\"charId\":\"383476b0\",\"unicodeChar\":\"㳱\",\"unicodeCodePoint\":\"3CF1\",\"pinYinChars\":[{\"char\":\"YANG2\"}],\"splitChars\":[{\"char\":\"氵阳\"}],\"weight\":10},{\"charId\":\"135ab1ba\",\"unicodeChar\":\"㳯\",\"unicodeCodePoint\":\"3CEF\",\"pinYinChars\":[{\"char\":\"SHEN1\"}],\"splitChars\":[{\"char\":\"氵辛\"}],\"weight\":10},{\"charId\":\"92b94c87\",\"unicodeChar\":\"㳋\",\"unicodeCodePoint\":\"3CCB\",\"pinYinChars\":[{\"char\":\"QIU1\"}],\"splitChars\":[{\"char\":\"氵丘\"}],\"weight\":10},{\"charId\":\"8fdf8107\",\"unicodeChar\":\"㳍\",\"unicodeCodePoint\":\"3CCD\",\"pinYinChars\":[{\"char\":\"BU4\"}],\"splitChars\":[{\"char\":\"氵布\"}],\"weight\":10},{\"charId\":\"7e13db85\",\"unicodeChar\":\"㱔\",\"unicodeCodePoint\":\"3C54\",\"pinYinChars\":[{\"char\":\"XIE1\"}],\"splitChars\":[{\"char\":\"此夕\"}],\"weight\":10},{\"charId\":\"604b7acd\",\"unicodeChar\":\"㯎\",\"unicodeCodePoint\":\"3BCE\",\"pinYinChars\":[{\"char\":\"NEN4\"}],\"splitChars\":[{\"char\":\"林言\"}],\"weight\":10},{\"charId\":\"35f1728a\",\"unicodeChar\":\"㯝\",\"unicodeCodePoint\":\"3BDD\",\"pinYinChars\":[{\"char\":\"LU4\"}],\"splitChars\":[{\"char\":\"木路\"}],\"weight\":10},{\"charId\":\"cead8e5d\",\"unicodeChar\":\"㯌\",\"unicodeCodePoint\":\"3BCC\",\"pinYinChars\":[{\"char\":\"CHUAN2\"}],\"splitChars\":[{\"char\":\"木逐\"}],\"weight\":10},{\"charId\":\"cd6bdc13\",\"unicodeChar\":\"㮩\",\"unicodeCodePoint\":\"3BA9\",\"pinYinChars\":[{\"char\":\"XI1\"}],\"splitChars\":[{\"char\":\"木息\"}],\"weight\":10},{\"charId\":\"16958bce\",\"unicodeChar\":\"㮟\",\"unicodeCodePoint\":\"3B9F\",\"pinYinChars\":[{\"char\":\"NIAN3\"}],\"splitChars\":[{\"char\":\"林石\"}],\"weight\":10},{\"charId\":\"ad585e0f\",\"unicodeChar\":\"㮊\",\"unicodeCodePoint\":\"3B8A\",\"pinYinChars\":[{\"char\":\"MAO4\"}],\"splitChars\":[{\"char\":\"林予\"}],\"weight\":10},{\"charId\":\"f88a3d48\",\"unicodeChar\":\"㭪\",\"unicodeCodePoint\":\"3B6A\",\"pinYinChars\":[{\"char\":\"FU1\"}],\"splitChars\":[{\"char\":\"木甫\"}],\"weight\":10},{\"charId\":\"3f87ea77\",\"unicodeChar\":\"㭫\",\"unicodeCodePoint\":\"3B6B\",\"pinYinChars\":[{\"char\":\"CUO2\"}],\"splitChars\":[{\"char\":\"木坐\"}],\"weight\":10},{\"charId\":\"080b3451\",\"unicodeChar\":\"㻍\",\"unicodeCodePoint\":\"3ECD\",\"pinYinChars\":[{\"char\":\"WU2\"}],\"splitChars\":[{\"char\":\"王吴\"}],\"weight\":10},{\"charId\":\"4fc57d5b\",\"unicodeChar\":\"㻇\",\"unicodeCodePoint\":\"3EC7\",\"pinYinChars\":[{\"char\":\"QUAN2\"}],\"splitChars\":[{\"char\":\"王全\"}],\"weight\":10},{\"charId\":\"b6239716\",\"unicodeChar\":\"㻂\",\"unicodeCodePoint\":\"3EC2\",\"pinYinChars\":[{\"char\":\"PING2\"}],\"splitChars\":[{\"char\":\"王并\"}],\"weight\":10},{\"charId\":\"c952af40\",\"unicodeChar\":\"㹧\",\"unicodeCodePoint\":\"3E67\",\"pinYinChars\":[{\"char\":\"YANG1\"}],\"splitChars\":[{\"char\":\"犭央\"}],\"weight\":10},{\"charId\":\"f00362ec\",\"unicodeChar\":\"㷬\",\"unicodeCodePoint\":\"3DEC\",\"pinYinChars\":[{\"char\":\"MO4\"}],\"splitChars\":[{\"char\":\"火莫\"}],\"weight\":10},{\"charId\":\"c1613bd1\",\"unicodeChar\":\"㷒\",\"unicodeCodePoint\":\"3DD2\",\"pinYinChars\":[{\"char\":\"YU2\"}],\"splitChars\":[{\"char\":\"火禺\"}],\"weight\":10},{\"charId\":\"6bdb9397\",\"unicodeChar\":\"㶿\",\"unicodeCodePoint\":\"3DBF\",\"pinYinChars\":[{\"char\":\"BO2\"}],\"splitChars\":[{\"char\":\"火孛\"}],\"weight\":10},{\"charId\":\"015380ca\",\"unicodeChar\":\"㶴\",\"unicodeCodePoint\":\"3DB4\",\"pinYinChars\":[{\"char\":\"CHI3\"}],\"splitChars\":[{\"char\":\"火多\"}],\"weight\":10},{\"charId\":\"cbeaec32\",\"unicodeChar\":\"㶬\",\"unicodeCodePoint\":\"3DAC\",\"pinYinChars\":[{\"char\":\"MO4\"}],\"splitChars\":[{\"char\":\"火末\"}],\"weight\":10},{\"charId\":\"fd556233\",\"unicodeChar\":\"𣳤\",\"unicodeCodePoint\":\"23CE4\",\"pinYinChars\":[{\"char\":\"ZHAN4\"}],\"splitChars\":[{\"char\":\"氵土\"}],\"weight\":10},{\"charId\":\"02abe87c\",\"unicodeChar\":\"𣳃\",\"unicodeCodePoint\":\"23CC3\",\"pinYinChars\":[{\"char\":\"JI1\"}],\"splitChars\":[{\"char\":\"氵士\"}],\"weight\":10},{\"charId\":\"30381d62\",\"unicodeChar\":\"𣲭\",\"unicodeCodePoint\":\"23CAD\",\"pinYinChars\":[{\"char\":\"MAO2\"}],\"splitChars\":[{\"char\":\"氵毛\"}],\"weight\":10},{\"charId\":\"c785e6ef\",\"unicodeChar\":\"𣱼\",\"unicodeCodePoint\":\"23C7C\",\"pinYinChars\":[{\"char\":\"LE4\"}],\"splitChars\":[{\"char\":\"氵刀\"}],\"weight\":10},{\"charId\":\"73b8f8ae\",\"unicodeChar\":\"龿\",\"unicodeCodePoint\":\"9FBF\",\"pinYinChars\":[{\"char\":\"JIA1\"}],\"splitChars\":[{\"char\":\"艹佳\"}],\"weight\":10},{\"charId\":\"ddae9cf4\",\"unicodeChar\":\"𣭠\",\"unicodeCodePoint\":\"23B60\",\"pinYinChars\":[{\"char\":\"RU2\"}],\"splitChars\":[{\"char\":\"如毛\"}],\"weight\":10},{\"charId\":\"7a2c907c\",\"unicodeChar\":\"𫈒\",\"unicodeCodePoint\":\"2B212\",\"pinYinChars\":[{\"char\":\"BIAO3\"}],\"splitChars\":[{\"char\":\"艹表\"}],\"weight\":10},{\"charId\":\"f9551b77\",\"unicodeChar\":\"𣴙\",\"unicodeCodePoint\":\"23D19\",\"pinYinChars\":[{\"char\":\"CHI4\"}],\"splitChars\":[{\"char\":\"氵多\"}],\"weight\":10},{\"charId\":\"54ada9c8\",\"unicodeChar\":\"𣴓\",\"unicodeCodePoint\":\"23D13\",\"pinYinChars\":[{\"char\":\"JIAN4\"}],\"splitChars\":[{\"char\":\"氵件\"}],\"weight\":10},{\"charId\":\"e0c0cb3c\",\"unicodeChar\":\"𣣣\",\"unicodeCodePoint\":\"238E3\",\"pinYinChars\":[{\"char\":\"DIAN4\"}],\"splitChars\":[{\"char\":\"尸欠\"}],\"weight\":10},{\"charId\":\"d577bd39\",\"unicodeChar\":\"𣬂\",\"unicodeCodePoint\":\"23B02\",\"pinYinChars\":[{\"char\":\"GUAN4\"}],\"splitChars\":[{\"char\":\"比干\"}],\"weight\":10},{\"charId\":\"2ed6bd3c\",\"unicodeChar\":\"𫉃\",\"unicodeCodePoint\":\"2B243\",\"pinYinChars\":[{\"char\":\"LI4\"}],\"splitChars\":[{\"char\":\"艹利(浰)\"}],\"weight\":10},{\"charId\":\"04c6b0ae\",\"unicodeChar\":\"𬝚\",\"unicodeCodePoint\":\"2C75A\",\"pinYinChars\":[{\"char\":\"SU4\"}],\"splitChars\":[{\"char\":\"艹素\"}],\"weight\":10},{\"charId\":\"fc374b54\",\"unicodeChar\":\"𣸥\",\"unicodeCodePoint\":\"23E25\",\"pinYinChars\":[{\"char\":\"YAN4\"}],\"splitChars\":[{\"char\":\"氵彦\"}],\"weight\":10},{\"charId\":\"950114e6\",\"unicodeChar\":\"𬞸\",\"unicodeCodePoint\":\"2C7B8\",\"pinYinChars\":[{\"char\":\"KUAN1\"}],\"splitChars\":[{\"char\":\"艹見\"}],\"weight\":10},{\"charId\":\"3f1f1507\",\"unicodeChar\":\"𫉯\",\"unicodeCodePoint\":\"2B26F\",\"pinYinChars\":[{\"char\":\"HUO4\"}],\"splitChars\":[{\"char\":\"艹()又\"}],\"weight\":10},{\"charId\":\"64004476\",\"unicodeChar\":\"𣵡\",\"unicodeCodePoint\":\"23D61\",\"pinYinChars\":[{\"char\":\"HAN4\"}],\"splitChars\":[{\"char\":\"氵旱\"}],\"weight\":10},{\"charId\":\"f12f479e\",\"unicodeChar\":\"𬞦\",\"unicodeCodePoint\":\"2C7A6\",\"pinYinChars\":[{\"char\":\"YI2\"}],\"splitChars\":[{\"char\":\"艹()廾\"}],\"weight\":10},{\"charId\":\"d11fd3b1\",\"unicodeChar\":\"𣷿\",\"unicodeCodePoint\":\"23DFF\",\"pinYinChars\":[{\"char\":\"TUO3\"}],\"splitChars\":[{\"char\":\"氵月\"}],\"weight\":10},{\"charId\":\"b8d3ea33\",\"unicodeChar\":\"𣻼\",\"unicodeCodePoint\":\"23EFC\",\"pinYinChars\":[{\"char\":\"HAO2\"}],\"splitChars\":[{\"char\":\"氵毫\"}],\"weight\":10},{\"charId\":\"b161ffad\",\"unicodeChar\":\"𣻐\",\"unicodeCodePoint\":\"23ED0\",\"pinYinChars\":[{\"char\":\"JU1\"}],\"splitChars\":[{\"char\":\"氵且\"}],\"weight\":10},{\"charId\":\"e8581502\",\"unicodeChar\":\"𣶶\",\"unicodeCodePoint\":\"23DB6\",\"pinYinChars\":[{\"char\":\"CAI3\"}],\"splitChars\":[{\"char\":\"氵采\"}],\"weight\":10},{\"charId\":\"adece15f\",\"unicodeChar\":\"𣶏\",\"unicodeCodePoint\":\"23D8F\",\"pinYinChars\":[{\"char\":\"JIE1\"}],\"splitChars\":[{\"char\":\"氵疌\"}],\"weight\":10},{\"charId\":\"2426e8f9\",\"unicodeChar\":\"𣶋\",\"unicodeCodePoint\":\"23D8B\",\"pinYinChars\":[{\"char\":\"ZHE4\"}],\"splitChars\":[{\"char\":\"氵炙\"}],\"weight\":10},{\"charId\":\"e0df76d2\",\"unicodeChar\":\"𬝒\",\"unicodeCodePoint\":\"2C752\",\"pinYinChars\":[{\"char\":\"LI4\"}],\"splitChars\":[{\"char\":\"艹俐\"}],\"weight\":10},{\"charId\":\"c7e8e945\",\"unicodeChar\":\"𬝎\",\"unicodeCodePoint\":\"2C74E\",\"pinYinChars\":[{\"char\":\"RUI4\"}],\"splitChars\":[{\"char\":\"艹皿\"}],\"weight\":10},{\"charId\":\"a250af4b\",\"unicodeChar\":\"𣲒\",\"unicodeCodePoint\":\"23C92\",\"pinYinChars\":[{\"char\":\"LI4\"}],\"splitChars\":[{\"char\":\"氵力\"}],\"weight\":10},{\"charId\":\"16ec05be\",\"unicodeChar\":\"𣱽\",\"unicodeCodePoint\":\"23C7D\",\"pinYinChars\":[{\"char\":\"ZHEN3\"}],\"splitChars\":[{\"char\":\"氵乃\"}],\"weight\":10},{\"charId\":\"ce838ac0\",\"unicodeChar\":\"𣴥\",\"unicodeCodePoint\":\"23D25\",\"pinYinChars\":[{\"char\":\"KUANG2\"}],\"splitChars\":[{\"char\":\"氵狂\"}],\"weight\":10},{\"charId\":\"6d3b2a2b\",\"unicodeChar\":\"𫉟\",\"unicodeCodePoint\":\"2B25F\",\"pinYinChars\":[{\"char\":\"JUN1\"}],\"splitChars\":[{\"char\":\"艹鈞\"}],\"weight\":10},{\"charId\":\"2ae31a32\",\"unicodeChar\":\"𣴞\",\"unicodeCodePoint\":\"23D1E\",\"pinYinChars\":[{\"char\":\"BEN4\"}],\"splitChars\":[{\"char\":\"氵土\"}],\"weight\":10},{\"charId\":\"06ac3028\",\"unicodeChar\":\"𫉔\",\"unicodeCodePoint\":\"2B254\",\"pinYinChars\":[{\"char\":\"WEI3\"}],\"splitChars\":[{\"char\":\"艹偉\"}],\"weight\":10},{\"charId\":\"f3a0027b\",\"unicodeChar\":\"𣷫\",\"unicodeCodePoint\":\"23DEB\",\"pinYinChars\":[{\"char\":\"SU4\"}],\"splitChars\":[{\"char\":\"氵放\"}],\"weight\":10},{\"charId\":\"47641682\",\"unicodeChar\":\"𬢲\",\"unicodeCodePoint\":\"2C8B2\",\"pinYinChars\":[{\"char\":\"HAN2\"}],\"splitChars\":[{\"char\":\"言函\"}],\"weight\":10},{\"charId\":\"d1b1e1c5\",\"unicodeChar\":\"𫌶\",\"unicodeCodePoint\":\"2B336\",\"pinYinChars\":[{\"char\":\"PI1\"}],\"splitChars\":[{\"char\":\"言丕\"}],\"weight\":10},{\"charId\":\"dfc9b4fd\",\"unicodeChar\":\"𤆞\",\"unicodeCodePoint\":\"2419E\",\"pinYinChars\":[{\"char\":\"XU4\"}],\"splitChars\":[{\"char\":\"火勿\"}],\"weight\":10},{\"charId\":\"dd8da4d0\",\"unicodeChar\":\"𤆃\",\"unicodeCodePoint\":\"24183\",\"pinYinChars\":[{\"char\":\"TAI2\"}],\"splitChars\":[{\"char\":\"厶火\"}],\"weight\":10},{\"charId\":\"e29e3508\",\"unicodeChar\":\"𤄖\",\"unicodeCodePoint\":\"24116\",\"pinYinChars\":[{\"char\":\"CA1\"}],\"splitChars\":[{\"char\":\"氵雜\"}],\"weight\":10},{\"charId\":\"15be9b20\",\"unicodeChar\":\"𬤕\",\"unicodeCodePoint\":\"2C915\",\"pinYinChars\":[{\"char\":\"TA1\"}],\"splitChars\":[{\"char\":\"讠塌𦐇\"}],\"weight\":10},{\"charId\":\"b0c3e545\",\"unicodeChar\":\"𤃈\",\"unicodeCodePoint\":\"240C8\",\"pinYinChars\":[{\"char\":\"NANG3\"}],\"splitChars\":[{\"char\":\"氵囊\"}],\"weight\":10},{\"charId\":\"46e25891\",\"unicodeChar\":\"𫍲\",\"unicodeCodePoint\":\"2B372\",\"pinYinChars\":[{\"char\":\"XIAO3\"}],\"splitChars\":[{\"char\":\"讠叟\"}],\"weight\":10},{\"charId\":\"2f6a53f6\",\"unicodeChar\":\"𤁪\",\"unicodeCodePoint\":\"2406A\",\"pinYinChars\":[{\"char\":\"HUA2\"}],\"splitChars\":[{\"char\":\"活頁\"}],\"weight\":10},{\"charId\":\"d6a5cac8\",\"unicodeChar\":\"𫊉\",\"unicodeCodePoint\":\"2B289\",\"pinYinChars\":[{\"char\":\"SE4\"}],\"splitChars\":[{\"char\":\"艹止(澁)\"}],\"weight\":10},{\"charId\":\"3e55f031\",\"unicodeChar\":\"𬟇\",\"unicodeCodePoint\":\"2C7C7\",\"pinYinChars\":[{\"char\":\"YUN4\"}],\"splitChars\":[{\"char\":\"艹昷\"}],\"weight\":10},{\"charId\":\"7bc8e33a\",\"unicodeChar\":\"𣾜\",\"unicodeCodePoint\":\"23F9C\",\"pinYinChars\":[{\"char\":\"MI\"}],\"splitChars\":[{\"char\":\"氵淼\"}],\"weight\":10},{\"charId\":\"48e46ea8\",\"unicodeChar\":\"𫋳\",\"unicodeCodePoint\":\"2B2F3\",\"pinYinChars\":[{\"char\":\"FANG1\"}],\"splitChars\":[{\"char\":\"衤方\"}],\"weight\":10},{\"charId\":\"c860cd76\",\"unicodeChar\":\"𣽸\",\"unicodeCodePoint\":\"23F78\",\"pinYinChars\":[{\"char\":\"JIAO4\"}],\"splitChars\":[{\"char\":\"氵窖\"}],\"weight\":10},{\"charId\":\"94e83b2b\",\"unicodeChar\":\"𬣡\",\"unicodeCodePoint\":\"2C8E1\",\"pinYinChars\":[{\"char\":\"JIAN4\"}],\"splitChars\":[{\"char\":\"讠戋\"}],\"weight\":10},{\"charId\":\"476f10d3\",\"unicodeChar\":\"𣽛\",\"unicodeCodePoint\":\"23F5B\",\"pinYinChars\":[{\"char\":\"ZHA2\"}],\"splitChars\":[{\"char\":\"氵答\"}],\"weight\":10},{\"charId\":\"ed68fd7e\",\"unicodeChar\":\"𤂶\",\"unicodeCodePoint\":\"240B6\",\"pinYinChars\":[{\"char\":\"LIN4\"}],\"splitChars\":[{\"char\":\"氵隹\"}],\"weight\":10},{\"charId\":\"cb5b0386\",\"unicodeChar\":\"𬤊\",\"unicodeCodePoint\":\"2C90A\",\"pinYinChars\":[{\"char\":\"SHI4\"}],\"splitChars\":[{\"char\":\"讠是\"}],\"weight\":10},{\"charId\":\"558f201b\",\"unicodeChar\":\"𬤇\",\"unicodeCodePoint\":\"2C907\",\"pinYinChars\":[{\"char\":\"YIN1\"}],\"splitChars\":[{\"char\":\"讠土\"}],\"weight\":10},{\"charId\":\"63394b64\",\"unicodeChar\":\"𬤁\",\"unicodeCodePoint\":\"2C901\",\"pinYinChars\":[{\"char\":\"TAO2\"}],\"splitChars\":[{\"char\":\"讠匋\"}],\"weight\":10},{\"charId\":\"07fa0f9d\",\"unicodeChar\":\"𬨎\",\"unicodeCodePoint\":\"2CA0E\",\"pinYinChars\":[{\"char\":\"YOU2\"}],\"splitChars\":[{\"char\":\"车酋\"}],\"weight\":10},{\"charId\":\"d9f56bc2\",\"unicodeChar\":\"𫏴\",\"unicodeCodePoint\":\"2B3F4\",\"pinYinChars\":[{\"char\":\"JU2\"}],\"splitChars\":[{\"char\":\"車白\"}],\"weight\":10},{\"charId\":\"66f28728\",\"unicodeChar\":\"𫏬\",\"unicodeCodePoint\":\"2B3EC\",\"pinYinChars\":[{\"char\":\"LIA1\"}],\"splitChars\":[{\"char\":\"身身\"}],\"weight\":10},{\"charId\":\"d0a0e396\",\"unicodeChar\":\"𤇕\",\"unicodeCodePoint\":\"241D5\",\"pinYinChars\":[{\"char\":\"QI\"}],\"splitChars\":[{\"char\":\"禾灬\"}],\"weight\":10},{\"charId\":\"9526caad\",\"unicodeChar\":\"𬦈\",\"unicodeCodePoint\":\"2C988\",\"pinYinChars\":[{\"char\":\"TU1\"}],\"splitChars\":[{\"char\":\"走月\"}],\"weight\":10},{\"charId\":\"c66cd1b1\",\"unicodeChar\":\"𥛢\",\"unicodeCodePoint\":\"256E2\",\"pinYinChars\":[{\"char\":\"CH\"}],\"splitChars\":[{\"char\":\"礻崇\"}],\"weight\":10},{\"charId\":\"b5bf03d7\",\"unicodeChar\":\"𥛚\",\"unicodeCodePoint\":\"256DA\",\"pinYinChars\":[{\"char\":\"DI2\"}],\"splitChars\":[{\"char\":\"礻啇\"}],\"weight\":10},{\"charId\":\"dbb2c74e\",\"unicodeChar\":\"𥚷\",\"unicodeCodePoint\":\"256B7\",\"pinYinChars\":[{\"char\":\"JI4\"}],\"splitChars\":[{\"char\":\"礻胃\"}],\"weight\":10},{\"charId\":\"d6706128\",\"unicodeChar\":\"𥚊\",\"unicodeCodePoint\":\"2568A\",\"pinYinChars\":[{\"char\":\"LU4\"}],\"splitChars\":[{\"char\":\"礻坴\"}],\"weight\":10},{\"charId\":\"5f135f61\",\"unicodeChar\":\"𥙹\",\"unicodeCodePoint\":\"25679\",\"pinYinChars\":[{\"char\":\"QI\"}],\"splitChars\":[{\"char\":\"礻求\"}],\"weight\":10},{\"charId\":\"60902a1c\",\"unicodeChar\":\"𥘺\",\"unicodeCodePoint\":\"2563A\",\"pinYinChars\":[{\"char\":\"ZH\"}],\"splitChars\":[{\"char\":\"礻正\"}],\"weight\":10},{\"charId\":\"74179b15\",\"unicodeChar\":\"𥘮\",\"unicodeCodePoint\":\"2562E\",\"pinYinChars\":[{\"char\":\"JU1\"}],\"splitChars\":[{\"char\":\"礻句\"}],\"weight\":10},{\"charId\":\"c28c67da\",\"unicodeChar\":\"𥜴\",\"unicodeCodePoint\":\"25734\",\"pinYinChars\":[{\"char\":\"QIAN1\"}],\"splitChars\":[{\"char\":\"礻馬\"}],\"weight\":10},{\"charId\":\"6ec6f635\",\"unicodeChar\":\"𥘫\",\"unicodeCodePoint\":\"2562B\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"礻可\"}],\"weight\":10},{\"charId\":\"8da97f1a\",\"unicodeChar\":\"𥞧\",\"unicodeCodePoint\":\"257A7\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"禾行\"}],\"weight\":10},{\"charId\":\"433f9293\",\"unicodeChar\":\"𥣳\",\"unicodeCodePoint\":\"258F3\",\"pinYinChars\":[{\"char\":\"SH\"}],\"splitChars\":[{\"char\":\"禾審\"}],\"weight\":10},{\"charId\":\"9294352e\",\"unicodeChar\":\"𥣩\",\"unicodeCodePoint\":\"258E9\",\"pinYinChars\":[{\"char\":\"JI4\"}],\"splitChars\":[{\"char\":\"禾戈\"}],\"weight\":10},{\"charId\":\"b3a2751c\",\"unicodeChar\":\"𥢹\",\"unicodeCodePoint\":\"258B9\",\"pinYinChars\":[{\"char\":\"XIE2\"}],\"splitChars\":[{\"char\":\"禾敫\"}],\"weight\":10},{\"charId\":\"1e84e324\",\"unicodeChar\":\"𥫝\",\"unicodeCodePoint\":\"25ADD\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"竹弋\"}],\"weight\":10},{\"charId\":\"b2366802\",\"unicodeChar\":\"𥪀\",\"unicodeCodePoint\":\"25A80\",\"pinYinChars\":[{\"char\":\"BU1\"}],\"splitChars\":[{\"char\":\"立甫\"}],\"weight\":10},{\"charId\":\"bfa873f2\",\"unicodeChar\":\"𥟠\",\"unicodeCodePoint\":\"257E0\",\"pinYinChars\":[{\"char\":\"JIE1\"}],\"splitChars\":[{\"char\":\"禾皆\"}],\"weight\":10},{\"charId\":\"fe3ba49e\",\"unicodeChar\":\"𮥍\",\"unicodeCodePoint\":\"2E94D\",\"pinYinChars\":[{\"char\":\"KUN1\"}],\"splitChars\":[{\"char\":\"阝昆\"}],\"weight\":10},{\"charId\":\"86ba3810\",\"unicodeChar\":\"𥟍\",\"unicodeCodePoint\":\"257CD\",\"pinYinChars\":[{\"char\":\"FEI3\"}],\"splitChars\":[{\"char\":\"禾非\"}],\"weight\":10},{\"charId\":\"a26e4046\",\"unicodeChar\":\"𥞚\",\"unicodeCodePoint\":\"2579A\",\"pinYinChars\":[{\"char\":\"RU2\"}],\"splitChars\":[{\"char\":\"禾如\"}],\"weight\":10},{\"charId\":\"4cd822cc\",\"unicodeChar\":\"𥞊\",\"unicodeCodePoint\":\"2578A\",\"pinYinChars\":[{\"char\":\"MEI4\"}],\"splitChars\":[{\"char\":\"禾未\"}],\"weight\":10},{\"charId\":\"f7362fc1\",\"unicodeChar\":\"𥞃\",\"unicodeCodePoint\":\"25783\",\"pinYinChars\":[{\"char\":\"CHUI4\"}],\"splitChars\":[{\"char\":\"禾出\"}],\"weight\":10},{\"charId\":\"dad32926\",\"unicodeChar\":\"𥝴\",\"unicodeCodePoint\":\"25774\",\"pinYinChars\":[{\"char\":\"SH\"}],\"splitChars\":[{\"char\":\"禾冘\"}],\"weight\":10},{\"charId\":\"604a130b\",\"unicodeChar\":\"𥝦\",\"unicodeCodePoint\":\"25766\",\"pinYinChars\":[{\"char\":\"NIU3\"}],\"splitChars\":[{\"char\":\"禾丑\"}],\"weight\":10},{\"charId\":\"84e4104a\",\"unicodeChar\":\"𥝥\",\"unicodeCodePoint\":\"25765\",\"pinYinChars\":[{\"char\":\"JIE2\"}],\"splitChars\":[{\"char\":\"禾及\"}],\"weight\":10},{\"charId\":\"bf7ef6e9\",\"unicodeChar\":\"𥡅\",\"unicodeCodePoint\":\"25845\",\"pinYinChars\":[{\"char\":\"GAO1\"}],\"splitChars\":[{\"char\":\"禾本\"}],\"weight\":10},{\"charId\":\"435449a9\",\"unicodeChar\":\"𥠅\",\"unicodeCodePoint\":\"25805\",\"pinYinChars\":[{\"char\":\"HUAN4\"}],\"splitChars\":[{\"char\":\"禾奂\"}],\"weight\":10},{\"charId\":\"02374d38\",\"unicodeChar\":\"𥛷\",\"unicodeCodePoint\":\"256F7\",\"pinYinChars\":[{\"char\":\"LIN2\"}],\"splitChars\":[{\"char\":\"礻粦\"}],\"weight\":10},{\"charId\":\"0d2237e7\",\"unicodeChar\":\"𫣅\",\"unicodeCodePoint\":\"2B8C5\",\"pinYinChars\":[{\"char\":\"KUI2\"}],\"splitChars\":[{\"char\":\"亻豈\"}],\"weight\":10},{\"charId\":\"835baeb8\",\"unicodeChar\":\"𥛯\",\"unicodeCodePoint\":\"256EF\",\"pinYinChars\":[{\"char\":\"JUE2\"}],\"splitChars\":[{\"char\":\"礻矞\"}],\"weight\":10},{\"charId\":\"4e004ef1\",\"unicodeChar\":\"𠊄\",\"unicodeCodePoint\":\"20284\",\"pinYinChars\":[{\"char\":\"QIN2\"}],\"splitChars\":[{\"char\":\"亻金\"}],\"weight\":10},{\"charId\":\"15c0d4f2\",\"unicodeChar\":\"𥮤\",\"unicodeCodePoint\":\"25BA4\",\"pinYinChars\":[{\"char\":\"NIE4\"}],\"splitChars\":[{\"char\":\"竹隶\"}],\"weight\":10},{\"charId\":\"8d6b0bfb\",\"unicodeChar\":\"𠋥\",\"unicodeCodePoint\":\"202E5\",\"pinYinChars\":[{\"char\":\"MEI2\"}],\"splitChars\":[{\"char\":\"亻眉\"}],\"weight\":10},{\"charId\":\"d4ad9c85\",\"unicodeChar\":\"𬝌\",\"unicodeCodePoint\":\"2C74C\",\"pinYinChars\":[{\"char\":\"BO1\"}],\"splitChars\":[{\"char\":\"艹柏\"}],\"weight\":10},{\"charId\":\"22a78759\",\"unicodeChar\":\"𠉄\",\"unicodeCodePoint\":\"20244\",\"pinYinChars\":[{\"char\":\"BI4\"}],\"splitChars\":[{\"char\":\"亻辛\"}],\"weight\":10},{\"charId\":\"657f0a2d\",\"unicodeChar\":\"𥭡\",\"unicodeCodePoint\":\"25B61\",\"pinYinChars\":[{\"char\":\"ZHI4\"}],\"splitChars\":[{\"char\":\"竹志\"}],\"weight\":10},{\"charId\":\"28cd2a64\",\"unicodeChar\":\"𥳾\",\"unicodeCodePoint\":\"25CFE\",\"pinYinChars\":[{\"char\":\"GOU1\"}],\"splitChars\":[{\"char\":\"竹鈞\"}],\"weight\":10},{\"charId\":\"cd456a73\",\"unicodeChar\":\"𥳕\",\"unicodeCodePoint\":\"25CD5\",\"pinYinChars\":[{\"char\":\"SHU1\"}],\"splitChars\":[{\"char\":\"竹舒\"}],\"weight\":10},{\"charId\":\"f09bed47\",\"unicodeChar\":\"𥳇\",\"unicodeCodePoint\":\"25CC7\",\"pinYinChars\":[{\"char\":\"FU4\"}],\"splitChars\":[{\"char\":\"竹复\"}],\"weight\":10},{\"charId\":\"cf3132a5\",\"unicodeChar\":\"𥲑\",\"unicodeCodePoint\":\"25C91\",\"pinYinChars\":[{\"char\":\"MAN2\"}],\"splitChars\":[{\"char\":\"竹曼\"}],\"weight\":10},{\"charId\":\"b284c94b\",\"unicodeChar\":\"𥿩\",\"unicodeCodePoint\":\"25FE9\",\"pinYinChars\":[{\"char\":\"ZI4\"}],\"splitChars\":[{\"char\":\"次糸\"}],\"weight\":10},{\"charId\":\"f9432202\",\"unicodeChar\":\"𥿝\",\"unicodeCodePoint\":\"25FDD\",\"pinYinChars\":[{\"char\":\"DAI4\"}],\"splitChars\":[{\"char\":\"代糸\"}],\"weight\":10},{\"charId\":\"e51d4d38\",\"unicodeChar\":\"𥾋\",\"unicodeCodePoint\":\"25F8B\",\"pinYinChars\":[{\"char\":\"RENG2\"}],\"splitChars\":[{\"char\":\"糹乃\"}],\"weight\":10},{\"charId\":\"2f26278f\",\"unicodeChar\":\"𥽬\",\"unicodeCodePoint\":\"25F6C\",\"pinYinChars\":[{\"char\":\"NIANG4\"}],\"splitChars\":[{\"char\":\"米襄\"}],\"weight\":10},{\"charId\":\"0468ab75\",\"unicodeChar\":\"𥼁\",\"unicodeCodePoint\":\"25F01\",\"pinYinChars\":[{\"char\":\"LV3\"}],\"splitChars\":[{\"char\":\"米率\"}],\"weight\":10},{\"charId\":\"025b7200\",\"unicodeChar\":\"𠒣\",\"unicodeCodePoint\":\"204A3\",\"pinYinChars\":[{\"char\":\"XING2\"}],\"splitChars\":[{\"char\":\"先行\"}],\"weight\":10},{\"charId\":\"ea04f94d\",\"unicodeChar\":\"𠓰\",\"unicodeCodePoint\":\"204F0\",\"pinYinChars\":[{\"char\":\"SHUANG1\"}],\"splitChars\":[{\"char\":\"全双\"}],\"weight\":10},{\"charId\":\"37ad6590\",\"unicodeChar\":\"𥯔\",\"unicodeCodePoint\":\"25BD4\",\"pinYinChars\":[{\"char\":\"JU3\"}],\"splitChars\":[{\"char\":\"竹禹\"}],\"weight\":10},{\"charId\":\"37e4b763\",\"unicodeChar\":\"𠍐\",\"unicodeCodePoint\":\"20350\",\"pinYinChars\":[{\"char\":\"LENG2\"}],\"splitChars\":[{\"char\":\"令狐\"}],\"weight\":10},{\"charId\":\"f0c4ea8b\",\"unicodeChar\":\"𠎶\",\"unicodeCodePoint\":\"203B6\",\"pinYinChars\":[{\"char\":\"ZAI3\"}],\"splitChars\":[{\"char\":\"未人\"}],\"weight\":10},{\"charId\":\"72052fa1\",\"unicodeChar\":\"𥮬\",\"unicodeCodePoint\":\"25BAC\",\"pinYinChars\":[{\"char\":\"XI4\"}],\"splitChars\":[{\"char\":\"竹易\"}],\"weight\":10},{\"charId\":\"73e93c56\",\"unicodeChar\":\"𥦨\",\"unicodeCodePoint\":\"259A8\",\"pinYinChars\":[{\"char\":\"KE4\"}],\"splitChars\":[{\"char\":\"穴金\"}],\"weight\":10},{\"charId\":\"b5796fa7\",\"unicodeChar\":\"𥭞\",\"unicodeCodePoint\":\"25B5E\",\"pinYinChars\":[{\"char\":\"YUAN4\"}],\"splitChars\":[{\"char\":\"竹肙\"}],\"weight\":10},{\"charId\":\"33b3121b\",\"unicodeChar\":\"𥬯\",\"unicodeCodePoint\":\"25B2F\",\"pinYinChars\":[{\"char\":\"KAO3\"}],\"splitChars\":[{\"char\":\"竹考\"}],\"weight\":10},{\"charId\":\"3ef193fa\",\"unicodeChar\":\"𥬝\",\"unicodeCodePoint\":\"25B1D\",\"pinYinChars\":[{\"char\":\"BAI2\"}],\"splitChars\":[{\"char\":\"竹白\"}],\"weight\":10},{\"charId\":\"0f553876\",\"unicodeChar\":\"𥬉\",\"unicodeCodePoint\":\"25B09\",\"pinYinChars\":[{\"char\":\"GOU1\"}],\"splitChars\":[{\"char\":\"竹勾\"}],\"weight\":10},{\"charId\":\"cf8631f0\",\"unicodeChar\":\"𥫸\",\"unicodeCodePoint\":\"25AF8\",\"pinYinChars\":[{\"char\":\"SHUI3\"}],\"splitChars\":[{\"char\":\"竹水\"}],\"weight\":10},{\"charId\":\"31155e2d\",\"unicodeChar\":\"𥱤\",\"unicodeCodePoint\":\"25C64\",\"pinYinChars\":[{\"char\":\"XIU1\"}],\"splitChars\":[{\"char\":\"竹修\"}],\"weight\":10},{\"charId\":\"4c12f20c\",\"unicodeChar\":\"𥯪\",\"unicodeCodePoint\":\"25BEA\",\"pinYinChars\":[{\"char\":\"SOU4\"}],\"splitChars\":[{\"char\":\"竹奏\"}],\"weight\":10},{\"charId\":\"e7c50a58\",\"unicodeChar\":\"𥯤\",\"unicodeCodePoint\":\"25BE4\",\"pinYinChars\":[{\"char\":\"WEI3\"}],\"splitChars\":[{\"char\":\"竹韋\"}],\"weight\":10},{\"charId\":\"e9124c18\",\"unicodeChar\":\"𥯕\",\"unicodeCodePoint\":\"25BD5\",\"pinYinChars\":[{\"char\":\"DANG4\"}],\"splitChars\":[{\"char\":\"竹昜\"}],\"weight\":10},{\"charId\":\"60598c64\",\"unicodeChar\":\"𥧓\",\"unicodeCodePoint\":\"259D3\",\"pinYinChars\":[{\"char\":\"MA3\"}],\"splitChars\":[{\"char\":\"穴馬\"}],\"weight\":10},{\"charId\":\"c5d13461\",\"unicodeChar\":\"𥧏\",\"unicodeCodePoint\":\"259CF\",\"pinYinChars\":[{\"char\":\"CEN3\"}],\"splitChars\":[{\"char\":\"穴者\"}],\"weight\":10},{\"charId\":\"c7225acf\",\"unicodeChar\":\"𡊰\",\"unicodeCodePoint\":\"212B0\",\"pinYinChars\":[{\"char\":\"TIAN2\"}],\"splitChars\":[{\"char\":\"土田\"}],\"weight\":10},{\"charId\":\"230e9390\",\"unicodeChar\":\"𦁤\",\"unicodeCodePoint\":\"26064\",\"pinYinChars\":[{\"char\":\"NIAN4\"}],\"splitChars\":[{\"char\":\"糹念\"}],\"weight\":10},{\"charId\":\"f2f0cb65\",\"unicodeChar\":\"𡊤\",\"unicodeCodePoint\":\"212A4\",\"pinYinChars\":[{\"char\":\"YING4\"}],\"splitChars\":[{\"char\":\"土用\"}],\"weight\":10},{\"charId\":\"3127a7e7\",\"unicodeChar\":\"𡊚\",\"unicodeCodePoint\":\"2129A\",\"pinYinChars\":[{\"char\":\"PO1\"}],\"splitChars\":[{\"char\":\"土白\"}],\"weight\":10},{\"charId\":\"7a21016f\",\"unicodeChar\":\"𠛼\",\"unicodeCodePoint\":\"206FC\",\"pinYinChars\":[{\"char\":\"JING1\"}],\"splitChars\":[{\"char\":\"并刂\"}],\"weight\":10},{\"charId\":\"873fd6d2\",\"unicodeChar\":\"𦆆\",\"unicodeCodePoint\":\"26186\",\"pinYinChars\":[{\"char\":\"LIAN2\"}],\"splitChars\":[{\"char\":\"糹廉\"}],\"weight\":10},{\"charId\":\"79971a53\",\"unicodeChar\":\"𠚵\",\"unicodeCodePoint\":\"206B5\",\"pinYinChars\":[{\"char\":\"JU4\"}],\"splitChars\":[{\"char\":\"及刂\"}],\"weight\":10},{\"charId\":\"f95f5f4f\",\"unicodeChar\":\"𦅼\",\"unicodeCodePoint\":\"2617C\",\"pinYinChars\":[{\"char\":\"DAN4\"}],\"splitChars\":[{\"char\":\"糹詹\"}],\"weight\":10},{\"charId\":\"c1ae2ed6\",\"unicodeChar\":\"𠛀\",\"unicodeCodePoint\":\"206C0\",\"pinYinChars\":[{\"char\":\"ZHONG1\"}],\"splitChars\":[{\"char\":\"公刂\"}],\"weight\":10},{\"charId\":\"8979fe2f\",\"unicodeChar\":\"𦅣\",\"unicodeCodePoint\":\"26163\",\"pinYinChars\":[{\"char\":\"ZH\"}],\"splitChars\":[{\"char\":\"糹攵\"}],\"weight\":10},{\"charId\":\"1ec4bec7\",\"unicodeChar\":\"𡉦\",\"unicodeCodePoint\":\"21266\",\"pinYinChars\":[{\"char\":\"WU3\"}],\"splitChars\":[{\"char\":\"土午\"}],\"weight\":10},{\"charId\":\"0f553b11\",\"unicodeChar\":\"𦏸\",\"unicodeCodePoint\":\"263F8\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"羽也\"}],\"weight\":10},{\"charId\":\"a6454840\",\"unicodeChar\":\"𡉫\",\"unicodeCodePoint\":\"2126B\",\"pinYinChars\":[{\"char\":\"TUN2\"}],\"splitChars\":[{\"char\":\"屯土\"}],\"weight\":10},{\"charId\":\"d8c2ce68\",\"unicodeChar\":\"𡉑\",\"unicodeCodePoint\":\"21251\",\"pinYinChars\":[{\"char\":\"DA1\"}],\"splitChars\":[{\"char\":\"土大\"}],\"weight\":10},{\"charId\":\"984259b6\",\"unicodeChar\":\"𡉥\",\"unicodeCodePoint\":\"21265\",\"pinYinChars\":[{\"char\":\"CHONG1\"}],\"splitChars\":[{\"char\":\"土中\"}],\"weight\":10},{\"charId\":\"02d7191b\",\"unicodeChar\":\"𦌊\",\"unicodeCodePoint\":\"2630A\",\"pinYinChars\":[{\"char\":\"SU4\"}],\"splitChars\":[{\"char\":\"四欠\"}],\"weight\":10},{\"charId\":\"167bf169\",\"unicodeChar\":\"𦋅\",\"unicodeCodePoint\":\"262C5\",\"pinYinChars\":[{\"char\":\"XIE2\"}],\"splitChars\":[{\"char\":\"四圭\"}],\"weight\":10},{\"charId\":\"7b52c12a\",\"unicodeChar\":\"𡊿\",\"unicodeCodePoint\":\"212BF\",\"pinYinChars\":[{\"char\":\"CHONG1\"}],\"splitChars\":[{\"char\":\"土充\"}],\"weight\":10},{\"charId\":\"897190ab\",\"unicodeChar\":\"𡋎\",\"unicodeCodePoint\":\"212CE\",\"pinYinChars\":[{\"char\":\"LAO3\"}],\"splitChars\":[{\"char\":\"土老\"}],\"weight\":10},{\"charId\":\"111d848a\",\"unicodeChar\":\"𡊱\",\"unicodeCodePoint\":\"212B1\",\"pinYinChars\":[{\"char\":\"ZHAO1\"}],\"splitChars\":[{\"char\":\"土召\"}],\"weight\":10},{\"charId\":\"bfc25cbc\",\"unicodeChar\":\"𡊻\",\"unicodeCodePoint\":\"212BB\",\"pinYinChars\":[{\"char\":\"LIE4\"}],\"splitChars\":[{\"char\":\"土列\"}],\"weight\":10},{\"charId\":\"f247007a\",\"unicodeChar\":\"𦂄\",\"unicodeCodePoint\":\"26084\",\"pinYinChars\":[{\"char\":\"KAI1\"}],\"splitChars\":[{\"char\":\"糹皆\"}],\"weight\":10},{\"charId\":\"3e0e47eb\",\"unicodeChar\":\"𠰉\",\"unicodeCodePoint\":\"20C09\",\"pinYinChars\":[{\"char\":\"CHAO1\"}],\"splitChars\":[{\"char\":\"口召\"}],\"weight\":10},{\"charId\":\"a81c8b47\",\"unicodeChar\":\"𥵧\",\"unicodeCodePoint\":\"25D67\",\"pinYinChars\":[{\"char\":\"QIN3\"}],\"splitChars\":[{\"char\":\"竹盡\"}],\"weight\":10},{\"charId\":\"f094f733\",\"unicodeChar\":\"𠰩\",\"unicodeCodePoint\":\"20C29\",\"pinYinChars\":[{\"char\":\"YONG4\"}],\"splitChars\":[{\"char\":\"口用\"}],\"weight\":10},{\"charId\":\"8cf9f693\",\"unicodeChar\":\"𥵞\",\"unicodeCodePoint\":\"25D5E\",\"pinYinChars\":[{\"char\":\"JIE2\"}],\"splitChars\":[{\"char\":\"竹截\"}],\"weight\":10},{\"charId\":\"7c8c57ed\",\"unicodeChar\":\"𠱐\",\"unicodeCodePoint\":\"20C50\",\"pinYinChars\":[{\"char\":\"YU3\"}],\"splitChars\":[{\"char\":\"口吴\"}],\"weight\":10},{\"charId\":\"44d9bff9\",\"unicodeChar\":\"𠡒\",\"unicodeCodePoint\":\"20852\",\"pinYinChars\":[{\"char\":\"DUI3\"}],\"splitChars\":[{\"char\":\"𠂤力\"}],\"weight\":10},{\"charId\":\"dc161582\",\"unicodeChar\":\"𦀕\",\"unicodeCodePoint\":\"26015\",\"pinYinChars\":[{\"char\":\"YE4\"}],\"splitChars\":[{\"char\":\"糹邑\"}],\"weight\":10},{\"charId\":\"1a31488b\",\"unicodeChar\":\"𠕽\",\"unicodeCodePoint\":\"2057D\",\"pinYinChars\":[{\"char\":\"LAN\"}],\"splitChars\":[{\"char\":\"冖水\"}],\"weight\":10},{\"charId\":\"dd60f313\",\"unicodeChar\":\"𠙶\",\"unicodeCodePoint\":\"20676\",\"pinYinChars\":[{\"char\":\"OU3\"}],\"splitChars\":[{\"char\":\"了凵\"}],\"weight\":10},{\"charId\":\"28cae6af\",\"unicodeChar\":\"𦅘\",\"unicodeCodePoint\":\"26158\",\"pinYinChars\":[{\"char\":\"JIAN4\"}],\"splitChars\":[{\"char\":\"糹間\"}],\"weight\":10},{\"charId\":\"90f8c65e\",\"unicodeChar\":\"𠕇\",\"unicodeCodePoint\":\"20547\",\"pinYinChars\":[{\"char\":\"DIAN4\"}],\"splitChars\":[{\"char\":\"冇丶\"}],\"weight\":10},{\"charId\":\"eeb08818\",\"unicodeChar\":\"𦄢\",\"unicodeCodePoint\":\"26122\",\"pinYinChars\":[{\"char\":\"YONG1\"}],\"splitChars\":[{\"char\":\"糹庸\"}],\"weight\":10},{\"charId\":\"2688dc17\",\"unicodeChar\":\"𦂕\",\"unicodeCodePoint\":\"26095\",\"pinYinChars\":[{\"char\":\"OU2\"}],\"splitChars\":[{\"char\":\"糹禺\"}],\"weight\":10},{\"charId\":\"013f4f6d\",\"unicodeChar\":\"𠵌\",\"unicodeCodePoint\":\"20D4C\",\"pinYinChars\":[{\"char\":\"YI2\"}],\"splitChars\":[{\"char\":\"口宜\"}],\"weight\":10},{\"charId\":\"c046b80a\",\"unicodeChar\":\"𠼟\",\"unicodeCodePoint\":\"20F1F\",\"pinYinChars\":[{\"char\":\"LUE4\"}],\"splitChars\":[{\"char\":\"口面\"}],\"weight\":10},{\"charId\":\"16599511\",\"unicodeChar\":\"𠳐\",\"unicodeCodePoint\":\"20CD0\",\"pinYinChars\":[{\"char\":\"BANG1\"}],\"splitChars\":[{\"char\":\"口邦\"}],\"weight\":10},{\"charId\":\"e742cc25\",\"unicodeChar\":\"𡛕\",\"unicodeCodePoint\":\"216D5\",\"pinYinChars\":[{\"char\":\"TAI4\"}],\"splitChars\":[{\"char\":\"女太\"}],\"weight\":10},{\"charId\":\"2521b859\",\"unicodeChar\":\"𡛩\",\"unicodeCodePoint\":\"216E9\",\"pinYinChars\":[{\"char\":\"LI4\"}],\"splitChars\":[{\"char\":\"女立\"}],\"weight\":10},{\"charId\":\"119dbcb9\",\"unicodeChar\":\"𡘧\",\"unicodeCodePoint\":\"21627\",\"pinYinChars\":[{\"char\":\"QIA2\"}],\"splitChars\":[{\"char\":\"大步\"}],\"weight\":10},{\"charId\":\"1f8161ef\",\"unicodeChar\":\"𦑍\",\"unicodeCodePoint\":\"2644D\",\"pinYinChars\":[{\"char\":\"XU4\"}],\"splitChars\":[{\"char\":\"或羽\"}],\"weight\":10},{\"charId\":\"3d1ffe61\",\"unicodeChar\":\"𦑋\",\"unicodeCodePoint\":\"2644B\",\"pinYinChars\":[{\"char\":\"ZU2\"}],\"splitChars\":[{\"char\":\"卒羽\"}],\"weight\":10},{\"charId\":\"79c4efaf\",\"unicodeChar\":\"𡑒\",\"unicodeCodePoint\":\"21452\",\"pinYinChars\":[{\"char\":\"GAN3\"}],\"splitChars\":[{\"char\":\"土敢\"}],\"weight\":10},{\"charId\":\"d088b558\",\"unicodeChar\":\"𡘙\",\"unicodeCodePoint\":\"21619\",\"pinYinChars\":[{\"char\":\"TAI4\"}],\"splitChars\":[{\"char\":\"大大\"}],\"weight\":10},{\"charId\":\"e7af4bfd\",\"unicodeChar\":\"𦑁\",\"unicodeCodePoint\":\"26441\",\"pinYinChars\":[{\"char\":\"ZONG1\"}],\"splitChars\":[{\"char\":\"羽夋\"}],\"weight\":10},{\"charId\":\"a8a9dd30\",\"unicodeChar\":\"𡐹\",\"unicodeCodePoint\":\"21439\",\"pinYinChars\":[{\"char\":\"EN3\"}],\"splitChars\":[{\"char\":\"土景\"}],\"weight\":10},{\"charId\":\"437adc36\",\"unicodeChar\":\"𡑄\",\"unicodeCodePoint\":\"21444\",\"pinYinChars\":[{\"char\":\"ZHANG3\"}],\"splitChars\":[{\"char\":\"土掌\"}],\"weight\":10},{\"charId\":\"e14bd9a4\",\"unicodeChar\":\"𦒘\",\"unicodeCodePoint\":\"26498\",\"pinYinChars\":[{\"char\":\"XIAN1\"}],\"splitChars\":[{\"char\":\"西羽\"}],\"weight\":10},{\"charId\":\"df0a05d6\",\"unicodeChar\":\"𡏼\",\"unicodeCodePoint\":\"213FC\",\"pinYinChars\":[{\"char\":\"AO2\"}],\"splitChars\":[{\"char\":\"土敖\"}],\"weight\":10},{\"charId\":\"9d2c8865\",\"unicodeChar\":\"𦗭\",\"unicodeCodePoint\":\"265ED\",\"pinYinChars\":[{\"char\":\"PENG2\"}],\"splitChars\":[{\"char\":\"彭耳\"}],\"weight\":10},{\"charId\":\"cc4415a9\",\"unicodeChar\":\"𡐓\",\"unicodeCodePoint\":\"21413\",\"pinYinChars\":[{\"char\":\"KANG1\"}],\"splitChars\":[{\"char\":\"土康\"}],\"weight\":10},{\"charId\":\"727d39af\",\"unicodeChar\":\"𦖽\",\"unicodeCodePoint\":\"265BD\",\"pinYinChars\":[{\"char\":\"YING2\"}],\"splitChars\":[{\"char\":\"𤇾耳\"}],\"weight\":10},{\"charId\":\"0a84e91c\",\"unicodeChar\":\"𡏞\",\"unicodeCodePoint\":\"213DE\",\"pinYinChars\":[{\"char\":\"JIANG3\"}],\"splitChars\":[{\"char\":\"土冓\"}],\"weight\":10},{\"charId\":\"39825c6d\",\"unicodeChar\":\"𦖵\",\"unicodeCodePoint\":\"265B5\",\"pinYinChars\":[{\"char\":\"NU\"}],\"splitChars\":[{\"char\":\"耳爰\"}],\"weight\":10},{\"charId\":\"fb1c038b\",\"unicodeChar\":\"𡎜\",\"unicodeCodePoint\":\"2139C\",\"pinYinChars\":[{\"char\":\"NAN2\"}],\"splitChars\":[{\"char\":\"土南\"}],\"weight\":10},{\"charId\":\"0209ec94\",\"unicodeChar\":\"𦕠\",\"unicodeCodePoint\":\"26560\",\"pinYinChars\":[{\"char\":\"JU4\"}],\"splitChars\":[{\"char\":\"耳共\"}],\"weight\":10},{\"charId\":\"19aab38d\",\"unicodeChar\":\"𡏊\",\"unicodeCodePoint\":\"213CA\",\"pinYinChars\":[{\"char\":\"QIAN1\"}],\"splitChars\":[{\"char\":\"土兼\"}],\"weight\":10},{\"charId\":\"1e3047c2\",\"unicodeChar\":\"𦔿\",\"unicodeCodePoint\":\"2653F\",\"pinYinChars\":[{\"char\":\"TIAN4\"}],\"splitChars\":[{\"char\":\"耳天\"}],\"weight\":10},{\"charId\":\"3b880b68\",\"unicodeChar\":\"𡛻\",\"unicodeCodePoint\":\"216FB\",\"pinYinChars\":[{\"char\":\"YONG3\"}],\"splitChars\":[{\"char\":\"女永\"}],\"weight\":10},{\"charId\":\"cf218bc5\",\"unicodeChar\":\"𡛼\",\"unicodeCodePoint\":\"216FC\",\"pinYinChars\":[{\"char\":\"YU4\"}],\"splitChars\":[{\"char\":\"女玉\"}],\"weight\":10},{\"charId\":\"8f6919a9\",\"unicodeChar\":\"𡍲\",\"unicodeCodePoint\":\"21372\",\"pinYinChars\":[{\"char\":\"DA1\"}],\"splitChars\":[{\"char\":\"土耳(耷)\"}],\"weight\":10},{\"charId\":\"9f72934d\",\"unicodeChar\":\"𦊓\",\"unicodeCodePoint\":\"26293\",\"pinYinChars\":[{\"char\":\"LING3\"}],\"splitChars\":[{\"char\":\"四令\"}],\"weight\":10},{\"charId\":\"148177e7\",\"unicodeChar\":\"𡍹\",\"unicodeCodePoint\":\"21379\",\"pinYinChars\":[{\"char\":\"BAI3\"}],\"splitChars\":[{\"char\":\"土拜\"}],\"weight\":10},{\"charId\":\"9838998d\",\"unicodeChar\":\"𡌢\",\"unicodeCodePoint\":\"21322\",\"pinYinChars\":[{\"char\":\"HAN4\"}],\"splitChars\":[{\"char\":\"土含\"}],\"weight\":10},{\"charId\":\"ba3fb09d\",\"unicodeChar\":\"𡌚\",\"unicodeCodePoint\":\"2131A\",\"pinYinChars\":[{\"char\":\"CHA3\"}],\"splitChars\":[{\"char\":\"土坐\"}],\"weight\":10},{\"charId\":\"d141c630\",\"unicodeChar\":\"𦆴\",\"unicodeCodePoint\":\"261B4\",\"pinYinChars\":[{\"char\":\"SH\"}],\"splitChars\":[{\"char\":\"糹絲(\"}],\"weight\":10},{\"charId\":\"631a4dda\",\"unicodeChar\":\"𦐹\",\"unicodeCodePoint\":\"26439\",\"pinYinChars\":[{\"char\":\"SHEN2\"}],\"splitChars\":[{\"char\":\"羽辛\"}],\"weight\":10},{\"charId\":\"884cff8d\",\"unicodeChar\":\"𡉽\",\"unicodeCodePoint\":\"2127D\",\"pinYinChars\":[{\"char\":\"LU4\"}],\"splitChars\":[{\"char\":\"土六\"}],\"weight\":10},{\"charId\":\"c65f2029\",\"unicodeChar\":\"𦐄\",\"unicodeCodePoint\":\"26404\",\"pinYinChars\":[{\"char\":\"HANG2\"}],\"splitChars\":[{\"char\":\"亢羽\"}],\"weight\":10},{\"charId\":\"5da25476\",\"unicodeChar\":\"𡋟\",\"unicodeCodePoint\":\"212DF\",\"pinYinChars\":[{\"char\":\"GAO4\"}],\"splitChars\":[{\"char\":\"土交\"}],\"weight\":10},{\"charId\":\"48a1feda\",\"unicodeChar\":\"𦒑\",\"unicodeCodePoint\":\"26491\",\"pinYinChars\":[{\"char\":\"YU4\"}],\"splitChars\":[{\"char\":\"矛(矞)羽\"}],\"weight\":10},{\"charId\":\"3f732993\",\"unicodeChar\":\"𡋗\",\"unicodeCodePoint\":\"212D7\",\"pinYinChars\":[{\"char\":\"WEI4\"}],\"splitChars\":[{\"char\":\"土会\"}],\"weight\":10},{\"charId\":\"c4fc542b\",\"unicodeChar\":\"𦒍\",\"unicodeCodePoint\":\"2648D\",\"pinYinChars\":[{\"char\":\"TONG2\"}],\"splitChars\":[{\"char\":\"童羽\"}],\"weight\":10},{\"charId\":\"680b66e3\",\"unicodeChar\":\"𡋙\",\"unicodeCodePoint\":\"212D9\",\"pinYinChars\":[{\"char\":\"HUI2\"}],\"splitChars\":[{\"char\":\"土回\"}],\"weight\":10},{\"charId\":\"b0c446ab\",\"unicodeChar\":\"𦑹\",\"unicodeCodePoint\":\"26479\",\"pinYinChars\":[{\"char\":\"FU2\"}],\"splitChars\":[{\"char\":\"臼羽\"}],\"weight\":10},{\"charId\":\"0a2a0c02\",\"unicodeChar\":\"𡋕\",\"unicodeCodePoint\":\"212D5\",\"pinYinChars\":[{\"char\":\"XUN2\"}],\"splitChars\":[{\"char\":\"土旬\"}],\"weight\":10},{\"charId\":\"a43d1fb3\",\"unicodeChar\":\"𦑡\",\"unicodeCodePoint\":\"26461\",\"pinYinChars\":[{\"char\":\"CHI2\"}],\"splitChars\":[{\"char\":\"是羽\"}],\"weight\":10},{\"charId\":\"98221421\",\"unicodeChar\":\"𦑠\",\"unicodeCodePoint\":\"26460\",\"pinYinChars\":[{\"char\":\"HONG1\"}],\"splitChars\":[{\"char\":\"羽皇\"}],\"weight\":10},{\"charId\":\"ff65932b\",\"unicodeChar\":\"𦑝\",\"unicodeCodePoint\":\"2645D\",\"pinYinChars\":[{\"char\":\"CHONG3\"}],\"splitChars\":[{\"char\":\"重羽\"}],\"weight\":10},{\"charId\":\"5172e189\",\"unicodeChar\":\"𦑘\",\"unicodeCodePoint\":\"26458\",\"pinYinChars\":[{\"char\":\"XIAN2\"}],\"splitChars\":[{\"char\":\"咸羽\"}],\"weight\":10},{\"charId\":\"77b048b7\",\"unicodeChar\":\"𡎚\",\"unicodeCodePoint\":\"2139A\",\"pinYinChars\":[{\"char\":\"PIAN3\"}],\"splitChars\":[{\"char\":\"土扁\"}],\"weight\":10},{\"charId\":\"110fa7fb\",\"unicodeChar\":\"𡍼\",\"unicodeCodePoint\":\"2137C\",\"pinYinChars\":[{\"char\":\"TU2\"}],\"splitChars\":[{\"char\":\"涂土\"}],\"weight\":10},{\"charId\":\"c1389c03\",\"unicodeChar\":\"𡎑\",\"unicodeCodePoint\":\"21391\",\"pinYinChars\":[{\"char\":\"AN4\"}],\"splitChars\":[{\"char\":\"土彦\"}],\"weight\":10},{\"charId\":\"9661230e\",\"unicodeChar\":\"𢆓\",\"unicodeCodePoint\":\"22193\",\"pinYinChars\":[{\"char\":\"BA1\"}],\"splitChars\":[{\"char\":\"不平\"}],\"weight\":10},{\"charId\":\"df9a9cc9\",\"unicodeChar\":\"𡺎\",\"unicodeCodePoint\":\"21E8E\",\"pinYinChars\":[{\"char\":\"CHAN2\"}],\"splitChars\":[{\"char\":\"山丶\"}],\"weight\":10},{\"charId\":\"13f39cd7\",\"unicodeChar\":\"𡼎\",\"unicodeCodePoint\":\"21F0E\",\"pinYinChars\":[{\"char\":\"YI3\"}],\"splitChars\":[{\"char\":\"山喜\"}],\"weight\":10},{\"charId\":\"d8974245\",\"unicodeChar\":\"𦙮\",\"unicodeCodePoint\":\"2666E\",\"pinYinChars\":[{\"char\":\"JU2\"}],\"splitChars\":[{\"char\":\"月穴\"}],\"weight\":10},{\"charId\":\"dd056e7b\",\"unicodeChar\":\"𦙀\",\"unicodeCodePoint\":\"26640\",\"pinYinChars\":[{\"char\":\"PAN4\"}],\"splitChars\":[{\"char\":\"月反\"}],\"weight\":10},{\"charId\":\"b407fb8b\",\"unicodeChar\":\"𡷀\",\"unicodeCodePoint\":\"21DC0\",\"pinYinChars\":[{\"char\":\"GUANG1\"}],\"splitChars\":[{\"char\":\"光山\"}],\"weight\":10},{\"charId\":\"26549899\",\"unicodeChar\":\"𡷈\",\"unicodeCodePoint\":\"21DC8\",\"pinYinChars\":[{\"char\":\"SHI4\"}],\"splitChars\":[{\"char\":\"山山\"}],\"weight\":10},{\"charId\":\"9e5d9e69\",\"unicodeChar\":\"𦘪\",\"unicodeCodePoint\":\"2662A\",\"pinYinChars\":[{\"char\":\"CHI4\"}],\"splitChars\":[{\"char\":\"月匕\"}],\"weight\":10},{\"charId\":\"d26749c9\",\"unicodeChar\":\"𡶦\",\"unicodeCodePoint\":\"21DA6\",\"pinYinChars\":[{\"char\":\"YA4\"}],\"splitChars\":[{\"char\":\"山丘\"}],\"weight\":10},{\"charId\":\"2fe6a6cd\",\"unicodeChar\":\"𡶄\",\"unicodeCodePoint\":\"21D84\",\"pinYinChars\":[{\"char\":\"BAO1\"}],\"splitChars\":[{\"char\":\"山包\"}],\"weight\":10},{\"charId\":\"2e38a6ed\",\"unicodeChar\":\"𡵅\",\"unicodeCodePoint\":\"21D45\",\"pinYinChars\":[{\"char\":\"LA4\"}],\"splitChars\":[{\"char\":\"山川\"}],\"weight\":10},{\"charId\":\"b11f4931\",\"unicodeChar\":\"𡴭\",\"unicodeCodePoint\":\"21D2D\",\"pinYinChars\":[{\"char\":\"YA4\"}],\"splitChars\":[{\"char\":\"山乙\"}],\"weight\":10},{\"charId\":\"6ada8e8e\",\"unicodeChar\":\"𡥧\",\"unicodeCodePoint\":\"21967\",\"pinYinChars\":[{\"char\":\"JIN4\"}],\"splitChars\":[{\"char\":\"子尽\"}],\"weight\":10},{\"charId\":\"7cbb4a9f\",\"unicodeChar\":\"𦔖\",\"unicodeCodePoint\":\"26516\",\"pinYinChars\":[{\"char\":\"LIAN2\"}],\"splitChars\":[{\"char\":\"耒連\"}],\"weight\":10},{\"charId\":\"4af77b09\",\"unicodeChar\":\"𦓱\",\"unicodeCodePoint\":\"264F1\",\"pinYinChars\":[{\"char\":\"GE4\"}],\"splitChars\":[{\"char\":\"耒各\"}],\"weight\":10},{\"charId\":\"f38e218c\",\"unicodeChar\":\"𡟛\",\"unicodeCodePoint\":\"217DB\",\"pinYinChars\":[{\"char\":\"PING2\"}],\"splitChars\":[{\"char\":\"女屏\"}],\"weight\":10},{\"charId\":\"0e4a1fc0\",\"unicodeChar\":\"𦓰\",\"unicodeCodePoint\":\"264F0\",\"pinYinChars\":[{\"char\":\"QUAN2\"}],\"splitChars\":[{\"char\":\"耒全\"}],\"weight\":10},{\"charId\":\"d9ac7e4a\",\"unicodeChar\":\"𡟯\",\"unicodeCodePoint\":\"217EF\",\"pinYinChars\":[{\"char\":\"BI4\"}],\"splitChars\":[{\"char\":\"女恩\"}],\"weight\":10},{\"charId\":\"981d3f69\",\"unicodeChar\":\"𦓔\",\"unicodeCodePoint\":\"264D4\",\"pinYinChars\":[{\"char\":\"ER2\"}],\"splitChars\":[{\"char\":\"而而\"}],\"weight\":10},{\"charId\":\"f4643434\",\"unicodeChar\":\"𡟃\",\"unicodeCodePoint\":\"217C3\",\"pinYinChars\":[{\"char\":\"YUAN4\"}],\"splitChars\":[{\"char\":\"女苑\"}],\"weight\":10},{\"charId\":\"3ad428e5\",\"unicodeChar\":\"𦓎\",\"unicodeCodePoint\":\"264CE\",\"pinYinChars\":[{\"char\":\"NAI4\"}],\"splitChars\":[{\"char\":\"而刂\"}],\"weight\":10},{\"charId\":\"57c22bc8\",\"unicodeChar\":\"𡝹\",\"unicodeCodePoint\":\"21779\",\"pinYinChars\":[{\"char\":\"MENG4\"}],\"splitChars\":[{\"char\":\"女孟\"}],\"weight\":10},{\"charId\":\"f00f7ef8\",\"unicodeChar\":\"𡜿\",\"unicodeCodePoint\":\"2173F\",\"pinYinChars\":[{\"char\":\"MU3\"}],\"splitChars\":[{\"char\":\"女亩\"}],\"weight\":10},{\"charId\":\"c84ee4df\",\"unicodeChar\":\"𡜵\",\"unicodeCodePoint\":\"21735\",\"pinYinChars\":[{\"char\":\"PU1\"}],\"splitChars\":[{\"char\":\"女甫\"}],\"weight\":10},{\"charId\":\"386bb786\",\"unicodeChar\":\"𣗬\",\"unicodeCodePoint\":\"235EC\",\"pinYinChars\":[{\"char\":\"QIU3\"}],\"splitChars\":[{\"char\":\"木臭\"}],\"weight\":10},{\"charId\":\"997c7d01\",\"unicodeChar\":\"𣗁\",\"unicodeCodePoint\":\"235C1\",\"pinYinChars\":[{\"char\":\"QIA4\"}],\"splitChars\":[{\"char\":\"石木\"}],\"weight\":10},{\"charId\":\"227ca19e\",\"unicodeChar\":\"𣒍\",\"unicodeCodePoint\":\"2348D\",\"pinYinChars\":[{\"char\":\"HE2\"}],\"splitChars\":[{\"char\":\"木何\"}],\"weight\":10},{\"charId\":\"224e157b\",\"unicodeChar\":\"𣔙\",\"unicodeCodePoint\":\"23519\",\"pinYinChars\":[{\"char\":\"XIAN1\"}],\"splitChars\":[{\"char\":\"木欣\"}],\"weight\":10},{\"charId\":\"3f66fff8\",\"unicodeChar\":\"𣑯\",\"unicodeCodePoint\":\"2346F\",\"pinYinChars\":[{\"char\":\"ZH\"}],\"splitChars\":[{\"char\":\"木兆\"}],\"weight\":10},{\"charId\":\"5298d1e2\",\"unicodeChar\":\"𣍏\",\"unicodeCodePoint\":\"2334F\",\"pinYinChars\":[{\"char\":\"CHA4\"}],\"splitChars\":[{\"char\":\"更差\"}],\"weight\":10},{\"charId\":\"d97ec019\",\"unicodeChar\":\"𣊭\",\"unicodeCodePoint\":\"232AD\",\"pinYinChars\":[{\"char\":\"LU4\"}],\"splitChars\":[{\"char\":\"昌昌\"}],\"weight\":10},{\"charId\":\"c2aa8b93\",\"unicodeChar\":\"𣍇\",\"unicodeCodePoint\":\"23347\",\"pinYinChars\":[{\"char\":\"JU4\"}],\"splitChars\":[{\"char\":\"更取\"}],\"weight\":10},{\"charId\":\"73da2473\",\"unicodeChar\":\"𣈅\",\"unicodeCodePoint\":\"23205\",\"pinYinChars\":[{\"char\":\"CAO2\"}],\"splitChars\":[{\"char\":\"林日\"}],\"weight\":10},{\"charId\":\"086d6d03\",\"unicodeChar\":\"𣊐\",\"unicodeCodePoint\":\"23290\",\"pinYinChars\":[{\"char\":\"CHEN2\"}],\"splitChars\":[{\"char\":\"日晨\"}],\"weight\":10},{\"charId\":\"9f28db70\",\"unicodeChar\":\"𣁦\",\"unicodeCodePoint\":\"23066\",\"pinYinChars\":[{\"char\":\"PAN2\"}],\"splitChars\":[{\"char\":\"斌全\"}],\"weight\":10},{\"charId\":\"4a63b8f2\",\"unicodeChar\":\"𣁚\",\"unicodeCodePoint\":\"2305A\",\"pinYinChars\":[{\"char\":\"QING1\"}],\"splitChars\":[{\"char\":\"文即\"}],\"weight\":10},{\"charId\":\"f8b4f9ce\",\"unicodeChar\":\"𢬑\",\"unicodeCodePoint\":\"22B11\",\"pinYinChars\":[{\"char\":\"QU1\"}],\"splitChars\":[{\"char\":\"扌曲\"}],\"weight\":10},{\"charId\":\"2605b5aa\",\"unicodeChar\":\"𢭪\",\"unicodeCodePoint\":\"22B6A\",\"pinYinChars\":[{\"char\":\"KE1\"}],\"splitChars\":[{\"char\":\"扌克\"}],\"weight\":10},{\"charId\":\"59b12a6a\",\"unicodeChar\":\"𢠖\",\"unicodeCodePoint\":\"22816\",\"pinYinChars\":[{\"char\":\"MAO4\"}],\"splitChars\":[{\"char\":\"林(女)心\"}],\"weight\":10},{\"charId\":\"921d4e76\",\"unicodeChar\":\"𢛜\",\"unicodeCodePoint\":\"226DC\",\"pinYinChars\":[{\"char\":\"NI4\"}],\"splitChars\":[{\"char\":\"泥心\"}],\"weight\":10},{\"charId\":\"a3ed0ccd\",\"unicodeChar\":\"𢔁\",\"unicodeCodePoint\":\"22501\",\"pinYinChars\":[{\"char\":\"LING2\"}],\"splitChars\":[{\"char\":\"彳夌\"}],\"weight\":10},{\"charId\":\"85a56786\",\"unicodeChar\":\"𢌷\",\"unicodeCodePoint\":\"22337\",\"pinYinChars\":[{\"char\":\"QU1\"}],\"splitChars\":[{\"char\":\"内廾\"}],\"weight\":10},{\"charId\":\"d9d102c6\",\"unicodeChar\":\"𢈍\",\"unicodeCodePoint\":\"2220D\",\"pinYinChars\":[{\"char\":\"SHI3\"}],\"splitChars\":[{\"char\":\"广米\"}],\"weight\":10},{\"charId\":\"ec925908\",\"unicodeChar\":\"𣸣\",\"unicodeCodePoint\":\"23E23\",\"pinYinChars\":[{\"char\":\"FEN2\"}],\"splitChars\":[{\"char\":\"氵贲\"}],\"weight\":10},{\"charId\":\"a7788900\",\"unicodeChar\":\"𣵜\",\"unicodeCodePoint\":\"23D5C\",\"pinYinChars\":[{\"char\":\"AO4\"}],\"splitChars\":[{\"char\":\"氵山\"}],\"weight\":10},{\"charId\":\"0056e363\",\"unicodeChar\":\"𣵛\",\"unicodeCodePoint\":\"23D5B\",\"pinYinChars\":[{\"char\":\"XIU4\"}],\"splitChars\":[{\"char\":\"氵秀\"}],\"weight\":10},{\"charId\":\"906fc1f2\",\"unicodeChar\":\"𣳑\",\"unicodeCodePoint\":\"23CD1\",\"pinYinChars\":[{\"char\":\"SHEN1\"}],\"splitChars\":[{\"char\":\"氵申\"}],\"weight\":10},{\"charId\":\"364c75bc\",\"unicodeChar\":\"𣲲\",\"unicodeCodePoint\":\"23CB2\",\"pinYinChars\":[{\"char\":\"NI4\"}],\"splitChars\":[{\"char\":\"氵禾\"}],\"weight\":10},{\"charId\":\"ebc3657a\",\"unicodeChar\":\"𣲾\",\"unicodeCodePoint\":\"23CBE\",\"pinYinChars\":[{\"char\":\"GUAI4\"}],\"splitChars\":[{\"char\":\"氵圣\"}],\"weight\":10},{\"charId\":\"ae8f38a4\",\"unicodeChar\":\"𣲥\",\"unicodeCodePoint\":\"23CA5\",\"pinYinChars\":[{\"char\":\"DAN1\"}],\"splitChars\":[{\"char\":\"氵丹\"}],\"weight\":10},{\"charId\":\"ee23feaf\",\"unicodeChar\":\"𣭲\",\"unicodeCodePoint\":\"23B72\",\"pinYinChars\":[{\"char\":\"RONG3\"}],\"splitChars\":[{\"char\":\"甬毛\"}],\"weight\":10},{\"charId\":\"98627846\",\"unicodeChar\":\"𣬛\",\"unicodeCodePoint\":\"23B1B\",\"pinYinChars\":[{\"char\":\"SAN1\"}],\"splitChars\":[{\"char\":\"丿七\"}],\"weight\":10},{\"charId\":\"5a9fadce\",\"unicodeChar\":\"𣚭\",\"unicodeCodePoint\":\"236AD\",\"pinYinChars\":[{\"char\":\"JU2\"}],\"splitChars\":[{\"char\":\"木菊\"}],\"weight\":10},{\"charId\":\"8c5122ea\",\"unicodeChar\":\"𤲞\",\"unicodeCodePoint\":\"24C9E\",\"pinYinChars\":[{\"char\":\"YU2\"}],\"splitChars\":[{\"char\":\"人田\"}],\"weight\":10},{\"charId\":\"13c342c7\",\"unicodeChar\":\"𤱧\",\"unicodeCodePoint\":\"24C67\",\"pinYinChars\":[{\"char\":\"TUO3\"}],\"splitChars\":[{\"char\":\"田朵\"}],\"weight\":10},{\"charId\":\"6e6403bf\",\"unicodeChar\":\"𤴻\",\"unicodeCodePoint\":\"24D3B\",\"pinYinChars\":[{\"char\":\"TAO2\"}],\"splitChars\":[{\"char\":\"疒犬\"}],\"weight\":10},{\"charId\":\"6056afc1\",\"unicodeChar\":\"𤳖\",\"unicodeCodePoint\":\"24CD6\",\"pinYinChars\":[{\"char\":\"BAN1\"}],\"splitChars\":[{\"char\":\"番去\"}],\"weight\":10},{\"charId\":\"132ec342\",\"unicodeChar\":\"𤫫\",\"unicodeCodePoint\":\"24AEB\",\"pinYinChars\":[{\"char\":\"BAN1\"}],\"splitChars\":[{\"char\":\"分瓜\"}],\"weight\":10},{\"charId\":\"67d606f3\",\"unicodeChar\":\"𮪒\",\"unicodeCodePoint\":\"2EA92\",\"pinYinChars\":[{\"char\":\"YING1\"}],\"splitChars\":[{\"char\":\"馬英\"}],\"weight\":10},{\"charId\":\"d34d2c7b\",\"unicodeChar\":\"𥇦\",\"unicodeCodePoint\":\"251E6\",\"pinYinChars\":[{\"char\":\"XI1\"}],\"splitChars\":[{\"char\":\"目析\"}],\"weight\":10},{\"charId\":\"198ade85\",\"unicodeChar\":\"𥇖\",\"unicodeCodePoint\":\"251D6\",\"pinYinChars\":[{\"char\":\"FEI1\"}],\"splitChars\":[{\"char\":\"非目\"}],\"weight\":10},{\"charId\":\"16f4cb09\",\"unicodeChar\":\"𤽈\",\"unicodeCodePoint\":\"24F48\",\"pinYinChars\":[{\"char\":\"GAO3\"}],\"splitChars\":[{\"char\":\"白火\"}],\"weight\":10},{\"charId\":\"3674590b\",\"unicodeChar\":\"𬊣\",\"unicodeCodePoint\":\"2C2A3\",\"pinYinChars\":[{\"char\":\"CHUN1\"}],\"splitChars\":[{\"char\":\"火京\"}],\"weight\":10},{\"charId\":\"0aa7ca4b\",\"unicodeChar\":\"𥅉\",\"unicodeCodePoint\":\"25149\",\"pinYinChars\":[{\"char\":\"MEI2\"}],\"splitChars\":[{\"char\":\"丿冒\"}],\"weight\":10},{\"charId\":\"dd6dbd8e\",\"unicodeChar\":\"𥅅\",\"unicodeCodePoint\":\"25145\",\"pinYinChars\":[{\"char\":\"MU4\"}],\"splitChars\":[{\"char\":\"目击\"}],\"weight\":10},{\"charId\":\"7ced85cb\",\"unicodeChar\":\"𥊧\",\"unicodeCodePoint\":\"252A7\",\"pinYinChars\":[{\"char\":\"KOU4\"}],\"splitChars\":[{\"char\":\"声(殸)目\"}],\"weight\":10},{\"charId\":\"2e1f19ad\",\"unicodeChar\":\"𥉐\",\"unicodeCodePoint\":\"25250\",\"pinYinChars\":[{\"char\":\"QI1\"}],\"splitChars\":[{\"char\":\"目奚\"}],\"weight\":10},{\"charId\":\"8f83e05e\",\"unicodeChar\":\"𫘘\",\"unicodeCodePoint\":\"2B618\",\"pinYinChars\":[{\"char\":\"LU4\"}],\"splitChars\":[{\"char\":\"路馬\"}],\"weight\":10},{\"charId\":\"96181621\",\"unicodeChar\":\"𥈨\",\"unicodeCodePoint\":\"25228\",\"pinYinChars\":[{\"char\":\"DU\"}],\"splitChars\":[{\"char\":\"目段\"}],\"weight\":10},{\"charId\":\"0b6bc938\",\"unicodeChar\":\"龭\",\"unicodeCodePoint\":\"9FAD\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"馬異\"}],\"weight\":10},{\"charId\":\"813b92b8\",\"unicodeChar\":\"𤽹\",\"unicodeCodePoint\":\"24F79\",\"pinYinChars\":[{\"char\":\"BAI4\"}],\"splitChars\":[{\"char\":\"白卑\"}],\"weight\":10},{\"charId\":\"d2305a9c\",\"unicodeChar\":\"𫗧\",\"unicodeCodePoint\":\"2B5E7\",\"pinYinChars\":[{\"char\":\"SU4\"}],\"splitChars\":[{\"char\":\"饣束\"}],\"weight\":10},{\"charId\":\"701ff451\",\"unicodeChar\":\"𤰼\",\"unicodeCodePoint\":\"24C3C\",\"pinYinChars\":[{\"char\":\"CH\"}],\"splitChars\":[{\"char\":\"田牛\"}],\"weight\":10},{\"charId\":\"8cb5963c\",\"unicodeChar\":\"𬲯\",\"unicodeCodePoint\":\"2CCAF\",\"pinYinChars\":[{\"char\":\"GOU1\"}],\"splitChars\":[{\"char\":\"饣句\"}],\"weight\":10},{\"charId\":\"80f72228\",\"unicodeChar\":\"𤷍\",\"unicodeCodePoint\":\"24DCD\",\"pinYinChars\":[{\"char\":\"QI2\"}],\"splitChars\":[{\"char\":\"疒其\"}],\"weight\":10},{\"charId\":\"d630cba1\",\"unicodeChar\":\"𤵐\",\"unicodeCodePoint\":\"24D50\",\"pinYinChars\":[{\"char\":\"WU4\"}],\"splitChars\":[{\"char\":\"疒勿\"}],\"weight\":10},{\"charId\":\"e95d4812\",\"unicodeChar\":\"龮\",\"unicodeCodePoint\":\"9FAE\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"馬翼\"}],\"weight\":10},{\"charId\":\"da5b10a5\",\"unicodeChar\":\"𥄟\",\"unicodeCodePoint\":\"2511F\",\"pinYinChars\":[{\"char\":\"SHAN3\"}],\"splitChars\":[{\"char\":\"分目\"}],\"weight\":10},{\"charId\":\"44dfd3c0\",\"unicodeChar\":\"𥕥\",\"unicodeCodePoint\":\"25565\",\"pinYinChars\":[{\"char\":\"OU1\"}],\"splitChars\":[{\"char\":\"石區\"}],\"weight\":10},{\"charId\":\"ed3066a6\",\"unicodeChar\":\"𬶐\",\"unicodeCodePoint\":\"2CD90\",\"pinYinChars\":[{\"char\":\"ZHAO4\"}],\"splitChars\":[{\"char\":\"鱼兆\"}],\"weight\":10},{\"charId\":\"baf4f381\",\"unicodeChar\":\"𬶍\",\"unicodeCodePoint\":\"2CD8D\",\"pinYinChars\":[{\"char\":\"TUO2\"}],\"splitChars\":[{\"char\":\"鱼它\"}],\"weight\":10},{\"charId\":\"febd8476\",\"unicodeChar\":\"𥔿\",\"unicodeCodePoint\":\"2553F\",\"pinYinChars\":[{\"char\":\"TAO1\"}],\"splitChars\":[{\"char\":\"石舀\"}],\"weight\":10},{\"charId\":\"c54f1a3c\",\"unicodeChar\":\"𥓒\",\"unicodeCodePoint\":\"254D2\",\"pinYinChars\":[{\"char\":\"XIAN4\"}],\"splitChars\":[{\"char\":\"石臽\"}],\"weight\":10},{\"charId\":\"c58049a1\",\"unicodeChar\":\"㻞\",\"unicodeCodePoint\":\"3EDE\",\"pinYinChars\":[{\"char\":\"BIN1\"}],\"splitChars\":[{\"char\":\"王扁\"}],\"weight\":10},{\"charId\":\"aec84bbc\",\"unicodeChar\":\"𬷕\",\"unicodeCodePoint\":\"2CDD5\",\"pinYinChars\":[{\"char\":\"BU1\"}],\"splitChars\":[{\"char\":\"甫鸟\"}],\"weight\":10},{\"charId\":\"52c9edef\",\"unicodeChar\":\"㻢\",\"unicodeCodePoint\":\"3EE2\",\"pinYinChars\":[{\"char\":\"SHI1\"}],\"splitChars\":[{\"char\":\"王施\"}],\"weight\":10},{\"charId\":\"2e9a93e8\",\"unicodeChar\":\"𥐚\",\"unicodeCodePoint\":\"2541A\",\"pinYinChars\":[{\"char\":\"PU3\"}],\"splitChars\":[{\"char\":\"石卜\"}],\"weight\":10},{\"charId\":\"0332a471\",\"unicodeChar\":\"䃅\",\"unicodeCodePoint\":\"40C5\",\"pinYinChars\":[{\"char\":\"DI1\"}],\"splitChars\":[{\"char\":\"石单\"}],\"weight\":10},{\"charId\":\"596a12d0\",\"unicodeChar\":\"𥒰\",\"unicodeCodePoint\":\"254B0\",\"pinYinChars\":[{\"char\":\"FU3\"}],\"splitChars\":[{\"char\":\"石甫\"}],\"weight\":10},{\"charId\":\"941139db\",\"unicodeChar\":\"䂼\",\"unicodeCodePoint\":\"40BC\",\"pinYinChars\":[{\"char\":\"NIE4\"}],\"splitChars\":[{\"char\":\"石念\"}],\"weight\":10},{\"charId\":\"1613a738\",\"unicodeChar\":\"𥒞\",\"unicodeCodePoint\":\"2549E\",\"pinYinChars\":[{\"char\":\"YANG2\"}],\"splitChars\":[{\"char\":\"石羊\"}],\"weight\":10},{\"charId\":\"75d1aa98\",\"unicodeChar\":\"䃂\",\"unicodeCodePoint\":\"40C2\",\"pinYinChars\":[{\"char\":\"GUN3\"}],\"splitChars\":[{\"char\":\"石昆\"}],\"weight\":10},{\"charId\":\"65ae24c5\",\"unicodeChar\":\"䂬\",\"unicodeCodePoint\":\"40AC\",\"pinYinChars\":[{\"char\":\"GONG3\"}],\"splitChars\":[{\"char\":\"巩石\"}],\"weight\":10},{\"charId\":\"caa9891c\",\"unicodeChar\":\"𥑸\",\"unicodeCodePoint\":\"25478\",\"pinYinChars\":[{\"char\":\"ZHOU1\"}],\"splitChars\":[{\"char\":\"石舟\"}],\"weight\":10},{\"charId\":\"48e9428a\",\"unicodeChar\":\"䂭\",\"unicodeCodePoint\":\"40AD\",\"pinYinChars\":[{\"char\":\"QIAO1\"}],\"splitChars\":[{\"char\":\"石交\"}],\"weight\":10},{\"charId\":\"be13ddb3\",\"unicodeChar\":\"𥑮\",\"unicodeCodePoint\":\"2546E\",\"pinYinChars\":[{\"char\":\"GU\"}],\"splitChars\":[{\"char\":\"石古\"}],\"weight\":10},{\"charId\":\"20081b6a\",\"unicodeChar\":\"䀹\",\"unicodeCodePoint\":\"4039\",\"pinYinChars\":[{\"char\":\"JIE2\"}],\"splitChars\":[{\"char\":\"目夾\"}],\"weight\":10},{\"charId\":\"3c5cdfe0\",\"unicodeChar\":\"𥖁\",\"unicodeCodePoint\":\"25581\",\"pinYinChars\":[{\"char\":\"ZUN1\"}],\"splitChars\":[{\"char\":\"石尊\"}],\"weight\":10},{\"charId\":\"875ca36e\",\"unicodeChar\":\"𥕵\",\"unicodeCodePoint\":\"25575\",\"pinYinChars\":[{\"char\":\"GAN3\"}],\"splitChars\":[{\"char\":\"石敢\"}],\"weight\":10},{\"charId\":\"5c5b99ed\",\"unicodeChar\":\"𥑇\",\"unicodeCodePoint\":\"25447\",\"pinYinChars\":[{\"char\":\"DIE2\"}],\"splitChars\":[{\"char\":\"石失\"}],\"weight\":10},{\"charId\":\"d74c3300\",\"unicodeChar\":\"𬴃\",\"unicodeCodePoint\":\"2CD03\",\"pinYinChars\":[{\"char\":\"HUO1\"}],\"splitChars\":[{\"char\":\"马石\"}],\"weight\":10},{\"charId\":\"d1a1bab1\",\"unicodeChar\":\"𥐸\",\"unicodeCodePoint\":\"25438\",\"pinYinChars\":[{\"char\":\"YIN3\"}],\"splitChars\":[{\"char\":\"石允\"}],\"weight\":10},{\"charId\":\"e66d29f8\",\"unicodeChar\":\"𥐱\",\"unicodeCodePoint\":\"25431\",\"pinYinChars\":[{\"char\":\"CH\"}],\"splitChars\":[{\"char\":\"石冗\"}],\"weight\":10},{\"charId\":\"13dc0299\",\"unicodeChar\":\"𥐯\",\"unicodeCodePoint\":\"2542F\",\"pinYinChars\":[{\"char\":\"TAN2\"}],\"splitChars\":[{\"char\":\"石云\"}],\"weight\":10},{\"charId\":\"53f366f0\",\"unicodeChar\":\"𥐩\",\"unicodeCodePoint\":\"25429\",\"pinYinChars\":[{\"char\":\"YUN2\"}],\"splitChars\":[{\"char\":\"石匀\"}],\"weight\":10},{\"charId\":\"d668149a\",\"unicodeChar\":\"𥐜\",\"unicodeCodePoint\":\"2541C\",\"pinYinChars\":[{\"char\":\"JI\"}],\"splitChars\":[{\"char\":\"石九\"}],\"weight\":10},{\"charId\":\"c1a0bdc9\",\"unicodeChar\":\"𥆡\",\"unicodeCodePoint\":\"251A1\",\"pinYinChars\":[{\"char\":\"GU3\"}],\"splitChars\":[{\"char\":\"目含\"}],\"weight\":10},{\"charId\":\"58762bf5\",\"unicodeChar\":\"𥅽\",\"unicodeCodePoint\":\"2517D\",\"pinYinChars\":[{\"char\":\"JI\"}],\"splitChars\":[{\"char\":\"合目\"}],\"weight\":10},{\"charId\":\"9920db9f\",\"unicodeChar\":\"㻚\",\"unicodeCodePoint\":\"3EDA\",\"pinYinChars\":[{\"char\":\"PENG2\"}],\"splitChars\":[{\"char\":\"王朋\"}],\"weight\":10},{\"charId\":\"183f28cd\",\"unicodeChar\":\"𥏜\",\"unicodeCodePoint\":\"253DC\",\"pinYinChars\":[{\"char\":\"YI3\"}],\"splitChars\":[{\"char\":\"矢奇\"}],\"weight\":10},{\"charId\":\"efa02c03\",\"unicodeChar\":\"𬷈\",\"unicodeCodePoint\":\"2CDC8\",\"pinYinChars\":[{\"char\":\"DAI4\"}],\"splitChars\":[{\"char\":\"代鳥\"}],\"weight\":10},{\"charId\":\"2674e8aa\",\"unicodeChar\":\"㻖\",\"unicodeCodePoint\":\"3ED6\",\"pinYinChars\":[{\"char\":\"DAI4\"}],\"splitChars\":[{\"char\":\"王隶\"}],\"weight\":10},{\"charId\":\"006ef067\",\"unicodeChar\":\"㻙\",\"unicodeCodePoint\":\"3ED9\",\"pinYinChars\":[{\"char\":\"YU4\"}],\"splitChars\":[{\"char\":\"王育\"}],\"weight\":10},{\"charId\":\"4bd43dd9\",\"unicodeChar\":\"㻐\",\"unicodeCodePoint\":\"3ED0\",\"pinYinChars\":[{\"char\":\"QUN1\"}],\"splitChars\":[{\"char\":\"王夋\"}],\"weight\":10},{\"charId\":\"e7f1acea\",\"unicodeChar\":\"𥋆\",\"unicodeCodePoint\":\"252C6\",\"pinYinChars\":[{\"char\":\"DUN1\"}],\"splitChars\":[{\"char\":\"目敦\"}],\"weight\":10},{\"charId\":\"e77f3a72\",\"unicodeChar\":\"𥑘\",\"unicodeCodePoint\":\"25458\",\"pinYinChars\":[{\"char\":\"MO4\"}],\"splitChars\":[{\"char\":\"石未\"}],\"weight\":10},{\"charId\":\"32c65965\",\"unicodeChar\":\"䄸\",\"unicodeCodePoint\":\"4138\",\"pinYinChars\":[{\"char\":\"PO4\"}],\"splitChars\":[{\"char\":\"禾白\"}],\"weight\":10},{\"charId\":\"4894fbec\",\"unicodeChar\":\"䄓\",\"unicodeCodePoint\":\"4113\",\"pinYinChars\":[{\"char\":\"HUANG2\"}],\"splitChars\":[{\"char\":\"礻皇\"}],\"weight\":10},{\"charId\":\"d2526164\",\"unicodeChar\":\"䄙\",\"unicodeCodePoint\":\"4119\",\"pinYinChars\":[{\"char\":\"MING2\"}],\"splitChars\":[{\"char\":\"礻冥\"}],\"weight\":10},{\"charId\":\"b8e8f672\",\"unicodeChar\":\"𬸦\",\"unicodeCodePoint\":\"2CE26\",\"pinYinChars\":[{\"char\":\"ZHUO2\"}],\"splitChars\":[{\"char\":\"族鸟\"}],\"weight\":10},{\"charId\":\"e0a7ebdc\",\"unicodeChar\":\"䃿\",\"unicodeCodePoint\":\"40FF\",\"pinYinChars\":[{\"char\":\"FU1\"}],\"splitChars\":[{\"char\":\"礻夫\"}],\"weight\":10},{\"charId\":\"7c02b4d3\",\"unicodeChar\":\"䉪\",\"unicodeCodePoint\":\"426A\",\"pinYinChars\":[{\"char\":\"LEI4\"}],\"splitChars\":[{\"char\":\"竹田\"}],\"weight\":10},{\"charId\":\"31d5923c\",\"unicodeChar\":\"𡷟\",\"unicodeCodePoint\":\"21DDF\",\"pinYinChars\":[{\"char\":\"LONG4\"}],\"splitChars\":[{\"char\":\"山弄\"}],\"weight\":10},{\"charId\":\"91b4c504\",\"unicodeChar\":\"䓶\",\"unicodeCodePoint\":\"44F6\",\"pinYinChars\":[{\"char\":\"LAI4\"}],\"splitChars\":[{\"char\":\"艹剌\"}],\"weight\":10},{\"charId\":\"c082c948\",\"unicodeChar\":\"䔉\",\"unicodeCodePoint\":\"4509\",\"pinYinChars\":[{\"char\":\"LI4\"}],\"splitChars\":[{\"char\":\"艹禾\"}],\"weight\":10},{\"charId\":\"c29fa156\",\"unicodeChar\":\"䓂\",\"unicodeCodePoint\":\"44C2\",\"pinYinChars\":[{\"char\":\"YAN2\"}],\"splitChars\":[{\"char\":\"艹言\"}],\"weight\":10},{\"charId\":\"ecaaca71\",\"unicodeChar\":\"䓊\",\"unicodeCodePoint\":\"44CA\",\"pinYinChars\":[{\"char\":\"WU2\"}],\"splitChars\":[{\"char\":\"艹吾\"}],\"weight\":10},{\"charId\":\"a211bd18\",\"unicodeChar\":\"䒩\",\"unicodeCodePoint\":\"44A9\",\"pinYinChars\":[{\"char\":\"HE2\"}],\"splitChars\":[{\"char\":\"艹禾\"}],\"weight\":10},{\"charId\":\"91fbf221\",\"unicodeChar\":\"䒵\",\"unicodeCodePoint\":\"44B5\",\"pinYinChars\":[{\"char\":\"HAO4\"}],\"splitChars\":[{\"char\":\"艹好\"}],\"weight\":10},{\"charId\":\"bf771498\",\"unicodeChar\":\"䒕\",\"unicodeCodePoint\":\"4495\",\"pinYinChars\":[{\"char\":\"XIAO3\"}],\"splitChars\":[{\"char\":\"艹小\"}],\"weight\":10},{\"charId\":\"9969a951\",\"unicodeChar\":\"㽘\",\"unicodeCodePoint\":\"3F58\",\"pinYinChars\":[{\"char\":\"GANG3\"}],\"splitChars\":[{\"char\":\"田亢\"}],\"weight\":10},{\"charId\":\"618f9e2c\",\"unicodeChar\":\"㿠\",\"unicodeCodePoint\":\"3FE0\",\"pinYinChars\":[{\"char\":\"HUANG4\"}],\"splitChars\":[{\"char\":\"白光\"}],\"weight\":10},{\"charId\":\"4c6f2244\",\"unicodeChar\":\"㽏\",\"unicodeCodePoint\":\"3F4F\",\"pinYinChars\":[{\"char\":\"GAN4\"}],\"splitChars\":[{\"char\":\"洽甘\"}],\"weight\":10},{\"charId\":\"3047febb\",\"unicodeChar\":\"䃥\",\"unicodeCodePoint\":\"40E5\",\"pinYinChars\":[{\"char\":\"CHUANG2\"}],\"splitChars\":[{\"char\":\"石童\"}],\"weight\":10},{\"charId\":\"835ce8af\",\"unicodeChar\":\"䃎\",\"unicodeCodePoint\":\"40CE\",\"pinYinChars\":[{\"char\":\"ZHA4\"}],\"splitChars\":[{\"char\":\"石多\"}],\"weight\":10},{\"charId\":\"8256df09\",\"unicodeChar\":\"䃗\",\"unicodeCodePoint\":\"40D7\",\"pinYinChars\":[{\"char\":\"BO1\"}],\"splitChars\":[{\"char\":\"石剥\"}],\"weight\":10},{\"charId\":\"ddcd38af\",\"unicodeChar\":\"𬸘\",\"unicodeCodePoint\":\"2CE18\",\"pinYinChars\":[{\"char\":\"YAN3\"}],\"splitChars\":[{\"char\":\"匚(匽)鸟\"}],\"weight\":10},{\"charId\":\"34b7523b\",\"unicodeChar\":\"䇯\",\"unicodeCodePoint\":\"41EF\",\"pinYinChars\":[{\"char\":\"RONG2\"}],\"splitChars\":[{\"char\":\"竹耳\"}],\"weight\":10},{\"charId\":\"b0e71023\",\"unicodeChar\":\"䇛\",\"unicodeCodePoint\":\"41DB\",\"pinYinChars\":[{\"char\":\"ZHI3\"}],\"splitChars\":[{\"char\":\"竹止\"}],\"weight\":10},{\"charId\":\"bf29cfae\",\"unicodeChar\":\"䇭\",\"unicodeCodePoint\":\"41ED\",\"pinYinChars\":[{\"char\":\"LAO3\"}],\"splitChars\":[{\"char\":\"竹老\"}],\"weight\":10},{\"charId\":\"74f0560b\",\"unicodeChar\":\"䅼\",\"unicodeCodePoint\":\"417C\",\"pinYinChars\":[{\"char\":\"MAN2\"}],\"splitChars\":[{\"char\":\"禾曼\"}],\"weight\":10},{\"charId\":\"dc4de4f2\",\"unicodeChar\":\"𥘏\",\"unicodeCodePoint\":\"2560F\",\"pinYinChars\":[{\"char\":\"GAN3\"}],\"splitChars\":[{\"char\":\"礻干\"}],\"weight\":10},{\"charId\":\"1e640f62\",\"unicodeChar\":\"䆔\",\"unicodeCodePoint\":\"4194\",\"pinYinChars\":[{\"char\":\"CHONG1\"}],\"splitChars\":[{\"char\":\"穴中\"}],\"weight\":10},{\"charId\":\"da834d6f\",\"unicodeChar\":\"𥗝\",\"unicodeCodePoint\":\"255DD\",\"pinYinChars\":[{\"char\":\"RANG3\"}],\"splitChars\":[{\"char\":\"石襄\"}],\"weight\":10},{\"charId\":\"2c1022d1\",\"unicodeChar\":\"𥖏\",\"unicodeCodePoint\":\"2558F\",\"pinYinChars\":[{\"char\":\"GU\"}],\"splitChars\":[{\"char\":\"石貫\"}],\"weight\":10},{\"charId\":\"ac660c3d\",\"unicodeChar\":\"𨑾\",\"unicodeCodePoint\":\"2847E\",\"pinYinChars\":[{\"char\":\"NANG2\"}],\"splitChars\":[{\"char\":\"辶水\"}],\"weight\":10},{\"charId\":\"6668cdef\",\"unicodeChar\":\"䝞\",\"unicodeCodePoint\":\"475E\",\"pinYinChars\":[{\"char\":\"HAO4\"}],\"splitChars\":[{\"char\":\"豸虎\"}],\"weight\":10},{\"charId\":\"8c1fc523\",\"unicodeChar\":\"䕕\",\"unicodeCodePoint\":\"4555\",\"pinYinChars\":[{\"char\":\"MAN4\"}],\"splitChars\":[{\"char\":\"艹曼\"}],\"weight\":10},{\"charId\":\"176e39d5\",\"unicodeChar\":\"䖑\",\"unicodeCodePoint\":\"4591\",\"pinYinChars\":[{\"char\":\"MI4\"}],\"splitChars\":[{\"char\":\"虎日\"}],\"weight\":10},{\"charId\":\"17da41bb\",\"unicodeChar\":\"䔧\",\"unicodeCodePoint\":\"4527\",\"pinYinChars\":[{\"char\":\"LI2\"}],\"splitChars\":[{\"char\":\"艹梨\"}],\"weight\":10},{\"charId\":\"a4731e78\",\"unicodeChar\":\"䔽\",\"unicodeCodePoint\":\"453D\",\"pinYinChars\":[{\"char\":\"DU2\"}],\"splitChars\":[{\"char\":\"艹渴\"}],\"weight\":10},{\"charId\":\"9043f109\",\"unicodeChar\":\"䵚\",\"unicodeCodePoint\":\"4D5A\",\"pinYinChars\":[{\"char\":\"TAO3\"}],\"splitChars\":[{\"char\":\"黍舀\"}],\"weight\":10},{\"charId\":\"49688874\",\"unicodeChar\":\"𫝴\",\"unicodeCodePoint\":\"2B774\",\"pinYinChars\":[{\"char\":\"HOU4\"}],\"splitChars\":[{\"char\":\"山后\"}],\"weight\":10},{\"charId\":\"b9bcfd14\",\"unicodeChar\":\"𫟭\",\"unicodeCodePoint\":\"2B7ED\",\"pinYinChars\":[{\"char\":\"KE4\"}],\"splitChars\":[{\"char\":\"客阝\"}],\"weight\":10},{\"charId\":\"e705b56c\",\"unicodeChar\":\"䑩\",\"unicodeCodePoint\":\"4469\",\"pinYinChars\":[{\"char\":\"GU3\"}],\"splitChars\":[{\"char\":\"舟古\"}],\"weight\":10},{\"charId\":\"e80d4dce\",\"unicodeChar\":\"䑣\",\"unicodeCodePoint\":\"4463\",\"pinYinChars\":[{\"char\":\"CHEN1\"}],\"splitChars\":[{\"char\":\"舟彡\"}],\"weight\":10},{\"charId\":\"4192199d\",\"unicodeChar\":\"䌹\",\"unicodeCodePoint\":\"4339\",\"pinYinChars\":[{\"char\":\"JIONG1\"}],\"splitChars\":[{\"char\":\"纟冋\"}],\"weight\":10},{\"charId\":\"e8077171\",\"unicodeChar\":\"䔟\",\"unicodeCodePoint\":\"451F\",\"pinYinChars\":[{\"char\":\"YI2\"}],\"splitChars\":[{\"char\":\"艹移\"}],\"weight\":10},{\"charId\":\"b1f2dab2\",\"unicodeChar\":\"䧄\",\"unicodeCodePoint\":\"49C4\",\"pinYinChars\":[{\"char\":\"GE4\"}],\"splitChars\":[{\"char\":\"阝各\"}],\"weight\":10},{\"charId\":\"d52addaa\",\"unicodeChar\":\"䢺\",\"unicodeCodePoint\":\"48BA\",\"pinYinChars\":[{\"char\":\"CHU1\"}],\"splitChars\":[{\"char\":\"出阝\"}],\"weight\":10},{\"charId\":\"bfa9f573\",\"unicodeChar\":\"䤰\",\"unicodeCodePoint\":\"4930\",\"pinYinChars\":[{\"char\":\"YONG2\"}],\"splitChars\":[{\"char\":\"坎金\"}],\"weight\":10},{\"charId\":\"60356310\",\"unicodeChar\":\"𠇱\",\"unicodeCodePoint\":\"201F1\",\"pinYinChars\":[{\"char\":\"MO4\"}],\"splitChars\":[{\"char\":\"亻末\"}],\"weight\":10},{\"charId\":\"bc3fad5a\",\"unicodeChar\":\"𠆩\",\"unicodeCodePoint\":\"201A9\",\"pinYinChars\":[{\"char\":\"FAN4\"}],\"splitChars\":[{\"char\":\"亻凡\"}],\"weight\":10},{\"charId\":\"87946de4\",\"unicodeChar\":\"𠃝\",\"unicodeCodePoint\":\"200DD\",\"pinYinChars\":[{\"char\":\"NIU4\"}],\"splitChars\":[{\"char\":\"乙小\"}],\"weight\":10},{\"charId\":\"335898c1\",\"unicodeChar\":\"䨝\",\"unicodeCodePoint\":\"4A1D\",\"pinYinChars\":[{\"char\":\"QING1\"}],\"splitChars\":[{\"char\":\"雨青\"}],\"weight\":10},{\"charId\":\"0905c7a3\",\"unicodeChar\":\"䨒\",\"unicodeCodePoint\":\"4A12\",\"pinYinChars\":[{\"char\":\"YU3\"}],\"splitChars\":[{\"char\":\"雨羽\"}],\"weight\":10},{\"charId\":\"74b21c0a\",\"unicodeChar\":\"𦸁\",\"unicodeCodePoint\":\"26E01\",\"pinYinChars\":[{\"char\":\"TAN1\"}],\"splitChars\":[{\"char\":\"艹淡\"}],\"weight\":10},{\"charId\":\"87946312\",\"unicodeChar\":\"𦷪\",\"unicodeCodePoint\":\"26DEA\",\"pinYinChars\":[{\"char\":\"SU\"}],\"splitChars\":[{\"char\":\"艹妥\"}],\"weight\":10},{\"charId\":\"aec913d8\",\"unicodeChar\":\"𧁃\",\"unicodeCodePoint\":\"27043\",\"pinYinChars\":[{\"char\":\"XU4\"}],\"splitChars\":[{\"char\":\"艹畜\"}],\"weight\":10},{\"charId\":\"a7ba295d\",\"unicodeChar\":\"𧀺\",\"unicodeCodePoint\":\"2703A\",\"pinYinChars\":[{\"char\":\"XIE2\"}],\"splitChars\":[{\"char\":\"艹頁\"}],\"weight\":10},{\"charId\":\"66cc4d64\",\"unicodeChar\":\"𧀮\",\"unicodeCodePoint\":\"2702E\",\"pinYinChars\":[{\"char\":\"FU1\"}],\"splitChars\":[{\"char\":\"艹敷\"}],\"weight\":10},{\"charId\":\"d83dc590\",\"unicodeChar\":\"𧀠\",\"unicodeCodePoint\":\"27020\",\"pinYinChars\":[{\"char\":\"TI2\"}],\"splitChars\":[{\"char\":\"艹是\"}],\"weight\":10},{\"charId\":\"c1f03b12\",\"unicodeChar\":\"𧄁\",\"unicodeCodePoint\":\"27101\",\"pinYinChars\":[{\"char\":\"XI\"}],\"splitChars\":[{\"char\":\"艹霞\"}],\"weight\":10},{\"charId\":\"5a2f8eba\",\"unicodeChar\":\"𧃸\",\"unicodeCodePoint\":\"270F8\",\"pinYinChars\":[{\"char\":\"HUI1\"}],\"splitChars\":[{\"char\":\"艹徽\"}],\"weight\":10},{\"charId\":\"01d441bc\",\"unicodeChar\":\"𦽎\",\"unicodeCodePoint\":\"26F4E\",\"pinYinChars\":[{\"char\":\"LU4\"}],\"splitChars\":[{\"char\":\"艹禄\"}],\"weight\":10},{\"charId\":\"54993cdc\",\"unicodeChar\":\"𦼊\",\"unicodeCodePoint\":\"26F0A\",\"pinYinChars\":[{\"char\":\"LENG2\"}],\"splitChars\":[{\"char\":\"艹棱\"}],\"weight\":10},{\"charId\":\"ee0869d7\",\"unicodeChar\":\"𦺷\",\"unicodeCodePoint\":\"26EB7\",\"pinYinChars\":[{\"char\":\"SHEN1\"}],\"splitChars\":[{\"char\":\"艹先\"}],\"weight\":10},{\"charId\":\"0d29df7b\",\"unicodeChar\":\"𦺦\",\"unicodeCodePoint\":\"26EA6\",\"pinYinChars\":[{\"char\":\"HAN2\"}],\"splitChars\":[{\"char\":\"艹寒\"}],\"weight\":10},{\"charId\":\"ef943c74\",\"unicodeChar\":\"𦺖\",\"unicodeCodePoint\":\"26E96\",\"pinYinChars\":[{\"char\":\"JU2\"}],\"splitChars\":[{\"char\":\"艹矞\"}],\"weight\":10},{\"charId\":\"60a7c972\",\"unicodeChar\":\"𦺓\",\"unicodeCodePoint\":\"26E93\",\"pinYinChars\":[{\"char\":\"ZHAO4\"}],\"splitChars\":[{\"char\":\"艹朝\"}],\"weight\":10},{\"charId\":\"9df2cd3d\",\"unicodeChar\":\"𦺊\",\"unicodeCodePoint\":\"26E8A\",\"pinYinChars\":[{\"char\":\"GUAN1\"}],\"splitChars\":[{\"char\":\"艹完\"}],\"weight\":10},{\"charId\":\"ce3a42e7\",\"unicodeChar\":\"𦾿\",\"unicodeCodePoint\":\"26FBF\",\"pinYinChars\":[{\"char\":\"JING1\"}],\"splitChars\":[{\"char\":\"艹精\"}],\"weight\":10},{\"charId\":\"d4a1142b\",\"unicodeChar\":\"𦹔\",\"unicodeCodePoint\":\"26E54\",\"pinYinChars\":[{\"char\":\"KU\"}],\"splitChars\":[{\"char\":\"艹欵\"}],\"weight\":10},{\"charId\":\"c3bb4665\",\"unicodeChar\":\"𦸗\",\"unicodeCodePoint\":\"26E17\",\"pinYinChars\":[{\"char\":\"QI2\"}],\"splitChars\":[{\"char\":\"艹戚\"}],\"weight\":10},{\"charId\":\"b162f21a\",\"unicodeChar\":\"𦸐\",\"unicodeCodePoint\":\"26E10\",\"pinYinChars\":[{\"char\":\"LU4\"}],\"splitChars\":[{\"char\":\"艹陸\"}],\"weight\":10},{\"charId\":\"16867771\",\"unicodeChar\":\"𦸂\",\"unicodeCodePoint\":\"26E02\",\"pinYinChars\":[{\"char\":\"SHEN1\"}],\"splitChars\":[{\"char\":\"艹深\"}],\"weight\":10},{\"charId\":\"5def3398\",\"unicodeChar\":\"𥚛\",\"unicodeCodePoint\":\"2569B\",\"pinYinChars\":[{\"char\":\"KUN1\"}],\"splitChars\":[{\"char\":\"礻昆\"}],\"weight\":10},{\"charId\":\"989ff229\",\"unicodeChar\":\"𧉟\",\"unicodeCodePoint\":\"2725F\",\"pinYinChars\":[{\"char\":\"TAI1\"}],\"splitChars\":[{\"char\":\"虫台\"}],\"weight\":10},{\"charId\":\"ce67688b\",\"unicodeChar\":\"𥚉\",\"unicodeCodePoint\":\"25689\",\"pinYinChars\":[{\"char\":\"ZI1\"}],\"splitChars\":[{\"char\":\"礻甾\"}],\"weight\":10},{\"charId\":\"44272d7f\",\"unicodeChar\":\"𧕖\",\"unicodeCodePoint\":\"27556\",\"pinYinChars\":[{\"char\":\"XI\"}],\"splitChars\":[{\"char\":\"虫霞\"}],\"weight\":10},{\"charId\":\"758e2a9c\",\"unicodeChar\":\"𧒽\",\"unicodeCodePoint\":\"274BD\",\"pinYinChars\":[{\"char\":\"LEI2\"}],\"splitChars\":[{\"char\":\"虫雷\"}],\"weight\":10},{\"charId\":\"53eb1588\",\"unicodeChar\":\"𧎚\",\"unicodeCodePoint\":\"2739A\",\"pinYinChars\":[{\"char\":\"DU\"}],\"splitChars\":[{\"char\":\"虫段\"}],\"weight\":10},{\"charId\":\"218300b4\",\"unicodeChar\":\"𧙣\",\"unicodeCodePoint\":\"27663\",\"pinYinChars\":[{\"char\":\"TI2\"}],\"splitChars\":[{\"char\":\"衤夷\"}],\"weight\":10},{\"charId\":\"1be778f7\",\"unicodeChar\":\"𧙝\",\"unicodeCodePoint\":\"2765D\",\"pinYinChars\":[{\"char\":\"CHE4\"}],\"splitChars\":[{\"char\":\"衤斥\"}],\"weight\":10},{\"charId\":\"e346f1d1\",\"unicodeChar\":\"𥥧\",\"unicodeCodePoint\":\"25967\",\"pinYinChars\":[{\"char\":\"XIONG4\"}],\"splitChars\":[{\"char\":\"穴老\"}],\"weight\":10},{\"charId\":\"080a86d1\",\"unicodeChar\":\"𥥅\",\"unicodeCodePoint\":\"25945\",\"pinYinChars\":[{\"char\":\"KONG3\"}],\"splitChars\":[{\"char\":\"穴孔\"}],\"weight\":10},{\"charId\":\"70aa4041\",\"unicodeChar\":\"𧊂\",\"unicodeCodePoint\":\"27282\",\"pinYinChars\":[{\"char\":\"DONG1\"}],\"splitChars\":[{\"char\":\"虫冬\"}],\"weight\":10},{\"charId\":\"d2f133b8\",\"unicodeChar\":\"𧉽\",\"unicodeCodePoint\":\"2727D\",\"pinYinChars\":[{\"char\":\"SH\"}],\"splitChars\":[{\"char\":\"虫市\"}],\"weight\":10},{\"charId\":\"72077674\",\"unicodeChar\":\"𥞍\",\"unicodeCodePoint\":\"2578D\",\"pinYinChars\":[{\"char\":\"KE2\"}],\"splitChars\":[{\"char\":\"禾可\"}],\"weight\":10},{\"charId\":\"c289b117\",\"unicodeChar\":\"𥤺\",\"unicodeCodePoint\":\"2593A\",\"pinYinChars\":[{\"char\":\"WA1\"}],\"splitChars\":[{\"char\":\"穴手\"}],\"weight\":10},{\"charId\":\"368e5882\",\"unicodeChar\":\"𧉣\",\"unicodeCodePoint\":\"27263\",\"pinYinChars\":[{\"char\":\"YU4\"}],\"splitChars\":[{\"char\":\"虫玉\"}],\"weight\":10},{\"charId\":\"bb8f94c1\",\"unicodeChar\":\"𧄠\",\"unicodeCodePoint\":\"27120\",\"pinYinChars\":[{\"char\":\"ZHA2\"}],\"splitChars\":[{\"char\":\"艹枼\"}],\"weight\":10},{\"charId\":\"5cc5c0f4\",\"unicodeChar\":\"𧌊\",\"unicodeCodePoint\":\"2730A\",\"pinYinChars\":[{\"char\":\"XIE4\"}],\"splitChars\":[{\"char\":\"虫夜\"}],\"weight\":10},{\"charId\":\"1aeab96e\",\"unicodeChar\":\"𧊬\",\"unicodeCodePoint\":\"272AC\",\"pinYinChars\":[{\"char\":\"HE4\"}],\"splitChars\":[{\"char\":\"艹虫\"}],\"weight\":10},{\"charId\":\"85433d1b\",\"unicodeChar\":\"𧂨\",\"unicodeCodePoint\":\"270A8\",\"pinYinChars\":[{\"char\":\"DI4\"}],\"splitChars\":[{\"char\":\"艹(蒂)足\"}],\"weight\":10},{\"charId\":\"eef56fe1\",\"unicodeChar\":\"𧂈\",\"unicodeCodePoint\":\"27088\",\"pinYinChars\":[{\"char\":\"JIAO3\"}],\"splitChars\":[{\"char\":\"艹操\"}],\"weight\":10},{\"charId\":\"202400f8\",\"unicodeChar\":\"𧁜\",\"unicodeCodePoint\":\"2705C\",\"pinYinChars\":[{\"char\":\"HU\"}],\"splitChars\":[{\"char\":\"艹慧\"}],\"weight\":10},{\"charId\":\"a4c3835b\",\"unicodeChar\":\"𧛀\",\"unicodeCodePoint\":\"276C0\",\"pinYinChars\":[{\"char\":\"YI1\"}],\"splitChars\":[{\"char\":\"林衣\"}],\"weight\":10},{\"charId\":\"a08c36fe\",\"unicodeChar\":\"𦸪\",\"unicodeCodePoint\":\"26E2A\",\"pinYinChars\":[{\"char\":\"PEI2\"}],\"splitChars\":[{\"char\":\"艹非\"}],\"weight\":10},{\"charId\":\"4db76229\",\"unicodeChar\":\"𧚫\",\"unicodeCodePoint\":\"276AB\",\"pinYinChars\":[{\"char\":\"QIAN4\"}],\"splitChars\":[{\"char\":\"衤青\"}],\"weight\":10},{\"charId\":\"2a425f24\",\"unicodeChar\":\"𧚨\",\"unicodeCodePoint\":\"276A8\",\"pinYinChars\":[{\"char\":\"QI4\"}],\"splitChars\":[{\"char\":\"衤疌\"}],\"weight\":10},{\"charId\":\"48089003\",\"unicodeChar\":\"𦊫\",\"unicodeCodePoint\":\"262AB\",\"pinYinChars\":[{\"char\":\"GONG1\"}],\"splitChars\":[{\"char\":\"四光\"}],\"weight\":10},{\"charId\":\"acfa5850\",\"unicodeChar\":\"𧟄\",\"unicodeCodePoint\":\"277C4\",\"pinYinChars\":[{\"char\":\"RANG2\"}],\"splitChars\":[{\"char\":\"衤襄\"}],\"weight\":10},{\"charId\":\"be2a79ea\",\"unicodeChar\":\"𧞏\",\"unicodeCodePoint\":\"2778F\",\"pinYinChars\":[{\"char\":\"YU2\"}],\"splitChars\":[{\"char\":\"衤與\"}],\"weight\":10},{\"charId\":\"b92532c0\",\"unicodeChar\":\"𦬎\",\"unicodeCodePoint\":\"26B0E\",\"pinYinChars\":[{\"char\":\"YE2\"}],\"splitChars\":[{\"char\":\"艹也\"}],\"weight\":10},{\"charId\":\"3e1ebc52\",\"unicodeChar\":\"𧦞\",\"unicodeCodePoint\":\"2799E\",\"pinYinChars\":[{\"char\":\"PU4\"}],\"splitChars\":[{\"char\":\"言布\"}],\"weight\":10},{\"charId\":\"e362cb9d\",\"unicodeChar\":\"𦭜\",\"unicodeCodePoint\":\"26B5C\",\"pinYinChars\":[{\"char\":\"ZHI1\"}],\"splitChars\":[{\"char\":\"艹只\"}],\"weight\":10},{\"charId\":\"f933e33b\",\"unicodeChar\":\"𦬅\",\"unicodeCodePoint\":\"26B05\",\"pinYinChars\":[{\"char\":\"KOU1\"}],\"splitChars\":[{\"char\":\"艹口\"}],\"weight\":10},{\"charId\":\"abac21b1\",\"unicodeChar\":\"𧥣\",\"unicodeCodePoint\":\"27963\",\"pinYinChars\":[{\"char\":\"KOU4\"}],\"splitChars\":[{\"char\":\"言口\"}],\"weight\":10},{\"charId\":\"0e18ad32\",\"unicodeChar\":\"𧣖\",\"unicodeCodePoint\":\"278D6\",\"pinYinChars\":[{\"char\":\"TUO2\"}],\"splitChars\":[{\"char\":\"角它\"}],\"weight\":10},{\"charId\":\"466774f9\",\"unicodeChar\":\"𧊅\",\"unicodeCodePoint\":\"27285\",\"pinYinChars\":[{\"char\":\"GUAI3\"}],\"splitChars\":[{\"char\":\"虫另\"}],\"weight\":10},{\"charId\":\"53132173\",\"unicodeChar\":\"𧈢\",\"unicodeCodePoint\":\"27222\",\"pinYinChars\":[{\"char\":\"BA1\"}],\"splitChars\":[{\"char\":\"虫八\"}],\"weight\":10},{\"charId\":\"f5b4dac5\",\"unicodeChar\":\"𧉀\",\"unicodeCodePoint\":\"27240\",\"pinYinChars\":[{\"char\":\"CHI3\"}],\"splitChars\":[{\"char\":\"虫止\"}],\"weight\":10},{\"charId\":\"0770ea6c\",\"unicodeChar\":\"𧛟\",\"unicodeCodePoint\":\"276DF\",\"pinYinChars\":[{\"char\":\"XING1\"}],\"splitChars\":[{\"char\":\"衤星\"}],\"weight\":10},{\"charId\":\"b85cfc40\",\"unicodeChar\":\"𧆺\",\"unicodeCodePoint\":\"271BA\",\"pinYinChars\":[{\"char\":\"LING2\"}],\"splitChars\":[{\"char\":\"令虎\"}],\"weight\":10},{\"charId\":\"de1a386a\",\"unicodeChar\":\"𦓐\",\"unicodeCodePoint\":\"264D0\",\"pinYinChars\":[{\"char\":\"JUE2\"}],\"splitChars\":[{\"char\":\"丿丨\"}],\"weight\":10},{\"charId\":\"fe10e7be\",\"unicodeChar\":\"𧗠\",\"unicodeCodePoint\":\"275E0\",\"pinYinChars\":[{\"char\":\"AO\"}],\"splitChars\":[{\"char\":\"行冫\"}],\"weight\":10},{\"charId\":\"5b2a9dba\",\"unicodeChar\":\"𦖠\",\"unicodeCodePoint\":\"265A0\",\"pinYinChars\":[{\"char\":\"YAN3\"}],\"splitChars\":[{\"char\":\"耳炎\"}],\"weight\":10},{\"charId\":\"d30d7c94\",\"unicodeChar\":\"𧚉\",\"unicodeCodePoint\":\"27689\",\"pinYinChars\":[{\"char\":\"JUN4\"}],\"splitChars\":[{\"char\":\"衤夋\"}],\"weight\":10},{\"charId\":\"ba10f1cd\",\"unicodeChar\":\"𫟼\",\"unicodeCodePoint\":\"2B7FC\",\"pinYinChars\":[{\"char\":\"DA2\"}],\"splitChars\":[{\"char\":\"钅达\"}],\"weight\":10},{\"charId\":\"494d3c22\",\"unicodeChar\":\"𧚀\",\"unicodeCodePoint\":\"27680\",\"pinYinChars\":[{\"char\":\"MU4\"}],\"splitChars\":[{\"char\":\"衤每\"}],\"weight\":10},{\"charId\":\"687462ea\",\"unicodeChar\":\"𥸱\",\"unicodeCodePoint\":\"25E31\",\"pinYinChars\":[{\"char\":\"GU1\"}],\"splitChars\":[{\"char\":\"米几(凢)\"}],\"weight\":10},{\"charId\":\"2ff69fb5\",\"unicodeChar\":\"𧜧\",\"unicodeCodePoint\":\"27727\",\"pinYinChars\":[{\"char\":\"CHUANG1\"}],\"splitChars\":[{\"char\":\"衤舂\"}],\"weight\":10},{\"charId\":\"0adc9788\",\"unicodeChar\":\"𧜊\",\"unicodeCodePoint\":\"2770A\",\"pinYinChars\":[{\"char\":\"LV3\"}],\"splitChars\":[{\"char\":\"衣日\"}],\"weight\":10},{\"charId\":\"cc8a537c\",\"unicodeChar\":\"𧛭\",\"unicodeCodePoint\":\"276ED\",\"pinYinChars\":[{\"char\":\"RUO4\"}],\"splitChars\":[{\"char\":\"衤若\"}],\"weight\":10},{\"charId\":\"3e941c77\",\"unicodeChar\":\"𮃇\",\"unicodeCodePoint\":\"2E0C7\",\"pinYinChars\":[{\"char\":\"QIAN4\"}],\"splitChars\":[{\"char\":\"禾青\"}],\"weight\":10},{\"charId\":\"a8a159c4\",\"unicodeChar\":\"𦥏\",\"unicodeCodePoint\":\"2694F\",\"pinYinChars\":[{\"char\":\"ZHI4\"}],\"splitChars\":[{\"char\":\"至至\"}],\"weight\":10},{\"charId\":\"d8f66fd6\",\"unicodeChar\":\"𧘏\",\"unicodeCodePoint\":\"2760F\",\"pinYinChars\":[{\"char\":\"GONG1\"}],\"splitChars\":[{\"char\":\"衤弓\"}],\"weight\":10},{\"charId\":\"20d1d034\",\"unicodeChar\":\"𧘍\",\"unicodeCodePoint\":\"2760D\",\"pinYinChars\":[{\"char\":\"JIANG1\"}],\"splitChars\":[{\"char\":\"衤工\"}],\"weight\":10},{\"charId\":\"e4d322eb\",\"unicodeChar\":\"𧨳\",\"unicodeCodePoint\":\"27A33\",\"pinYinChars\":[{\"char\":\"ZHUO2\"}],\"splitChars\":[{\"char\":\"言卓\"}],\"weight\":10},{\"charId\":\"c2b10e9e\",\"unicodeChar\":\"𨥖\",\"unicodeCodePoint\":\"28956\",\"pinYinChars\":[{\"char\":\"SHU\"}],\"splitChars\":[{\"char\":\"金双\"}],\"weight\":10},{\"charId\":\"0ad4d0b1\",\"unicodeChar\":\"𧨡\",\"unicodeCodePoint\":\"27A21\",\"pinYinChars\":[{\"char\":\"CHEN2\"}],\"splitChars\":[{\"char\":\"言君\"}],\"weight\":10},{\"charId\":\"c08f1956\",\"unicodeChar\":\"𨚗\",\"unicodeCodePoint\":\"28697\",\"pinYinChars\":[{\"char\":\"NA4\"}],\"splitChars\":[{\"char\":\"冉阝\"}],\"weight\":10},{\"charId\":\"8b021324\",\"unicodeChar\":\"𧧾\",\"unicodeCodePoint\":\"279FE\",\"pinYinChars\":[{\"char\":\"HUI4\"}],\"splitChars\":[{\"char\":\"言貝\"}],\"weight\":10},{\"charId\":\"6ccd5cfc\",\"unicodeChar\":\"𨟠\",\"unicodeCodePoint\":\"287E0\",\"pinYinChars\":[{\"char\":\"QUE4\"}],\"splitChars\":[{\"char\":\"瞿阝\"}],\"weight\":10},{\"charId\":\"80f6e4ab\",\"unicodeChar\":\"𨓨\",\"unicodeCodePoint\":\"284E8\",\"pinYinChars\":[{\"char\":\"YONG3\"}],\"splitChars\":[{\"char\":\"辶角\"}],\"weight\":10},{\"charId\":\"6e51643a\",\"unicodeChar\":\"𧧸\",\"unicodeCodePoint\":\"279F8\",\"pinYinChars\":[{\"char\":\"BIE2\"}],\"splitChars\":[{\"char\":\"言别\"}],\"weight\":10},{\"charId\":\"73c49457\",\"unicodeChar\":\"𧧕\",\"unicodeCodePoint\":\"279D5\",\"pinYinChars\":[{\"char\":\"ZI4\"}],\"splitChars\":[{\"char\":\"言字\"}],\"weight\":10},{\"charId\":\"39c0adcb\",\"unicodeChar\":\"𠽠\",\"unicodeCodePoint\":\"20F60\",\"pinYinChars\":[{\"char\":\"DUAN4\"}],\"splitChars\":[{\"char\":\"古段\"}],\"weight\":10},{\"charId\":\"bd3ce554\",\"unicodeChar\":\"𧙖\",\"unicodeCodePoint\":\"27656\",\"pinYinChars\":[{\"char\":\"GU1\"}],\"splitChars\":[{\"char\":\"衤古\"}],\"weight\":10},{\"charId\":\"4fcb0a82\",\"unicodeChar\":\"𧪦\",\"unicodeCodePoint\":\"27AA6\",\"pinYinChars\":[{\"char\":\"TA1\"}],\"splitChars\":[{\"char\":\"訁𦐇\"}],\"weight\":10},{\"charId\":\"2d2611d6\",\"unicodeChar\":\"𧬌\",\"unicodeCodePoint\":\"27B0C\",\"pinYinChars\":[{\"char\":\"YAN2\"}],\"splitChars\":[{\"char\":\"言山\"}],\"weight\":10},{\"charId\":\"4c65e913\",\"unicodeChar\":\"𨐒\",\"unicodeCodePoint\":\"28412\",\"pinYinChars\":[{\"char\":\"GU1\"}],\"splitChars\":[{\"char\":\"古辛\"}],\"weight\":10},{\"charId\":\"e5929084\",\"unicodeChar\":\"𧬆\",\"unicodeCodePoint\":\"27B06\",\"pinYinChars\":[{\"char\":\"ZHAN3\"}],\"splitChars\":[{\"char\":\"言善\"}],\"weight\":10},{\"charId\":\"afe1eccc\",\"unicodeChar\":\"𨑥\",\"unicodeCodePoint\":\"28465\",\"pinYinChars\":[{\"char\":\"WU4\"}],\"splitChars\":[{\"char\":\"辶勿\"}],\"weight\":10},{\"charId\":\"5062372c\",\"unicodeChar\":\"𧬂\",\"unicodeCodePoint\":\"27B02\",\"pinYinChars\":[{\"char\":\"HE4\"}],\"splitChars\":[{\"char\":\"言賀\"}],\"weight\":10},{\"charId\":\"681a3a18\",\"unicodeChar\":\"𬭤\",\"unicodeCodePoint\":\"2CB64\",\"pinYinChars\":[{\"char\":\"HOU2\"}],\"splitChars\":[{\"char\":\"钅侯\"}],\"weight\":10},{\"charId\":\"1307e744\",\"unicodeChar\":\"𨈘\",\"unicodeCodePoint\":\"28218\",\"pinYinChars\":[{\"char\":\"SHAO3\"}],\"splitChars\":[{\"char\":\"身少\"}],\"weight\":10},{\"charId\":\"fa918320\",\"unicodeChar\":\"𧫿\",\"unicodeCodePoint\":\"27AFF\",\"pinYinChars\":[{\"char\":\"TAN3\"}],\"splitChars\":[{\"char\":\"言尋\"}],\"weight\":10},{\"charId\":\"e9ebd213\",\"unicodeChar\":\"𧫱\",\"unicodeCodePoint\":\"27AF1\",\"pinYinChars\":[{\"char\":\"ZHANG1\"}],\"splitChars\":[{\"char\":\"言章\"}],\"weight\":10},{\"charId\":\"9eb64a46\",\"unicodeChar\":\"𧫥\",\"unicodeCodePoint\":\"27AE5\",\"pinYinChars\":[{\"char\":\"AN1\"}],\"splitChars\":[{\"char\":\"言庵\"}],\"weight\":10},{\"charId\":\"7cadb65c\",\"unicodeChar\":\"𨦮\",\"unicodeCodePoint\":\"289AE\",\"pinYinChars\":[{\"char\":\"JI2\"}],\"splitChars\":[{\"char\":\"氵金\"}],\"weight\":10},{\"charId\":\"77c65e3f\",\"unicodeChar\":\"𠃛\",\"unicodeCodePoint\":\"200DB\",\"pinYinChars\":[{\"char\":\"YA4\"}],\"splitChars\":[{\"char\":\"彑(彐)乙\"}],\"weight\":10},{\"charId\":\"bc2bcc39\",\"unicodeChar\":\"𧺫\",\"unicodeCodePoint\":\"27EAB\",\"pinYinChars\":[{\"char\":\"CH\"}],\"splitChars\":[{\"char\":\"走尺\"}],\"weight\":10},{\"charId\":\"fef5bd0c\",\"unicodeChar\":\"𧡤\",\"unicodeCodePoint\":\"27864\",\"pinYinChars\":[{\"char\":\"PIAN1\"}],\"splitChars\":[{\"char\":\"扁見\"}],\"weight\":10},{\"charId\":\"5570c1d0\",\"unicodeChar\":\"𧻢\",\"unicodeCodePoint\":\"27EE2\",\"pinYinChars\":[{\"char\":\"HU\"}],\"splitChars\":[{\"char\":\"走回\"}],\"weight\":10},{\"charId\":\"fccb3cbd\",\"unicodeChar\":\"𧠯\",\"unicodeCodePoint\":\"2782F\",\"pinYinChars\":[{\"char\":\"JI2\"}],\"splitChars\":[{\"char\":\"吉見\"}],\"weight\":10},{\"charId\":\"df0b8aaa\",\"unicodeChar\":\"𧠪\",\"unicodeCodePoint\":\"2782A\",\"pinYinChars\":[{\"char\":\"QI1\"}],\"splitChars\":[{\"char\":\"上(尗)見\"}],\"weight\":10},{\"charId\":\"a8f7e33c\",\"unicodeChar\":\"𧲧\",\"unicodeCodePoint\":\"27CA7\",\"pinYinChars\":[{\"char\":\"BA1\"}],\"splitChars\":[{\"char\":\"豸巴\"}],\"weight\":10},{\"charId\":\"b5b784fa\",\"unicodeChar\":\"𧠩\",\"unicodeCodePoint\":\"27829\",\"pinYinChars\":[{\"char\":\"HU1\"}],\"splitChars\":[{\"char\":\"共見\"}],\"weight\":10},{\"charId\":\"e287e1f0\",\"unicodeChar\":\"𧠆\",\"unicodeCodePoint\":\"27806\",\"pinYinChars\":[{\"char\":\"WAN3\"}],\"splitChars\":[{\"char\":\"自儿\"}],\"weight\":10},{\"charId\":\"ff4caf2d\",\"unicodeChar\":\"𧝁\",\"unicodeCodePoint\":\"27741\",\"pinYinChars\":[{\"char\":\"XUAN1\"}],\"splitChars\":[{\"char\":\"衤羽\"}],\"weight\":10},{\"charId\":\"3eb705e9\",\"unicodeChar\":\"𦰡\",\"unicodeCodePoint\":\"26C21\",\"pinYinChars\":[{\"char\":\"NA4\"}],\"splitChars\":[{\"char\":\"艹那\"}],\"weight\":10},{\"charId\":\"db352ff0\",\"unicodeChar\":\"𧧏\",\"unicodeCodePoint\":\"279CF\",\"pinYinChars\":[{\"char\":\"RE4\"}],\"splitChars\":[{\"char\":\"如言\"}],\"weight\":10},{\"charId\":\"0f161093\",\"unicodeChar\":\"𦭳\",\"unicodeCodePoint\":\"26B73\",\"pinYinChars\":[{\"char\":\"YU3\"}],\"splitChars\":[{\"char\":\"艹羽\"}],\"weight\":10},{\"charId\":\"f1f70098\",\"unicodeChar\":\"𦯿\",\"unicodeCodePoint\":\"26BFF\",\"pinYinChars\":[{\"char\":\"GU\"}],\"splitChars\":[{\"char\":\"艹寸\"}],\"weight\":10},{\"charId\":\"765913dd\",\"unicodeChar\":\"𧪚\",\"unicodeCodePoint\":\"27A9A\",\"pinYinChars\":[{\"char\":\"AI2\"}],\"splitChars\":[{\"char\":\"言豈\"}],\"weight\":10},{\"charId\":\"a536fe00\",\"unicodeChar\":\"𧪕\",\"unicodeCodePoint\":\"27A95\",\"pinYinChars\":[{\"char\":\"XIA1\"}],\"splitChars\":[{\"char\":\"言叚\"}],\"weight\":10},{\"charId\":\"d8cc97c7\",\"unicodeChar\":\"𧐔\",\"unicodeCodePoint\":\"27414\",\"pinYinChars\":[{\"char\":\"XI2\"}],\"splitChars\":[{\"char\":\"虫習\"}],\"weight\":10},{\"charId\":\"78547a89\",\"unicodeChar\":\"𧩦\",\"unicodeCodePoint\":\"27A66\",\"pinYinChars\":[{\"char\":\"JI2\"}],\"splitChars\":[{\"char\":\"言亟\"}],\"weight\":10},{\"charId\":\"0cf5a5d5\",\"unicodeChar\":\"𧨿\",\"unicodeCodePoint\":\"27A3F\",\"pinYinChars\":[{\"char\":\"ZHA3\"}],\"splitChars\":[{\"char\":\"言白\"}],\"weight\":10},{\"charId\":\"bf10e51d\",\"unicodeChar\":\"𨈓\",\"unicodeCodePoint\":\"28213\",\"pinYinChars\":[{\"char\":\"LENG2\"}],\"splitChars\":[{\"char\":\"身小\"}],\"weight\":10},{\"charId\":\"773a2a28\",\"unicodeChar\":\"𧼯\",\"unicodeCodePoint\":\"27F2F\",\"pinYinChars\":[{\"char\":\"SHU4\"}],\"splitChars\":[{\"char\":\"走俞\"}],\"weight\":10},{\"charId\":\"26eb040d\",\"unicodeChar\":\"𬽦\",\"unicodeCodePoint\":\"2CF66\",\"pinYinChars\":[{\"char\":\"ZHI\"}],\"splitChars\":[{\"char\":\"亻丸\"}],\"weight\":10},{\"charId\":\"2c3b0938\",\"unicodeChar\":\"𧮞\",\"unicodeCodePoint\":\"27B9E\",\"pinYinChars\":[{\"char\":\"XUE4\"}],\"splitChars\":[{\"char\":\"言矍\"}],\"weight\":10},{\"charId\":\"6dc72b3f\",\"unicodeChar\":\"𧭮\",\"unicodeCodePoint\":\"27B6E\",\"pinYinChars\":[{\"char\":\"MIAN2\"}],\"splitChars\":[{\"char\":\"言方\"}],\"weight\":10},{\"charId\":\"a918555a\",\"unicodeChar\":\"𧭜\",\"unicodeCodePoint\":\"27B5C\",\"pinYinChars\":[{\"char\":\"LV4\"}],\"splitChars\":[{\"char\":\"言慮\"}],\"weight\":10},{\"charId\":\"55f504ef\",\"unicodeChar\":\"𬽬\",\"unicodeCodePoint\":\"2CF6C\",\"pinYinChars\":[{\"char\":\"GU4\"}],\"splitChars\":[{\"char\":\"亻户\"}],\"weight\":10},{\"charId\":\"daf75e80\",\"unicodeChar\":\"𧫤\",\"unicodeCodePoint\":\"27AE4\",\"pinYinChars\":[{\"char\":\"BI4\"}],\"splitChars\":[{\"char\":\"言畢\"}],\"weight\":10},{\"charId\":\"f7d124fd\",\"unicodeChar\":\"𨿅\",\"unicodeCodePoint\":\"28FC5\",\"pinYinChars\":[{\"char\":\"MING2\"}],\"splitChars\":[{\"char\":\"名隹\"}],\"weight\":10},{\"charId\":\"345810fa\",\"unicodeChar\":\"𧫜\",\"unicodeCodePoint\":\"27ADC\",\"pinYinChars\":[{\"char\":\"JI4\"}],\"splitChars\":[{\"char\":\"既言\"}],\"weight\":10},{\"charId\":\"71761895\",\"unicodeChar\":\"𨹓\",\"unicodeCodePoint\":\"28E53\",\"pinYinChars\":[{\"char\":\"HAN\"}],\"splitChars\":[{\"char\":\"阝巾\"}],\"weight\":10},{\"charId\":\"095d6446\",\"unicodeChar\":\"𧫕\",\"unicodeCodePoint\":\"27AD5\",\"pinYinChars\":[{\"char\":\"QIE4\"}],\"splitChars\":[{\"char\":\"言祭\"}],\"weight\":10},{\"charId\":\"d167ce71\",\"unicodeChar\":\"𨻧\",\"unicodeCodePoint\":\"28EE7\",\"pinYinChars\":[{\"char\":\"LIU2\"}],\"splitChars\":[{\"char\":\"阝留\"}],\"weight\":10},{\"charId\":\"50cb8f48\",\"unicodeChar\":\"𧫓\",\"unicodeCodePoint\":\"27AD3\",\"pinYinChars\":[{\"char\":\"LU3\"}],\"splitChars\":[{\"char\":\"言鹵\"}],\"weight\":10},{\"charId\":\"56715809\",\"unicodeChar\":\"𩡝\",\"unicodeCodePoint\":\"2985D\",\"pinYinChars\":[{\"char\":\"TAN2\"}],\"splitChars\":[{\"char\":\"香覃\"}],\"weight\":10},{\"charId\":\"5f95ddd7\",\"unicodeChar\":\"𤦵\",\"unicodeCodePoint\":\"249B5\",\"pinYinChars\":[{\"char\":\"YAN4\"}],\"splitChars\":[{\"char\":\"王妟(匽)\"}],\"weight\":10},{\"charId\":\"345140b1\",\"unicodeChar\":\"𪢼\",\"unicodeCodePoint\":\"2A8BC\",\"pinYinChars\":[{\"char\":\"WA2\"}],\"splitChars\":[{\"char\":\"土化\"}],\"weight\":10},{\"charId\":\"7266aacd\",\"unicodeChar\":\"𪢻\",\"unicodeCodePoint\":\"2A8BB\",\"pinYinChars\":[{\"char\":\"YUE4\"}],\"splitChars\":[{\"char\":\"土月\"}],\"weight\":10},{\"charId\":\"ff17a032\",\"unicodeChar\":\"𫭟\",\"unicodeCodePoint\":\"2BB5F\",\"pinYinChars\":[{\"char\":\"OU1\"}],\"splitChars\":[{\"char\":\"土区\"}],\"weight\":10},{\"charId\":\"fe0ba937\",\"unicodeChar\":\"𫭝\",\"unicodeCodePoint\":\"2BB5D\",\"pinYinChars\":[{\"char\":\"FU1\"}],\"splitChars\":[{\"char\":\"土夫\"}],\"weight\":10},{\"charId\":\"b939f632\",\"unicodeChar\":\"𪢹\",\"unicodeCodePoint\":\"2A8B9\",\"pinYinChars\":[{\"char\":\"PAN4\"}],\"splitChars\":[{\"char\":\"土冇\"}],\"weight\":10},{\"charId\":\"ea620e97\",\"unicodeChar\":\"𪢸\",\"unicodeCodePoint\":\"2A8B8\",\"pinYinChars\":[{\"char\":\"WU2\"}],\"splitChars\":[{\"char\":\"土无\"}],\"weight\":10},{\"charId\":\"5f01d64a\",\"unicodeChar\":\"𪢫\",\"unicodeCodePoint\":\"2A8AB\",\"pinYinChars\":[{\"char\":\"WEI2\"}],\"splitChars\":[{\"char\":\"囗車\"}],\"weight\":10},{\"charId\":\"97978e15\",\"unicodeChar\":\"𪟝\",\"unicodeCodePoint\":\"2A7DD\",\"pinYinChars\":[{\"char\":\"JI4\"}],\"splitChars\":[{\"char\":\"责力\"}],\"weight\":10},{\"charId\":\"cb1db5d4\",\"unicodeChar\":\"𪞤\",\"unicodeCodePoint\":\"2A7A4\",\"pinYinChars\":[{\"char\":\"NIAN4\"}],\"splitChars\":[{\"char\":\"冫念\"}],\"weight\":10},{\"charId\":\"1e650623\",\"unicodeChar\":\"𫥆\",\"unicodeCodePoint\":\"2B946\",\"pinYinChars\":[{\"char\":\"YONG3\"}],\"splitChars\":[{\"char\":\"冫永\"}],\"weight\":10},{\"charId\":\"a4bf28dc\",\"unicodeChar\":\"𭖊\",\"unicodeCodePoint\":\"2D58A\",\"pinYinChars\":[{\"char\":\"LONG\"}],\"splitChars\":[{\"char\":\"冖(\"}],\"weight\":10},{\"charId\":\"6f3dfd6f\",\"unicodeChar\":\"𪝆\",\"unicodeCodePoint\":\"2A746\",\"pinYinChars\":[{\"char\":\"FANG1\"}],\"splitChars\":[{\"char\":\"亻芳\"}],\"weight\":10},{\"charId\":\"10dff3f6\",\"unicodeChar\":\"𫮉\",\"unicodeCodePoint\":\"2BB89\",\"pinYinChars\":[{\"char\":\"PING2\"}],\"splitChars\":[{\"char\":\"土苹\"}],\"weight\":10},{\"charId\":\"04838e6a\",\"unicodeChar\":\"𪣤\",\"unicodeCodePoint\":\"2A8E4\",\"pinYinChars\":[{\"char\":\"CUO4\"}],\"splitChars\":[{\"char\":\"土昔\"}],\"weight\":10},{\"charId\":\"21425c2a\",\"unicodeChar\":\"𪣟\",\"unicodeCodePoint\":\"2A8DF\",\"pinYinChars\":[{\"char\":\"HAN4\"}],\"splitChars\":[{\"char\":\"土罕\"}],\"weight\":10},{\"charId\":\"c080c2db\",\"unicodeChar\":\"𪣜\",\"unicodeCodePoint\":\"2A8DC\",\"pinYinChars\":[{\"char\":\"XIU4\"}],\"splitChars\":[{\"char\":\"土秀\"}],\"weight\":10},{\"charId\":\"051ded75\",\"unicodeChar\":\"𪣑\",\"unicodeCodePoint\":\"2A8D1\",\"pinYinChars\":[{\"char\":\"NONG2\"}],\"splitChars\":[{\"char\":\"土农\"}],\"weight\":10},{\"charId\":\"3b3cae45\",\"unicodeChar\":\"鿍\",\"unicodeCodePoint\":\"9FCD\",\"pinYinChars\":[{\"char\":\"GANG4\"}],\"splitChars\":[{\"char\":\"土夅\"}],\"weight\":10},{\"charId\":\"cfd95724\",\"unicodeChar\":\"𪣉\",\"unicodeCodePoint\":\"2A8C9\",\"pinYinChars\":[{\"char\":\"YONG3\"}],\"splitChars\":[{\"char\":\"土永\"}],\"weight\":10},{\"charId\":\"d5210e72\",\"unicodeChar\":\"𦤎\",\"unicodeCodePoint\":\"2690E\",\"pinYinChars\":[{\"char\":\"GAO3\"}],\"splitChars\":[{\"char\":\"自本\"}],\"weight\":10},{\"charId\":\"73761138\",\"unicodeChar\":\"𦣦\",\"unicodeCodePoint\":\"268E6\",\"pinYinChars\":[{\"char\":\"WANG2\"}],\"splitChars\":[{\"char\":\"臣臣\"}],\"weight\":10},{\"charId\":\"194c6f43\",\"unicodeChar\":\"𪻏\",\"unicodeCodePoint\":\"2AECF\",\"pinYinChars\":[{\"char\":\"JI2\"}],\"splitChars\":[{\"char\":\"王及\"}],\"weight\":10},{\"charId\":\"ebaa61bd\",\"unicodeChar\":\"𦨴\",\"unicodeCodePoint\":\"26A34\",\"pinYinChars\":[{\"char\":\"TONG2\"}],\"splitChars\":[{\"char\":\"舟同\"}],\"weight\":10},{\"charId\":\"628bcda9\",\"unicodeChar\":\"𦨤\",\"unicodeCodePoint\":\"26A24\",\"pinYinChars\":[{\"char\":\"YONG3\"}],\"splitChars\":[{\"char\":\"永舟\"}],\"weight\":10},{\"charId\":\"b7c22172\",\"unicodeChar\":\"𦨢\",\"unicodeCodePoint\":\"26A22\",\"pinYinChars\":[{\"char\":\"DI4\"}],\"splitChars\":[{\"char\":\"舟氐\"}],\"weight\":10},{\"charId\":\"1bb99ad4\",\"unicodeChar\":\"𦨍\",\"unicodeCodePoint\":\"26A0D\",\"pinYinChars\":[{\"char\":\"DING1\"}],\"splitChars\":[{\"char\":\"舟丁\"}],\"weight\":10},{\"charId\":\"7f890755\",\"unicodeChar\":\"𦨉\",\"unicodeCodePoint\":\"26A09\",\"pinYinChars\":[{\"char\":\"WU4\"}],\"splitChars\":[{\"char\":\"舟刂\"}],\"weight\":10},{\"charId\":\"c3ad299f\",\"unicodeChar\":\"𦙶\",\"unicodeCodePoint\":\"26676\",\"pinYinChars\":[{\"char\":\"GU3\"}],\"splitChars\":[{\"char\":\"月古\"}],\"weight\":10},{\"charId\":\"b73070d2\",\"unicodeChar\":\"𦛋\",\"unicodeCodePoint\":\"266CB\",\"pinYinChars\":[{\"char\":\"JI2\"}],\"splitChars\":[{\"char\":\"月吉\"}],\"weight\":10},{\"charId\":\"aa378c7a\",\"unicodeChar\":\"𦚱\",\"unicodeCodePoint\":\"266B1\",\"pinYinChars\":[{\"char\":\"LAO3\"}],\"splitChars\":[{\"char\":\"月老\"}],\"weight\":10},{\"charId\":\"127d5e65\",\"unicodeChar\":\"𦚧\",\"unicodeCodePoint\":\"266A7\",\"pinYinChars\":[{\"char\":\"CHUN3\"}],\"splitChars\":[{\"char\":\"月旬\"}],\"weight\":10},{\"charId\":\"008a5531\",\"unicodeChar\":\"𦚔\",\"unicodeCodePoint\":\"26694\",\"pinYinChars\":[{\"char\":\"ZH\"}],\"splitChars\":[{\"char\":\"月召\"}],\"weight\":10},{\"charId\":\"9e38b345\",\"unicodeChar\":\"𦮛\",\"unicodeCodePoint\":\"26B9B\",\"pinYinChars\":[{\"char\":\"JI\"}],\"splitChars\":[{\"char\":\"艹久\"}],\"weight\":10},{\"charId\":\"d726da0c\",\"unicodeChar\":\"𦭻\",\"unicodeCodePoint\":\"26B7B\",\"pinYinChars\":[{\"char\":\"JIU4\"}],\"splitChars\":[{\"char\":\"艹臼\"}],\"weight\":10},{\"charId\":\"9b174539\",\"unicodeChar\":\"𦭶\",\"unicodeCodePoint\":\"26B76\",\"pinYinChars\":[{\"char\":\"XIAN3\"}],\"splitChars\":[{\"char\":\"艹先\"}],\"weight\":10},{\"charId\":\"51b03cc1\",\"unicodeChar\":\"𦭰\",\"unicodeCodePoint\":\"26B70\",\"pinYinChars\":[{\"char\":\"RU2\"}],\"splitChars\":[{\"char\":\"艹汝\"}],\"weight\":10},{\"charId\":\"397c4b6f\",\"unicodeChar\":\"𦩠\",\"unicodeCodePoint\":\"26A60\",\"pinYinChars\":[{\"char\":\"XING1\"}],\"splitChars\":[{\"char\":\"舟星\"}],\"weight\":10},{\"charId\":\"0df5a92b\",\"unicodeChar\":\"𦩘\",\"unicodeCodePoint\":\"26A58\",\"pinYinChars\":[{\"char\":\"DING4\"}],\"splitChars\":[{\"char\":\"舟定\"}],\"weight\":10},{\"charId\":\"27945642\",\"unicodeChar\":\"𦩏\",\"unicodeCodePoint\":\"26A4F\",\"pinYinChars\":[{\"char\":\"JIN1\"}],\"splitChars\":[{\"char\":\"舟隹\"}],\"weight\":10},{\"charId\":\"48aa6e63\",\"unicodeChar\":\"𦩌\",\"unicodeCodePoint\":\"26A4C\",\"pinYinChars\":[{\"char\":\"XIE4\"}],\"splitChars\":[{\"char\":\"舟疌\"}],\"weight\":10},{\"charId\":\"fa304920\",\"unicodeChar\":\"𦭑\",\"unicodeCodePoint\":\"26B51\",\"pinYinChars\":[{\"char\":\"TING1\"}],\"splitChars\":[{\"char\":\"艹丁\"}],\"weight\":10},{\"charId\":\"cf0b4907\",\"unicodeChar\":\"𦮹\",\"unicodeCodePoint\":\"26BB9\",\"pinYinChars\":[{\"char\":\"FU2\"}],\"splitChars\":[{\"char\":\"艹巴\"}],\"weight\":10},{\"charId\":\"ed2af285\",\"unicodeChar\":\"𦮶\",\"unicodeCodePoint\":\"26BB6\",\"pinYinChars\":[{\"char\":\"WEN3\"}],\"splitChars\":[{\"char\":\"艹吻\"}],\"weight\":10},{\"charId\":\"3f880bdc\",\"unicodeChar\":\"𦮭\",\"unicodeCodePoint\":\"26BAD\",\"pinYinChars\":[{\"char\":\"CH\"}],\"splitChars\":[{\"char\":\"艹水\"}],\"weight\":10},{\"charId\":\"5b355964\",\"unicodeChar\":\"𦬁\",\"unicodeCodePoint\":\"26B01\",\"pinYinChars\":[{\"char\":\"CAI2\"}],\"splitChars\":[{\"char\":\"艹才\"}],\"weight\":10},{\"charId\":\"cf8b8e14\",\"unicodeChar\":\"𦪙\",\"unicodeCodePoint\":\"26A99\",\"pinYinChars\":[{\"char\":\"TA4\"}],\"splitChars\":[{\"char\":\"舟羽(翕)\"}],\"weight\":10},{\"charId\":\"a3bea615\",\"unicodeChar\":\"𦪑\",\"unicodeCodePoint\":\"26A91\",\"pinYinChars\":[{\"char\":\"FA2\"}],\"splitChars\":[{\"char\":\"舟發\"}],\"weight\":10},{\"charId\":\"251f880e\",\"unicodeChar\":\"𦢂\",\"unicodeCodePoint\":\"26882\",\"pinYinChars\":[{\"char\":\"PU2\"}],\"splitChars\":[{\"char\":\"月美\"}],\"weight\":10},{\"charId\":\"e26350b3\",\"unicodeChar\":\"𦟟\",\"unicodeCodePoint\":\"267DF\",\"pinYinChars\":[{\"char\":\"MO2\"}],\"splitChars\":[{\"char\":\"月麻\"}],\"weight\":10},{\"charId\":\"a85bea2d\",\"unicodeChar\":\"𦞳\",\"unicodeCodePoint\":\"267B3\",\"pinYinChars\":[{\"char\":\"RONG2\"}],\"splitChars\":[{\"char\":\"月容\"}],\"weight\":10},{\"charId\":\"14219a68\",\"unicodeChar\":\"𭸷\",\"unicodeCodePoint\":\"2DE37\",\"pinYinChars\":[{\"char\":\"ZHI1\"}],\"splitChars\":[{\"char\":\"王支\"}],\"weight\":10},{\"charId\":\"d3d7fc11\",\"unicodeChar\":\"𦝨\",\"unicodeCodePoint\":\"26768\",\"pinYinChars\":[{\"char\":\"JIE1\"}],\"splitChars\":[{\"char\":\"月皆\"}],\"weight\":10},{\"charId\":\"12f88044\",\"unicodeChar\":\"𦨾\",\"unicodeCodePoint\":\"26A3E\",\"pinYinChars\":[{\"char\":\"HENG1\"}],\"splitChars\":[{\"char\":\"舟亨\"}],\"weight\":10},{\"charId\":\"e7eb1527\",\"unicodeChar\":\"𦬱\",\"unicodeCodePoint\":\"26B31\",\"pinYinChars\":[{\"char\":\"SH\"}],\"splitChars\":[{\"char\":\"艹升\"}],\"weight\":10},{\"charId\":\"ff3e6252\",\"unicodeChar\":\"𦬪\",\"unicodeCodePoint\":\"26B2A\",\"pinYinChars\":[{\"char\":\"ZH\"}],\"splitChars\":[{\"char\":\"艹丁\"}],\"weight\":10},{\"charId\":\"cc377700\",\"unicodeChar\":\"𦬞\",\"unicodeCodePoint\":\"26B1E\",\"pinYinChars\":[{\"char\":\"TIAN1\"}],\"splitChars\":[{\"char\":\"艹天\"}],\"weight\":10},{\"charId\":\"0413dfd3\",\"unicodeChar\":\"𦬕\",\"unicodeCodePoint\":\"26B15\",\"pinYinChars\":[{\"char\":\"ZHONG1\"}],\"splitChars\":[{\"char\":\"艹中\"}],\"weight\":10},{\"charId\":\"b8065c44\",\"unicodeChar\":\"𦴊\",\"unicodeCodePoint\":\"26D0A\",\"pinYinChars\":[{\"char\":\"YANG1\"}],\"splitChars\":[{\"char\":\"艹殃\"}],\"weight\":10},{\"charId\":\"3c54fa58\",\"unicodeChar\":\"𦳫\",\"unicodeCodePoint\":\"26CEB\",\"pinYinChars\":[{\"char\":\"SHAN1\"}],\"splitChars\":[{\"char\":\"艹欠\"}],\"weight\":10},{\"charId\":\"625acd61\",\"unicodeChar\":\"𦳝\",\"unicodeCodePoint\":\"26CDD\",\"pinYinChars\":[{\"char\":\"TANG1\"}],\"splitChars\":[{\"char\":\"艹昜\"}],\"weight\":10},{\"charId\":\"efe81d2d\",\"unicodeChar\":\"𤇏\",\"unicodeCodePoint\":\"241CF\",\"pinYinChars\":[{\"char\":\"CH\"}],\"splitChars\":[{\"char\":\"氶灬\"}],\"weight\":10},{\"charId\":\"c9aaa065\",\"unicodeChar\":\"𦰱\",\"unicodeCodePoint\":\"26C31\",\"pinYinChars\":[{\"char\":\"CHANG2\"}],\"splitChars\":[{\"char\":\"艹尚\"}],\"weight\":10},{\"charId\":\"130dcd77\",\"unicodeChar\":\"𦳌\",\"unicodeCodePoint\":\"26CCC\",\"pinYinChars\":[{\"char\":\"XUN2\"}],\"splitChars\":[{\"char\":\"艹急\"}],\"weight\":10},{\"charId\":\"c65f6304\",\"unicodeChar\":\"𤓾\",\"unicodeCodePoint\":\"244FE\",\"pinYinChars\":[{\"char\":\"DAO4\"}],\"splitChars\":[{\"char\":\"爪丈\"}],\"weight\":10},{\"charId\":\"9b945778\",\"unicodeChar\":\"𦳄\",\"unicodeCodePoint\":\"26CC4\",\"pinYinChars\":[{\"char\":\"PIAN2\"}],\"splitChars\":[{\"char\":\"艹便\"}],\"weight\":10},{\"charId\":\"e67f84c8\",\"unicodeChar\":\"𤍤\",\"unicodeCodePoint\":\"24364\",\"pinYinChars\":[{\"char\":\"ZHANG1\"}],\"splitChars\":[{\"char\":\"火章\"}],\"weight\":10},{\"charId\":\"ed0cd464\",\"unicodeChar\":\"𦲶\",\"unicodeCodePoint\":\"26CB6\",\"pinYinChars\":[{\"char\":\"CH\"}],\"splitChars\":[{\"char\":\"艹承\"}],\"weight\":10},{\"charId\":\"a1a683a3\",\"unicodeChar\":\"𤉙\",\"unicodeCodePoint\":\"24259\",\"pinYinChars\":[{\"char\":\"QUN2\"}],\"splitChars\":[{\"char\":\"火君\"}],\"weight\":10},{\"charId\":\"c45130a6\",\"unicodeChar\":\"𦵧\",\"unicodeCodePoint\":\"26D67\",\"pinYinChars\":[{\"char\":\"LANG2\"}],\"splitChars\":[{\"char\":\"艹狼\"}],\"weight\":10},{\"charId\":\"51258e6d\",\"unicodeChar\":\"𦱊\",\"unicodeCodePoint\":\"26C4A\",\"pinYinChars\":[{\"char\":\"ZHENG1\"}],\"splitChars\":[{\"char\":\"艹争\"}],\"weight\":10},{\"charId\":\"54a296b8\",\"unicodeChar\":\"𦱅\",\"unicodeCodePoint\":\"26C45\",\"pinYinChars\":[{\"char\":\"JU1\"}],\"splitChars\":[{\"char\":\"艹居\"}],\"weight\":10},{\"charId\":\"0abccd00\",\"unicodeChar\":\"𦱀\",\"unicodeCodePoint\":\"26C40\",\"pinYinChars\":[{\"char\":\"YU4\"}],\"splitChars\":[{\"char\":\"艹育\"}],\"weight\":10},{\"charId\":\"0c7567f7\",\"unicodeChar\":\"𦰺\",\"unicodeCodePoint\":\"26C3A\",\"pinYinChars\":[{\"char\":\"FU4\"}],\"splitChars\":[{\"char\":\"艹阜\"}],\"weight\":10},{\"charId\":\"788e4f56\",\"unicodeChar\":\"𦭛\",\"unicodeCodePoint\":\"26B5B\",\"pinYinChars\":[{\"char\":\"QI\"}],\"splitChars\":[{\"char\":\"艹仟\"}],\"weight\":10},{\"charId\":\"28b9445a\",\"unicodeChar\":\"𦭘\",\"unicodeCodePoint\":\"26B58\",\"pinYinChars\":[{\"char\":\"YUAN2\"}],\"splitChars\":[{\"char\":\"艹卩\"}],\"weight\":10},{\"charId\":\"2ca91bce\",\"unicodeChar\":\"𦰏\",\"unicodeCodePoint\":\"26C0F\",\"pinYinChars\":[{\"char\":\"TI\"}],\"splitChars\":[{\"char\":\"艹条\"}],\"weight\":10},{\"charId\":\"e9e8d308\",\"unicodeChar\":\"𦯬\",\"unicodeCodePoint\":\"26BEC\",\"pinYinChars\":[{\"char\":\"SHE2\"}],\"splitChars\":[{\"char\":\"艹佘\"}],\"weight\":10},{\"charId\":\"d9b618f1\",\"unicodeChar\":\"𣺮\",\"unicodeCodePoint\":\"23EAE\",\"pinYinChars\":[{\"char\":\"TAO4\"}],\"splitChars\":[{\"char\":\"氵套\"}],\"weight\":10},{\"charId\":\"c0aaa9b0\",\"unicodeChar\":\"𦯀\",\"unicodeCodePoint\":\"26BC0\",\"pinYinChars\":[{\"char\":\"BEN4\"}],\"splitChars\":[{\"char\":\"艹(芬)土\"}],\"weight\":10},{\"charId\":\"31aba09a\",\"unicodeChar\":\"𦱷\",\"unicodeCodePoint\":\"26C77\",\"pinYinChars\":[{\"char\":\"FEI1\"}],\"splitChars\":[{\"char\":\"艹灬\"}],\"weight\":10},{\"charId\":\"a99acdd1\",\"unicodeChar\":\"𤤗\",\"unicodeCodePoint\":\"24917\",\"pinYinChars\":[{\"char\":\"NI2\"}],\"splitChars\":[{\"char\":\"王尼\"}],\"weight\":10},{\"charId\":\"206c97ec\",\"unicodeChar\":\"𤤮\",\"unicodeCodePoint\":\"2492E\",\"pinYinChars\":[{\"char\":\"DONG1\"}],\"splitChars\":[{\"char\":\"王冬\"}],\"weight\":10},{\"charId\":\"d7fe362c\",\"unicodeChar\":\"𭩈\",\"unicodeCodePoint\":\"2DA48\",\"pinYinChars\":[{\"char\":\"XIANG4\"}],\"splitChars\":[{\"char\":\"月象\"}],\"weight\":10},{\"charId\":\"68dc90e7\",\"unicodeChar\":\"𤤆\",\"unicodeCodePoint\":\"24906\",\"pinYinChars\":[{\"char\":\"QIN2\"}],\"splitChars\":[{\"char\":\"王斤\"}],\"weight\":10},{\"charId\":\"424cfb9f\",\"unicodeChar\":\"𤩠\",\"unicodeCodePoint\":\"24A60\",\"pinYinChars\":[{\"char\":\"XI3\"}],\"splitChars\":[{\"char\":\"王喜\"}],\"weight\":10},{\"charId\":\"b2adfe40\",\"unicodeChar\":\"𤩔\",\"unicodeCodePoint\":\"24A54\",\"pinYinChars\":[{\"char\":\"TONG2\"}],\"splitChars\":[{\"char\":\"王童\"}],\"weight\":10},{\"charId\":\"c54944e8\",\"unicodeChar\":\"𤨲\",\"unicodeCodePoint\":\"24A32\",\"pinYinChars\":[{\"char\":\"CH\"}],\"splitChars\":[{\"char\":\"王崇\"}],\"weight\":10},{\"charId\":\"03be3097\",\"unicodeChar\":\"𤧼\",\"unicodeCodePoint\":\"249FC\",\"pinYinChars\":[{\"char\":\"GAO3\"}],\"splitChars\":[{\"char\":\"王高\"}],\"weight\":10},{\"charId\":\"7e09f046\",\"unicodeChar\":\"𤙔\",\"unicodeCodePoint\":\"24654\",\"pinYinChars\":[{\"char\":\"ZHAO4\"}],\"splitChars\":[{\"char\":\"牛兆\"}],\"weight\":10},{\"charId\":\"fbeaf302\",\"unicodeChar\":\"𤘪\",\"unicodeCodePoint\":\"2462A\",\"pinYinChars\":[{\"char\":\"DAN1\"}],\"splitChars\":[{\"char\":\"牛丹\"}],\"weight\":10},{\"charId\":\"4dfaf2dc\",\"unicodeChar\":\"𤛭\",\"unicodeCodePoint\":\"246ED\",\"pinYinChars\":[{\"char\":\"QUN2\"}],\"splitChars\":[{\"char\":\"牛牛\"}],\"weight\":10},{\"charId\":\"c87e0318\",\"unicodeChar\":\"𦶕\",\"unicodeCodePoint\":\"26D95\",\"pinYinChars\":[{\"char\":\"SHU1\"}],\"splitChars\":[{\"char\":\"艹書\"}],\"weight\":10},{\"charId\":\"58b17ff8\",\"unicodeChar\":\"𦵼\",\"unicodeCodePoint\":\"26D7C\",\"pinYinChars\":[{\"char\":\"JUN4\"}],\"splitChars\":[{\"char\":\"艹郡\"}],\"weight\":10},{\"charId\":\"f39572b4\",\"unicodeChar\":\"𦵫\",\"unicodeCodePoint\":\"26D6B\",\"pinYinChars\":[{\"char\":\"SUO3\"}],\"splitChars\":[{\"char\":\"艹索\"}],\"weight\":10},{\"charId\":\"02767142\",\"unicodeChar\":\"𤥐\",\"unicodeCodePoint\":\"24950\",\"pinYinChars\":[{\"char\":\"JI2\"}],\"splitChars\":[{\"char\":\"王吉\"}],\"weight\":10},{\"charId\":\"644d453f\",\"unicodeChar\":\"𦵩\",\"unicodeCodePoint\":\"26D69\",\"pinYinChars\":[{\"char\":\"ZAO1\"}],\"splitChars\":[{\"char\":\"艹酒\"}],\"weight\":10},{\"charId\":\"602bbfbe\",\"unicodeChar\":\"𤥁\",\"unicodeCodePoint\":\"24941\",\"pinYinChars\":[{\"char\":\"MING2\"}],\"splitChars\":[{\"char\":\"王名\"}],\"weight\":10},{\"charId\":\"ac101c85\",\"unicodeChar\":\"𤈄\",\"unicodeCodePoint\":\"24204\",\"pinYinChars\":[{\"char\":\"JI2\"}],\"splitChars\":[{\"char\":\"火吉\"}],\"weight\":10},{\"charId\":\"9afc72f1\",\"unicodeChar\":\"𤯥\",\"unicodeCodePoint\":\"24BE5\",\"pinYinChars\":[{\"char\":\"CHAN3\"}],\"splitChars\":[{\"char\":\"如生\"}],\"weight\":10},{\"charId\":\"bcc378a3\",\"unicodeChar\":\"𤬪\",\"unicodeCodePoint\":\"24B2A\",\"pinYinChars\":[{\"char\":\"DU4\"}],\"splitChars\":[{\"char\":\"土瓦\"}],\"weight\":10},{\"charId\":\"91243f31\",\"unicodeChar\":\"𥖜\",\"unicodeCodePoint\":\"2559C\",\"pinYinChars\":[{\"char\":\"JIN3\"}],\"splitChars\":[{\"char\":\"石禁\"}],\"weight\":10},{\"charId\":\"4b2e5e30\",\"unicodeChar\":\"𥖨\",\"unicodeCodePoint\":\"255A8\",\"pinYinChars\":[{\"char\":\"ZAO4\"}],\"splitChars\":[{\"char\":\"石喿\"}],\"weight\":10},{\"charId\":\"ff8ae9d9\",\"unicodeChar\":\"𥕞\",\"unicodeCodePoint\":\"2555E\",\"pinYinChars\":[{\"char\":\"ZH\"}],\"splitChars\":[{\"char\":\"石章\"}],\"weight\":10},{\"charId\":\"672e34fe\",\"unicodeChar\":\"𥕢\",\"unicodeCodePoint\":\"25562\",\"pinYinChars\":[{\"char\":\"CAO2\"}],\"splitChars\":[{\"char\":\"石曹\"}],\"weight\":10},{\"charId\":\"136d4f61\",\"unicodeChar\":\"𤧣\",\"unicodeCodePoint\":\"249E3\",\"pinYinChars\":[{\"char\":\"JIAN4\"}],\"splitChars\":[{\"char\":\"王建\"}],\"weight\":10},{\"charId\":\"d852cd8e\",\"unicodeChar\":\"𤧘\",\"unicodeCodePoint\":\"249D8\",\"pinYinChars\":[{\"char\":\"LING2\"}],\"splitChars\":[{\"char\":\"王香\"}],\"weight\":10},{\"charId\":\"e0083355\",\"unicodeChar\":\"𤧊\",\"unicodeCodePoint\":\"249CA\",\"pinYinChars\":[{\"char\":\"KU\"}],\"splitChars\":[{\"char\":\"王奎\"}],\"weight\":10},{\"charId\":\"af7fe819\",\"unicodeChar\":\"𤧐\",\"unicodeCodePoint\":\"249D0\",\"pinYinChars\":[{\"char\":\"QI\"}],\"splitChars\":[{\"char\":\"王秋\"}],\"weight\":10},{\"charId\":\"e2f2fccb\",\"unicodeChar\":\"𤪑\",\"unicodeCodePoint\":\"24A91\",\"pinYinChars\":[{\"char\":\"MENG2\"}],\"splitChars\":[{\"char\":\"王蒙\"}],\"weight\":10},{\"charId\":\"1a0d903c\",\"unicodeChar\":\"𥐰\",\"unicodeCodePoint\":\"25430\",\"pinYinChars\":[{\"char\":\"OU1\"}],\"splitChars\":[{\"char\":\"石区\"}],\"weight\":10},{\"charId\":\"c79305e5\",\"unicodeChar\":\"𥐙\",\"unicodeCodePoint\":\"25419\",\"pinYinChars\":[{\"char\":\"PA1\"}],\"splitChars\":[{\"char\":\"石八\"}],\"weight\":10},{\"charId\":\"7387413e\",\"unicodeChar\":\"𥂋\",\"unicodeCodePoint\":\"2508B\",\"pinYinChars\":[{\"char\":\"TU2\"}],\"splitChars\":[{\"char\":\"涂皿\"}],\"weight\":10},{\"charId\":\"e3393aaa\",\"unicodeChar\":\"𤰚\",\"unicodeCodePoint\":\"24C1A\",\"pinYinChars\":[{\"char\":\"LA2\"}],\"splitChars\":[{\"char\":\"九田\"}],\"weight\":10},{\"charId\":\"d6a4ab9c\",\"unicodeChar\":\"𤱙\",\"unicodeCodePoint\":\"24C59\",\"pinYinChars\":[{\"char\":\"BEN4\"}],\"splitChars\":[{\"char\":\"田本\"}],\"weight\":10},{\"charId\":\"d87bd7e1\",\"unicodeChar\":\"𥘌\",\"unicodeCodePoint\":\"2560C\",\"pinYinChars\":[{\"char\":\"JI1\"}],\"splitChars\":[{\"char\":\"礻几\"}],\"weight\":10},{\"charId\":\"af020a84\",\"unicodeChar\":\"𥖮\",\"unicodeCodePoint\":\"255AE\",\"pinYinChars\":[{\"char\":\"CU\"}],\"splitChars\":[{\"char\":\"石翠\"}],\"weight\":10},{\"charId\":\"46a178d3\",\"unicodeChar\":\"𥒫\",\"unicodeCodePoint\":\"254AB\",\"pinYinChars\":[{\"char\":\"FU1\"}],\"splitChars\":[{\"char\":\"石孚\"}],\"weight\":10},{\"charId\":\"e74f5f33\",\"unicodeChar\":\"𥓂\",\"unicodeCodePoint\":\"254C2\",\"pinYinChars\":[{\"char\":\"HAN1\"}],\"splitChars\":[{\"char\":\"石含\"}],\"weight\":10},{\"charId\":\"2f169368\",\"unicodeChar\":\"𥑬\",\"unicodeCodePoint\":\"2546C\",\"pinYinChars\":[{\"char\":\"SHAN1\"}],\"splitChars\":[{\"char\":\"石册\"}],\"weight\":10},{\"charId\":\"cc803f45\",\"unicodeChar\":\"𥑋\",\"unicodeCodePoint\":\"2544B\",\"pinYinChars\":[{\"char\":\"GUAI4\"}],\"splitChars\":[{\"char\":\"石圣\"}],\"weight\":10},{\"charId\":\"54ffa1a6\",\"unicodeChar\":\"𨨅\",\"unicodeCodePoint\":\"28A05\",\"pinYinChars\":[{\"char\":\"HU\"}],\"splitChars\":[{\"char\":\"金或\"}],\"weight\":10},{\"charId\":\"d4cf8809\",\"unicodeChar\":\"𨧰\",\"unicodeCodePoint\":\"289F0\",\"pinYinChars\":[{\"char\":\"ZU2\"}],\"splitChars\":[{\"char\":\"金乖\"}],\"weight\":10},{\"charId\":\"6efce1e0\",\"unicodeChar\":\"𨧤\",\"unicodeCodePoint\":\"289E4\",\"pinYinChars\":[{\"char\":\"HENG1\"}],\"splitChars\":[{\"char\":\"金亨\"}],\"weight\":10},{\"charId\":\"afd3462d\",\"unicodeChar\":\"𨧡\",\"unicodeCodePoint\":\"289E1\",\"pinYinChars\":[{\"char\":\"JUN1\"}],\"splitChars\":[{\"char\":\"金君\"}],\"weight\":10},{\"charId\":\"5770e6c8\",\"unicodeChar\":\"𨦫\",\"unicodeCodePoint\":\"289AB\",\"pinYinChars\":[{\"char\":\"YU3\"}],\"splitChars\":[{\"char\":\"金羽\"}],\"weight\":10},{\"charId\":\"bbc88f7e\",\"unicodeChar\":\"𨹸\",\"unicodeCodePoint\":\"28E78\",\"pinYinChars\":[{\"char\":\"ZHA4\"}],\"splitChars\":[{\"char\":\"阝土\"}],\"weight\":10},{\"charId\":\"5c344144\",\"unicodeChar\":\"𨹚\",\"unicodeCodePoint\":\"28E5A\",\"pinYinChars\":[{\"char\":\"CHENG2\"}],\"splitChars\":[{\"char\":\"阝成\"}],\"weight\":10},{\"charId\":\"eea92f95\",\"unicodeChar\":\"𨹗\",\"unicodeCodePoint\":\"28E57\",\"pinYinChars\":[{\"char\":\"BING1\"}],\"splitChars\":[{\"char\":\"阝并\"}],\"weight\":10},{\"charId\":\"92dd4142\",\"unicodeChar\":\"𨹑\",\"unicodeCodePoint\":\"28E51\",\"pinYinChars\":[{\"char\":\"QU\"}],\"splitChars\":[{\"char\":\"阝全\"}],\"weight\":10},{\"charId\":\"4b09829f\",\"unicodeChar\":\"𨹍\",\"unicodeCodePoint\":\"28E4D\",\"pinYinChars\":[{\"char\":\"JIAO1\"}],\"splitChars\":[{\"char\":\"阝交\"}],\"weight\":10},{\"charId\":\"86ee1c84\",\"unicodeChar\":\"𨸘\",\"unicodeCodePoint\":\"28E18\",\"pinYinChars\":[{\"char\":\"YUAN2\"}],\"splitChars\":[{\"char\":\"阝广\"}],\"weight\":10},{\"charId\":\"628aa5b7\",\"unicodeChar\":\"𨶈\",\"unicodeCodePoint\":\"28D88\",\"pinYinChars\":[{\"char\":\"TANG2\"}],\"splitChars\":[{\"char\":\"門唐\"}],\"weight\":10},{\"charId\":\"a6f2c103\",\"unicodeChar\":\"𨶇\",\"unicodeCodePoint\":\"28D87\",\"pinYinChars\":[{\"char\":\"WU3\"}],\"splitChars\":[{\"char\":\"門烏\"}],\"weight\":10},{\"charId\":\"d45933ba\",\"unicodeChar\":\"𨱔\",\"unicodeCodePoint\":\"28C54\",\"pinYinChars\":[{\"char\":\"ZUN1\"}],\"splitChars\":[{\"char\":\"钅尊\"}],\"weight\":10},{\"charId\":\"c46921a0\",\"unicodeChar\":\"𨱈\",\"unicodeCodePoint\":\"28C48\",\"pinYinChars\":[{\"char\":\"SU4\"}],\"splitChars\":[{\"char\":\"钅束\"}],\"weight\":10},{\"charId\":\"d216d90f\",\"unicodeChar\":\"𨱃\",\"unicodeCodePoint\":\"28C43\",\"pinYinChars\":[{\"char\":\"GU1\"}],\"splitChars\":[{\"char\":\"钅瓜\"}],\"weight\":10},{\"charId\":\"738c3bdb\",\"unicodeChar\":\"𨰣\",\"unicodeCodePoint\":\"28C23\",\"pinYinChars\":[{\"char\":\"LI4\"}],\"splitChars\":[{\"char\":\"金麗\"}],\"weight\":10},{\"charId\":\"cf441d77\",\"unicodeChar\":\"𨰃\",\"unicodeCodePoint\":\"28C03\",\"pinYinChars\":[{\"char\":\"YING1\"}],\"splitChars\":[{\"char\":\"金嬰\"}],\"weight\":10},{\"charId\":\"87f9da35\",\"unicodeChar\":\"𨯚\",\"unicodeCodePoint\":\"28BDA\",\"pinYinChars\":[{\"char\":\"HU\"}],\"splitChars\":[{\"char\":\"金慧\"}],\"weight\":10},{\"charId\":\"a90c3630\",\"unicodeChar\":\"𨯌\",\"unicodeCodePoint\":\"28BCC\",\"pinYinChars\":[{\"char\":\"LI\"}],\"splitChars\":[{\"char\":\"金蓮\"}],\"weight\":10},{\"charId\":\"ec457a1d\",\"unicodeChar\":\"𨮔\",\"unicodeCodePoint\":\"28B94\",\"pinYinChars\":[{\"char\":\"YU4\"}],\"splitChars\":[{\"char\":\"金與\"}],\"weight\":10},{\"charId\":\"9d250bd3\",\"unicodeChar\":\"𨮒\",\"unicodeCodePoint\":\"28B92\",\"pinYinChars\":[{\"char\":\"MENG4\"}],\"splitChars\":[{\"char\":\"金夢\"}],\"weight\":10},{\"charId\":\"61ba3b3f\",\"unicodeChar\":\"𨭐\",\"unicodeCodePoint\":\"28B50\",\"pinYinChars\":[{\"char\":\"CHAN2\"}],\"splitChars\":[{\"char\":\"金單\"}],\"weight\":10},{\"charId\":\"580c52fa\",\"unicodeChar\":\"𨸕\",\"unicodeCodePoint\":\"28E15\",\"pinYinChars\":[{\"char\":\"DENG4\"}],\"splitChars\":[{\"char\":\"阝又\"}],\"weight\":10},{\"charId\":\"084f5142\",\"unicodeChar\":\"𨬛\",\"unicodeCodePoint\":\"28B1B\",\"pinYinChars\":[{\"char\":\"ZHENG4\"}],\"splitChars\":[{\"char\":\"艹金\"}],\"weight\":10},{\"charId\":\"9f71d42e\",\"unicodeChar\":\"𨪄\",\"unicodeCodePoint\":\"28A84\",\"pinYinChars\":[{\"char\":\"YING4\"}],\"splitChars\":[{\"char\":\"土金\"}],\"weight\":10},{\"charId\":\"385bcb62\",\"unicodeChar\":\"𨨖\",\"unicodeCodePoint\":\"28A16\",\"pinYinChars\":[{\"char\":\"ZHEN1\"}],\"splitChars\":[{\"char\":\"王金\"}],\"weight\":10},{\"charId\":\"cdd4a9cd\",\"unicodeChar\":\"𩂿\",\"unicodeCodePoint\":\"290BF\",\"pinYinChars\":[{\"char\":\"YUN3\"}],\"splitChars\":[{\"char\":\"雨君\"}],\"weight\":10},{\"charId\":\"6ffe7b93\",\"unicodeChar\":\"𪯲\",\"unicodeCodePoint\":\"2ABF2\",\"pinYinChars\":[{\"char\":\"QI2\"}],\"splitChars\":[{\"char\":\"方斤\"}],\"weight\":10},{\"charId\":\"a673400a\",\"unicodeChar\":\"𩊬\",\"unicodeCodePoint\":\"292AC\",\"pinYinChars\":[{\"char\":\"BU4\"}],\"splitChars\":[{\"char\":\"革甫\"}],\"weight\":10},{\"charId\":\"4078597f\",\"unicodeChar\":\"𩊂\",\"unicodeCodePoint\":\"29282\",\"pinYinChars\":[{\"char\":\"LING2\"}],\"splitChars\":[{\"char\":\"革令\"}],\"weight\":10},{\"charId\":\"bc2d64f9\",\"unicodeChar\":\"𩔊\",\"unicodeCodePoint\":\"2950A\",\"pinYinChars\":[{\"char\":\"ZHUAN4\"}],\"splitChars\":[{\"char\":\"頁頁\"}],\"weight\":10},{\"charId\":\"b677cc33\",\"unicodeChar\":\"𬂣\",\"unicodeCodePoint\":\"2C0A3\",\"pinYinChars\":[{\"char\":\"JIE4\"}],\"splitChars\":[{\"char\":\"木介\"}],\"weight\":10},{\"charId\":\"e56aaf1b\",\"unicodeChar\":\"𩅿\",\"unicodeCodePoint\":\"2917F\",\"pinYinChars\":[{\"char\":\"FU4\"}],\"splitChars\":[{\"char\":\"雨溥\"}],\"weight\":10},{\"charId\":\"c66029b2\",\"unicodeChar\":\"𩅄\",\"unicodeCodePoint\":\"29144\",\"pinYinChars\":[{\"char\":\"LU4\"}],\"splitChars\":[{\"char\":\"雨鹿\"}],\"weight\":10},{\"charId\":\"e1d47ddc\",\"unicodeChar\":\"𬀉\",\"unicodeCodePoint\":\"2C009\",\"pinYinChars\":[{\"char\":\"FANG1\"}],\"splitChars\":[{\"char\":\"方方\"}],\"weight\":10},{\"charId\":\"cad03738\",\"unicodeChar\":\"𩄻\",\"unicodeCodePoint\":\"2913B\",\"pinYinChars\":[{\"char\":\"MO4\"}],\"splitChars\":[{\"char\":\"雨莫\"}],\"weight\":10},{\"charId\":\"5e57cb4b\",\"unicodeChar\":\"𩃀\",\"unicodeCodePoint\":\"290C0\",\"pinYinChars\":[{\"char\":\"YAN4\"}],\"splitChars\":[{\"char\":\"雨延\"}],\"weight\":10},{\"charId\":\"794ad854\",\"unicodeChar\":\"𩂴\",\"unicodeCodePoint\":\"290B4\",\"pinYinChars\":[{\"char\":\"SE4\"}],\"splitChars\":[{\"char\":\"雨朿\"}],\"weight\":10},{\"charId\":\"4cc59f66\",\"unicodeChar\":\"𩂤\",\"unicodeCodePoint\":\"290A4\",\"pinYinChars\":[{\"char\":\"HUA4\"}],\"splitChars\":[{\"char\":\"雨舟\"}],\"weight\":10},{\"charId\":\"3adb364c\",\"unicodeChar\":\"𩂓\",\"unicodeCodePoint\":\"29093\",\"pinYinChars\":[{\"char\":\"DONG1\"}],\"splitChars\":[{\"char\":\"雨冬\"}],\"weight\":10},{\"charId\":\"188e09ee\",\"unicodeChar\":\"𩂍\",\"unicodeCodePoint\":\"2908D\",\"pinYinChars\":[{\"char\":\"CHUAN1\"}],\"splitChars\":[{\"char\":\"雨水\"}],\"weight\":10},{\"charId\":\"708c99ea\",\"unicodeChar\":\"𩂄\",\"unicodeCodePoint\":\"29084\",\"pinYinChars\":[{\"char\":\"TUN1\"}],\"splitChars\":[{\"char\":\"雨屯\"}],\"weight\":10},{\"charId\":\"7886812b\",\"unicodeChar\":\"𩇔\",\"unicodeCodePoint\":\"291D4\",\"pinYinChars\":[{\"char\":\"NONG2\"}],\"splitChars\":[{\"char\":\"雲雲\"}],\"weight\":10},{\"charId\":\"fdd0e5a1\",\"unicodeChar\":\"𩆩\",\"unicodeCodePoint\":\"291A9\",\"pinYinChars\":[{\"char\":\"ZH\"}],\"splitChars\":[{\"char\":\"雨寸\"}],\"weight\":10},{\"charId\":\"0343ef08\",\"unicodeChar\":\"𨿁\",\"unicodeCodePoint\":\"28FC1\",\"pinYinChars\":[{\"char\":\"YUE4\"}],\"splitChars\":[{\"char\":\"爪隹\"}],\"weight\":10},{\"charId\":\"13f18e69\",\"unicodeChar\":\"𨾉\",\"unicodeCodePoint\":\"28F89\",\"pinYinChars\":[{\"char\":\"JIU3\"}],\"splitChars\":[{\"char\":\"久隹\"}],\"weight\":10},{\"charId\":\"0f1640c7\",\"unicodeChar\":\"𨼿\",\"unicodeCodePoint\":\"28F3F\",\"pinYinChars\":[{\"char\":\"MENG2\"}],\"splitChars\":[{\"char\":\"阝蒙\"}],\"weight\":10},{\"charId\":\"05924dd2\",\"unicodeChar\":\"𩙡\",\"unicodeCodePoint\":\"29661\",\"pinYinChars\":[{\"char\":\"HOU1\"}],\"splitChars\":[{\"char\":\"風風\"}],\"weight\":10},{\"charId\":\"a0046efd\",\"unicodeChar\":\"𩢸\",\"unicodeCodePoint\":\"298B8\",\"pinYinChars\":[{\"char\":\"ZHOU1\"}],\"splitChars\":[{\"char\":\"馬舟\"}],\"weight\":10},{\"charId\":\"64a50595\",\"unicodeChar\":\"𩢷\",\"unicodeCodePoint\":\"298B7\",\"pinYinChars\":[{\"char\":\"MO4\"}],\"splitChars\":[{\"char\":\"馬百\"}],\"weight\":10},{\"charId\":\"5b80c2a2\",\"unicodeChar\":\"𩢴\",\"unicodeCodePoint\":\"298B4\",\"pinYinChars\":[{\"char\":\"JIE2\"}],\"splitChars\":[{\"char\":\"馬吉\"}],\"weight\":10},{\"charId\":\"ab9efb7a\",\"unicodeChar\":\"𬂭\",\"unicodeCodePoint\":\"2C0AD\",\"pinYinChars\":[{\"char\":\"XIANG1\"}],\"splitChars\":[{\"char\":\"木向\"}],\"weight\":10},{\"charId\":\"f5bae0fa\",\"unicodeChar\":\"𪳆\",\"unicodeCodePoint\":\"2ACC6\",\"pinYinChars\":[{\"char\":\"YONG3\"}],\"splitChars\":[{\"char\":\"木勇\"}],\"weight\":10},{\"charId\":\"4acd370a\",\"unicodeChar\":\"𩤥\",\"unicodeCodePoint\":\"29925\",\"pinYinChars\":[{\"char\":\"XIAN2\"}],\"splitChars\":[{\"char\":\"馬咸\"}],\"weight\":10},{\"charId\":\"5bfbf305\",\"unicodeChar\":\"𩤠\",\"unicodeCodePoint\":\"29920\",\"pinYinChars\":[{\"char\":\"XIE2\"}],\"splitChars\":[{\"char\":\"馬皆\"}],\"weight\":10},{\"charId\":\"a619a2ce\",\"unicodeChar\":\"𩤏\",\"unicodeCodePoint\":\"2990F\",\"pinYinChars\":[{\"char\":\"CUI4\"}],\"splitChars\":[{\"char\":\"馬卒\"}],\"weight\":10},{\"charId\":\"6c6ef814\",\"unicodeChar\":\"𩣸\",\"unicodeCodePoint\":\"298F8\",\"pinYinChars\":[{\"char\":\"FU4\"}],\"splitChars\":[{\"char\":\"馬阜\"}],\"weight\":10},{\"charId\":\"d105e483\",\"unicodeChar\":\"𬇨\",\"unicodeCodePoint\":\"2C1E8\",\"pinYinChars\":[{\"char\":\"ZHI4\"}],\"splitChars\":[{\"char\":\"氵志\"}],\"weight\":10},{\"charId\":\"b0d0b44f\",\"unicodeChar\":\"𩚹\",\"unicodeCodePoint\":\"296B9\",\"pinYinChars\":[{\"char\":\"LING2\"}],\"splitChars\":[{\"char\":\"食令\"}],\"weight\":10},{\"charId\":\"e944e370\",\"unicodeChar\":\"𩐁\",\"unicodeCodePoint\":\"29401\",\"pinYinChars\":[{\"char\":\"XIE4\"}],\"splitChars\":[{\"char\":\"歹韭\"}],\"weight\":10},{\"charId\":\"c792a1a0\",\"unicodeChar\":\"𩎿\",\"unicodeCodePoint\":\"293BF\",\"pinYinChars\":[{\"char\":\"CHANG1\"}],\"splitChars\":[{\"char\":\"韋昌\"}],\"weight\":10},{\"charId\":\"bf82bbef\",\"unicodeChar\":\"𩖣\",\"unicodeCodePoint\":\"295A3\",\"pinYinChars\":[{\"char\":\"XIN2\"}],\"splitChars\":[{\"char\":\"文風\"}],\"weight\":10},{\"charId\":\"adac7bc1\",\"unicodeChar\":\"𩖠\",\"unicodeCodePoint\":\"295A0\",\"pinYinChars\":[{\"char\":\"BEI4\"}],\"splitChars\":[{\"char\":\"風女\"}],\"weight\":10},{\"charId\":\"abeb1851\",\"unicodeChar\":\"𩖛\",\"unicodeCodePoint\":\"2959B\",\"pinYinChars\":[{\"char\":\"PENG2\"}],\"splitChars\":[{\"char\":\"風凡\"}],\"weight\":10},{\"charId\":\"3a045a71\",\"unicodeChar\":\"𩡺\",\"unicodeCodePoint\":\"2987A\",\"pinYinChars\":[{\"char\":\"JIE4\"}],\"splitChars\":[{\"char\":\"馬介\"}],\"weight\":10},{\"charId\":\"9ec6a77a\",\"unicodeChar\":\"𩡕\",\"unicodeCodePoint\":\"29855\",\"pinYinChars\":[{\"char\":\"PENG2\"}],\"splitChars\":[{\"char\":\"旁香\"}],\"weight\":10},{\"charId\":\"07d61ff2\",\"unicodeChar\":\"𩠻\",\"unicodeCodePoint\":\"2983B\",\"pinYinChars\":[{\"char\":\"HAN1\"}],\"splitChars\":[{\"char\":\"香今\"}],\"weight\":10},{\"charId\":\"a454d905\",\"unicodeChar\":\"𩒀\",\"unicodeCodePoint\":\"29480\",\"pinYinChars\":[{\"char\":\"ZHEN3\"}],\"splitChars\":[{\"char\":\"人頁\"}],\"weight\":10},{\"charId\":\"e2ed8478\",\"unicodeChar\":\"𬃒\",\"unicodeCodePoint\":\"2C0D2\",\"pinYinChars\":[{\"char\":\"LIANG2\"}],\"splitChars\":[{\"char\":\"木木\"}],\"weight\":10},{\"charId\":\"3fa68d11\",\"unicodeChar\":\"𩑻\",\"unicodeCodePoint\":\"2947B\",\"pinYinChars\":[{\"char\":\"BI4\"}],\"splitChars\":[{\"char\":\"白頁\"}],\"weight\":10},{\"charId\":\"b1af06e9\",\"unicodeChar\":\"𪲞\",\"unicodeCodePoint\":\"2AC9E\",\"pinYinChars\":[{\"char\":\"QIANG1\"}],\"splitChars\":[{\"char\":\"木羌\"}],\"weight\":10},{\"charId\":\"c5dc19b2\",\"unicodeChar\":\"𩐤\",\"unicodeCodePoint\":\"29424\",\"pinYinChars\":[{\"char\":\"DONG4\"}],\"splitChars\":[{\"char\":\"音同\"}],\"weight\":10},{\"charId\":\"78753b80\",\"unicodeChar\":\"𩦹\",\"unicodeCodePoint\":\"299B9\",\"pinYinChars\":[{\"char\":\"XIAN4\"}],\"splitChars\":[{\"char\":\"馬監\"}],\"weight\":10},{\"charId\":\"e34db497\",\"unicodeChar\":\"𩦠\",\"unicodeCodePoint\":\"299A0\",\"pinYinChars\":[{\"char\":\"BANG4\"}],\"splitChars\":[{\"char\":\"馬剽\"}],\"weight\":10},{\"charId\":\"391f7340\",\"unicodeChar\":\"𩻪\",\"unicodeCodePoint\":\"29EEA\",\"pinYinChars\":[{\"char\":\"CH\"}],\"splitChars\":[{\"char\":\"敞魚\"}],\"weight\":10},{\"charId\":\"2b62f434\",\"unicodeChar\":\"𬉿\",\"unicodeCodePoint\":\"2C27F\",\"pinYinChars\":[{\"char\":\"PAO1\"}],\"splitChars\":[{\"char\":\"爪火\"}],\"weight\":10},{\"charId\":\"f34f0091\",\"unicodeChar\":\"𩺰\",\"unicodeCodePoint\":\"29EB0\",\"pinYinChars\":[{\"char\":\"YU2\"}],\"splitChars\":[{\"char\":\"魚魚\"}],\"weight\":10},{\"charId\":\"126456ce\",\"unicodeChar\":\"𬉾\",\"unicodeCodePoint\":\"2C27E\",\"pinYinChars\":[{\"char\":\"DAN1\"}],\"splitChars\":[{\"char\":\"火丹\"}],\"weight\":10},{\"charId\":\"88fa3231\",\"unicodeChar\":\"𩵖\",\"unicodeCodePoint\":\"29D56\",\"pinYinChars\":[{\"char\":\"XIAO3\"}],\"splitChars\":[{\"char\":\"魚小\"}],\"weight\":10},{\"charId\":\"cfdf871f\",\"unicodeChar\":\"𩱞\",\"unicodeCodePoint\":\"29C5E\",\"pinYinChars\":[{\"char\":\"JIAO4\"}],\"splitChars\":[{\"char\":\"孝鬲\"}],\"weight\":10},{\"charId\":\"045b56ef\",\"unicodeChar\":\"𩧉\",\"unicodeCodePoint\":\"299C9\",\"pinYinChars\":[{\"char\":\"GUANG1\"}],\"splitChars\":[{\"char\":\"馬廣\"}],\"weight\":10},{\"charId\":\"efad04ca\",\"unicodeChar\":\"𩣱\",\"unicodeCodePoint\":\"298F1\",\"pinYinChars\":[{\"char\":\"LU4\"}],\"splitChars\":[{\"char\":\"馬坴\"}],\"weight\":10},{\"charId\":\"4ecb629c\",\"unicodeChar\":\"𩣮\",\"unicodeCodePoint\":\"298EE\",\"pinYinChars\":[{\"char\":\"TU4\"}],\"splitChars\":[{\"char\":\"馬兔\"}],\"weight\":10},{\"charId\":\"d0cf3ef7\",\"unicodeChar\":\"𪶽\",\"unicodeCodePoint\":\"2ADBD\",\"pinYinChars\":[{\"char\":\"SANG1\"}],\"splitChars\":[{\"char\":\"氵桑\"}],\"weight\":10},{\"charId\":\"08669109\",\"unicodeChar\":\"𪵩\",\"unicodeCodePoint\":\"2AD69\",\"pinYinChars\":[{\"char\":\"XIA4\"}],\"splitChars\":[{\"char\":\"氵下\"}],\"weight\":10},{\"charId\":\"dd252a9e\",\"unicodeChar\":\"𩥐\",\"unicodeCodePoint\":\"29950\",\"pinYinChars\":[{\"char\":\"SHI1\"}],\"splitChars\":[{\"char\":\"馬師\"}],\"weight\":10},{\"charId\":\"c0e1426d\",\"unicodeChar\":\"𩥋\",\"unicodeCodePoint\":\"2994B\",\"pinYinChars\":[{\"char\":\"OU4\"}],\"splitChars\":[{\"char\":\"馬馬\"}],\"weight\":10},{\"charId\":\"44cfcd93\",\"unicodeChar\":\"𩥉\",\"unicodeCodePoint\":\"29949\",\"pinYinChars\":[{\"char\":\"JI4\"}],\"splitChars\":[{\"char\":\"馬豈\"}],\"weight\":10},{\"charId\":\"92acc0a2\",\"unicodeChar\":\"𩤽\",\"unicodeCodePoint\":\"2993D\",\"pinYinChars\":[{\"char\":\"TI1\"}],\"splitChars\":[{\"char\":\"馬虎\"}],\"weight\":10},{\"charId\":\"2da248f9\",\"unicodeChar\":\"𪸎\",\"unicodeCodePoint\":\"2AE0E\",\"pinYinChars\":[{\"char\":\"FAN2\"}],\"splitChars\":[{\"char\":\"火几(凢)\"}],\"weight\":10},{\"charId\":\"202515ab\",\"unicodeChar\":\"𩣳\",\"unicodeCodePoint\":\"298F3\",\"pinYinChars\":[{\"char\":\"DONG1\"}],\"splitChars\":[{\"char\":\"馬東\"}],\"weight\":10},{\"charId\":\"4f44eab7\",\"unicodeChar\":\"𬈷\",\"unicodeCodePoint\":\"2C237\",\"pinYinChars\":[{\"char\":\"TANG2\"}],\"splitChars\":[{\"char\":\"氵棠\"}],\"weight\":10},{\"charId\":\"43faeaf4\",\"unicodeChar\":\"𩣲\",\"unicodeCodePoint\":\"298F2\",\"pinYinChars\":[{\"char\":\"YAN1\"}],\"splitChars\":[{\"char\":\"馬典\"}],\"weight\":10},{\"charId\":\"5d4b89ec\",\"unicodeChar\":\"𬎏\",\"unicodeCodePoint\":\"2C38F\",\"pinYinChars\":[{\"char\":\"ZI3\"}],\"splitChars\":[{\"char\":\"王紫\"}],\"weight\":10},{\"charId\":\"55424081\",\"unicodeChar\":\"𪂕\",\"unicodeCodePoint\":\"2A095\",\"pinYinChars\":[{\"char\":\"YU3\"}],\"splitChars\":[{\"char\":\"雨鳥\"}],\"weight\":10},{\"charId\":\"613a97e1\",\"unicodeChar\":\"𬎇\",\"unicodeCodePoint\":\"2C387\",\"pinYinChars\":[{\"char\":\"MO4\"}],\"splitChars\":[{\"char\":\"王莫\"}],\"weight\":10},{\"charId\":\"46ab23f1\",\"unicodeChar\":\"𪂈\",\"unicodeCodePoint\":\"2A088\",\"pinYinChars\":[{\"char\":\"YAN2\"}],\"splitChars\":[{\"char\":\"炎鳥\"}],\"weight\":10},{\"charId\":\"f6b733a4\",\"unicodeChar\":\"𬎋\",\"unicodeCodePoint\":\"2C38B\",\"pinYinChars\":[{\"char\":\"QIN2\"}],\"splitChars\":[{\"char\":\"王琴\"}],\"weight\":10},{\"charId\":\"53cae372\",\"unicodeChar\":\"𪁿\",\"unicodeCodePoint\":\"2A07F\",\"pinYinChars\":[{\"char\":\"SONG1\"}],\"splitChars\":[{\"char\":\"松鳥\"}],\"weight\":10},{\"charId\":\"757e6d2e\",\"unicodeChar\":\"𪁏\",\"unicodeCodePoint\":\"2A04F\",\"pinYinChars\":[{\"char\":\"CHEN2\"}],\"splitChars\":[{\"char\":\"山鳥\"}],\"weight\":10},{\"charId\":\"4b08145b\",\"unicodeChar\":\"𪼏\",\"unicodeCodePoint\":\"2AF0F\",\"pinYinChars\":[{\"char\":\"SANG1\"}],\"splitChars\":[{\"char\":\"王桑\"}],\"weight\":10},{\"charId\":\"7f9ef6de\",\"unicodeChar\":\"𪻽\",\"unicodeCodePoint\":\"2AEFD\",\"pinYinChars\":[{\"char\":\"RONG2\"}],\"splitChars\":[{\"char\":\"王客\"}],\"weight\":10},{\"charId\":\"4d68cb26\",\"unicodeChar\":\"𪀩\",\"unicodeCodePoint\":\"2A029\",\"pinYinChars\":[{\"char\":\"QI1\"}],\"splitChars\":[{\"char\":\"多鳥\"}],\"weight\":10},{\"charId\":\"a6db9c2c\",\"unicodeChar\":\"𬍺\",\"unicodeCodePoint\":\"2C37A\",\"pinYinChars\":[{\"char\":\"YONG3\"}],\"splitChars\":[{\"char\":\"王勇\"}],\"weight\":10},{\"charId\":\"d7bc07ff\",\"unicodeChar\":\"𪻤\",\"unicodeCodePoint\":\"2AEE4\",\"pinYinChars\":[{\"char\":\"BING1\"}],\"splitChars\":[{\"char\":\"王兵\"}],\"weight\":10},{\"charId\":\"3f7ae35b\",\"unicodeChar\":\"𩱇\",\"unicodeCodePoint\":\"29C47\",\"pinYinChars\":[{\"char\":\"LI4\"}],\"splitChars\":[{\"char\":\"鬲鬲\"}],\"weight\":10},{\"charId\":\"9f434ef3\",\"unicodeChar\":\"𩫆\",\"unicodeCodePoint\":\"29AC6\",\"pinYinChars\":[{\"char\":\"SH\"}],\"splitChars\":[{\"char\":\"高升\"}],\"weight\":10},{\"charId\":\"ef02f169\",\"unicodeChar\":\"𩪛\",\"unicodeCodePoint\":\"29A9B\",\"pinYinChars\":[{\"char\":\"PU2\"}],\"splitChars\":[{\"char\":\"骨菐\"}],\"weight\":10},{\"charId\":\"d88908a1\",\"unicodeChar\":\"𩨑\",\"unicodeCodePoint\":\"29A11\",\"pinYinChars\":[{\"char\":\"TING1\"}],\"splitChars\":[{\"char\":\"骨丁\"}],\"weight\":10},{\"charId\":\"5c12387e\",\"unicodeChar\":\"𬊀\",\"unicodeCodePoint\":\"2C280\",\"pinYinChars\":[{\"char\":\"FANG1\"}],\"splitChars\":[{\"char\":\"火方\"}],\"weight\":10},{\"charId\":\"82079527\",\"unicodeChar\":\"𩾽\",\"unicodeCodePoint\":\"29FBD\",\"pinYinChars\":[{\"char\":\"XIN1\"}],\"splitChars\":[{\"char\":\"鳥心\"}],\"weight\":10},{\"charId\":\"fa0a7c1a\",\"unicodeChar\":\"𩽾\",\"unicodeCodePoint\":\"29F7E\",\"pinYinChars\":[{\"char\":\"AN1\"}],\"splitChars\":[{\"char\":\"鱼安\"}],\"weight\":10},{\"charId\":\"ee05a053\",\"unicodeChar\":\"𬋅\",\"unicodeCodePoint\":\"2C2C5\",\"pinYinChars\":[{\"char\":\"HUI4\"}],\"splitChars\":[{\"char\":\"火惠\"}],\"weight\":10},{\"charId\":\"60bf089d\",\"unicodeChar\":\"𬍥\",\"unicodeCodePoint\":\"2C365\",\"pinYinChars\":[{\"char\":\"FU3\"}],\"splitChars\":[{\"char\":\"王甫\"}],\"weight\":10},{\"charId\":\"c3c0e727\",\"unicodeChar\":\"𬒗\",\"unicodeCodePoint\":\"2C497\",\"pinYinChars\":[{\"char\":\"LAN2\"}],\"splitChars\":[{\"char\":\"石览\"}],\"weight\":10},{\"charId\":\"3f42fc23\",\"unicodeChar\":\"鿎\",\"unicodeCodePoint\":\"9FCE\",\"pinYinChars\":[{\"char\":\"TA3\"}],\"splitChars\":[{\"char\":\"石达\"}],\"weight\":10},{\"charId\":\"8fb993f5\",\"unicodeChar\":\"𬒈\",\"unicodeCodePoint\":\"2C488\",\"pinYinChars\":[{\"char\":\"QUE4\"}],\"splitChars\":[{\"char\":\"小石\"}],\"weight\":10},{\"charId\":\"28b3f223\",\"unicodeChar\":\"𮀔\",\"unicodeCodePoint\":\"2E014\",\"pinYinChars\":[{\"char\":\"ZHAI4\"}],\"splitChars\":[{\"char\":\"石示\"}],\"weight\":10},{\"charId\":\"121d8aaa\",\"unicodeChar\":\"𪾢\",\"unicodeCodePoint\":\"2AFA2\",\"pinYinChars\":[{\"char\":\"XIAN4\"}],\"splitChars\":[{\"char\":\"目见\"}],\"weight\":10},{\"charId\":\"7470f15c\",\"unicodeChar\":\"𪽏\",\"unicodeCodePoint\":\"2AF4F\",\"pinYinChars\":[{\"char\":\"LENG4\"}],\"splitChars\":[{\"char\":\"田令\"}],\"weight\":10},{\"charId\":\"6b302409\",\"unicodeChar\":\"𪽇\",\"unicodeCodePoint\":\"2AF47\",\"pinYinChars\":[{\"char\":\"KE1\"}],\"splitChars\":[{\"char\":\"田九\"}],\"weight\":10},{\"charId\":\"292f0d14\",\"unicodeChar\":\"𪼦\",\"unicodeCodePoint\":\"2AF26\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"王意\"}],\"weight\":10},{\"charId\":\"a68c8069\",\"unicodeChar\":\"𬘧\",\"unicodeCodePoint\":\"2C627\",\"pinYinChars\":[{\"char\":\"JI4\"}],\"splitChars\":[{\"char\":\"纟齐\"}],\"weight\":10},{\"charId\":\"eb6a52c9\",\"unicodeChar\":\"𬘡\",\"unicodeCodePoint\":\"2C621\",\"pinYinChars\":[{\"char\":\"YIN1\"}],\"splitChars\":[{\"char\":\"纟因\"}],\"weight\":10},{\"charId\":\"895b5c94\",\"unicodeChar\":\"𫂺\",\"unicodeCodePoint\":\"2B0BA\",\"pinYinChars\":[{\"char\":\"FAN1\"}],\"splitChars\":[{\"char\":\"米田\"}],\"weight\":10},{\"charId\":\"323a7fd0\",\"unicodeChar\":\"𬕂\",\"unicodeCodePoint\":\"2C542\",\"pinYinChars\":[{\"char\":\"GONG1\"}],\"splitChars\":[{\"char\":\"竹贡\"}],\"weight\":10},{\"charId\":\"62c04212\",\"unicodeChar\":\"𬓮\",\"unicodeCodePoint\":\"2C4EE\",\"pinYinChars\":[{\"char\":\"TANG2\"}],\"splitChars\":[{\"char\":\"禾尚\"}],\"weight\":10},{\"charId\":\"752eb8d9\",\"unicodeChar\":\"𪿲\",\"unicodeCodePoint\":\"2AFF2\",\"pinYinChars\":[{\"char\":\"YAO2\"}],\"splitChars\":[{\"char\":\"石窑\"}],\"weight\":10},{\"charId\":\"cb54ca0d\",\"unicodeChar\":\"𧻚\",\"unicodeCodePoint\":\"27EDA\",\"pinYinChars\":[{\"char\":\"YUAN2\"}],\"splitChars\":[{\"char\":\"走亘\"}],\"weight\":10},{\"charId\":\"4e4469e6\",\"unicodeChar\":\"𨀘\",\"unicodeCodePoint\":\"28018\",\"pinYinChars\":[{\"char\":\"XIANG2\"}],\"splitChars\":[{\"char\":\"足羊\"}],\"weight\":10},{\"charId\":\"93dac241\",\"unicodeChar\":\"𧿥\",\"unicodeCodePoint\":\"27FE5\",\"pinYinChars\":[{\"char\":\"BIE2\"}],\"splitChars\":[{\"char\":\"足比\"}],\"weight\":10},{\"charId\":\"882b8149\",\"unicodeChar\":\"𧾰\",\"unicodeCodePoint\":\"27FB0\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"走翼\"}],\"weight\":10},{\"charId\":\"94086d2c\",\"unicodeChar\":\"𧼨\",\"unicodeCodePoint\":\"27F28\",\"pinYinChars\":[{\"char\":\"JIE2\"}],\"splitChars\":[{\"char\":\"走曷\"}],\"weight\":10},{\"charId\":\"10c31798\",\"unicodeChar\":\"𧯀\",\"unicodeCodePoint\":\"27BC0\",\"pinYinChars\":[{\"char\":\"YING1\"}],\"splitChars\":[{\"char\":\"谷英\"}],\"weight\":10},{\"charId\":\"30bd66ef\",\"unicodeChar\":\"𧲡\",\"unicodeCodePoint\":\"27CA1\",\"pinYinChars\":[{\"char\":\"LI4\"}],\"splitChars\":[{\"char\":\"豸力\"}],\"weight\":10},{\"charId\":\"239f71a4\",\"unicodeChar\":\"𨒇\",\"unicodeCodePoint\":\"28487\",\"pinYinChars\":[{\"char\":\"JIA3\"}],\"splitChars\":[{\"char\":\"辶甲\"}],\"weight\":10},{\"charId\":\"23d804af\",\"unicodeChar\":\"𨒃\",\"unicodeCodePoint\":\"28483\",\"pinYinChars\":[{\"char\":\"PAN4\"}],\"splitChars\":[{\"char\":\"辶半\"}],\"weight\":10},{\"charId\":\"fff8be25\",\"unicodeChar\":\"𨄗\",\"unicodeCodePoint\":\"28117\",\"pinYinChars\":[{\"char\":\"KANG1\"}],\"splitChars\":[{\"char\":\"足康\"}],\"weight\":10},{\"charId\":\"38fd7d2a\",\"unicodeChar\":\"𨂿\",\"unicodeCodePoint\":\"280BF\",\"pinYinChars\":[{\"char\":\"WAI3\"}],\"splitChars\":[{\"char\":\"足歪\"}],\"weight\":10},{\"charId\":\"d1cded81\",\"unicodeChar\":\"𨁏\",\"unicodeCodePoint\":\"2804F\",\"pinYinChars\":[{\"char\":\"PU1\"}],\"splitChars\":[{\"char\":\"足甫\"}],\"weight\":10},{\"charId\":\"a39a1dcc\",\"unicodeChar\":\"𨁂\",\"unicodeCodePoint\":\"28042\",\"pinYinChars\":[{\"char\":\"XIE2\"}],\"splitChars\":[{\"char\":\"足夾\"}],\"weight\":10},{\"charId\":\"03d1ebdd\",\"unicodeChar\":\"𨓿\",\"unicodeCodePoint\":\"284FF\",\"pinYinChars\":[{\"char\":\"PEI2\"}],\"splitChars\":[{\"char\":\"辶非\"}],\"weight\":10},{\"charId\":\"88de5d5c\",\"unicodeChar\":\"𧂋\",\"unicodeCodePoint\":\"2708B\",\"pinYinChars\":[{\"char\":\"PING2\"}],\"splitChars\":[{\"char\":\"艹心(憑)\"}],\"weight\":10},{\"charId\":\"cfe66ac7\",\"unicodeChar\":\"𨓯\",\"unicodeCodePoint\":\"284EF\",\"pinYinChars\":[{\"char\":\"YUAN1\"}],\"splitChars\":[{\"char\":\"辶片\"}],\"weight\":10},{\"charId\":\"8c9a4269\",\"unicodeChar\":\"𨓞\",\"unicodeCodePoint\":\"284DE\",\"pinYinChars\":[{\"char\":\"DIA4\"}],\"splitChars\":[{\"char\":\"辶㐬\"}],\"weight\":10},{\"charId\":\"6ebc0dcb\",\"unicodeChar\":\"𨒱\",\"unicodeCodePoint\":\"284B1\",\"pinYinChars\":[{\"char\":\"GONG1\"}],\"splitChars\":[{\"char\":\"辶共\"}],\"weight\":10},{\"charId\":\"66daf2c0\",\"unicodeChar\":\"𢙿\",\"unicodeCodePoint\":\"2267F\",\"pinYinChars\":[{\"char\":\"JIN4\"}],\"splitChars\":[{\"char\":\"忄今(岑)\"}],\"weight\":10},{\"charId\":\"2f84c757\",\"unicodeChar\":\"𨒫\",\"unicodeCodePoint\":\"284AB\",\"pinYinChars\":[{\"char\":\"YAN2\"}],\"splitChars\":[{\"char\":\"辶羊\"}],\"weight\":10},{\"charId\":\"52ab979a\",\"unicodeChar\":\"𨆬\",\"unicodeCodePoint\":\"281AC\",\"pinYinChars\":[{\"char\":\"CHUO4\"}],\"splitChars\":[{\"char\":\"足足\"}],\"weight\":10},{\"charId\":\"5e603db9\",\"unicodeChar\":\"𨄮\",\"unicodeCodePoint\":\"2812E\",\"pinYinChars\":[{\"char\":\"SHUAI1\"}],\"splitChars\":[{\"char\":\"足率\"}],\"weight\":10},{\"charId\":\"884fea83\",\"unicodeChar\":\"𧺸\",\"unicodeCodePoint\":\"27EB8\",\"pinYinChars\":[{\"char\":\"YONG2\"}],\"splitChars\":[{\"char\":\"走冋\"}],\"weight\":10},{\"charId\":\"c9317377\",\"unicodeChar\":\"𧺊\",\"unicodeCodePoint\":\"27E8A\",\"pinYinChars\":[{\"char\":\"HU\"}],\"splitChars\":[{\"char\":\"走匕\"}],\"weight\":10},{\"charId\":\"a50602b7\",\"unicodeChar\":\"𨀙\",\"unicodeCodePoint\":\"28019\",\"pinYinChars\":[{\"char\":\"XI1\"}],\"splitChars\":[{\"char\":\"足吉\"}],\"weight\":10},{\"charId\":\"6375d2f9\",\"unicodeChar\":\"𩢀\",\"unicodeCodePoint\":\"29880\",\"pinYinChars\":[{\"char\":\"TUN2\"}],\"splitChars\":[{\"char\":\"馬屯\"}],\"weight\":10},{\"charId\":\"f3e78c1d\",\"unicodeChar\":\"𨍶\",\"unicodeCodePoint\":\"28376\",\"pinYinChars\":[{\"char\":\"QIONG2\"}],\"splitChars\":[{\"char\":\"𤇾車\"}],\"weight\":10},{\"charId\":\"8e0d102e\",\"unicodeChar\":\"𨋺\",\"unicodeCodePoint\":\"282FA\",\"pinYinChars\":[{\"char\":\"FA2\"}],\"splitChars\":[{\"char\":\"臼車\"}],\"weight\":10},{\"charId\":\"fe84a319\",\"unicodeChar\":\"𨊧\",\"unicodeCodePoint\":\"282A7\",\"pinYinChars\":[{\"char\":\"GANG1\"}],\"splitChars\":[{\"char\":\"車工\"}],\"weight\":10},{\"charId\":\"355d1b5a\",\"unicodeChar\":\"𨇤\",\"unicodeCodePoint\":\"281E4\",\"pinYinChars\":[{\"char\":\"XIAN1\"}],\"splitChars\":[{\"char\":\"足鮮\"}],\"weight\":10},{\"charId\":\"9d6a35ca\",\"unicodeChar\":\"𨠏\",\"unicodeCodePoint\":\"2880F\",\"pinYinChars\":[{\"char\":\"TI2\"}],\"splitChars\":[{\"char\":\"酉氐\"}],\"weight\":10},{\"charId\":\"dd9d3677\",\"unicodeChar\":\"𨟵\",\"unicodeCodePoint\":\"287F5\",\"pinYinChars\":[{\"char\":\"BI3\"}],\"splitChars\":[{\"char\":\"酉比\"}],\"weight\":10},{\"charId\":\"db19a5ee\",\"unicodeChar\":\"𨞺\",\"unicodeCodePoint\":\"287BA\",\"pinYinChars\":[{\"char\":\"LI4\"}],\"splitChars\":[{\"char\":\"厲阝\"}],\"weight\":10},{\"charId\":\"c20319d9\",\"unicodeChar\":\"𨞕\",\"unicodeCodePoint\":\"28795\",\"pinYinChars\":[{\"char\":\"ZHU2\"}],\"splitChars\":[{\"char\":\"蜀阝\"}],\"weight\":10},{\"charId\":\"a3d6d688\",\"unicodeChar\":\"𫮑\",\"unicodeCodePoint\":\"2BB91\",\"pinYinChars\":[{\"char\":\"JIAN4\"}],\"splitChars\":[{\"char\":\"土建\"}],\"weight\":10},{\"charId\":\"4950d39b\",\"unicodeChar\":\"𨗦\",\"unicodeCodePoint\":\"285E6\",\"pinYinChars\":[{\"char\":\"QIAN3\"}],\"splitChars\":[{\"char\":\"辶僉\"}],\"weight\":10},{\"charId\":\"6c4a045e\",\"unicodeChar\":\"𫮃\",\"unicodeCodePoint\":\"2BB83\",\"pinYinChars\":[{\"char\":\"SHAN4\"}],\"splitChars\":[{\"char\":\"土单\"}],\"weight\":10},{\"charId\":\"68ab702a\",\"unicodeChar\":\"𨝎\",\"unicodeCodePoint\":\"2874E\",\"pinYinChars\":[{\"char\":\"KANG1\"}],\"splitChars\":[{\"char\":\"康阝\"}],\"weight\":10},{\"charId\":\"cdea090d\",\"unicodeChar\":\"𪤊\",\"unicodeCodePoint\":\"2A90A\",\"pinYinChars\":[{\"char\":\"LANG4\"}],\"splitChars\":[{\"char\":\"浪土\"}],\"weight\":10},{\"charId\":\"70f192ae\",\"unicodeChar\":\"𨜶\",\"unicodeCodePoint\":\"28736\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"益阝\"}],\"weight\":10},{\"charId\":\"852c2abf\",\"unicodeChar\":\"𨜓\",\"unicodeCodePoint\":\"28713\",\"pinYinChars\":[{\"char\":\"ZHENG1\"}],\"splitChars\":[{\"char\":\"貞阝\"}],\"weight\":10},{\"charId\":\"d0c3f67d\",\"unicodeChar\":\"𨜏\",\"unicodeCodePoint\":\"2870F\",\"pinYinChars\":[{\"char\":\"YING2\"}],\"splitChars\":[{\"char\":\"盈阝\"}],\"weight\":10},{\"charId\":\"cd92fe2f\",\"unicodeChar\":\"𨢌\",\"unicodeCodePoint\":\"2888C\",\"pinYinChars\":[{\"char\":\"LI4\"}],\"splitChars\":[{\"char\":\"酉鬲\"}],\"weight\":10},{\"charId\":\"aff643d1\",\"unicodeChar\":\"𨡹\",\"unicodeCodePoint\":\"28879\",\"pinYinChars\":[{\"char\":\"JI4\"}],\"splitChars\":[{\"char\":\"酉泉\"}],\"weight\":10},{\"charId\":\"dd76d6ce\",\"unicodeChar\":\"𨚔\",\"unicodeCodePoint\":\"28694\",\"pinYinChars\":[{\"char\":\"BAO1\"}],\"splitChars\":[{\"char\":\"包阝\"}],\"weight\":10},{\"charId\":\"99133474\",\"unicodeChar\":\"𨙴\",\"unicodeCodePoint\":\"28674\",\"pinYinChars\":[{\"char\":\"CAI2\"}],\"splitChars\":[{\"char\":\"才阝\"}],\"weight\":10},{\"charId\":\"84d9b2c8\",\"unicodeChar\":\"𨗴\",\"unicodeCodePoint\":\"285F4\",\"pinYinChars\":[{\"char\":\"XIAN1\"}],\"splitChars\":[{\"char\":\"辶隹\"}],\"weight\":10},{\"charId\":\"dfc02080\",\"unicodeChar\":\"𨗨\",\"unicodeCodePoint\":\"285E8\",\"pinYinChars\":[{\"char\":\"WEI3\"}],\"splitChars\":[{\"char\":\"辶韋\"}],\"weight\":10},{\"charId\":\"2a604a6b\",\"unicodeChar\":\"𨑨\",\"unicodeCodePoint\":\"28468\",\"pinYinChars\":[{\"char\":\"ZHI4\"}],\"splitChars\":[{\"char\":\"辶日\"}],\"weight\":10},{\"charId\":\"0fc50acd\",\"unicodeChar\":\"𨔦\",\"unicodeCodePoint\":\"28526\",\"pinYinChars\":[{\"char\":\"SHU4\"}],\"splitChars\":[{\"char\":\"辶壴\"}],\"weight\":10},{\"charId\":\"8ab9cc5d\",\"unicodeChar\":\"𨛴\",\"unicodeCodePoint\":\"286F4\",\"pinYinChars\":[{\"char\":\"HAO4\"}],\"splitChars\":[{\"char\":\"昊阝\"}],\"weight\":10},{\"charId\":\"9d79e000\",\"unicodeChar\":\"𨛮\",\"unicodeCodePoint\":\"286EE\",\"pinYinChars\":[{\"char\":\"JU1\"}],\"splitChars\":[{\"char\":\"居阝\"}],\"weight\":10},{\"charId\":\"dbb6bf49\",\"unicodeChar\":\"𨛬\",\"unicodeCodePoint\":\"286EC\",\"pinYinChars\":[{\"char\":\"XI2\"}],\"splitChars\":[{\"char\":\"非邑\"}],\"weight\":10},{\"charId\":\"dc79ecc1\",\"unicodeChar\":\"𨚮\",\"unicodeCodePoint\":\"286AE\",\"pinYinChars\":[{\"char\":\"HAO4\"}],\"splitChars\":[{\"char\":\"白阝\"}],\"weight\":10},{\"charId\":\"489522b4\",\"unicodeChar\":\"𪤗\",\"unicodeCodePoint\":\"2A917\",\"pinYinChars\":[{\"char\":\"LIAO4\"}],\"splitChars\":[{\"char\":\"土翏\"}],\"weight\":10},{\"charId\":\"9ab383a1\",\"unicodeChar\":\"𫰛\",\"unicodeCodePoint\":\"2BC1B\",\"pinYinChars\":[{\"char\":\"XING2\"}],\"splitChars\":[{\"char\":\"女𢀖\"}],\"weight\":10},{\"charId\":\"d9c79386\",\"unicodeChar\":\"𪥰\",\"unicodeCodePoint\":\"2A970\",\"pinYinChars\":[{\"char\":\"NING2\"}],\"splitChars\":[{\"char\":\"女宁\"}],\"weight\":10},{\"charId\":\"0519717d\",\"unicodeChar\":\"𨥜\",\"unicodeCodePoint\":\"2895C\",\"pinYinChars\":[{\"char\":\"AO3\"}],\"splitChars\":[{\"char\":\"金夭\"}],\"weight\":10},{\"charId\":\"1172f2e9\",\"unicodeChar\":\"𫳑\",\"unicodeCodePoint\":\"2BCD1\",\"pinYinChars\":[{\"char\":\"YAN1\"}],\"splitChars\":[{\"char\":\"宀奄\"}],\"weight\":10},{\"charId\":\"319d4e63\",\"unicodeChar\":\"𫱮\",\"unicodeCodePoint\":\"2BC6E\",\"pinYinChars\":[{\"char\":\"HUI4\"}],\"splitChars\":[{\"char\":\"女惠\"}],\"weight\":10},{\"charId\":\"a72a90ea\",\"unicodeChar\":\"𫰾\",\"unicodeCodePoint\":\"2BC3E\",\"pinYinChars\":[{\"char\":\"JIN1\"}],\"splitChars\":[{\"char\":\"女金\"}],\"weight\":10},{\"charId\":\"80950feb\",\"unicodeChar\":\"𭏦\",\"unicodeCodePoint\":\"2D3E6\",\"pinYinChars\":[{\"char\":\"AI4\"}],\"splitChars\":[{\"char\":\"土盖\"}],\"weight\":10},{\"charId\":\"76fc4087\",\"unicodeChar\":\"𪤏\",\"unicodeCodePoint\":\"2A90F\",\"pinYinChars\":[{\"char\":\"JI1\"}],\"splitChars\":[{\"char\":\"土基\"}],\"weight\":10},{\"charId\":\"7442e9fb\",\"unicodeChar\":\"𨝯\",\"unicodeCodePoint\":\"2876F\",\"pinYinChars\":[{\"char\":\"TONG2\"}],\"splitChars\":[{\"char\":\"童阝\"}],\"weight\":10},{\"charId\":\"86139900\",\"unicodeChar\":\"𨥙\",\"unicodeCodePoint\":\"28959\",\"pinYinChars\":[{\"char\":\"JING3\"}],\"splitChars\":[{\"char\":\"金井\"}],\"weight\":10},{\"charId\":\"7a5f411a\",\"unicodeChar\":\"𫰎\",\"unicodeCodePoint\":\"2BC0E\",\"pinYinChars\":[{\"char\":\"YA1\"}],\"splitChars\":[{\"char\":\"女牙\"}],\"weight\":10},{\"charId\":\"99828527\",\"unicodeChar\":\"𪥈\",\"unicodeCodePoint\":\"2A948\",\"pinYinChars\":[{\"char\":\"DUN1\"}],\"splitChars\":[{\"char\":\"大平\"}],\"weight\":10},{\"charId\":\"41119732\",\"unicodeChar\":\"𨥌\",\"unicodeCodePoint\":\"2894C\",\"pinYinChars\":[{\"char\":\"CHI2\"}],\"splitChars\":[{\"char\":\"金氏\"}],\"weight\":10},{\"charId\":\"12d2133b\",\"unicodeChar\":\"𨥈\",\"unicodeCodePoint\":\"28948\",\"pinYinChars\":[{\"char\":\"JI3\"}],\"splitChars\":[{\"char\":\"金己\"}],\"weight\":10},{\"charId\":\"3bba04c4\",\"unicodeChar\":\"𪤅\",\"unicodeCodePoint\":\"2A905\",\"pinYinChars\":[{\"char\":\"DANG3\"}],\"splitChars\":[{\"char\":\"土党\"}],\"weight\":10},{\"charId\":\"7568cd43\",\"unicodeChar\":\"𪨪\",\"unicodeCodePoint\":\"2AA2A\",\"pinYinChars\":[{\"char\":\"CE4\"}],\"splitChars\":[{\"char\":\"山册\"}],\"weight\":10},{\"charId\":\"3a3fa569\",\"unicodeChar\":\"𪥵\",\"unicodeCodePoint\":\"2A975\",\"pinYinChars\":[{\"char\":\"XU3\"}],\"splitChars\":[{\"char\":\"女羽\"}],\"weight\":10},{\"charId\":\"51265e07\",\"unicodeChar\":\"𡸫\",\"unicodeCodePoint\":\"21E2B\",\"pinYinChars\":[{\"char\":\"PIN1\"}],\"splitChars\":[{\"char\":\"山并(幷)\"}],\"weight\":10},{\"charId\":\"cd6e9db2\",\"unicodeChar\":\"𪨳\",\"unicodeCodePoint\":\"2AA33\",\"pinYinChars\":[{\"char\":\"HENG4\"}],\"splitChars\":[{\"char\":\"山行\"}],\"weight\":10},{\"charId\":\"12f515d2\",\"unicodeChar\":\"𪥼\",\"unicodeCodePoint\":\"2A97C\",\"pinYinChars\":[{\"char\":\"QI1\"}],\"splitChars\":[{\"char\":\"女妻\"}],\"weight\":10},{\"charId\":\"219a9806\",\"unicodeChar\":\"𪭴\",\"unicodeCodePoint\":\"2AB74\",\"pinYinChars\":[{\"char\":\"ZOU3\"}],\"splitChars\":[{\"char\":\"扌走\"}],\"weight\":10},{\"charId\":\"8ebf4028\",\"unicodeChar\":\"𭜸\",\"unicodeCodePoint\":\"2D738\",\"pinYinChars\":[{\"char\":\"XIAO4\"}],\"splitChars\":[{\"char\":\"忄孝\"}],\"weight\":10},{\"charId\":\"f21fe2ed\",\"unicodeChar\":\"𫶇\",\"unicodeCodePoint\":\"2BD87\",\"pinYinChars\":[{\"char\":\"DIE2\"}],\"splitChars\":[{\"char\":\"山带\"}],\"weight\":10},{\"charId\":\"17cc5320\",\"unicodeChar\":\"𪩃\",\"unicodeCodePoint\":\"2AA43\",\"pinYinChars\":[{\"char\":\"SHI4\"}],\"splitChars\":[{\"char\":\"山是\"}],\"weight\":10},{\"charId\":\"3a78c4a1\",\"unicodeChar\":\"𫓯\",\"unicodeCodePoint\":\"2B4EF\",\"pinYinChars\":[{\"char\":\"JI1\"}],\"splitChars\":[{\"char\":\"钅圭\"}],\"weight\":10},{\"charId\":\"ae27f533\",\"unicodeChar\":\"𬬾\",\"unicodeCodePoint\":\"2CB3E\",\"pinYinChars\":[{\"char\":\"NING2\"}],\"splitChars\":[{\"char\":\"钅宁\"}],\"weight\":10},{\"charId\":\"691b53e3\",\"unicodeChar\":\"𬭸\",\"unicodeCodePoint\":\"2CB78\",\"pinYinChars\":[{\"char\":\"LIN2\"}],\"splitChars\":[{\"char\":\"钅粦\"}],\"weight\":10},{\"charId\":\"9a0effa3\",\"unicodeChar\":\"𬭳\",\"unicodeCodePoint\":\"2CB73\",\"pinYinChars\":[{\"char\":\"XI3\"}],\"splitChars\":[{\"char\":\"钅喜\"}],\"weight\":10},{\"charId\":\"8829c6b4\",\"unicodeChar\":\"𬭯\",\"unicodeCodePoint\":\"2CB6F\",\"pinYinChars\":[{\"char\":\"PIE3\"}],\"splitChars\":[{\"char\":\"钅敝\"}],\"weight\":10},{\"charId\":\"bbaeee52\",\"unicodeChar\":\"𬭄\",\"unicodeCodePoint\":\"2CB44\",\"pinYinChars\":[{\"char\":\"XI3\"}],\"splitChars\":[{\"char\":\"钅西\"}],\"weight\":10},{\"charId\":\"0d3c33bb\",\"unicodeChar\":\"𫓹\",\"unicodeCodePoint\":\"2B4F9\",\"pinYinChars\":[{\"char\":\"JI1\"}],\"splitChars\":[{\"char\":\"钅其\"}],\"weight\":10},{\"charId\":\"bb9f76fb\",\"unicodeChar\":\"𬮡\",\"unicodeCodePoint\":\"2CBA1\",\"pinYinChars\":[{\"char\":\"MA3\"}],\"splitChars\":[{\"char\":\"门外\"}],\"weight\":10},{\"charId\":\"e7e88266\",\"unicodeChar\":\"𫕟\",\"unicodeCodePoint\":\"2B55F\",\"pinYinChars\":[{\"char\":\"XIAO1\"}],\"splitChars\":[{\"char\":\"雨月\"}],\"weight\":10},{\"charId\":\"bb95afc8\",\"unicodeChar\":\"𫠃\",\"unicodeCodePoint\":\"2B803\",\"pinYinChars\":[{\"char\":\"XIAN\"}],\"splitChars\":[{\"char\":\"阝显\"}],\"weight\":10},{\"charId\":\"7830fd00\",\"unicodeChar\":\"𬯎\",\"unicodeCodePoint\":\"2CBCE\",\"pinYinChars\":[{\"char\":\"TUI2\"}],\"splitChars\":[{\"char\":\"阝贵\"}],\"weight\":10},{\"charId\":\"371ba62d\",\"unicodeChar\":\"𬷻\",\"unicodeCodePoint\":\"2CDFB\",\"pinYinChars\":[{\"char\":\"JIE\"}],\"splitChars\":[{\"char\":\"鸟乙\"}],\"weight\":10},{\"charId\":\"f7d8f6b6\",\"unicodeChar\":\"𬶖\",\"unicodeCodePoint\":\"2CD96\",\"pinYinChars\":[{\"char\":\"YE4\"}],\"splitChars\":[{\"char\":\"鱼奄\"}],\"weight\":10},{\"charId\":\"7efe3dc7\",\"unicodeChar\":\"𬳽\",\"unicodeCodePoint\":\"2CCFD\",\"pinYinChars\":[{\"char\":\"SHEN1\"}],\"splitChars\":[{\"char\":\"马先\"}],\"weight\":10},{\"charId\":\"fc795622\",\"unicodeChar\":\"𬴊\",\"unicodeCodePoint\":\"2CD0A\",\"pinYinChars\":[{\"char\":\"LIN2\"}],\"splitChars\":[{\"char\":\"马粦\"}],\"weight\":10},{\"charId\":\"d8efcb10\",\"unicodeChar\":\"𫘪\",\"unicodeCodePoint\":\"2B62A\",\"pinYinChars\":[{\"char\":\"YUAN2\"}],\"splitChars\":[{\"char\":\"马原\"}],\"weight\":10},{\"charId\":\"f79f9e32\",\"unicodeChar\":\"𬳿\",\"unicodeCodePoint\":\"2CCFF\",\"pinYinChars\":[{\"char\":\"TU2\"}],\"splitChars\":[{\"char\":\"马余\"}],\"weight\":10},{\"charId\":\"58de861e\",\"unicodeChar\":\"𬳶\",\"unicodeCodePoint\":\"2CCF6\",\"pinYinChars\":[{\"char\":\"JIONG1\"}],\"splitChars\":[{\"char\":\"马冋\"}],\"weight\":10},{\"charId\":\"3029fb34\",\"unicodeChar\":\"𫘜\",\"unicodeCodePoint\":\"2B61C\",\"pinYinChars\":[{\"char\":\"WEN2\"}],\"splitChars\":[{\"char\":\"马文\"}],\"weight\":10},{\"charId\":\"b60b7c8b\",\"unicodeChar\":\"𫘝\",\"unicodeCodePoint\":\"2B61D\",\"pinYinChars\":[{\"char\":\"JUE2\"}],\"splitChars\":[{\"char\":\"马夬\"}],\"weight\":10},{\"charId\":\"c5e32c79\",\"unicodeChar\":\"𫘨\",\"unicodeCodePoint\":\"2B628\",\"pinYinChars\":[{\"char\":\"TI2\"}],\"splitChars\":[{\"char\":\"马是\"}],\"weight\":10},{\"charId\":\"cd8188e8\",\"unicodeChar\":\"𫘦\",\"unicodeCodePoint\":\"2B626\",\"pinYinChars\":[{\"char\":\"TAO2\"}],\"splitChars\":[{\"char\":\"马匋\"}],\"weight\":10},{\"charId\":\"20d024c4\",\"unicodeChar\":\"𪝉\",\"unicodeCodePoint\":\"2A749\",\"pinYinChars\":[{\"char\":\"TIAO2\"}],\"splitChars\":[{\"char\":\"亻条\"}],\"weight\":10},{\"charId\":\"360a99db\",\"unicodeChar\":\"𫠡\",\"unicodeCodePoint\":\"2B821\",\"pinYinChars\":[{\"char\":\"DENG4\"}],\"splitChars\":[{\"char\":\"一个\"}],\"weight\":10},{\"charId\":\"757fc29a\",\"unicodeChar\":\"𬸣\",\"unicodeCodePoint\":\"2CE23\",\"pinYinChars\":[{\"char\":\"XIAN1\"}],\"splitChars\":[{\"char\":\"宀鸟\"}],\"weight\":10},{\"charId\":\"ed4565c6\",\"unicodeChar\":\"𬶌\",\"unicodeCodePoint\":\"2CD8C\",\"pinYinChars\":[{\"char\":\"DAI4\"}],\"splitChars\":[{\"char\":\"鱼代\"}],\"weight\":10},{\"charId\":\"c2a5be3c\",\"unicodeChar\":\"𫛲\",\"unicodeCodePoint\":\"2B6F2\",\"pinYinChars\":[{\"char\":\"DIAO1\"}],\"splitChars\":[{\"char\":\"周鸟\"}],\"weight\":10},{\"charId\":\"0ff8af82\",\"unicodeChar\":\"𬸚\",\"unicodeCodePoint\":\"2CE1A\",\"pinYinChars\":[{\"char\":\"YUE4\"}],\"splitChars\":[{\"char\":\"狱鸟\"}],\"weight\":10},{\"charId\":\"dcb6bd47\",\"unicodeChar\":\"𪋮\",\"unicodeCodePoint\":\"2A2EE\",\"pinYinChars\":[{\"char\":\"YU4\"}],\"splitChars\":[{\"char\":\"鹿與\"}],\"weight\":10},{\"charId\":\"c6779768\",\"unicodeChar\":\"𪋬\",\"unicodeCodePoint\":\"2A2EC\",\"pinYinChars\":[{\"char\":\"YU3\"}],\"splitChars\":[{\"char\":\"鹿吴(虞)\"}],\"weight\":10},{\"charId\":\"2fa4d2e7\",\"unicodeChar\":\"𪋡\",\"unicodeCodePoint\":\"2A2E1\",\"pinYinChars\":[{\"char\":\"PU2\"}],\"splitChars\":[{\"char\":\"鹿菐\"}],\"weight\":10},{\"charId\":\"c500fbe7\",\"unicodeChar\":\"𪊷\",\"unicodeCodePoint\":\"2A2B7\",\"pinYinChars\":[{\"char\":\"XIAO4\"}],\"splitChars\":[{\"char\":\"鹿孝\"}],\"weight\":10},{\"charId\":\"4c5b3ca2\",\"unicodeChar\":\"𪊶\",\"unicodeCodePoint\":\"2A2B6\",\"pinYinChars\":[{\"char\":\"TING3\"}],\"splitChars\":[{\"char\":\"鹿廷\"}],\"weight\":10},{\"charId\":\"a34a4ab1\",\"unicodeChar\":\"𪇵\",\"unicodeCodePoint\":\"2A1F5\",\"pinYinChars\":[{\"char\":\"GUANG3\"}],\"splitChars\":[{\"char\":\"廣鳥\"}],\"weight\":10},{\"charId\":\"9325a45b\",\"unicodeChar\":\"𪆶\",\"unicodeCodePoint\":\"2A1B6\",\"pinYinChars\":[{\"char\":\"CAN4\"}],\"splitChars\":[{\"char\":\"粲鳥\"}],\"weight\":10},{\"charId\":\"d792df1d\",\"unicodeChar\":\"𪄹\",\"unicodeCodePoint\":\"2A139\",\"pinYinChars\":[{\"char\":\"CHANG2\"}],\"splitChars\":[{\"char\":\"常鳥\"}],\"weight\":10},{\"charId\":\"34e0c785\",\"unicodeChar\":\"𪄴\",\"unicodeCodePoint\":\"2A134\",\"pinYinChars\":[{\"char\":\"MIN3\"}],\"splitChars\":[{\"char\":\"敏鳥\"}],\"weight\":10},{\"charId\":\"856d06e3\",\"unicodeChar\":\"𪃾\",\"unicodeCodePoint\":\"2A0FE\",\"pinYinChars\":[{\"char\":\"RONG2\"}],\"splitChars\":[{\"char\":\"容鳥\"}],\"weight\":10},{\"charId\":\"89ca7dbc\",\"unicodeChar\":\"𪃑\",\"unicodeCodePoint\":\"2A0D1\",\"pinYinChars\":[{\"char\":\"MAO4\"}],\"splitChars\":[{\"char\":\"冒鳥\"}],\"weight\":10},{\"charId\":\"fe32ef02\",\"unicodeChar\":\"𪂹\",\"unicodeCodePoint\":\"2A0B9\",\"pinYinChars\":[{\"char\":\"CHUN1\"}],\"splitChars\":[{\"char\":\"春鳥\"}],\"weight\":10},{\"charId\":\"a1ff160b\",\"unicodeChar\":\"𫢎\",\"unicodeCodePoint\":\"2B88E\",\"pinYinChars\":[{\"char\":\"SHUN3\"}],\"splitChars\":[{\"char\":\"亻允\"}],\"weight\":10},{\"charId\":\"7b9c3ba5\",\"unicodeChar\":\"𪕀\",\"unicodeCodePoint\":\"2A540\",\"pinYinChars\":[{\"char\":\"YUAN2\"}],\"splitChars\":[{\"char\":\"鼠元\"}],\"weight\":10},{\"charId\":\"588af633\",\"unicodeChar\":\"𪒠\",\"unicodeCodePoint\":\"2A4A0\",\"pinYinChars\":[{\"char\":\"YAN3\"}],\"splitChars\":[{\"char\":\"黑敢\"}],\"weight\":10},{\"charId\":\"df64b479\",\"unicodeChar\":\"𪎒\",\"unicodeCodePoint\":\"2A392\",\"pinYinChars\":[{\"char\":\"SHUO4\"}],\"splitChars\":[{\"char\":\"麻凡\"}],\"weight\":10},{\"charId\":\"0ed1c49d\",\"unicodeChar\":\"𪌼\",\"unicodeCodePoint\":\"2A33C\",\"pinYinChars\":[{\"char\":\"TAO2\"}],\"splitChars\":[{\"char\":\"麥匋\"}],\"weight\":10},{\"charId\":\"9e4349b8\",\"unicodeChar\":\"𪜳\",\"unicodeCodePoint\":\"2A733\",\"pinYinChars\":[{\"char\":\"MIAN2\"}],\"splitChars\":[{\"char\":\"亻民\"}],\"weight\":10},{\"charId\":\"fc720c64\",\"unicodeChar\":\"𪈼\",\"unicodeCodePoint\":\"2A23C\",\"pinYinChars\":[{\"char\":\"NIAO3\"}],\"splitChars\":[{\"char\":\"鳥鳥\"}],\"weight\":10},{\"charId\":\"a8309abf\",\"unicodeChar\":\"𫢉\",\"unicodeCodePoint\":\"2B889\",\"pinYinChars\":[{\"char\":\"GAN4\"}],\"splitChars\":[{\"char\":\"人干\"}],\"weight\":10},{\"charId\":\"06df16e7\",\"unicodeChar\":\"𫥡\",\"unicodeCodePoint\":\"2B961\",\"pinYinChars\":[{\"char\":\"DOU1\"}],\"splitChars\":[{\"char\":\"比几\"}],\"weight\":10},{\"charId\":\"69ad5b09\",\"unicodeChar\":\"𫥞\",\"unicodeCodePoint\":\"2B95E\",\"pinYinChars\":[{\"char\":\"PEI4\"}],\"splitChars\":[{\"char\":\"几帀\"}],\"weight\":10},{\"charId\":\"83702bb6\",\"unicodeChar\":\"𬙂\",\"unicodeCodePoint\":\"2C642\",\"pinYinChars\":[{\"char\":\"YAN3\"}],\"splitChars\":[{\"char\":\"纟寅\"}],\"weight\":10},{\"charId\":\"434d73c3\",\"unicodeChar\":\"𬙙\",\"unicodeCodePoint\":\"2C659\",\"pinYinChars\":[{\"char\":\"LENG4\"}],\"splitChars\":[{\"char\":\"四方\"}],\"weight\":10},{\"charId\":\"4db0a415\",\"unicodeChar\":\"𬘴\",\"unicodeCodePoint\":\"2C634\",\"pinYinChars\":[{\"char\":\"QIU1\"}],\"splitChars\":[{\"char\":\"纟秋\"}],\"weight\":10},{\"charId\":\"44a5d969\",\"unicodeChar\":\"𬘭\",\"unicodeCodePoint\":\"2C62D\",\"pinYinChars\":[{\"char\":\"LIN2\"}],\"splitChars\":[{\"char\":\"纟林\"}],\"weight\":10},{\"charId\":\"ca97ac92\",\"unicodeChar\":\"𫢷\",\"unicodeCodePoint\":\"2B8B7\",\"pinYinChars\":[{\"char\":\"TING2\"}],\"splitChars\":[{\"char\":\"亻享\"}],\"weight\":10},{\"charId\":\"0b8092ed\",\"unicodeChar\":\"𬜥\",\"unicodeCodePoint\":\"2C725\",\"pinYinChars\":[{\"char\":\"LAN2\"}],\"splitChars\":[{\"char\":\"艹风\"}],\"weight\":10},{\"charId\":\"803cb6a3\",\"unicodeChar\":\"𫇭\",\"unicodeCodePoint\":\"2B1ED\",\"pinYinChars\":[{\"char\":\"WEI3\"}],\"splitChars\":[{\"char\":\"艹为\"}],\"weight\":10},{\"charId\":\"163e6eb9\",\"unicodeChar\":\"𭃂\",\"unicodeCodePoint\":\"2D0C2\",\"pinYinChars\":[{\"char\":\"LIANG3\"}],\"splitChars\":[{\"char\":\"刀二\"}],\"weight\":10},{\"charId\":\"4bf360e8\",\"unicodeChar\":\"𫢌\",\"unicodeCodePoint\":\"2B88C\",\"pinYinChars\":[{\"char\":\"DAN1\"}],\"splitChars\":[{\"char\":\"亻丹\"}],\"weight\":10},{\"charId\":\"6f1acb19\",\"unicodeChar\":\"𬽪\",\"unicodeCodePoint\":\"2CF6A\",\"pinYinChars\":[{\"char\":\"RI4\"}],\"splitChars\":[{\"char\":\"亻日\"}],\"weight\":10},{\"charId\":\"aad6dd02\",\"unicodeChar\":\"𬘫\",\"unicodeCodePoint\":\"2C62B\",\"pinYinChars\":[{\"char\":\"HUAN2\"}],\"splitChars\":[{\"char\":\"纟完\"}],\"weight\":10},{\"charId\":\"3ccecf3b\",\"unicodeChar\":\"𫢝\",\"unicodeCodePoint\":\"2B89D\",\"pinYinChars\":[{\"char\":\"YU3\"}],\"splitChars\":[{\"char\":\"亻宇\"}],\"weight\":10},{\"charId\":\"3eddb85f\",\"unicodeChar\":\"鿇\",\"unicodeCodePoint\":\"9FC7\",\"pinYinChars\":[{\"char\":\"ZHENG1\"}],\"splitChars\":[{\"char\":\"亻争\"}],\"weight\":10},{\"charId\":\"418249f2\",\"unicodeChar\":\"𪝞\",\"unicodeCodePoint\":\"2A75E\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"亻益\"}],\"weight\":10},{\"charId\":\"64ac85a2\",\"unicodeChar\":\"𪟺\",\"unicodeCodePoint\":\"2A7FA\",\"pinYinChars\":[{\"char\":\"SHU1\"}],\"splitChars\":[{\"char\":\"卓俞\"}],\"weight\":10},{\"charId\":\"c77d6b93\",\"unicodeChar\":\"𬣞\",\"unicodeCodePoint\":\"2C8DE\",\"pinYinChars\":[{\"char\":\"ZHU4\"}],\"splitChars\":[{\"char\":\"讠㝉贮\"}],\"weight\":10},{\"charId\":\"30816d46\",\"unicodeChar\":\"𫅪\",\"unicodeCodePoint\":\"2B16A\",\"pinYinChars\":[{\"char\":\"FEI3\"}],\"splitChars\":[{\"char\":\"羽非\"}],\"weight\":10},{\"charId\":\"19e272f8\",\"unicodeChar\":\"𬚖\",\"unicodeCodePoint\":\"2C696\",\"pinYinChars\":[{\"char\":\"CHAO3\"}],\"splitChars\":[{\"char\":\"耳召\"}],\"weight\":10},{\"charId\":\"9c48f105\",\"unicodeChar\":\"𬜯\",\"unicodeCodePoint\":\"2C72F\",\"pinYinChars\":[{\"char\":\"LIANG3\"}],\"splitChars\":[{\"char\":\"艹两\"}],\"weight\":10},{\"charId\":\"9a536bf1\",\"unicodeChar\":\"𫥓\",\"unicodeCodePoint\":\"2B953\",\"pinYinChars\":[{\"char\":\"YU2\"}],\"splitChars\":[{\"char\":\"冫俞\"}],\"weight\":10},{\"charId\":\"be93f9e4\",\"unicodeChar\":\"𫇺\",\"unicodeCodePoint\":\"2B1FA\",\"pinYinChars\":[{\"char\":\"ZHUANG1\"}],\"splitChars\":[{\"char\":\"艹庄\"}],\"weight\":10},{\"charId\":\"48891159\",\"unicodeChar\":\"𬟽\",\"unicodeCodePoint\":\"2C7FD\",\"pinYinChars\":[{\"char\":\"DONG1\"}],\"splitChars\":[{\"char\":\"虫东\"}],\"weight\":10},{\"charId\":\"b90053f3\",\"unicodeChar\":\"𫦪\",\"unicodeCodePoint\":\"2B9AA\",\"pinYinChars\":[{\"char\":\"JUAN1\"}],\"splitChars\":[{\"char\":\"肙力\"}],\"weight\":10},{\"charId\":\"43b2fb1f\",\"unicodeChar\":\"𪟘\",\"unicodeCodePoint\":\"2A7D8\",\"pinYinChars\":[{\"char\":\"QIU1\"}],\"splitChars\":[{\"char\":\"丘力\"}],\"weight\":10},{\"charId\":\"b44ce0f6\",\"unicodeChar\":\"𫍯\",\"unicodeCodePoint\":\"2B36F\",\"pinYinChars\":[{\"char\":\"XIAN2\"}],\"splitChars\":[{\"char\":\"讠咸\"}],\"weight\":10},{\"charId\":\"3b4273ef\",\"unicodeChar\":\"𫐄\",\"unicodeCodePoint\":\"2B404\",\"pinYinChars\":[{\"char\":\"YUE4\"}],\"splitChars\":[{\"char\":\"车兀\"}],\"weight\":10},{\"charId\":\"0a502cb2\",\"unicodeChar\":\"𬩽\",\"unicodeCodePoint\":\"2CA7D\",\"pinYinChars\":[{\"char\":\"XUN2\"}],\"splitChars\":[{\"char\":\"寻阝\"}],\"weight\":10},{\"charId\":\"2726f50e\",\"unicodeChar\":\"𬢤\",\"unicodeCodePoint\":\"2C8A4\",\"pinYinChars\":[{\"char\":\"ZI1\"}],\"splitChars\":[{\"char\":\"次言\"}],\"weight\":10},{\"charId\":\"828a68da\",\"unicodeChar\":\"𬣙\",\"unicodeCodePoint\":\"2C8D9\",\"pinYinChars\":[{\"char\":\"XU1\"}],\"splitChars\":[{\"char\":\"讠于\"}],\"weight\":10},{\"charId\":\"1177260f\",\"unicodeChar\":\"𬬮\",\"unicodeCodePoint\":\"2CB2E\",\"pinYinChars\":[{\"char\":\"CHANG3\"}],\"splitChars\":[{\"char\":\"钅长\"}],\"weight\":10},{\"charId\":\"ee66dfd1\",\"unicodeChar\":\"𫓧\",\"unicodeCodePoint\":\"2B4E7\",\"pinYinChars\":[{\"char\":\"FU1\"}],\"splitChars\":[{\"char\":\"钅夫\"}],\"weight\":10},{\"charId\":\"9e442d9a\",\"unicodeChar\":\"𮞑\",\"unicodeCodePoint\":\"2E791\",\"pinYinChars\":[{\"char\":\"GE4\"}],\"splitChars\":[{\"char\":\"辶各\"}],\"weight\":10},{\"charId\":\"254d46dc\",\"unicodeChar\":\"𬩳\",\"unicodeCodePoint\":\"2CA73\",\"pinYinChars\":[{\"char\":\"LI\"}],\"splitChars\":[{\"char\":\"力阝\"}],\"weight\":10},{\"charId\":\"4c664628\",\"unicodeChar\":\"𪦪\",\"unicodeCodePoint\":\"2A9AA\",\"pinYinChars\":[{\"char\":\"YUE4\"}],\"splitChars\":[{\"char\":\"女粤\"}],\"weight\":10},{\"charId\":\"73bc7892\",\"unicodeChar\":\"𫞩\",\"unicodeCodePoint\":\"2B7A9\",\"pinYinChars\":[{\"char\":\"MEN2\"}],\"splitChars\":[{\"char\":\"𤣩𬜯满\"}],\"weight\":10},{\"charId\":\"cfe89738\",\"unicodeChar\":\"𬍕\",\"unicodeCodePoint\":\"2C355\",\"pinYinChars\":[{\"char\":\"HUA4\"}],\"splitChars\":[{\"char\":\"王化\"}],\"weight\":10},{\"charId\":\"5ececbeb\",\"unicodeChar\":\"𤉹\",\"unicodeCodePoint\":\"24279\",\"pinYinChars\":[{\"char\":\"FU2\"}],\"splitChars\":[{\"char\":\"或火\"}],\"weight\":10},{\"charId\":\"996b818c\",\"unicodeChar\":\"牪\",\"unicodeCodePoint\":\"726A\",\"pinYinChars\":[{\"char\":\"YAN4\"}],\"splitChars\":[{\"char\":\"牛牛\"}],\"weight\":10},{\"charId\":\"aa555301\",\"unicodeChar\":\"𢶀\",\"unicodeCodePoint\":\"22D80\",\"pinYinChars\":[{\"char\":\"CHUAI2\"}],\"splitChars\":[{\"char\":\"扌罪\"}],\"weight\":10},{\"charId\":\"81121f33\",\"unicodeChar\":\"𡎠\",\"unicodeCodePoint\":\"213A0\",\"pinYinChars\":[{\"char\":\"YING4\"}],\"splitChars\":[{\"char\":\"土盈\"}],\"weight\":10},{\"charId\":\"3af1ea4c\",\"unicodeChar\":\"𫭽\",\"unicodeCodePoint\":\"2BB7D\",\"pinYinChars\":[{\"char\":\"LENG4\"}],\"splitChars\":[{\"char\":\"土罗\"}],\"weight\":10},{\"charId\":\"ee66a668\",\"unicodeChar\":\"𬟔\",\"unicodeCodePoint\":\"2C7D4\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"艹憶\"}],\"weight\":10},{\"charId\":\"a23a7092\",\"unicodeChar\":\"𫩑\",\"unicodeCodePoint\":\"2BA51\",\"pinYinChars\":[{\"char\":\"BENG4\"}],\"splitChars\":[{\"char\":\"一口\"}],\"weight\":10},{\"charId\":\"b454d49b\",\"unicodeChar\":\"𫵺\",\"unicodeCodePoint\":\"2BD7A\",\"pinYinChars\":[{\"char\":\"SHU\"}],\"splitChars\":[{\"char\":\"山色\"}],\"weight\":10},{\"charId\":\"265e1d75\",\"unicodeChar\":\"㕵\",\"unicodeCodePoint\":\"3575\",\"pinYinChars\":[{\"char\":\"MANG2\"}],\"splitChars\":[{\"char\":\"口王\"}],\"weight\":10},{\"charId\":\"577ec1f6\",\"unicodeChar\":\"𠕆\",\"unicodeCodePoint\":\"20546\",\"pinYinChars\":[{\"char\":\"DIAN4\"}],\"splitChars\":[{\"char\":\"冇一\"}],\"weight\":10},{\"charId\":\"b8585d7d\",\"unicodeChar\":\"𬈯\",\"unicodeCodePoint\":\"2C22F\",\"pinYinChars\":[{\"char\":\"JIAO4\"}],\"splitChars\":[{\"char\":\"氵告\"}],\"weight\":10},{\"charId\":\"2e5d6062\",\"unicodeChar\":\"䭰\",\"unicodeCodePoint\":\"4B70\",\"pinYinChars\":[{\"char\":\"BENG4\"}],\"splitChars\":[{\"char\":\"香奉\"}],\"weight\":10},{\"charId\":\"d4425efa\",\"unicodeChar\":\"𫭢\",\"unicodeCodePoint\":\"2BB62\",\"pinYinChars\":[{\"char\":\"LUN3\"}],\"splitChars\":[{\"char\":\"土仑\"}],\"weight\":10},{\"charId\":\"c2befa40\",\"unicodeChar\":\"䥈\",\"unicodeCodePoint\":\"4948\",\"pinYinChars\":[{\"char\":\"MU3\"}],\"splitChars\":[{\"char\":\"金莽\"}],\"weight\":10},{\"charId\":\"6f7f313a\",\"unicodeChar\":\"𬦱\",\"unicodeCodePoint\":\"2C9B1\",\"pinYinChars\":[{\"char\":\"PAI4\"}],\"splitChars\":[{\"char\":\"𧾷𠂢派\"}],\"weight\":10},{\"charId\":\"9bb380ed\",\"unicodeChar\":\"𪮅\",\"unicodeCodePoint\":\"2AB85\",\"pinYinChars\":[{\"char\":\"TIAO2\"}],\"splitChars\":[{\"char\":\"扌条\"}],\"weight\":10},{\"charId\":\"802cdf67\",\"unicodeChar\":\"𫰠\",\"unicodeCodePoint\":\"2BC20\",\"pinYinChars\":[{\"char\":\"DANG1\"}],\"splitChars\":[{\"char\":\"女当\"}],\"weight\":10},{\"charId\":\"197da0f3\",\"unicodeChar\":\"鿭\",\"unicodeCodePoint\":\"9FED\",\"pinYinChars\":[{\"char\":\"NIE4\"}],\"splitChars\":[{\"char\":\"钅尔\"}],\"weight\":\"10\"},{\"charId\":\"0e6b9434\",\"unicodeChar\":\"龻\",\"unicodeCodePoint\":\"9FBB\",\"pinYinChars\":[{\"char\":\"LUAN2\"}],\"splitChars\":[{\"char\":\"糹言\"}],\"weight\":\"10\"},{\"charId\":\"3cbfe2db\",\"unicodeChar\":\"龺\",\"unicodeCodePoint\":\"9FBA\",\"pinYinChars\":[{\"char\":\"ZHUO2\"}],\"splitChars\":[{\"char\":\"十早\"}],\"weight\":\"10\"},{\"charId\":\"5dce642f\",\"unicodeChar\":\"龹\",\"unicodeCodePoint\":\"9FB9\",\"pinYinChars\":[{\"char\":\"JUAN3\"}],\"splitChars\":[{\"char\":\"火二\"}],\"weight\":\"10\"},{\"charId\":\"aee76a3a\",\"unicodeChar\":\"龸\",\"unicodeCodePoint\":\"9FB8\",\"pinYinChars\":[{\"char\":\"CHANG2\"}],\"splitChars\":[{\"char\":\"⺌冖\"}],\"weight\":\"10\"},{\"charId\":\"f2af6762\",\"unicodeChar\":\"龷\",\"unicodeCodePoint\":\"9FB7\",\"pinYinChars\":[{\"char\":\"GONG4\"},{\"char\":\"HUANG2\"}],\"splitChars\":[{\"char\":\"艹一\"}],\"weight\":\"10\"},{\"charId\":\"7e1f8720\",\"unicodeChar\":\"龶\",\"unicodeCodePoint\":\"9FB6\",\"pinYinChars\":[{\"char\":\"QING1\"}],\"splitChars\":[{\"char\":\"𰀁一\"}],\"weight\":\"10\"},{\"charId\":\"b5b0af82\",\"unicodeChar\":\"龴\",\"unicodeCodePoint\":\"9FB4\",\"pinYinChars\":[{\"char\":\"YU3\"}],\"splitChars\":[{\"char\":\"乛丶\"}],\"weight\":\"10\"},{\"charId\":\"565052d1\",\"unicodeChar\":\"䲡\",\"unicodeCodePoint\":\"4CA1\",\"pinYinChars\":[{\"char\":\"QIU1\"}],\"splitChars\":[{\"char\":\"鱼酋\"}],\"weight\":\"10\"},{\"charId\":\"f4f16753\",\"unicodeChar\":\"䲞\",\"unicodeCodePoint\":\"4C9E\",\"pinYinChars\":[{\"char\":\"LI4\"}],\"splitChars\":[{\"char\":\"鱼立\"}],\"weight\":\"10\"},{\"charId\":\"3f627495\",\"unicodeChar\":\"䲎\",\"unicodeCodePoint\":\"4C8E\",\"pinYinChars\":[{\"char\":\"NEI3\"}],\"splitChars\":[{\"char\":\"魚敢\"}],\"weight\":\"10\"},{\"charId\":\"d897abcd\",\"unicodeChar\":\"䮾\",\"unicodeCodePoint\":\"4BBE\",\"pinYinChars\":[{\"char\":\"LONG2\"}],\"splitChars\":[{\"char\":\"馬龍\"}],\"weight\":\"10\"},{\"charId\":\"f5dab525\",\"unicodeChar\":\"䩄\",\"unicodeCodePoint\":\"4A44\",\"pinYinChars\":[{\"char\":\"TIAN3\"}],\"splitChars\":[{\"char\":\"面见\"}],\"weight\":\"10\"},{\"charId\":\"4403047f\",\"unicodeChar\":\"䨌\",\"unicodeCodePoint\":\"4A0C\",\"pinYinChars\":[{\"char\":\"BAO2\"}],\"splitChars\":[{\"char\":\"雨元\"}],\"weight\":\"10\"},{\"charId\":\"d8653a6a\",\"unicodeChar\":\"䦆\",\"unicodeCodePoint\":\"4986\",\"pinYinChars\":[{\"char\":\"JUE2\"}],\"splitChars\":[{\"char\":\"钅矍\"}],\"weight\":\"10\"},{\"charId\":\"dffa1f79\",\"unicodeChar\":\"䦅\",\"unicodeCodePoint\":\"4985\",\"pinYinChars\":[{\"char\":\"SHAN4\"}],\"splitChars\":[{\"char\":\"钅善\"}],\"weight\":\"10\"},{\"charId\":\"5006b707\",\"unicodeChar\":\"䦂\",\"unicodeCodePoint\":\"4982\",\"pinYinChars\":[{\"char\":\"SHAN4\"}],\"splitChars\":[{\"char\":\"钅扇\"}],\"weight\":\"10\"},{\"charId\":\"8b0aa2bd\",\"unicodeChar\":\"䦀\",\"unicodeCodePoint\":\"4980\",\"pinYinChars\":[{\"char\":\"YU3\"}],\"splitChars\":[{\"char\":\"钅羽\"}],\"weight\":\"10\"},{\"charId\":\"caad5d2c\",\"unicodeChar\":\"䥺\",\"unicodeCodePoint\":\"497A\",\"pinYinChars\":[{\"char\":\"YE2\"}],\"splitChars\":[{\"char\":\"钅牙\"}],\"weight\":\"10\"},{\"charId\":\"e9930939\",\"unicodeChar\":\"䢰\",\"unicodeCodePoint\":\"48B0\",\"pinYinChars\":[{\"char\":\"TI4\"}],\"splitChars\":[{\"char\":\"辶翟\"}],\"weight\":\"10\"},{\"charId\":\"e8bf22ac\",\"unicodeChar\":\"䢁\",\"unicodeCodePoint\":\"4881\",\"pinYinChars\":[{\"char\":\"YUE4\"}],\"splitChars\":[{\"char\":\"车月\"}],\"weight\":\"10\"},{\"charId\":\"192b57ef\",\"unicodeChar\":\"䢀\",\"unicodeCodePoint\":\"4880\",\"pinYinChars\":[{\"char\":\"QI4\"}],\"splitChars\":[{\"char\":\"车乞\"}],\"weight\":\"10\"},{\"charId\":\"b012bf5d\",\"unicodeChar\":\"䞍\",\"unicodeCodePoint\":\"478D\",\"pinYinChars\":[{\"char\":\"JING4\"}],\"splitChars\":[{\"char\":\"贝青\"}],\"weight\":\"10\"},{\"charId\":\"d2a72369\",\"unicodeChar\":\"䜩\",\"unicodeCodePoint\":\"4729\",\"pinYinChars\":[{\"char\":\"YAN4\"}],\"splitChars\":[{\"char\":\"讠燕\"}],\"weight\":\"10\"},{\"charId\":\"b30c7183\",\"unicodeChar\":\"䙌\",\"unicodeCodePoint\":\"464C\",\"pinYinChars\":[{\"char\":\"KUI4\"}],\"splitChars\":[{\"char\":\"衤贵\"}],\"weight\":\"10\"},{\"charId\":\"1ce9016d\",\"unicodeChar\":\"䘞\",\"unicodeCodePoint\":\"461E\",\"pinYinChars\":[{\"char\":\"MA3\"}],\"splitChars\":[{\"char\":\"衤马\"}],\"weight\":\"10\"},{\"charId\":\"bb6c218f\",\"unicodeChar\":\"䓵\",\"unicodeCodePoint\":\"44F5\",\"pinYinChars\":[{\"char\":\"FU1\"}],\"splitChars\":[{\"char\":\"艹品\"}],\"weight\":\"10\"},{\"charId\":\"c8c76b20\",\"unicodeChar\":\"䎱\",\"unicodeCodePoint\":\"43B1\",\"pinYinChars\":[{\"char\":\"BEI1\"}],\"splitChars\":[{\"char\":\"耒罷\"}],\"weight\":\"10\"},{\"charId\":\"5e2c6c24\",\"unicodeChar\":\"䎬\",\"unicodeCodePoint\":\"43AC\",\"pinYinChars\":[{\"char\":\"BEI1\"}],\"splitChars\":[{\"char\":\"耒罢\"}],\"weight\":\"10\"},{\"charId\":\"dbfeb96b\",\"unicodeChar\":\"䎆\",\"unicodeCodePoint\":\"4386\",\"pinYinChars\":[{\"char\":\"LIU4\"}],\"splitChars\":[{\"char\":\"羽令\"}],\"weight\":\"10\"},{\"charId\":\"736480f5\",\"unicodeChar\":\"䌽\",\"unicodeCodePoint\":\"433D\",\"pinYinChars\":[{\"char\":\"CAI3\"}],\"splitChars\":[{\"char\":\"纟采\"}],\"weight\":\"10\"},{\"charId\":\"559be4cd\",\"unicodeChar\":\"䌻\",\"unicodeCodePoint\":\"433B\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"纟羽\"}],\"weight\":\"10\"},{\"charId\":\"07a9848d\",\"unicodeChar\":\"䌷\",\"unicodeCodePoint\":\"4337\",\"pinYinChars\":[{\"char\":\"CHOU2\"}],\"splitChars\":[{\"char\":\"纟由\"}],\"weight\":\"10\"},{\"charId\":\"449a2a52\",\"unicodeChar\":\"䇹\",\"unicodeCodePoint\":\"41F9\",\"pinYinChars\":[{\"char\":\"JUN4\"}],\"splitChars\":[{\"char\":\"𥫗君\"}],\"weight\":\"10\"},{\"charId\":\"886ef32d\",\"unicodeChar\":\"䄠\",\"unicodeCodePoint\":\"4120\",\"pinYinChars\":[{\"char\":\"SHAN4\"}],\"splitChars\":[{\"char\":\"示亶\"}],\"weight\":\"10\"},{\"charId\":\"c1e3cb29\",\"unicodeChar\":\"䄎\",\"unicodeCodePoint\":\"410E\",\"pinYinChars\":[{\"char\":\"QI3\"}],\"splitChars\":[{\"char\":\"示奇\"}],\"weight\":\"10\"},{\"charId\":\"2cf305fa\",\"unicodeChar\":\"䃆\",\"unicodeCodePoint\":\"40C6\",\"pinYinChars\":[{\"char\":\"QI2\"}],\"splitChars\":[{\"char\":\"石其\"}],\"weight\":\"10\"},{\"charId\":\"d60dac87\",\"unicodeChar\":\"䀪\",\"unicodeCodePoint\":\"402A\",\"pinYinChars\":[{\"char\":\"HANG2\"}],\"splitChars\":[{\"char\":\"目行\"}],\"weight\":\"10\"},{\"charId\":\"c880a566\",\"unicodeChar\":\"㼆\",\"unicodeCodePoint\":\"3F06\",\"pinYinChars\":[{\"char\":\"YING2\"}],\"splitChars\":[{\"char\":\"王瑩\"}],\"weight\":\"10\"},{\"charId\":\"00f04439\",\"unicodeChar\":\"㻦\",\"unicodeCodePoint\":\"3EE6\",\"pinYinChars\":[{\"char\":\"王禺\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"10b959da\",\"unicodeChar\":\"㻛\",\"unicodeCodePoint\":\"3EDB\",\"pinYinChars\":[{\"char\":\"CHANG4\"},{\"char\":\"YANG2\"}],\"splitChars\":[{\"char\":\"王易\"}],\"weight\":\"10\"},{\"charId\":\"8bff9468\",\"unicodeChar\":\"㻅\",\"unicodeCodePoint\":\"3EC5\",\"pinYinChars\":[{\"char\":\"HUI4\"}],\"splitChars\":[{\"char\":\"王会\"}],\"weight\":\"10\"},{\"charId\":\"07b4e9f1\",\"unicodeChar\":\"㺶\",\"unicodeCodePoint\":\"3EB6\",\"pinYinChars\":[{\"char\":\"GEU\"}],\"splitChars\":[{\"char\":\"王斗\"}],\"weight\":\"10\"},{\"charId\":\"e304d54b\",\"unicodeChar\":\"㺵\",\"unicodeCodePoint\":\"3EB5\",\"pinYinChars\":[{\"char\":\"JIU3\"}],\"splitChars\":[{\"char\":\"王欠\"}],\"weight\":\"10\"},{\"charId\":\"e11afe18\",\"unicodeChar\":\"㺬\",\"unicodeCodePoint\":\"3EAC\",\"pinYinChars\":[{\"char\":\"GONG3\"}],\"splitChars\":[{\"char\":\"王凡\"}],\"weight\":\"10\"},{\"charId\":\"bc004cbf\",\"unicodeChar\":\"㺪\",\"unicodeCodePoint\":\"3EAA\",\"pinYinChars\":[{\"char\":\"PU2\"}],\"splitChars\":[{\"char\":\"王卜\"}],\"weight\":\"10\"},{\"charId\":\"d15fff67\",\"unicodeChar\":\"㸠\",\"unicodeCodePoint\":\"3E20\",\"pinYinChars\":[{\"char\":\"DIAO4\"}],\"splitChars\":[{\"char\":\"片兆\"}],\"weight\":\"10\"},{\"charId\":\"cae3dac5\",\"unicodeChar\":\"㷽\",\"unicodeCodePoint\":\"3DFD\",\"pinYinChars\":[{\"char\":\"SHAN4\"}],\"splitChars\":[{\"char\":\"火善\"}],\"weight\":\"10\"},{\"charId\":\"6ca655d5\",\"unicodeChar\":\"㶻\",\"unicodeCodePoint\":\"3DBB\",\"pinYinChars\":[{\"char\":\"FENG1\"}],\"splitChars\":[{\"char\":\"夆灬\"}],\"weight\":\"10\"},{\"charId\":\"49f0225b\",\"unicodeChar\":\"㶉\",\"unicodeCodePoint\":\"3D89\",\"pinYinChars\":[{\"char\":\"XI1\"}],\"splitChars\":[{\"char\":\"溪鸟\"}],\"weight\":\"10\"},{\"charId\":\"2adc5788\",\"unicodeChar\":\"㵲\",\"unicodeCodePoint\":\"3D72\",\"pinYinChars\":[{\"char\":\"WU3\"}],\"splitChars\":[{\"char\":\"氵舞\"}],\"weight\":\"10\"},{\"charId\":\"eaf983fe\",\"unicodeChar\":\"㵙\",\"unicodeCodePoint\":\"3D59\",\"pinYinChars\":[{\"char\":\"XI1\"},{\"char\":\"QING1\"}],\"splitChars\":[{\"char\":\"氵喜\"}],\"weight\":\"10\"},{\"charId\":\"0c08efb6\",\"unicodeChar\":\"㴻\",\"unicodeCodePoint\":\"3D3B\",\"pinYinChars\":[{\"char\":\"SHU4\"}],\"splitChars\":[{\"char\":\"浢寸\"}],\"weight\":\"10\"},{\"charId\":\"ef4159c3\",\"unicodeChar\":\"㴋\",\"unicodeCodePoint\":\"3D0B\",\"pinYinChars\":[{\"char\":\"SU4\"}],\"splitChars\":[{\"char\":\"氵肃\"}],\"weight\":\"10\"},{\"charId\":\"3fbb4d57\",\"unicodeChar\":\"㳽\",\"unicodeCodePoint\":\"3CFD\",\"pinYinChars\":[{\"char\":\"MI2\"}],\"splitChars\":[{\"char\":\"氵弥\"}],\"weight\":\"10\"},{\"charId\":\"2f1520ba\",\"unicodeChar\":\"㳕\",\"unicodeCodePoint\":\"3CD5\",\"pinYinChars\":[{\"char\":\"LAN2\"}],\"splitChars\":[{\"char\":\"氵兰\"}],\"weight\":\"10\"},{\"charId\":\"205c857e\",\"unicodeChar\":\"㳔\",\"unicodeCodePoint\":\"3CD4\",\"pinYinChars\":[{\"char\":\"DUI4\"}],\"splitChars\":[{\"char\":\"氵对\"}],\"weight\":\"10\"},{\"charId\":\"10954b1d\",\"unicodeChar\":\"㳅\",\"unicodeCodePoint\":\"3CC5\",\"pinYinChars\":[{\"char\":\"LIU2\"}],\"splitChars\":[{\"char\":\"氵不\"}],\"weight\":\"10\"},{\"charId\":\"91c173f2\",\"unicodeChar\":\"㲿\",\"unicodeCodePoint\":\"3CBF\",\"pinYinChars\":[{\"char\":\"WANG3\"}],\"splitChars\":[{\"char\":\"氵广\"}],\"weight\":\"10\"},{\"charId\":\"4c71c791\",\"unicodeChar\":\"㱮\",\"unicodeCodePoint\":\"3C6E\",\"pinYinChars\":[{\"char\":\"KUI4\"}],\"splitChars\":[{\"char\":\"歹贵\"}],\"weight\":\"10\"},{\"charId\":\"c50e5aae\",\"unicodeChar\":\"㯳\",\"unicodeCodePoint\":\"3BF3\",\"pinYinChars\":[{\"char\":\"QING2\"}],\"splitChars\":[{\"char\":\"木敬\"}],\"weight\":\"10\"},{\"charId\":\"119cab4d\",\"unicodeChar\":\"㮡\",\"unicodeCodePoint\":\"3BA1\",\"pinYinChars\":[{\"char\":\"GUAN4\"}],\"splitChars\":[{\"char\":\"炬木\"}],\"weight\":\"10\"},{\"charId\":\"41c6944f\",\"unicodeChar\":\"㮠\",\"unicodeCodePoint\":\"3BA0\",\"pinYinChars\":[{\"char\":\"RONG2\"}],\"splitChars\":[{\"char\":\"木荣\"}],\"weight\":\"10\"},{\"charId\":\"4d16a70e\",\"unicodeChar\":\"㮀\",\"unicodeCodePoint\":\"3B80\",\"pinYinChars\":[{\"char\":\"HAN2\"}],\"splitChars\":[{\"char\":\"木函\"}],\"weight\":\"10\"},{\"charId\":\"a7d8907d\",\"unicodeChar\":\"㭏\",\"unicodeCodePoint\":\"3B4F\",\"pinYinChars\":[{\"char\":\"WEI3\"}],\"splitChars\":[{\"char\":\"木韦\"}],\"weight\":\"10\"},{\"charId\":\"6d3579a5\",\"unicodeChar\":\"㬫\",\"unicodeCodePoint\":\"3B2B\",\"pinYinChars\":[{\"char\":\"YAN4\"}],\"splitChars\":[{\"char\":\"燕日\"}],\"weight\":\"10\"},{\"charId\":\"6864f1a4\",\"unicodeChar\":\"㬇\",\"unicodeCodePoint\":\"3B07\",\"pinYinChars\":[{\"char\":\"HUAN4\"}],\"splitChars\":[{\"char\":\"日奐\"}],\"weight\":\"10\"},{\"charId\":\"0cec48dc\",\"unicodeChar\":\"㫬\",\"unicodeCodePoint\":\"3AEC\",\"pinYinChars\":[{\"char\":\"XU4\"}],\"splitChars\":[{\"char\":\"日旬\"}],\"weight\":\"10\"},{\"charId\":\"0f73b008\",\"unicodeChar\":\"㫤\",\"unicodeCodePoint\":\"3AE4\",\"pinYinChars\":[{\"char\":\"CHANG3\"}],\"splitChars\":[{\"char\":\"日永\"}],\"weight\":\"10\"},{\"charId\":\"d99d1947\",\"unicodeChar\":\"㢷\",\"unicodeCodePoint\":\"38B7\",\"pinYinChars\":[{\"char\":\"SUI4\"}],\"splitChars\":[{\"char\":\"弓岁\"}],\"weight\":\"10\"},{\"charId\":\"35b95e87\",\"unicodeChar\":\"㠭\",\"unicodeCodePoint\":\"382D\",\"pinYinChars\":[{\"char\":\"ZHAN3\"}],\"splitChars\":[{\"char\":\"工工工工\"}],\"weight\":\"10\"},{\"charId\":\"d253a91d\",\"unicodeChar\":\"㟷\",\"unicodeCodePoint\":\"37F7\",\"pinYinChars\":[{\"char\":\"DA5\"}],\"splitChars\":[{\"char\":\"山荅\"}],\"weight\":\"10\"},{\"charId\":\"206c136f\",\"unicodeChar\":\"㞵\",\"unicodeCodePoint\":\"37B5\",\"pinYinChars\":[{\"char\":\"TAO1\"}],\"splitChars\":[{\"char\":\"山文\"}],\"weight\":\"10\"},{\"charId\":\"f084ef74\",\"unicodeChar\":\"㞯\",\"unicodeCodePoint\":\"37AF\",\"pinYinChars\":[{\"char\":\"QI3\"}],\"splitChars\":[{\"char\":\"己山\"}],\"weight\":\"10\"},{\"charId\":\"69fcab38\",\"unicodeChar\":\"㝃\",\"unicodeCodePoint\":\"3743\",\"pinYinChars\":[{\"char\":\"MIAN3\"}],\"splitChars\":[{\"char\":\"子免\"}],\"weight\":\"10\"},{\"charId\":\"b42efe1d\",\"unicodeChar\":\"㛤\",\"unicodeCodePoint\":\"36E4\",\"pinYinChars\":[{\"char\":\"LI2\"}],\"splitChars\":[{\"char\":\"女丽\"}],\"weight\":\"10\"},{\"charId\":\"17b969b0\",\"unicodeChar\":\"㛣\",\"unicodeCodePoint\":\"36E3\",\"pinYinChars\":[{\"char\":\"YUN2\"}],\"splitChars\":[{\"char\":\"女员\"}],\"weight\":\"10\"},{\"charId\":\"efd7119e\",\"unicodeChar\":\"㛟\",\"unicodeCodePoint\":\"36DF\",\"pinYinChars\":[{\"char\":\"HUAN4\"}],\"splitChars\":[{\"char\":\"女奂\"}],\"weight\":\"10\"},{\"charId\":\"c9e5e7e7\",\"unicodeChar\":\"㚸\",\"unicodeCodePoint\":\"36B8\",\"pinYinChars\":[{\"char\":\"SI1\"}],\"splitChars\":[{\"char\":\"女司\"}],\"weight\":\"10\"},{\"charId\":\"6dc2e621\",\"unicodeChar\":\"㚁\",\"unicodeCodePoint\":\"3681\",\"pinYinChars\":[{\"char\":\"QIAO4\"}],\"splitChars\":[{\"char\":\"堯堯\"}],\"weight\":\"10\"},{\"charId\":\"320dfd14\",\"unicodeChar\":\"㙋\",\"unicodeCodePoint\":\"364B\",\"pinYinChars\":[{\"char\":\"QI2\"}],\"splitChars\":[{\"char\":\"土其\"}],\"weight\":\"10\"},{\"charId\":\"a24aacbf\",\"unicodeChar\":\"㘼\",\"unicodeCodePoint\":\"363C\",\"pinYinChars\":[{\"char\":\"KAO3\"}],\"splitChars\":[{\"char\":\"土考\"}],\"weight\":\"10\"},{\"charId\":\"ccad38b7\",\"unicodeChar\":\"㘻\",\"unicodeCodePoint\":\"363B\",\"pinYinChars\":[{\"char\":\"YIN1\"}],\"splitChars\":[{\"char\":\"土因\"}],\"weight\":\"10\"},{\"charId\":\"c04da763\",\"unicodeChar\":\"㘮\",\"unicodeCodePoint\":\"362E\",\"pinYinChars\":[{\"char\":\"YI4\"},{\"char\":\"TU2\"}],\"splitChars\":[{\"char\":\"土尺\"}],\"weight\":\"10\"},{\"charId\":\"45c5f96b\",\"unicodeChar\":\"㘫\",\"unicodeCodePoint\":\"362B\",\"pinYinChars\":[{\"char\":\"JING3\"}],\"splitChars\":[{\"char\":\"土井\"}],\"weight\":\"10\"},{\"charId\":\"0692fc45\",\"unicodeChar\":\"㖞\",\"unicodeCodePoint\":\"359E\",\"pinYinChars\":[{\"char\":\"WAI1\"}],\"splitChars\":[{\"char\":\"口呙\"}],\"weight\":\"10\"},{\"charId\":\"5299bb27\",\"unicodeChar\":\"㓻\",\"unicodeCodePoint\":\"34FB\",\"pinYinChars\":[{\"char\":\"GANG1\"}],\"splitChars\":[{\"char\":\"罡刂\"}],\"weight\":\"10\"},{\"charId\":\"e7da0471\",\"unicodeChar\":\"㓥\",\"unicodeCodePoint\":\"34E5\",\"pinYinChars\":[{\"char\":\"TANG1\"}],\"splitChars\":[{\"char\":\"当刂\"}],\"weight\":\"10\"},{\"charId\":\"cabdee3b\",\"unicodeChar\":\"㒰\",\"unicodeCodePoint\":\"34B0\",\"pinYinChars\":[{\"char\":\"QUAN2\"}],\"splitChars\":[{\"char\":\"入工\"}],\"weight\":\"10\"},{\"charId\":\"75b3e013\",\"unicodeChar\":\"㒬\",\"unicodeCodePoint\":\"34AC\",\"pinYinChars\":[{\"char\":\"WANG1\"}],\"splitChars\":[{\"char\":\"尢 王\"}],\"weight\":\"10\"},{\"charId\":\"e392e287\",\"unicodeChar\":\"㑺\",\"unicodeCodePoint\":\"347A\",\"pinYinChars\":[{\"char\":\"JUN4\"}],\"splitChars\":[{\"char\":\"亻隽\"}],\"weight\":\"10\"},{\"charId\":\"c8999e07\",\"unicodeChar\":\"㑩\",\"unicodeCodePoint\":\"3469\",\"pinYinChars\":[{\"char\":\"LUO2\"}],\"splitChars\":[{\"char\":\"亻罗\"}],\"weight\":\"10\"},{\"charId\":\"2c038bc5\",\"unicodeChar\":\"㐽\",\"unicodeCodePoint\":\"343D\",\"pinYinChars\":[{\"char\":\"FENG1\"}],\"splitChars\":[{\"char\":\"亻风\"}],\"weight\":\"10\"},{\"charId\":\"009e8508\",\"unicodeChar\":\"㐻\",\"unicodeCodePoint\":\"343B\",\"pinYinChars\":[{\"char\":\"NEI4\"}],\"splitChars\":[{\"char\":\"亻内\"}],\"weight\":\"10\"},{\"charId\":\"bf63db30\",\"unicodeChar\":\"𱉱\",\"unicodeCodePoint\":\"31271\",\"pinYinChars\":[{\"char\":\"KUN1\"}],\"splitChars\":[{\"char\":\"军鸟\"}],\"weight\":\"10\"},{\"charId\":\"2dc9c261\",\"unicodeChar\":\"⻊\",\"unicodeCodePoint\":\"2ECA\",\"pinYinChars\":[{\"char\":\"ZU2\"}],\"splitChars\":[{\"char\":\"⻊\"}],\"weight\":\"10\"},{\"charId\":\"81c8ae42\",\"unicodeChar\":\"⺻\",\"unicodeCodePoint\":\"2EBB\",\"pinYinChars\":[{\"char\":\"YU4\"}],\"splitChars\":[{\"char\":\"⺻\"}],\"weight\":\"10\"},{\"charId\":\"a457d9be\",\"unicodeChar\":\"𮮇\",\"unicodeCodePoint\":\"2EB87\",\"pinYinChars\":[{\"char\":\"MOU2\"}],\"splitChars\":[{\"char\":\"麦牟\"}],\"weight\":\"10\"},{\"charId\":\"aad69e74\",\"unicodeChar\":\"⺷\",\"unicodeCodePoint\":\"2EB7\",\"pinYinChars\":[{\"char\":\"YANG2\"}],\"splitChars\":[{\"char\":\"⺷\"}],\"weight\":\"10\"},{\"charId\":\"a9201ce5\",\"unicodeChar\":\"𮭪\",\"unicodeCodePoint\":\"2EB6A\",\"pinYinChars\":[{\"char\":\"SHUANG1\"}],\"splitChars\":[{\"char\":\"爽鸟\"}],\"weight\":\"10\"},{\"charId\":\"4ae61a98\",\"unicodeChar\":\"𮭨\",\"unicodeCodePoint\":\"2EB68\",\"pinYinChars\":[{\"char\":\"YAN4\"}],\"splitChars\":[{\"char\":\"晏鸟\"}],\"weight\":\"10\"},{\"charId\":\"a3193b09\",\"unicodeChar\":\"𮭥\",\"unicodeCodePoint\":\"2EB65\",\"pinYinChars\":[{\"char\":\"GONG1\"}],\"splitChars\":[{\"char\":\"共鸟\"}],\"weight\":\"10\"},{\"charId\":\"7bc9ba70\",\"unicodeChar\":\"⺶\",\"unicodeCodePoint\":\"2EB6\",\"pinYinChars\":[{\"char\":\"YANG2\"}],\"splitChars\":[{\"char\":\"羊\"}],\"weight\":\"10\"},{\"charId\":\"fd57e7c0\",\"unicodeChar\":\"⺳\",\"unicodeCodePoint\":\"2EB3\",\"pinYinChars\":[{\"char\":\"WANG3\"}],\"splitChars\":[{\"char\":\"⺳\"}],\"weight\":\"10\"},{\"charId\":\"89b479d1\",\"unicodeChar\":\"𮬟\",\"unicodeCodePoint\":\"2EB1F\",\"pinYinChars\":[{\"char\":\"HUO4\"}],\"splitChars\":[{\"char\":\"鱼或\"}],\"weight\":\"10\"},{\"charId\":\"11ead999\",\"unicodeChar\":\"𮬞\",\"unicodeCodePoint\":\"2EB1E\",\"pinYinChars\":[{\"char\":\"CAN1\"}],\"splitChars\":[{\"char\":\"𣦼鱼\"}],\"weight\":\"10\"},{\"charId\":\"44a0b19e\",\"unicodeChar\":\"⺮\",\"unicodeCodePoint\":\"2EAE\",\"pinYinChars\":[{\"char\":\"ZHU2\"}],\"splitChars\":[{\"char\":\"⺮\"}],\"weight\":\"10\"},{\"charId\":\"e22ea325\",\"unicodeChar\":\"𮪥\",\"unicodeCodePoint\":\"2EAA5\",\"pinYinChars\":[{\"char\":\"DUN1\"}],\"splitChars\":[{\"char\":\"马敦\"}],\"weight\":\"10\"},{\"charId\":\"75fcb9e3\",\"unicodeChar\":\"𮪣\",\"unicodeCodePoint\":\"2EAA3\",\"pinYinChars\":[{\"char\":\"ZONG1\"}],\"splitChars\":[{\"char\":\"马㚇\"}],\"weight\":\"10\"},{\"charId\":\"379c0a39\",\"unicodeChar\":\"⺪\",\"unicodeCodePoint\":\"2EAA\",\"pinYinChars\":[{\"char\":\"PI3\"},{\"char\":\"YA3\"}],\"splitChars\":[{\"char\":\"⺪\"}],\"weight\":\"10\"},{\"charId\":\"097d2e61\",\"unicodeChar\":\"𮪌\",\"unicodeCodePoint\":\"2EA8C\",\"pinYinChars\":[{\"char\":\"馬甾\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"b1e8d993\",\"unicodeChar\":\"⺧\",\"unicodeCodePoint\":\"2EA7\",\"pinYinChars\":[{\"char\":\"NIU2\"}],\"splitChars\":[{\"char\":\"⺧\"}],\"weight\":\"10\"},{\"charId\":\"cc28eca6\",\"unicodeChar\":\"𮩞\",\"unicodeCodePoint\":\"2EA5E\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"饣壹\"}],\"weight\":\"10\"},{\"charId\":\"adb0f0d1\",\"unicodeChar\":\"𮨶\",\"unicodeCodePoint\":\"2EA36\",\"pinYinChars\":[{\"char\":\"FIE1\"}],\"splitChars\":[{\"char\":\"飞去\"}],\"weight\":\"10\"},{\"charId\":\"aab5af59\",\"unicodeChar\":\"𮨵\",\"unicodeCodePoint\":\"2EA35\",\"pinYinChars\":[{\"char\":\"LIU4\"}],\"splitChars\":[{\"char\":\"风翏\"}],\"weight\":\"10\"},{\"charId\":\"3b7fb5e4\",\"unicodeChar\":\"𮧴\",\"unicodeCodePoint\":\"2E9F4\",\"pinYinChars\":[{\"char\":\"CHANG4\"}],\"splitChars\":[{\"char\":\"韦长\"}],\"weight\":\"10\"},{\"charId\":\"adb1d2bb\",\"unicodeChar\":\"𮥼\",\"unicodeCodePoint\":\"2E97C\",\"pinYinChars\":[{\"char\":\"JUN4\"},{\"char\":\"JUAN4\"}],\"splitChars\":[{\"char\":\"隹冏\"}],\"weight\":\"10\"},{\"charId\":\"56de232e\",\"unicodeChar\":\"⺗\",\"unicodeCodePoint\":\"2E97\",\"pinYinChars\":[{\"char\":\"XIN1\"}],\"splitChars\":[{\"char\":\"⺗\"}],\"weight\":\"10\"},{\"charId\":\"f100fdc6\",\"unicodeChar\":\"𮥄\",\"unicodeCodePoint\":\"2E944\",\"pinYinChars\":[],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"276d8a6e\",\"unicodeChar\":\"𮣲\",\"unicodeCodePoint\":\"2E8F2\",\"pinYinChars\":[{\"char\":\"GANG1\"}],\"splitChars\":[{\"char\":\"钅工\"}],\"weight\":\"10\"},{\"charId\":\"42505445\",\"unicodeChar\":\"⺌\",\"unicodeCodePoint\":\"2E8C\",\"pinYinChars\":[{\"char\":\"xiao3\"}],\"splitChars\":[{\"char\":\"丶リ\"}],\"weight\":\"10\"},{\"charId\":\"40a1ddf4\",\"unicodeChar\":\"⺋\",\"unicodeCodePoint\":\"2E8B\",\"pinYinChars\":[{\"char\":\"fan4\"}],\"splitChars\":[{\"char\":\"乙 乙\"}],\"weight\":\"10\"},{\"charId\":\"2ed28b07\",\"unicodeChar\":\"⺈\",\"unicodeCodePoint\":\"2E88\",\"pinYinChars\":[{\"char\":\"dao1\"}],\"splitChars\":[{\"char\":\"刀\"}],\"weight\":\"10\"},{\"charId\":\"3e1663ea\",\"unicodeChar\":\"⺄\",\"unicodeCodePoint\":\"2E84\",\"pinYinChars\":[{\"char\":\"yi3\"}],\"splitChars\":[{\"char\":\"乙\"}],\"weight\":\"10\"},{\"charId\":\"8d07490c\",\"unicodeChar\":\"⺁\",\"unicodeCodePoint\":\"2E81\",\"pinYinChars\":[{\"char\":\"chang3\"}],\"splitChars\":[{\"char\":\"丿 丿\"}],\"weight\":\"10\"},{\"charId\":\"ecbc34c1\",\"unicodeChar\":\"𮝴\",\"unicodeCodePoint\":\"2E774\",\"pinYinChars\":[{\"char\":\"GU1\"}],\"splitChars\":[{\"char\":\"车瓜\"}],\"weight\":\"10\"},{\"charId\":\"402bf5a8\",\"unicodeChar\":\"𮙋\",\"unicodeCodePoint\":\"2E64B\",\"pinYinChars\":[{\"char\":\"DU2\"}],\"splitChars\":[{\"char\":\"读言\"}],\"weight\":\"10\"},{\"charId\":\"a8586412\",\"unicodeChar\":\"𮘫\",\"unicodeCodePoint\":\"2E62B\",\"pinYinChars\":[{\"char\":\"言 恭\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"873965fa\",\"unicodeChar\":\"𮐚\",\"unicodeCodePoint\":\"2E41A\",\"pinYinChars\":[{\"char\":\"FAN2\"}],\"splitChars\":[{\"char\":\"艹烦\"}],\"weight\":\"10\"},{\"charId\":\"22372bcd\",\"unicodeChar\":\"𮏛\",\"unicodeCodePoint\":\"2E3DB\",\"pinYinChars\":[{\"char\":\"艹 狗\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"27ffe4d9\",\"unicodeChar\":\"𮏈\",\"unicodeCodePoint\":\"2E3C8\",\"pinYinChars\":[{\"char\":\"艹 但\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"79c84378\",\"unicodeChar\":\"𮌝\",\"unicodeCodePoint\":\"2E31D\",\"pinYinChars\":[{\"char\":\"shi4\"}],\"splitChars\":[{\"char\":\"月易\"}],\"weight\":\"10\"},{\"charId\":\"190a8a54\",\"unicodeChar\":\"𮊅\",\"unicodeCodePoint\":\"2E285\",\"pinYinChars\":[{\"char\":\"cheng2\"}],\"splitChars\":[{\"char\":\"四 成\"}],\"weight\":\"10\"},{\"charId\":\"7f70c9d7\",\"unicodeChar\":\"𮉫\",\"unicodeCodePoint\":\"2E26B\",\"pinYinChars\":[{\"char\":\"RUI2\"}],\"splitChars\":[{\"char\":\"纟委\"}],\"weight\":\"10\"},{\"charId\":\"95920e7f\",\"unicodeChar\":\"𮉪\",\"unicodeCodePoint\":\"2E26A\",\"pinYinChars\":[{\"char\":\"ZOU1\"}],\"splitChars\":[{\"char\":\"纟取\"}],\"weight\":\"10\"},{\"charId\":\"f0ac618f\",\"unicodeChar\":\"𮉦\",\"unicodeCodePoint\":\"2E266\",\"pinYinChars\":[{\"char\":\"wang3\"}],\"splitChars\":[{\"char\":\"纟网\"}],\"weight\":\"10\"},{\"charId\":\"c30155ec\",\"unicodeChar\":\"𮉤\",\"unicodeCodePoint\":\"2E264\",\"pinYinChars\":[{\"char\":\"KUA1\"}],\"splitChars\":[{\"char\":\"纟圭\"}],\"weight\":\"10\"},{\"charId\":\"7c780b19\",\"unicodeChar\":\"𮆏\",\"unicodeCodePoint\":\"2E18F\",\"pinYinChars\":[{\"char\":\"LAN2\"}],\"splitChars\":[{\"char\":\"𥫗阑\"}],\"weight\":\"10\"},{\"charId\":\"d30204d8\",\"unicodeChar\":\"𮄲\",\"unicodeCodePoint\":\"2E132\",\"pinYinChars\":[{\"char\":\"立 奇\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"227cc29e\",\"unicodeChar\":\"𮃄\",\"unicodeCodePoint\":\"2E0C4\",\"pinYinChars\":[{\"char\":\"duo4\"}],\"splitChars\":[{\"char\":\"禾朶\"}],\"weight\":\"10\"},{\"charId\":\"3ab46f66\",\"unicodeChar\":\"𮂹\",\"unicodeCodePoint\":\"2E0B9\",\"pinYinChars\":[{\"char\":\"wen3\"}],\"splitChars\":[{\"char\":\"禾文\"}],\"weight\":\"10\"},{\"charId\":\"fb308ab4\",\"unicodeChar\":\"𮂓\",\"unicodeCodePoint\":\"2E093\",\"pinYinChars\":[{\"char\":\"礻 莫\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"94b611ec\",\"unicodeChar\":\"𮁣\",\"unicodeCodePoint\":\"2E063\",\"pinYinChars\":[{\"char\":\"ku4\"}],\"splitChars\":[{\"char\":\"示令\"}],\"weight\":\"10\"},{\"charId\":\"2c794608\",\"unicodeChar\":\"𮀎\",\"unicodeCodePoint\":\"2E00E\",\"pinYinChars\":[{\"char\":\"分 石\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"a5f0e804\",\"unicodeChar\":\"𭹜\",\"unicodeCodePoint\":\"2DE5C\",\"pinYinChars\":[{\"char\":\"LUO2\"}],\"splitChars\":[{\"char\":\"王罗\"}],\"weight\":\"10\"},{\"charId\":\"e16e7116\",\"unicodeChar\":\"𭹛\",\"unicodeCodePoint\":\"2DE5B\",\"pinYinChars\":[{\"char\":\"王 芳\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"0d6c947b\",\"unicodeChar\":\"𭸾\",\"unicodeCodePoint\":\"2DE3E\",\"pinYinChars\":[{\"char\":\"王 巨\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"ff331d78\",\"unicodeChar\":\"𭷝\",\"unicodeCodePoint\":\"2DDDD\",\"pinYinChars\":[{\"char\":\"bao4\"}],\"splitChars\":[{\"char\":\"牛包\"}],\"weight\":\"10\"},{\"charId\":\"acbfa5f6\",\"unicodeChar\":\"𭵵\",\"unicodeCodePoint\":\"2DD75\",\"pinYinChars\":[{\"char\":\"火 盛\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"9225d80c\",\"unicodeChar\":\"𭵩\",\"unicodeCodePoint\":\"2DD69\",\"pinYinChars\":[{\"char\":\"火 臭\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"ff7fda88\",\"unicodeChar\":\"𭵝\",\"unicodeCodePoint\":\"2DD5D\",\"pinYinChars\":[{\"char\":\"zi1\"},{\"char\":\"ci2\"}],\"splitChars\":[{\"char\":\"兹灬\"}],\"weight\":\"10\"},{\"charId\":\"0e42fb53\",\"unicodeChar\":\"𭴽\",\"unicodeCodePoint\":\"2DD3D\",\"pinYinChars\":[{\"char\":\"火炅\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"b6fa5674\",\"unicodeChar\":\"𭴼\",\"unicodeCodePoint\":\"2DD3C\",\"pinYinChars\":[{\"char\":\"火 青\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"75edaaa3\",\"unicodeChar\":\"𭴫\",\"unicodeCodePoint\":\"2DD2B\",\"pinYinChars\":[{\"char\":\"zhao4\"}],\"splitChars\":[{\"char\":\"日 灬\"}],\"weight\":\"10\"},{\"charId\":\"0a3c0131\",\"unicodeChar\":\"𭴧\",\"unicodeCodePoint\":\"2DD27\",\"pinYinChars\":[{\"char\":\"火豆\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"6668db51\",\"unicodeChar\":\"𭴌\",\"unicodeCodePoint\":\"2DD0C\",\"pinYinChars\":[{\"char\":\"yan1\"}],\"splitChars\":[{\"char\":\"火 日\"}],\"weight\":\"10\"},{\"charId\":\"4a867760\",\"unicodeChar\":\"𭴈\",\"unicodeCodePoint\":\"2DD08\",\"pinYinChars\":[{\"char\":\"yun4\"},{\"char\":\"yu4\"}],\"splitChars\":[{\"char\":\"火云\"}],\"weight\":\"10\"},{\"charId\":\"bda2465a\",\"unicodeChar\":\"𭳬\",\"unicodeCodePoint\":\"2DCEC\",\"pinYinChars\":[{\"char\":\"li4\"}],\"splitChars\":[{\"char\":\"氵隸\"}],\"weight\":\"10\"},{\"charId\":\"d2f5dcaf\",\"unicodeChar\":\"𭱣\",\"unicodeCodePoint\":\"2DC63\",\"pinYinChars\":[{\"char\":\"氵夏\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"8d6bd1d1\",\"unicodeChar\":\"𭱊\",\"unicodeCodePoint\":\"2DC4A\",\"pinYinChars\":[{\"char\":\"HONG4\"}],\"splitChars\":[{\"char\":\"氵项\"}],\"weight\":\"10\"},{\"charId\":\"c8f97c2b\",\"unicodeChar\":\"𭯽\",\"unicodeCodePoint\":\"2DBFD\",\"pinYinChars\":[{\"char\":\"wa3\"}],\"splitChars\":[{\"char\":\"氵瓦\"}],\"weight\":\"10\"},{\"charId\":\"d234342e\",\"unicodeChar\":\"𭯖\",\"unicodeCodePoint\":\"2DBD6\",\"pinYinChars\":[{\"char\":\"毛 白\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"2153f327\",\"unicodeChar\":\"𭬝\",\"unicodeCodePoint\":\"2DB1D\",\"pinYinChars\":[{\"char\":\"木 蒼\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"f6be62fc\",\"unicodeChar\":\"𭫀\",\"unicodeCodePoint\":\"2DAC0\",\"pinYinChars\":[{\"char\":\"KUI4\"}],\"splitChars\":[{\"char\":\"木贵\"}],\"weight\":\"10\"},{\"charId\":\"187a4fdb\",\"unicodeChar\":\"𭪆\",\"unicodeCodePoint\":\"2DA86\",\"pinYinChars\":[{\"char\":\"ZHUA1\"}],\"splitChars\":[{\"char\":\"木过\"}],\"weight\":\"10\"},{\"charId\":\"d8680145\",\"unicodeChar\":\"𭩹\",\"unicodeCodePoint\":\"2DA79\",\"pinYinChars\":[{\"char\":\"ming2\"}],\"splitChars\":[{\"char\":\"木名\"}],\"weight\":\"10\"},{\"charId\":\"24af1ca9\",\"unicodeChar\":\"𭩚\",\"unicodeCodePoint\":\"2DA5A\",\"pinYinChars\":[{\"char\":\"YI3\"}],\"splitChars\":[{\"char\":\"木义\"}],\"weight\":\"10\"},{\"charId\":\"2a97ae42\",\"unicodeChar\":\"𭦾\",\"unicodeCodePoint\":\"2D9BE\",\"pinYinChars\":[{\"char\":\"liang4\"}],\"splitChars\":[{\"char\":\"日亮\"}],\"weight\":\"10\"},{\"charId\":\"f1098a62\",\"unicodeChar\":\"𭥖\",\"unicodeCodePoint\":\"2D956\",\"pinYinChars\":[{\"char\":\"guang1\"}],\"splitChars\":[{\"char\":\"日 元\"}],\"weight\":\"10\"},{\"charId\":\"b5bb5a0e\",\"unicodeChar\":\"𭥕\",\"unicodeCodePoint\":\"2D955\",\"pinYinChars\":[{\"char\":\"xing1\"}],\"splitChars\":[{\"char\":\"日王\"}],\"weight\":\"10\"},{\"charId\":\"ea546f5f\",\"unicodeChar\":\"𭥓\",\"unicodeCodePoint\":\"2D953\",\"pinYinChars\":[{\"char\":\"日云\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"62d27197\",\"unicodeChar\":\"𭤴\",\"unicodeCodePoint\":\"2D934\",\"pinYinChars\":[{\"char\":\"ni3\"}],\"splitChars\":[{\"char\":\"方 七\"}],\"weight\":\"10\"},{\"charId\":\"8c2f8498\",\"unicodeChar\":\"𭝈\",\"unicodeCodePoint\":\"2D748\",\"pinYinChars\":[],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"37269229\",\"unicodeChar\":\"𭝅\",\"unicodeCodePoint\":\"2D745\",\"pinYinChars\":[],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"0a14b870\",\"unicodeChar\":\"𭚴\",\"unicodeCodePoint\":\"2D6B4\",\"pinYinChars\":[{\"char\":\"hong2\"}],\"splitChars\":[{\"char\":\"弓 宏\"}],\"weight\":\"10\"},{\"charId\":\"7a8f37c9\",\"unicodeChar\":\"𭚱\",\"unicodeCodePoint\":\"2D6B1\",\"pinYinChars\":[{\"char\":\"tao1\"}],\"splitChars\":[{\"char\":\"弓㞵\"}],\"weight\":\"10\"},{\"charId\":\"4463f8da\",\"unicodeChar\":\"𭚦\",\"unicodeCodePoint\":\"2D6A6\",\"pinYinChars\":[{\"char\":\"GUO1\"}],\"splitChars\":[{\"char\":\"弓广\"}],\"weight\":\"10\"},{\"charId\":\"537ac121\",\"unicodeChar\":\"𭙛\",\"unicodeCodePoint\":\"2D65B\",\"pinYinChars\":[{\"char\":\"guang3\"}],\"splitChars\":[{\"char\":\"广光\"}],\"weight\":\"10\"},{\"charId\":\"e912c3c8\",\"unicodeChar\":\"𭙏\",\"unicodeCodePoint\":\"2D64F\",\"pinYinChars\":[{\"char\":\"liao4\"}],\"splitChars\":[{\"char\":\"广了\"}],\"weight\":\"10\"},{\"charId\":\"8e20084c\",\"unicodeChar\":\"𭖦\",\"unicodeCodePoint\":\"2D5A6\",\"pinYinChars\":[{\"char\":\"yu4\"}],\"splitChars\":[{\"char\":\"山谷\"}],\"weight\":\"10\"},{\"charId\":\"6ecd359e\",\"unicodeChar\":\"𭖌\",\"unicodeCodePoint\":\"2D58C\",\"pinYinChars\":[{\"char\":\"ju1\"},{\"char\":\"ju3\"},{\"char\":\"zu2\"}],\"splitChars\":[{\"char\":\"山旦\"}],\"weight\":\"10\"},{\"charId\":\"d67f7edb\",\"unicodeChar\":\"𭖆\",\"unicodeCodePoint\":\"2D586\",\"pinYinChars\":[{\"char\":\"e2\"}],\"splitChars\":[{\"char\":\"山厄\"}],\"weight\":\"10\"},{\"charId\":\"bd06aa7b\",\"unicodeChar\":\"𭕆\",\"unicodeCodePoint\":\"2D546\",\"pinYinChars\":[{\"char\":\"SUO3\"}],\"splitChars\":[{\"char\":\"⺌贝\"}],\"weight\":\"10\"},{\"charId\":\"5f09986e\",\"unicodeChar\":\"𭓞\",\"unicodeCodePoint\":\"2D4DE\",\"pinYinChars\":[{\"char\":\"宀山\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"c933edba\",\"unicodeChar\":\"𭒠\",\"unicodeCodePoint\":\"2D4A0\",\"pinYinChars\":[{\"char\":\"jue2\"}],\"splitChars\":[{\"char\":\"女 矞\"}],\"weight\":\"10\"},{\"charId\":\"eb675a32\",\"unicodeChar\":\"𭒈\",\"unicodeCodePoint\":\"2D488\",\"pinYinChars\":[{\"char\":\"miao4\"}],\"splitChars\":[{\"char\":\"女 眇\"}],\"weight\":\"10\"},{\"charId\":\"3785e0f2\",\"unicodeChar\":\"𭑸\",\"unicodeCodePoint\":\"2D478\",\"pinYinChars\":[{\"char\":\"nong2\"}],\"splitChars\":[{\"char\":\"女农\"}],\"weight\":\"10\"},{\"charId\":\"652ebe6b\",\"unicodeChar\":\"𭏨\",\"unicodeCodePoint\":\"2D3E8\",\"pinYinChars\":[{\"char\":\"bu1\"},{\"char\":\"fu1\"}],\"splitChars\":[{\"char\":\"土冨\"}],\"weight\":\"10\"},{\"charId\":\"d44ea35c\",\"unicodeChar\":\"𭏠\",\"unicodeCodePoint\":\"2D3E0\",\"pinYinChars\":[{\"char\":\"土 堂\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"a9c5c992\",\"unicodeChar\":\"𭏜\",\"unicodeCodePoint\":\"2D3DC\",\"pinYinChars\":[{\"char\":\"土 般\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"ecc45b01\",\"unicodeChar\":\"𭎟\",\"unicodeCodePoint\":\"2D39F\",\"pinYinChars\":[{\"char\":\"huai4\"}],\"splitChars\":[{\"char\":\"土 否\"}],\"weight\":\"10\"},{\"charId\":\"37d46555\",\"unicodeChar\":\"𭎜\",\"unicodeCodePoint\":\"2D39C\",\"pinYinChars\":[{\"char\":\"DAO3\"}],\"splitChars\":[{\"char\":\"土寿\"}],\"weight\":\"10\"},{\"charId\":\"0053ea94\",\"unicodeChar\":\"𭎌\",\"unicodeCodePoint\":\"2D38C\",\"pinYinChars\":[],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"4d443281\",\"unicodeChar\":\"𭎂\",\"unicodeCodePoint\":\"2D382\",\"pinYinChars\":[{\"char\":\"ZONG1\"}],\"splitChars\":[{\"char\":\"土从\"}],\"weight\":\"10\"},{\"charId\":\"5f5dab55\",\"unicodeChar\":\"𭍾\",\"unicodeCodePoint\":\"2D37E\",\"pinYinChars\":[{\"char\":\"土支\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"52ec6cdd\",\"unicodeChar\":\"𭈜\",\"unicodeCodePoint\":\"2D21C\",\"pinYinChars\":[{\"char\":\"bịa\"}],\"splitChars\":[{\"char\":\"口备\"}],\"weight\":\"10\"},{\"charId\":\"0c9c0ac4\",\"unicodeChar\":\"𭈅\",\"unicodeCodePoint\":\"2D205\",\"pinYinChars\":[{\"char\":\"口乱\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"e4abb443\",\"unicodeChar\":\"𭇀\",\"unicodeCodePoint\":\"2D1C0\",\"pinYinChars\":[{\"char\":\"yi4\"}],\"splitChars\":[{\"char\":\"口义\"}],\"weight\":\"10\"},{\"charId\":\"1c4f6e48\",\"unicodeChar\":\"𭃬\",\"unicodeCodePoint\":\"2D0EC\",\"pinYinChars\":[],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"094519d1\",\"unicodeChar\":\"𭀦\",\"unicodeCodePoint\":\"2D026\",\"pinYinChars\":[{\"char\":\"yao4\"}],\"splitChars\":[{\"char\":\"光夭\"}],\"weight\":\"10\"},{\"charId\":\"ce536eac\",\"unicodeChar\":\"𭀢\",\"unicodeCodePoint\":\"2D022\",\"pinYinChars\":[{\"char\":\"大兄\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"ee8225e4\",\"unicodeChar\":\"𬿛\",\"unicodeCodePoint\":\"2CFDB\",\"pinYinChars\":[{\"char\":\"亻康\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"17152ad5\",\"unicodeChar\":\"𬾰\",\"unicodeCodePoint\":\"2CFB0\",\"pinYinChars\":[{\"char\":\"亻星\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"bcd0900c\",\"unicodeChar\":\"𬾅\",\"unicodeCodePoint\":\"2CF85\",\"pinYinChars\":[{\"char\":\"亻克\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"7e906f55\",\"unicodeChar\":\"𬽾\",\"unicodeCodePoint\":\"2CF7E\",\"pinYinChars\":[{\"char\":\"qi3\"}],\"splitChars\":[{\"char\":\"亻企\"}],\"weight\":\"10\"},{\"charId\":\"0d1be324\",\"unicodeChar\":\"𬽣\",\"unicodeCodePoint\":\"2CF63\",\"pinYinChars\":[{\"char\":\"xing2\"}],\"splitChars\":[{\"char\":\"亻亍\"}],\"weight\":\"10\"},{\"charId\":\"4f96ad9d\",\"unicodeChar\":\"𬺛\",\"unicodeCodePoint\":\"2CE9B\",\"pinYinChars\":[{\"char\":\"yan3\"}],\"splitChars\":[{\"char\":\"龙大\"}],\"weight\":\"10\"},{\"charId\":\"5031af8b\",\"unicodeChar\":\"𬸧\",\"unicodeCodePoint\":\"2CE27\",\"pinYinChars\":[{\"char\":\"yan4\"}],\"splitChars\":[{\"char\":\"燕鸟\"}],\"weight\":\"10\"},{\"charId\":\"973ee0a4\",\"unicodeChar\":\"𬸛\",\"unicodeCodePoint\":\"2CE1B\",\"pinYinChars\":[{\"char\":\"HUANG2\"}],\"splitChars\":[{\"char\":\"皇鸟\"}],\"weight\":\"10\"},{\"charId\":\"2c896936\",\"unicodeChar\":\"𬸒\",\"unicodeCodePoint\":\"2CE12\",\"pinYinChars\":[{\"char\":\"QI2\"}],\"splitChars\":[{\"char\":\"鸟其\"}],\"weight\":\"10\"},{\"charId\":\"b69c9126\",\"unicodeChar\":\"𬸊\",\"unicodeCodePoint\":\"2CE0A\",\"pinYinChars\":[{\"char\":\"REN2\"}],\"splitChars\":[{\"char\":\"任鸟\"}],\"weight\":\"10\"},{\"charId\":\"d3e4a836\",\"unicodeChar\":\"𬸈\",\"unicodeCodePoint\":\"2CE08\",\"pinYinChars\":[{\"char\":\"CHI1\"}],\"splitChars\":[{\"char\":\"至鸟\"}],\"weight\":\"10\"},{\"charId\":\"7612cc18\",\"unicodeChar\":\"𬸆\",\"unicodeCodePoint\":\"2CE06\",\"pinYinChars\":[{\"char\":\"sheng1\"}],\"splitChars\":[{\"char\":\"生鸟\"}],\"weight\":\"10\"},{\"charId\":\"dd358bea\",\"unicodeChar\":\"𬸅\",\"unicodeCodePoint\":\"2CE05\",\"pinYinChars\":[{\"char\":\"CHU2\"}],\"splitChars\":[{\"char\":\"刍鸟\"}],\"weight\":\"10\"},{\"charId\":\"09743f8d\",\"unicodeChar\":\"𬸁\",\"unicodeCodePoint\":\"2CE01\",\"pinYinChars\":[{\"char\":\"ou3\"}],\"splitChars\":[{\"char\":\"瓦鸟\"}],\"weight\":\"10\"},{\"charId\":\"557e7edb\",\"unicodeChar\":\"𬷼\",\"unicodeCodePoint\":\"2CDFC\",\"pinYinChars\":[{\"char\":\"yi4\"}],\"splitChars\":[{\"char\":\"儿鸟\"}],\"weight\":\"10\"},{\"charId\":\"d7e1c826\",\"unicodeChar\":\"𬶶\",\"unicodeCodePoint\":\"2CDB6\",\"pinYinChars\":[{\"char\":\"NIAN2\"}],\"splitChars\":[{\"char\":\"鱼廉\"}],\"weight\":\"10\"},{\"charId\":\"dd9eab09\",\"unicodeChar\":\"𬴴\",\"unicodeCodePoint\":\"2CD34\",\"pinYinChars\":[{\"char\":\"si4\"}],\"splitChars\":[{\"char\":\"鬲 司\"}],\"weight\":\"10\"},{\"charId\":\"ab4a544d\",\"unicodeChar\":\"𬴐\",\"unicodeCodePoint\":\"2CD10\",\"pinYinChars\":[{\"char\":\"HUAN1\"}],\"splitChars\":[{\"char\":\"马雚\"}],\"weight\":\"10\"},{\"charId\":\"5da1ead9\",\"unicodeChar\":\"𬴆\",\"unicodeCodePoint\":\"2CD06\",\"pinYinChars\":[{\"char\":\"QI2\"}],\"splitChars\":[{\"char\":\"马堇\"}],\"weight\":\"10\"},{\"charId\":\"f25815c8\",\"unicodeChar\":\"𬲱\",\"unicodeCodePoint\":\"2CCB1\",\"pinYinChars\":[{\"char\":\"tuo2\"},{\"char\":\"sha2\"}],\"splitChars\":[{\"char\":\"饣它\"}],\"weight\":\"10\"},{\"charId\":\"73edb054\",\"unicodeChar\":\"𬱫\",\"unicodeCodePoint\":\"2CC6B\",\"pinYinChars\":[{\"char\":\"DING4\"}],\"splitChars\":[{\"char\":\"定页\"}],\"weight\":\"10\"},{\"charId\":\"01571e71\",\"unicodeChar\":\"𬱙\",\"unicodeCodePoint\":\"2CC59\",\"pinYinChars\":[{\"char\":\"PAN4\"}],\"splitChars\":[{\"char\":\"半页\"}],\"weight\":\"10\"},{\"charId\":\"77414199\",\"unicodeChar\":\"𬮴\",\"unicodeCodePoint\":\"2CBB4\",\"pinYinChars\":[{\"char\":\"AN4\"}],\"splitChars\":[{\"char\":\"门音\"}],\"weight\":\"10\"},{\"charId\":\"84a8d8cf\",\"unicodeChar\":\"𬮢\",\"unicodeCodePoint\":\"2CBA2\",\"pinYinChars\":[{\"char\":\"hong4\"},{\"char\":\"xiang4\"}],\"splitChars\":[{\"char\":\"门共\"}],\"weight\":\"10\"},{\"charId\":\"a8723bf0\",\"unicodeChar\":\"𬮠\",\"unicodeCodePoint\":\"2CBA0\",\"pinYinChars\":[{\"char\":\"XIA3\"}],\"splitChars\":[{\"char\":\"门可\"}],\"weight\":\"10\"},{\"charId\":\"bcfad39d\",\"unicodeChar\":\"𬮟\",\"unicodeCodePoint\":\"2CB9F\",\"pinYinChars\":[{\"char\":\"lin4\"}],\"splitChars\":[{\"char\":\"门火\"}],\"weight\":\"10\"},{\"charId\":\"50d7a5b2\",\"unicodeChar\":\"𬭵\",\"unicodeCodePoint\":\"2CB75\",\"pinYinChars\":[{\"char\":\"pang1\"},{\"char\":\"peng2\"}],\"splitChars\":[{\"char\":\"钅彭\"}],\"weight\":\"10\"},{\"charId\":\"b7888613\",\"unicodeChar\":\"𬭴\",\"unicodeCodePoint\":\"2CB74\",\"pinYinChars\":[{\"char\":\"JIE2\"}],\"splitChars\":[{\"char\":\"钅絜\"}],\"weight\":\"10\"},{\"charId\":\"b3f1a9a2\",\"unicodeChar\":\"𬭮\",\"unicodeCodePoint\":\"2CB6E\",\"pinYinChars\":[{\"char\":\"MAN3\"}],\"splitChars\":[{\"char\":\"钅𬜯\"}],\"weight\":\"10\"},{\"charId\":\"fb7ac4da\",\"unicodeChar\":\"𬭫\",\"unicodeCodePoint\":\"2CB6B\",\"pinYinChars\":[{\"char\":\"zhan3\"}],\"splitChars\":[{\"char\":\"钅展\"}],\"weight\":\"10\"},{\"charId\":\"c190819c\",\"unicodeChar\":\"𬭨\",\"unicodeCodePoint\":\"2CB68\",\"pinYinChars\":[{\"char\":\"CHUI2\"}],\"splitChars\":[{\"char\":\"钅追\"}],\"weight\":\"10\"},{\"charId\":\"27480900\",\"unicodeChar\":\"𬭢\",\"unicodeCodePoint\":\"2CB62\",\"pinYinChars\":[{\"char\":\"KUI4\"}],\"splitChars\":[{\"char\":\"钅贵\"}],\"weight\":\"10\"},{\"charId\":\"c9c9ee85\",\"unicodeChar\":\"𬭟\",\"unicodeCodePoint\":\"2CB5F\",\"pinYinChars\":[{\"char\":\"COU4\"}],\"splitChars\":[{\"char\":\"钅奏\"}],\"weight\":\"10\"},{\"charId\":\"89d7d7df\",\"unicodeChar\":\"𬭙\",\"unicodeCodePoint\":\"2CB59\",\"pinYinChars\":[{\"char\":\"chan2\"}],\"splitChars\":[{\"char\":\"钅单\"}],\"weight\":\"10\"},{\"charId\":\"cf70d0e4\",\"unicodeChar\":\"𬭖\",\"unicodeCodePoint\":\"2CB56\",\"pinYinChars\":[{\"char\":\"PENG2\"}],\"splitChars\":[{\"char\":\"钅朋\"}],\"weight\":\"10\"},{\"charId\":\"a05f0d04\",\"unicodeChar\":\"𬭕\",\"unicodeCodePoint\":\"2CB55\",\"pinYinChars\":[{\"char\":\"TAO2\"}],\"splitChars\":[{\"char\":\"钅周\"}],\"weight\":\"10\"},{\"charId\":\"b7194d36\",\"unicodeChar\":\"𬭐\",\"unicodeCodePoint\":\"2CB50\",\"pinYinChars\":[{\"char\":\"yi1\"}],\"splitChars\":[{\"char\":\"钅矣\"}],\"weight\":\"10\"},{\"charId\":\"b1d0abd5\",\"unicodeChar\":\"𬭌\",\"unicodeCodePoint\":\"2CB4C\",\"pinYinChars\":[{\"char\":\"HUA2\"}],\"splitChars\":[{\"char\":\"钅吴\"}],\"weight\":\"10\"},{\"charId\":\"7a6caee2\",\"unicodeChar\":\"𬭇\",\"unicodeCodePoint\":\"2CB47\",\"pinYinChars\":[{\"char\":\"guo2\"}],\"splitChars\":[{\"char\":\"钅会\"}],\"weight\":\"10\"},{\"charId\":\"7c3c98ac\",\"unicodeChar\":\"𬭆\",\"unicodeCodePoint\":\"2CB46\",\"pinYinChars\":[{\"char\":\"duo3\"},{\"char\":\"duo4\"}],\"splitChars\":[{\"char\":\"钅朵\"}],\"weight\":\"10\"},{\"charId\":\"1ba7fdeb\",\"unicodeChar\":\"𬭅\",\"unicodeCodePoint\":\"2CB45\",\"pinYinChars\":[{\"char\":\"HOU2\"}],\"splitChars\":[{\"char\":\"钅后\"}],\"weight\":\"10\"},{\"charId\":\"ea17edcf\",\"unicodeChar\":\"𬭂\",\"unicodeCodePoint\":\"2CB42\",\"pinYinChars\":[{\"char\":\"hong2\"}],\"splitChars\":[{\"char\":\"钅弘\"}],\"weight\":\"10\"},{\"charId\":\"878ec138\",\"unicodeChar\":\"𬭀\",\"unicodeCodePoint\":\"2CB40\",\"pinYinChars\":[{\"char\":\"SI4\"}],\"splitChars\":[{\"char\":\"钅台\"}],\"weight\":\"10\"},{\"charId\":\"3da3c254\",\"unicodeChar\":\"𬬷\",\"unicodeCodePoint\":\"2CB37\",\"pinYinChars\":[{\"char\":\"shi2\"}],\"splitChars\":[{\"char\":\"钅石\"}],\"weight\":\"10\"},{\"charId\":\"7f0af7a0\",\"unicodeChar\":\"𬬰\",\"unicodeCodePoint\":\"2CB30\",\"pinYinChars\":[{\"char\":\"CHENG1\"},{\"char\":\"qiang1\"}],\"splitChars\":[{\"char\":\"钅仓\"}],\"weight\":\"10\"},{\"charId\":\"d5880692\",\"unicodeChar\":\"𬬨\",\"unicodeCodePoint\":\"2CB28\",\"pinYinChars\":[{\"char\":\"HUA2\"}],\"splitChars\":[{\"char\":\"钅亏\"}],\"weight\":\"10\"},{\"charId\":\"b2e4d9a4\",\"unicodeChar\":\"𬬧\",\"unicodeCodePoint\":\"2CB27\",\"pinYinChars\":[{\"char\":\"HAN4\"}],\"splitChars\":[{\"char\":\"钅干\"}],\"weight\":\"10\"},{\"charId\":\"54e44fee\",\"unicodeChar\":\"𬪍\",\"unicodeCodePoint\":\"2CA8D\",\"pinYinChars\":[{\"char\":\"MAO4\"}],\"splitChars\":[{\"char\":\"贸阝\"}],\"weight\":\"10\"},{\"charId\":\"1f00d897\",\"unicodeChar\":\"𬨨\",\"unicodeCodePoint\":\"2CA28\",\"pinYinChars\":[{\"char\":\"guo4\"}],\"splitChars\":[{\"char\":\"辶呙\"}],\"weight\":\"10\"},{\"charId\":\"d354f36a\",\"unicodeChar\":\"𬨣\",\"unicodeCodePoint\":\"2CA23\",\"pinYinChars\":[{\"char\":\"辶永\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"d112119b\",\"unicodeChar\":\"𬨟\",\"unicodeCodePoint\":\"2CA1F\",\"pinYinChars\":[{\"char\":\"fen1\"}],\"splitChars\":[{\"char\":\"辶分\"}],\"weight\":\"10\"},{\"charId\":\"a397459e\",\"unicodeChar\":\"𬨓\",\"unicodeCodePoint\":\"2CA13\",\"pinYinChars\":[{\"char\":\"CHAO2\"}],\"splitChars\":[{\"char\":\"车巢\"}],\"weight\":\"10\"},{\"charId\":\"3eae0824\",\"unicodeChar\":\"𬨊\",\"unicodeCodePoint\":\"2CA0A\",\"pinYinChars\":[{\"char\":\"mi3\"}],\"splitChars\":[{\"char\":\"尾 车\"}],\"weight\":\"10\"},{\"charId\":\"87910e98\",\"unicodeChar\":\"𬨈\",\"unicodeCodePoint\":\"2CA08\",\"pinYinChars\":[{\"char\":\"WAN3\"}],\"splitChars\":[{\"char\":\"车免\"}],\"weight\":\"10\"},{\"charId\":\"1874ee8c\",\"unicodeChar\":\"𬨄\",\"unicodeCodePoint\":\"2CA04\",\"pinYinChars\":[{\"char\":\"YANG3\"}],\"splitChars\":[{\"char\":\"车央\"}],\"weight\":\"10\"},{\"charId\":\"4cffa0cc\",\"unicodeChar\":\"𬧓\",\"unicodeCodePoint\":\"2C9D3\",\"pinYinChars\":[{\"char\":\"chuan3\"}],\"splitChars\":[{\"char\":\"足 舜\"}],\"weight\":\"10\"},{\"charId\":\"f17e5c41\",\"unicodeChar\":\"𬧏\",\"unicodeCodePoint\":\"2C9CF\",\"pinYinChars\":[{\"char\":\"gai4\"}],\"splitChars\":[{\"char\":\"𧾷盖\"}],\"weight\":\"10\"},{\"charId\":\"b2ef5cc4\",\"unicodeChar\":\"𬤮\",\"unicodeCodePoint\":\"2C92E\",\"pinYinChars\":[{\"char\":\"zan4\"}],\"splitChars\":[{\"char\":\"讠赞\"}],\"weight\":\"10\"},{\"charId\":\"1b1b23d1\",\"unicodeChar\":\"𬤥\",\"unicodeCodePoint\":\"2C925\",\"pinYinChars\":[{\"char\":\"zhuan4\"}],\"splitChars\":[{\"char\":\"讠巽\"}],\"weight\":\"10\"},{\"charId\":\"2ac17921\",\"unicodeChar\":\"𬤎\",\"unicodeCodePoint\":\"2C90E\",\"pinYinChars\":[{\"char\":\"XUAN1\"}],\"splitChars\":[{\"char\":\"讠宣\"}],\"weight\":\"10\"},{\"charId\":\"2f065475\",\"unicodeChar\":\"𬣼\",\"unicodeCodePoint\":\"2C8FC\",\"pinYinChars\":[{\"char\":\"lang3\"},{\"char\":\"lang4\"}],\"splitChars\":[{\"char\":\"讠良\"}],\"weight\":\"10\"},{\"charId\":\"d7c245a2\",\"unicodeChar\":\"𬣮\",\"unicodeCodePoint\":\"2C8EE\",\"pinYinChars\":[{\"char\":\"MING4\"}],\"splitChars\":[{\"char\":\"讠名\"}],\"weight\":\"10\"},{\"charId\":\"cd958aca\",\"unicodeChar\":\"𬣣\",\"unicodeCodePoint\":\"2C8E3\",\"pinYinChars\":[{\"char\":\"ZHU4\"}],\"splitChars\":[{\"char\":\"讠主\"}],\"weight\":\"10\"},{\"charId\":\"e467f698\",\"unicodeChar\":\"𬣉\",\"unicodeCodePoint\":\"2C8C9\",\"pinYinChars\":[{\"char\":\"su4\"}],\"splitChars\":[{\"char\":\"言肅\"}],\"weight\":\"10\"},{\"charId\":\"ef4fc710\",\"unicodeChar\":\"𬢎\",\"unicodeCodePoint\":\"2C88E\",\"pinYinChars\":[{\"char\":\"DU3\"}],\"splitChars\":[{\"char\":\"者见\"}],\"weight\":\"10\"},{\"charId\":\"45253867\",\"unicodeChar\":\"𬢊\",\"unicodeCodePoint\":\"2C88A\",\"pinYinChars\":[{\"char\":\"SI4\"}],\"splitChars\":[{\"char\":\"司见\"}],\"weight\":\"10\"},{\"charId\":\"f8d15009\",\"unicodeChar\":\"𬢇\",\"unicodeCodePoint\":\"2C887\",\"pinYinChars\":[{\"char\":\"ha1\"},{\"char\":\"cha4\"}],\"splitChars\":[{\"char\":\"又 见\"}],\"weight\":\"10\"},{\"charId\":\"b572ebca\",\"unicodeChar\":\"𬠅\",\"unicodeCodePoint\":\"2C805\",\"pinYinChars\":[{\"char\":\"DANG1\"}],\"splitChars\":[{\"char\":\"虫当\"}],\"weight\":\"10\"},{\"charId\":\"b25769e5\",\"unicodeChar\":\"𬞕\",\"unicodeCodePoint\":\"2C795\",\"pinYinChars\":[{\"char\":\"lan2\"}],\"splitChars\":[{\"char\":\"艹阑\"}],\"weight\":\"10\"},{\"charId\":\"bf26ef34\",\"unicodeChar\":\"𬜧\",\"unicodeCodePoint\":\"2C727\",\"pinYinChars\":[{\"char\":\"fa4\"}],\"splitChars\":[{\"char\":\"艹发\"}],\"weight\":\"10\"},{\"charId\":\"64ebf058\",\"unicodeChar\":\"𬜒\",\"unicodeCodePoint\":\"2C712\",\"pinYinChars\":[{\"char\":\"fan2\"}],\"splitChars\":[{\"char\":\"舟已\"}],\"weight\":\"10\"},{\"charId\":\"be13db59\",\"unicodeChar\":\"𬘵\",\"unicodeCodePoint\":\"2C635\",\"pinYinChars\":[{\"char\":\"GENG1\"}],\"splitChars\":[{\"char\":\"纟恒\"}],\"weight\":\"10\"},{\"charId\":\"043f17ab\",\"unicodeChar\":\"𬘢\",\"unicodeCodePoint\":\"2C622\",\"pinYinChars\":[{\"char\":\"KUANG4\"}],\"splitChars\":[{\"char\":\"纟光\"}],\"weight\":\"10\"},{\"charId\":\"3345b842\",\"unicodeChar\":\"𬘜\",\"unicodeCodePoint\":\"2C61C\",\"pinYinChars\":[{\"char\":\"ZHAN4\"}],\"splitChars\":[{\"char\":\"纟旦\"}],\"weight\":\"10\"},{\"charId\":\"b763f373\",\"unicodeChar\":\"𬘖\",\"unicodeCodePoint\":\"2C616\",\"pinYinChars\":[{\"char\":\"JIAN3\"}],\"splitChars\":[{\"char\":\"纟见\"}],\"weight\":\"10\"},{\"charId\":\"a85b1fae\",\"unicodeChar\":\"𬖣\",\"unicodeCodePoint\":\"2C5A3\",\"pinYinChars\":[{\"char\":\"米 定\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"fe56a4b7\",\"unicodeChar\":\"𬖍\",\"unicodeCodePoint\":\"2C58D\",\"pinYinChars\":[{\"char\":\"meng2\"}],\"splitChars\":[{\"char\":\"米八\"}],\"weight\":\"10\"},{\"charId\":\"d254b3fe\",\"unicodeChar\":\"𬔰\",\"unicodeCodePoint\":\"2C530\",\"pinYinChars\":[{\"char\":\"man3\"}],\"splitChars\":[{\"char\":\"𥫗心\"}],\"weight\":\"10\"},{\"charId\":\"c0ad766b\",\"unicodeChar\":\"𬔬\",\"unicodeCodePoint\":\"2C52C\",\"pinYinChars\":[{\"char\":\"竹 乃\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"3c2c6d11\",\"unicodeChar\":\"𬓇\",\"unicodeCodePoint\":\"2C4C7\",\"pinYinChars\":[{\"char\":\"礻 宜\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"a15c4bb6\",\"unicodeChar\":\"𬒓\",\"unicodeCodePoint\":\"2C493\",\"pinYinChars\":[{\"char\":\"ke1\"},{\"char\":\"luo3\"}],\"splitChars\":[{\"char\":\"石罗\"}],\"weight\":\"10\"},{\"charId\":\"9ce24cf5\",\"unicodeChar\":\"𬒍\",\"unicodeCodePoint\":\"2C48D\",\"pinYinChars\":[{\"char\":\"YUN3\"}],\"splitChars\":[{\"char\":\"石员\"}],\"weight\":\"10\"},{\"charId\":\"8b7cc416\",\"unicodeChar\":\"𬒃\",\"unicodeCodePoint\":\"2C483\",\"pinYinChars\":[{\"char\":\"lian4\"}],\"splitChars\":[{\"char\":\"石𫠣\"}],\"weight\":\"10\"},{\"charId\":\"6e72806d\",\"unicodeChar\":\"𬒂\",\"unicodeCodePoint\":\"2C482\",\"pinYinChars\":[{\"char\":\"石方\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"95094b23\",\"unicodeChar\":\"𬒁\",\"unicodeCodePoint\":\"2C481\",\"pinYinChars\":[{\"char\":\"石 夭\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"1ab3b4e2\",\"unicodeChar\":\"𬑺\",\"unicodeCodePoint\":\"2C47A\",\"pinYinChars\":[{\"char\":\"duo4\"}],\"splitChars\":[{\"char\":\"石 寸\"}],\"weight\":\"10\"},{\"charId\":\"2bfb0137\",\"unicodeChar\":\"𬑹\",\"unicodeCodePoint\":\"2C479\",\"pinYinChars\":[{\"char\":\"han4\"}],\"splitChars\":[{\"char\":\"石厂\"}],\"weight\":\"10\"},{\"charId\":\"0d7104b3\",\"unicodeChar\":\"𬑓\",\"unicodeCodePoint\":\"2C453\",\"pinYinChars\":[{\"char\":\"ye4\"}],\"splitChars\":[{\"char\":\"目华\"}],\"weight\":\"10\"},{\"charId\":\"60d5941c\",\"unicodeChar\":\"𬏟\",\"unicodeCodePoint\":\"2C3DF\",\"pinYinChars\":[{\"char\":\"JI4\"}],\"splitChars\":[{\"char\":\"疒计\"}],\"weight\":\"10\"},{\"charId\":\"4d2c083d\",\"unicodeChar\":\"𬏂\",\"unicodeCodePoint\":\"2C3C2\",\"pinYinChars\":[{\"char\":\"田尔\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"9368c357\",\"unicodeChar\":\"𬎑\",\"unicodeCodePoint\":\"2C391\",\"pinYinChars\":[{\"char\":\"LAN4\"}],\"splitChars\":[{\"char\":\"王阑\"}],\"weight\":\"10\"},{\"charId\":\"d385d725\",\"unicodeChar\":\"𬍳\",\"unicodeCodePoint\":\"2C373\",\"pinYinChars\":[{\"char\":\"王 享\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"aea5608c\",\"unicodeChar\":\"𬍯\",\"unicodeCodePoint\":\"2C36F\",\"pinYinChars\":[{\"char\":\"ke3\"},{\"char\":\"ke1\"}],\"splitChars\":[{\"char\":\"王果\"}],\"weight\":\"10\"},{\"charId\":\"f98693cf\",\"unicodeChar\":\"𬍜\",\"unicodeCodePoint\":\"2C35C\",\"pinYinChars\":[{\"char\":\"ning2\"}],\"splitChars\":[{\"char\":\"王宁\"}],\"weight\":\"10\"},{\"charId\":\"617e031a\",\"unicodeChar\":\"𬍙\",\"unicodeCodePoint\":\"2C359\",\"pinYinChars\":[{\"char\":\"ZHAN3\"}],\"splitChars\":[{\"char\":\"王戋\"}],\"weight\":\"10\"},{\"charId\":\"cad24ec7\",\"unicodeChar\":\"𬌙\",\"unicodeCodePoint\":\"2C319\",\"pinYinChars\":[{\"char\":\"pa2\"}],\"splitChars\":[{\"char\":\"牛八\"}],\"weight\":\"10\"},{\"charId\":\"1a395238\",\"unicodeChar\":\"𬊺\",\"unicodeCodePoint\":\"2C2BA\",\"pinYinChars\":[{\"char\":\"wei1\"}],\"splitChars\":[{\"char\":\"火爱\"}],\"weight\":\"10\"},{\"charId\":\"8450df31\",\"unicodeChar\":\"𬊶\",\"unicodeCodePoint\":\"2C2B6\",\"pinYinChars\":[{\"char\":\"LAN4\"}],\"splitChars\":[{\"char\":\"火监\"}],\"weight\":\"10\"},{\"charId\":\"8e3955af\",\"unicodeChar\":\"𬊵\",\"unicodeCodePoint\":\"2C2B5\",\"pinYinChars\":[{\"char\":\"TANG3\"}],\"splitChars\":[{\"char\":\"火党\"}],\"weight\":\"10\"},{\"charId\":\"3859f90e\",\"unicodeChar\":\"𬊭\",\"unicodeCodePoint\":\"2C2AD\",\"pinYinChars\":[{\"char\":\"YU4\"}],\"splitChars\":[{\"char\":\"火显\"}],\"weight\":\"10\"},{\"charId\":\"b83529f9\",\"unicodeChar\":\"𬊖\",\"unicodeCodePoint\":\"2C296\",\"pinYinChars\":[{\"char\":\"mei3\"}],\"splitChars\":[{\"char\":\"火闵\"}],\"weight\":\"10\"},{\"charId\":\"06e48477\",\"unicodeChar\":\"𬊕\",\"unicodeCodePoint\":\"2C295\",\"pinYinChars\":[{\"char\":\"火免\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"ceb386af\",\"unicodeChar\":\"𬊎\",\"unicodeCodePoint\":\"2C28E\",\"pinYinChars\":[{\"char\":\"gong4\"}],\"splitChars\":[{\"char\":\"火贡\"}],\"weight\":\"10\"},{\"charId\":\"7116c6d6\",\"unicodeChar\":\"𬊂\",\"unicodeCodePoint\":\"2C282\",\"pinYinChars\":[{\"char\":\"CHAO3\"}],\"splitChars\":[{\"char\":\"火刍\"}],\"weight\":\"10\"},{\"charId\":\"79cd3756\",\"unicodeChar\":\"𬉣\",\"unicodeCodePoint\":\"2C263\",\"pinYinChars\":[{\"char\":\"DO\"}],\"splitChars\":[{\"char\":\"氵餘\"}],\"weight\":\"10\"},{\"charId\":\"9143c35b\",\"unicodeChar\":\"𬉡\",\"unicodeCodePoint\":\"2C261\",\"pinYinChars\":[{\"char\":\"SUO3\"},{\"char\":\"RUI3\"}],\"splitChars\":[{\"char\":\"氵蕊\"}],\"weight\":\"10\"},{\"charId\":\"22db7749\",\"unicodeChar\":\"𬉊\",\"unicodeCodePoint\":\"2C24A\",\"pinYinChars\":[{\"char\":\"氵聖\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"2ef5e3f4\",\"unicodeChar\":\"𬈐\",\"unicodeCodePoint\":\"2C210\",\"pinYinChars\":[{\"char\":\"yao1\"}],\"splitChars\":[{\"char\":\"氵㓁目\"}],\"weight\":\"10\"},{\"charId\":\"fd2521e7\",\"unicodeChar\":\"𬇵\",\"unicodeCodePoint\":\"2C1F5\",\"pinYinChars\":[{\"char\":\"yan1\"}],\"splitChars\":[{\"char\":\"氵正与\"}],\"weight\":\"10\"},{\"charId\":\"c52834e0\",\"unicodeChar\":\"𬇡\",\"unicodeCodePoint\":\"2C1E1\",\"pinYinChars\":[{\"char\":\"kan3\"}],\"splitChars\":[{\"char\":\"氵口𫶧\"}],\"weight\":\"10\"},{\"charId\":\"af593a28\",\"unicodeChar\":\"𬅱\",\"unicodeCodePoint\":\"2C171\",\"pinYinChars\":[{\"char\":\"BO1\"}],\"splitChars\":[{\"char\":\"番欠\"}],\"weight\":\"10\"},{\"charId\":\"1dda74ed\",\"unicodeChar\":\"𬅄\",\"unicodeCodePoint\":\"2C144\",\"pinYinChars\":[{\"char\":\"peng2\"}],\"splitChars\":[{\"char\":\"未成林\"}],\"weight\":\"10\"},{\"charId\":\"c9dab524\",\"unicodeChar\":\"𬃲\",\"unicodeCodePoint\":\"2C0F2\",\"pinYinChars\":[{\"char\":\"LIN2\"}],\"splitChars\":[{\"char\":\"林页\"}],\"weight\":\"10\"},{\"charId\":\"7bc2863b\",\"unicodeChar\":\"𬃫\",\"unicodeCodePoint\":\"2C0EB\",\"pinYinChars\":[{\"char\":\"XIAN2\"}],\"splitChars\":[{\"char\":\"木宪\"}],\"weight\":\"10\"},{\"charId\":\"2d07ae40\",\"unicodeChar\":\"𬂰\",\"unicodeCodePoint\":\"2C0B0\",\"pinYinChars\":[{\"char\":\"NONG2\"}],\"splitChars\":[{\"char\":\"木农\"}],\"weight\":\"10\"},{\"charId\":\"5ae21fcb\",\"unicodeChar\":\"𬂟\",\"unicodeCodePoint\":\"2C09F\",\"pinYinChars\":[{\"char\":\"DAO1\"},{\"char\":\"TIAO2\"},{\"char\":\"MU4\"}],\"splitChars\":[{\"char\":\"木 刀\"}],\"weight\":\"10\"},{\"charId\":\"6beb135d\",\"unicodeChar\":\"𬁷\",\"unicodeCodePoint\":\"2C077\",\"pinYinChars\":[{\"char\":\"YAO\"}],\"splitChars\":[{\"char\":\"月夭\"}],\"weight\":\"10\"},{\"charId\":\"d9565f03\",\"unicodeChar\":\"𬁴\",\"unicodeCodePoint\":\"2C074\",\"pinYinChars\":[{\"char\":\"YU4\"}],\"splitChars\":[{\"char\":\"月云\"}],\"weight\":\"10\"},{\"charId\":\"ad647af2\",\"unicodeChar\":\"𬀱\",\"unicodeCodePoint\":\"2C031\",\"pinYinChars\":[{\"char\":\"KAI3\"}],\"splitChars\":[{\"char\":\"日岂\"}],\"weight\":\"10\"},{\"charId\":\"58270676\",\"unicodeChar\":\"𬀮\",\"unicodeCodePoint\":\"2C02E\",\"pinYinChars\":[{\"char\":\"DUI4\"}],\"splitChars\":[{\"char\":\"日对\"}],\"weight\":\"10\"},{\"charId\":\"f7e90bc7\",\"unicodeChar\":\"𫾻\",\"unicodeCodePoint\":\"2BFBB\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"易攵\"}],\"weight\":\"10\"},{\"charId\":\"53707d22\",\"unicodeChar\":\"𫽮\",\"unicodeCodePoint\":\"2BF6E\",\"pinYinChars\":[{\"char\":\"DANG3\"}],\"splitChars\":[{\"char\":\"扌党\"}],\"weight\":\"10\"},{\"charId\":\"fa8ae0bb\",\"unicodeChar\":\"𫽥\",\"unicodeCodePoint\":\"2BF65\",\"pinYinChars\":[{\"char\":\"qian1\"}],\"splitChars\":[{\"char\":\"扌举\"}],\"weight\":\"10\"},{\"charId\":\"8167da9e\",\"unicodeChar\":\"𫽋\",\"unicodeCodePoint\":\"2BF4B\",\"pinYinChars\":[{\"char\":\"LUO2\"}],\"splitChars\":[{\"char\":\"扌罗\"}],\"weight\":\"10\"},{\"charId\":\"2617b504\",\"unicodeChar\":\"𫺌\",\"unicodeCodePoint\":\"2BE8C\",\"pinYinChars\":[{\"char\":\"gong1\"},{\"char\":\"gong4\"},{\"char\":\"HONG3\"}],\"splitChars\":[{\"char\":\"忄贡\"}],\"weight\":\"10\"},{\"charId\":\"06fd4d8c\",\"unicodeChar\":\"𫺆\",\"unicodeCodePoint\":\"2BE86\",\"pinYinChars\":[{\"char\":\"hua2\"}],\"splitChars\":[{\"char\":\"忄华\"}],\"weight\":\"10\"},{\"charId\":\"b0e7c84a\",\"unicodeChar\":\"𫹼\",\"unicodeCodePoint\":\"2BE7C\",\"pinYinChars\":[{\"char\":\"dong1\"}],\"splitChars\":[{\"char\":\"忄东\"}],\"weight\":\"10\"},{\"charId\":\"8e546aad\",\"unicodeChar\":\"𫹴\",\"unicodeCodePoint\":\"2BE74\",\"pinYinChars\":[{\"char\":\"WEI3\"}],\"splitChars\":[{\"char\":\"忄韦\"}],\"weight\":\"10\"},{\"charId\":\"474eed3b\",\"unicodeChar\":\"𫹮\",\"unicodeCodePoint\":\"2BE6E\",\"pinYinChars\":[{\"char\":\"YU3\"}],\"splitChars\":[{\"char\":\"忄与\"}],\"weight\":\"10\"},{\"charId\":\"dac07213\",\"unicodeChar\":\"𫷹\",\"unicodeCodePoint\":\"2BDF9\",\"pinYinChars\":[{\"char\":\"LOU2\"}],\"splitChars\":[{\"char\":\"广娄\"}],\"weight\":\"10\"},{\"charId\":\"ba448313\",\"unicodeChar\":\"𫷬\",\"unicodeCodePoint\":\"2BDEC\",\"pinYinChars\":[{\"char\":\"LAI2\"}],\"splitChars\":[{\"char\":\"广来\"}],\"weight\":\"10\"},{\"charId\":\"a135a3eb\",\"unicodeChar\":\"𫷅\",\"unicodeCodePoint\":\"2BDC5\",\"pinYinChars\":[{\"char\":\"KUN1\"}],\"splitChars\":[{\"char\":\"巾军\"}],\"weight\":\"10\"},{\"charId\":\"89aca729\",\"unicodeChar\":\"𫷀\",\"unicodeCodePoint\":\"2BDC0\",\"pinYinChars\":[{\"char\":\"MAO4\"}],\"splitChars\":[{\"char\":\"巾毛\"}],\"weight\":\"10\"},{\"charId\":\"ca3837f0\",\"unicodeChar\":\"𫶚\",\"unicodeCodePoint\":\"2BD9A\",\"pinYinChars\":[{\"char\":\"AN\"}],\"splitChars\":[{\"char\":\"山 刂\"}],\"weight\":\"10\"},{\"charId\":\"6b72b93c\",\"unicodeChar\":\"𫶕\",\"unicodeCodePoint\":\"2BD95\",\"pinYinChars\":[{\"char\":\"RONG2\"}],\"splitChars\":[{\"char\":\"山营\"}],\"weight\":\"10\"},{\"charId\":\"82fc0784\",\"unicodeChar\":\"𫶔\",\"unicodeCodePoint\":\"2BD94\",\"pinYinChars\":[{\"char\":\"han4\"}],\"splitChars\":[{\"char\":\"敢山\"}],\"weight\":\"10\"},{\"charId\":\"97ae19fd\",\"unicodeChar\":\"𫵼\",\"unicodeCodePoint\":\"2BD7C\",\"pinYinChars\":[{\"char\":\"geng\"}],\"splitChars\":[{\"char\":\"山更\"}],\"weight\":\"10\"},{\"charId\":\"097535c3\",\"unicodeChar\":\"𫵶\",\"unicodeCodePoint\":\"2BD76\",\"pinYinChars\":[{\"char\":\"wei3\"}],\"splitChars\":[{\"char\":\"山韦\"}],\"weight\":\"10\"},{\"charId\":\"dbb1cae4\",\"unicodeChar\":\"𫵖\",\"unicodeCodePoint\":\"2BD56\",\"pinYinChars\":[{\"char\":\"SHI\"}],\"splitChars\":[{\"char\":\"尸示\"}],\"weight\":\"10\"},{\"charId\":\"f534d904\",\"unicodeChar\":\"𫳃\",\"unicodeCodePoint\":\"2BCC3\",\"pinYinChars\":[{\"char\":\"ya1\"}],\"splitChars\":[{\"char\":\"宀亚\"}],\"weight\":\"10\"},{\"charId\":\"99883a39\",\"unicodeChar\":\"𫳁\",\"unicodeCodePoint\":\"2BCC1\",\"pinYinChars\":[{\"char\":\"zhen3\"}],\"splitChars\":[{\"char\":\"宀 山\"}],\"weight\":\"10\"},{\"charId\":\"98291079\",\"unicodeChar\":\"𫲻\",\"unicodeCodePoint\":\"2BCBB\",\"pinYinChars\":[{\"char\":\"liao2\"}],\"splitChars\":[{\"char\":\"宀 乌\"}],\"weight\":\"10\"},{\"charId\":\"c6355a71\",\"unicodeChar\":\"𫲷\",\"unicodeCodePoint\":\"2BCB7\",\"pinYinChars\":[{\"char\":\"fu4\"}],\"splitChars\":[{\"char\":\"宀夫\"}],\"weight\":\"10\"},{\"charId\":\"498635ca\",\"unicodeChar\":\"𫲗\",\"unicodeCodePoint\":\"2BC97\",\"pinYinChars\":[{\"char\":\"zan4\"}],\"splitChars\":[{\"char\":\"女赞\"}],\"weight\":\"10\"},{\"charId\":\"8c3e38c6\",\"unicodeChar\":\"𫲄\",\"unicodeCodePoint\":\"2BC84\",\"pinYinChars\":[{\"char\":\"wa1\"}],\"splitChars\":[{\"char\":\"女 窝\"}],\"weight\":\"10\"},{\"charId\":\"17901921\",\"unicodeChar\":\"𫱣\",\"unicodeCodePoint\":\"2BC63\",\"pinYinChars\":[{\"char\":\"女國\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"054f1ac1\",\"unicodeChar\":\"𫱗\",\"unicodeCodePoint\":\"2BC57\",\"pinYinChars\":[{\"char\":\"NA\"}],\"splitChars\":[{\"char\":\"女拿\"}],\"weight\":\"10\"},{\"charId\":\"79850e58\",\"unicodeChar\":\"𫱕\",\"unicodeCodePoint\":\"2BC55\",\"pinYinChars\":[{\"char\":\"lan4\"}],\"splitChars\":[{\"char\":\"女监\"}],\"weight\":\"10\"},{\"charId\":\"17e10491\",\"unicodeChar\":\"𫱆\",\"unicodeCodePoint\":\"2BC46\",\"pinYinChars\":[{\"char\":\"女畐\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"8a95be73\",\"unicodeChar\":\"𫰿\",\"unicodeCodePoint\":\"2BC3F\",\"pinYinChars\":[{\"char\":\"YIN1\"}],\"splitChars\":[{\"char\":\"女𫂱\"}],\"weight\":\"10\"},{\"charId\":\"61e073eb\",\"unicodeChar\":\"𫰰\",\"unicodeCodePoint\":\"2BC30\",\"pinYinChars\":[{\"char\":\"XIAN1\"}],\"splitChars\":[{\"char\":\"女佥\"}],\"weight\":\"10\"},{\"charId\":\"41d88770\",\"unicodeChar\":\"𫰨\",\"unicodeCodePoint\":\"2BC28\",\"pinYinChars\":[{\"char\":\"mai2\"}],\"splitChars\":[{\"char\":\"女买\"}],\"weight\":\"10\"},{\"charId\":\"f12c4c43\",\"unicodeChar\":\"𫰧\",\"unicodeCodePoint\":\"2BC27\",\"pinYinChars\":[{\"char\":\"女羊\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"d9667507\",\"unicodeChar\":\"𫰢\",\"unicodeCodePoint\":\"2BC22\",\"pinYinChars\":[{\"char\":\"hui4\"}],\"splitChars\":[{\"char\":\"女会\"}],\"weight\":\"10\"},{\"charId\":\"173d2861\",\"unicodeChar\":\"𫰔\",\"unicodeCodePoint\":\"2BC14\",\"pinYinChars\":[{\"char\":\"女牛\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"260d036a\",\"unicodeChar\":\"𫰉\",\"unicodeCodePoint\":\"2BC09\",\"pinYinChars\":[{\"char\":\"女凡\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"3b653e86\",\"unicodeChar\":\"𫰈\",\"unicodeCodePoint\":\"2BC08\",\"pinYinChars\":[{\"char\":\"ya4\"}],\"splitChars\":[{\"char\":\"女下\"}],\"weight\":\"10\"},{\"charId\":\"64ee177e\",\"unicodeChar\":\"𫰂\",\"unicodeCodePoint\":\"2BC02\",\"pinYinChars\":[{\"char\":\"DUO3\"}],\"splitChars\":[{\"char\":\"奢单\"}],\"weight\":\"10\"},{\"charId\":\"70dc9b41\",\"unicodeChar\":\"𫯮\",\"unicodeCodePoint\":\"2BBEE\",\"pinYinChars\":[{\"char\":\"xue2\"}],\"splitChars\":[{\"char\":\"大 顺\"}],\"weight\":\"10\"},{\"charId\":\"9af0139f\",\"unicodeChar\":\"𫮏\",\"unicodeCodePoint\":\"2BB8F\",\"pinYinChars\":[{\"char\":\"fai\"}],\"splitChars\":[{\"char\":\"派土\"}],\"weight\":\"10\"},{\"charId\":\"acbef830\",\"unicodeChar\":\"𫮌\",\"unicodeCodePoint\":\"2BB8C\",\"pinYinChars\":[{\"char\":\"liang4\"}],\"splitChars\":[{\"char\":\"土亮\"}],\"weight\":\"10\"},{\"charId\":\"22fcd056\",\"unicodeChar\":\"𫮈\",\"unicodeCodePoint\":\"2BB88\",\"pinYinChars\":[{\"char\":\"chan2\"}],\"splitChars\":[{\"char\":\"土厘\"}],\"weight\":\"10\"},{\"charId\":\"851b16ea\",\"unicodeChar\":\"𫭼\",\"unicodeCodePoint\":\"2BB7C\",\"pinYinChars\":[{\"char\":\"LAO2\"}],\"splitChars\":[{\"char\":\"土劳\"}],\"weight\":\"10\"},{\"charId\":\"4d2963e6\",\"unicodeChar\":\"𫭮\",\"unicodeCodePoint\":\"2BB6E\",\"pinYinChars\":[{\"char\":\"ce4\"}],\"splitChars\":[{\"char\":\"土则\"}],\"weight\":\"10\"},{\"charId\":\"f0bcc550\",\"unicodeChar\":\"𫭪\",\"unicodeCodePoint\":\"2BB6A\",\"pinYinChars\":[{\"char\":\"QIAO1\"}],\"splitChars\":[{\"char\":\"土尧\"}],\"weight\":\"10\"},{\"charId\":\"63fcb51a\",\"unicodeChar\":\"𫭞\",\"unicodeCodePoint\":\"2BB5E\",\"pinYinChars\":[{\"char\":\"ZHUAN1\"}],\"splitChars\":[{\"char\":\"土专\"}],\"weight\":\"10\"},{\"charId\":\"1cb02f16\",\"unicodeChar\":\"𫭛\",\"unicodeCodePoint\":\"2BB5B\",\"pinYinChars\":[{\"char\":\"wang1\"}],\"splitChars\":[{\"char\":\"土 天\"}],\"weight\":\"10\"},{\"charId\":\"41162572\",\"unicodeChar\":\"𫭙\",\"unicodeCodePoint\":\"2BB59\",\"pinYinChars\":[{\"char\":\"kua4\"},{\"char\":\"kuo4\"}],\"splitChars\":[{\"char\":\"土口\"}],\"weight\":\"10\"},{\"charId\":\"322fc4ee\",\"unicodeChar\":\"𫫇\",\"unicodeCodePoint\":\"2BAC7\",\"pinYinChars\":[{\"char\":\"E4\"}],\"splitChars\":[{\"char\":\"口恶\"}],\"weight\":\"10\"},{\"charId\":\"59d6114d\",\"unicodeChar\":\"𫪘\",\"unicodeCodePoint\":\"2BA98\",\"pinYinChars\":[{\"char\":\"OU3\"}],\"splitChars\":[{\"char\":\"口欧\"}],\"weight\":\"10\"},{\"charId\":\"7fb3a697\",\"unicodeChar\":\"𫪁\",\"unicodeCodePoint\":\"2BA81\",\"pinYinChars\":[{\"char\":\"LAI4\"}],\"splitChars\":[{\"char\":\"口来\"}],\"weight\":\"10\"},{\"charId\":\"2601386e\",\"unicodeChar\":\"𫩝\",\"unicodeCodePoint\":\"2BA5D\",\"pinYinChars\":[{\"char\":\"ci1\"},{\"char\":\"gi4\"}],\"splitChars\":[{\"char\":\"口之\"}],\"weight\":\"10\"},{\"charId\":\"178b7f23\",\"unicodeChar\":\"𫧯\",\"unicodeCodePoint\":\"2B9EF\",\"pinYinChars\":[{\"char\":\"XIE4\"}],\"splitChars\":[{\"char\":\"占内\"}],\"weight\":\"10\"},{\"charId\":\"433b81b3\",\"unicodeChar\":\"𫤬\",\"unicodeCodePoint\":\"2B92C\",\"pinYinChars\":[{\"char\":\"gang4\"}],\"splitChars\":[{\"char\":\"八 丶\"}],\"weight\":\"10\"},{\"charId\":\"00b54176\",\"unicodeChar\":\"𫤪\",\"unicodeCodePoint\":\"2B92A\",\"pinYinChars\":[{\"char\":\"fong\"}],\"splitChars\":[{\"char\":\"全 全\"}],\"weight\":\"10\"},{\"charId\":\"612655b3\",\"unicodeChar\":\"𫣊\",\"unicodeCodePoint\":\"2B8CA\",\"pinYinChars\":[{\"char\":\"AI4\"}],\"splitChars\":[{\"char\":\"亻爱\"}],\"weight\":\"10\"},{\"charId\":\"776b10d1\",\"unicodeChar\":\"𫢪\",\"unicodeCodePoint\":\"2B8AA\",\"pinYinChars\":[{\"char\":\"LIAN4\"}],\"splitChars\":[{\"char\":\"亻连\"}],\"weight\":\"10\"},{\"charId\":\"a16ea7ff\",\"unicodeChar\":\"𫢙\",\"unicodeCodePoint\":\"2B899\",\"pinYinChars\":[{\"char\":\"tong2\"},{\"char\":\"dou\"}],\"splitChars\":[{\"char\":\"亻动\"}],\"weight\":\"10\"},{\"charId\":\"2d229739\",\"unicodeChar\":\"𫢘\",\"unicodeCodePoint\":\"2B898\",\"pinYinChars\":[{\"char\":\"DUI4\"}],\"splitChars\":[{\"char\":\"亻对\"}],\"weight\":\"10\"},{\"charId\":\"e323404d\",\"unicodeChar\":\"𫢋\",\"unicodeCodePoint\":\"2B88B\",\"pinYinChars\":[{\"char\":\"fo2\"}],\"splitChars\":[{\"char\":\"亻天\"}],\"weight\":\"10\"},{\"charId\":\"089fa1f7\",\"unicodeChar\":\"𫡥\",\"unicodeCodePoint\":\"2B865\",\"pinYinChars\":[{\"char\":\"da3\"}],\"splitChars\":[{\"char\":\"乙 合\"}],\"weight\":\"10\"},{\"charId\":\"ee3f415f\",\"unicodeChar\":\"𫡢\",\"unicodeCodePoint\":\"2B862\",\"pinYinChars\":[{\"char\":\"tang4\"},{\"char\":\"tuo3\"}],\"splitChars\":[{\"char\":\"乙土\"}],\"weight\":\"10\"},{\"charId\":\"a3862aee\",\"unicodeChar\":\"𫠫\",\"unicodeCodePoint\":\"2B82B\",\"pinYinChars\":[{\"char\":\"bian3\"}],\"splitChars\":[{\"char\":\"不元\"}],\"weight\":\"10\"},{\"charId\":\"c934b081\",\"unicodeChar\":\"𫟻\",\"unicodeCodePoint\":\"2B7FB\",\"pinYinChars\":[{\"char\":\"ZHOU1\"}],\"splitChars\":[{\"char\":\"钅州\"}],\"weight\":\"10\"},{\"charId\":\"f092251d\",\"unicodeChar\":\"𫟺\",\"unicodeCodePoint\":\"2B7FA\",\"pinYinChars\":[{\"char\":\"KAI1\"}],\"splitChars\":[{\"char\":\"钅亥\"}],\"weight\":\"10\"},{\"charId\":\"180e9878\",\"unicodeChar\":\"𫟷\",\"unicodeCodePoint\":\"2B7F7\",\"pinYinChars\":[{\"char\":\"LI4\"}],\"splitChars\":[{\"char\":\"钅立\"}],\"weight\":\"10\"},{\"charId\":\"f23f4151\",\"unicodeChar\":\"𫟴\",\"unicodeCodePoint\":\"2B7F4\",\"pinYinChars\":[{\"char\":\"FEN1\"}],\"splitChars\":[{\"char\":\"钅分\"}],\"weight\":\"10\"},{\"charId\":\"c2782b53\",\"unicodeChar\":\"𫟤\",\"unicodeCodePoint\":\"2B7E4\",\"pinYinChars\":[{\"char\":\"TUO2\"}],\"splitChars\":[{\"char\":\"车它\"}],\"weight\":\"10\"},{\"charId\":\"87264c99\",\"unicodeChar\":\"𫟌\",\"unicodeCodePoint\":\"2B7CC\",\"pinYinChars\":[{\"char\":\"yi4\"}],\"splitChars\":[{\"char\":\"艹外\"}],\"weight\":\"10\"},{\"charId\":\"e58633f7\",\"unicodeChar\":\"𫟇\",\"unicodeCodePoint\":\"2B7C7\",\"pinYinChars\":[{\"char\":\"liao4\"},{\"char\":\"liao2\"}],\"splitChars\":[{\"char\":\"纟廖\"}],\"weight\":\"10\"},{\"charId\":\"e9c0aefb\",\"unicodeChar\":\"𫞠\",\"unicodeCodePoint\":\"2B7A0\",\"pinYinChars\":[{\"char\":\"LING2\"}],\"splitChars\":[{\"char\":\"火灵\"}],\"weight\":\"10\"},{\"charId\":\"f2cfe4a8\",\"unicodeChar\":\"𫞂\",\"unicodeCodePoint\":\"2B782\",\"pinYinChars\":[{\"char\":\"yao4\"}],\"splitChars\":[{\"char\":\"日玉\"}],\"weight\":\"10\"},{\"charId\":\"d24a50a6\",\"unicodeChar\":\"𫝵\",\"unicodeCodePoint\":\"2B775\",\"pinYinChars\":[{\"char\":\"DAO3\"}],\"splitChars\":[{\"char\":\"山寿\"}],\"weight\":\"10\"},{\"charId\":\"fccb2fcf\",\"unicodeChar\":\"𫝮\",\"unicodeCodePoint\":\"2B76E\",\"pinYinChars\":[{\"char\":\"LAN3\"}],\"splitChars\":[{\"char\":\"女阑\"}],\"weight\":\"10\"},{\"charId\":\"e1580894\",\"unicodeChar\":\"𫝭\",\"unicodeCodePoint\":\"2B76D\",\"pinYinChars\":[{\"char\":\"YING1\"}],\"splitChars\":[{\"char\":\"女婴\"}],\"weight\":\"10\"},{\"charId\":\"ecb31c91\",\"unicodeChar\":\"𫝩\",\"unicodeCodePoint\":\"2B769\",\"pinYinChars\":[{\"char\":\"CHOU2\"}],\"splitChars\":[{\"char\":\"女寿\"}],\"weight\":\"10\"},{\"charId\":\"91dcac91\",\"unicodeChar\":\"𫝦\",\"unicodeCodePoint\":\"2B766\",\"pinYinChars\":[{\"char\":\"BEI4\"}],\"splitChars\":[{\"char\":\"女贝\"}],\"weight\":\"10\"},{\"charId\":\"bce2bf73\",\"unicodeChar\":\"𫜫\",\"unicodeCodePoint\":\"2B72B\",\"pinYinChars\":[{\"char\":\"bu3\"}],\"splitChars\":[{\"char\":\"齿甫\"}],\"weight\":\"10\"},{\"charId\":\"3811ea19\",\"unicodeChar\":\"𫜂\",\"unicodeCodePoint\":\"2B702\",\"pinYinChars\":[{\"char\":\"ZHANG1\"}],\"splitChars\":[{\"char\":\"章鸟\"}],\"weight\":\"10\"},{\"charId\":\"1acd05e7\",\"unicodeChar\":\"𫜀\",\"unicodeCodePoint\":\"2B700\",\"pinYinChars\":[{\"char\":\"CHEN2\"}],\"splitChars\":[{\"char\":\"晨鸟\"}],\"weight\":\"10\"},{\"charId\":\"67c4e15c\",\"unicodeChar\":\"𫛶\",\"unicodeCodePoint\":\"2B6F6\",\"pinYinChars\":[{\"char\":\"CHI4\"}],\"splitChars\":[{\"char\":\"勅鸟\"}],\"weight\":\"10\"},{\"charId\":\"9632ed92\",\"unicodeChar\":\"𫛰\",\"unicodeCodePoint\":\"2B6F0\",\"pinYinChars\":[{\"char\":\"QI2\"}],\"splitChars\":[{\"char\":\"其鸟\"}],\"weight\":\"10\"},{\"charId\":\"76f1b50e\",\"unicodeChar\":\"𫛩\",\"unicodeCodePoint\":\"2B6E9\",\"pinYinChars\":[{\"char\":\"YAN4\"}],\"splitChars\":[{\"char\":\"安鸟\"}],\"weight\":\"10\"},{\"charId\":\"5442350b\",\"unicodeChar\":\"𫛣\",\"unicodeCodePoint\":\"2B6E3\",\"pinYinChars\":[{\"char\":\"YU4\"}],\"splitChars\":[{\"char\":\"鸟穴\"}],\"weight\":\"10\"},{\"charId\":\"f363ed2d\",\"unicodeChar\":\"𫛢\",\"unicodeCodePoint\":\"2B6E2\",\"pinYinChars\":[{\"char\":\"NING2\"}],\"splitChars\":[{\"char\":\"宁鸟\"}],\"weight\":\"10\"},{\"charId\":\"b097ecaf\",\"unicodeChar\":\"𫛞\",\"unicodeCodePoint\":\"2B6DE\",\"pinYinChars\":[{\"char\":\"JUE2\"}],\"splitChars\":[{\"char\":\"鸟夬\"}],\"weight\":\"10\"},{\"charId\":\"2aedf660\",\"unicodeChar\":\"𫚋\",\"unicodeCodePoint\":\"2B68B\",\"pinYinChars\":[{\"char\":\"ZHUAN1\"}],\"splitChars\":[{\"char\":\"鱼专\"}],\"weight\":\"10\"},{\"charId\":\"81298ae9\",\"unicodeChar\":\"𫘱\",\"unicodeCodePoint\":\"2B631\",\"pinYinChars\":[{\"char\":\"XI2\"}],\"splitChars\":[{\"char\":\"马巂\"}],\"weight\":\"10\"},{\"charId\":\"a34be992\",\"unicodeChar\":\"𫘭\",\"unicodeCodePoint\":\"2B62D\",\"pinYinChars\":[{\"char\":\"SHUANG1\"}],\"splitChars\":[{\"char\":\"马爽\"}],\"weight\":\"10\"},{\"charId\":\"5eb0dcdd\",\"unicodeChar\":\"𫘥\",\"unicodeCodePoint\":\"2B625\",\"pinYinChars\":[{\"char\":\"KUN1\"}],\"splitChars\":[{\"char\":\"马昆\"}],\"weight\":\"10\"},{\"charId\":\"57f649a0\",\"unicodeChar\":\"𫘤\",\"unicodeCodePoint\":\"2B624\",\"pinYinChars\":[{\"char\":\"SI4\"}],\"splitChars\":[{\"char\":\"马矣\"}],\"weight\":\"10\"},{\"charId\":\"27933f75\",\"unicodeChar\":\"𫘠\",\"unicodeCodePoint\":\"2B620\",\"pinYinChars\":[{\"char\":\"ZHI4\"}],\"splitChars\":[{\"char\":\"马至\"}],\"weight\":\"10\"},{\"charId\":\"985751c5\",\"unicodeChar\":\"𫘑\",\"unicodeCodePoint\":\"2B611\",\"pinYinChars\":[{\"char\":\"馬美\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"a7dec5ad\",\"unicodeChar\":\"𫗩\",\"unicodeCodePoint\":\"2B5E9\",\"pinYinChars\":[{\"char\":\"LUO2\"}],\"splitChars\":[{\"char\":\"饣罗\"}],\"weight\":\"10\"},{\"charId\":\"3a2adc3d\",\"unicodeChar\":\"𫖵\",\"unicodeCodePoint\":\"2B5B5\",\"pinYinChars\":[{\"char\":\"YUE4\"}],\"splitChars\":[{\"char\":\"岳页\"}],\"weight\":\"10\"},{\"charId\":\"b5582a37\",\"unicodeChar\":\"𫖲\",\"unicodeCodePoint\":\"2B5B2\",\"pinYinChars\":[{\"char\":\"HUN4\"}],\"splitChars\":[{\"char\":\"员页\"}],\"weight\":\"10\"},{\"charId\":\"00fd28bc\",\"unicodeChar\":\"𫖕\",\"unicodeCodePoint\":\"2B595\",\"pinYinChars\":[{\"char\":\"GOU1\"}],\"splitChars\":[{\"char\":\"韦冓\"}],\"weight\":\"10\"},{\"charId\":\"14ffea47\",\"unicodeChar\":\"𫖒\",\"unicodeCodePoint\":\"2B592\",\"pinYinChars\":[{\"char\":\"BI4\"}],\"splitChars\":[{\"char\":\"韦毕\"}],\"weight\":\"10\"},{\"charId\":\"49dcc8e4\",\"unicodeChar\":\"𫔴\",\"unicodeCodePoint\":\"2B534\",\"pinYinChars\":[{\"char\":\"LIN4\"}],\"splitChars\":[{\"char\":\"门隹\"}],\"weight\":\"10\"},{\"charId\":\"bda802f2\",\"unicodeChar\":\"𫔔\",\"unicodeCodePoint\":\"2B514\",\"pinYinChars\":[{\"char\":\"XI1\"}],\"splitChars\":[{\"char\":\"钅巂\"}],\"weight\":\"10\"},{\"charId\":\"ca5b0c17\",\"unicodeChar\":\"𫔉\",\"unicodeCodePoint\":\"2B509\",\"pinYinChars\":[{\"char\":\"ying1\"}],\"splitChars\":[{\"char\":\"钅婴\"}],\"weight\":\"10\"},{\"charId\":\"b7724a78\",\"unicodeChar\":\"𫔈\",\"unicodeCodePoint\":\"2B508\",\"pinYinChars\":[{\"char\":\"SHUO4\"}],\"splitChars\":[{\"char\":\"钅朔\"}],\"weight\":\"10\"},{\"charId\":\"ac4651db\",\"unicodeChar\":\"𫔄\",\"unicodeCodePoint\":\"2B504\",\"pinYinChars\":[{\"char\":\"ROU2\"}],\"splitChars\":[{\"char\":\"钅柔\"}],\"weight\":\"10\"},{\"charId\":\"a21bad38\",\"unicodeChar\":\"𫔃\",\"unicodeCodePoint\":\"2B503\",\"pinYinChars\":[{\"char\":\"JIAN4\"}],\"splitChars\":[{\"char\":\"钅览\"}],\"weight\":\"10\"},{\"charId\":\"6d57127c\",\"unicodeChar\":\"𫔂\",\"unicodeCodePoint\":\"2B502\",\"pinYinChars\":[{\"char\":\"DI1\"}],\"splitChars\":[{\"char\":\"钅是\"}],\"weight\":\"10\"},{\"charId\":\"d76dc037\",\"unicodeChar\":\"𫔁\",\"unicodeCodePoint\":\"2B501\",\"pinYinChars\":[{\"char\":\"FEN2\"}],\"splitChars\":[{\"char\":\"钅贲\"}],\"weight\":\"10\"},{\"charId\":\"72a10400\",\"unicodeChar\":\"𫓾\",\"unicodeCodePoint\":\"2B4FE\",\"pinYinChars\":[{\"char\":\"YU4\"}],\"splitChars\":[{\"char\":\"钅育\"}],\"weight\":\"10\"},{\"charId\":\"f36b4d98\",\"unicodeChar\":\"𫓽\",\"unicodeCodePoint\":\"2B4FD\",\"pinYinChars\":[{\"char\":\"ZONG4\"}],\"splitChars\":[{\"char\":\"钅宗\"}],\"weight\":\"10\"},{\"charId\":\"9465757a\",\"unicodeChar\":\"𫓻\",\"unicodeCodePoint\":\"2B4FB\",\"pinYinChars\":[{\"char\":\"NIE4\"}],\"splitChars\":[{\"char\":\"钅念\"}],\"weight\":\"10\"},{\"charId\":\"a1c22844\",\"unicodeChar\":\"𫓴\",\"unicodeCodePoint\":\"2B4F4\",\"pinYinChars\":[{\"char\":\"MOU2\"}],\"splitChars\":[{\"char\":\"钅牟\"}],\"weight\":\"10\"},{\"charId\":\"c6c4e2a6\",\"unicodeChar\":\"𫓲\",\"unicodeCodePoint\":\"2B4F2\",\"pinYinChars\":[{\"char\":\"JUN1\"}],\"splitChars\":[{\"char\":\"钅旬\"}],\"weight\":\"10\"},{\"charId\":\"798e55ee\",\"unicodeChar\":\"𫓰\",\"unicodeCodePoint\":\"2B4F0\",\"pinYinChars\":[{\"char\":\"XU4\"}],\"splitChars\":[{\"char\":\"钅戌\"}],\"weight\":\"10\"},{\"charId\":\"449b71f2\",\"unicodeChar\":\"𫓩\",\"unicodeCodePoint\":\"2B4E9\",\"pinYinChars\":[{\"char\":\"CONG1\"}],\"splitChars\":[{\"char\":\"钅从\"}],\"weight\":\"10\"},{\"charId\":\"2bf9eb64\",\"unicodeChar\":\"𫓦\",\"unicodeCodePoint\":\"2B4E6\",\"pinYinChars\":[{\"char\":\"ZI3\"}],\"splitChars\":[{\"char\":\"钅子\"}],\"weight\":\"10\"},{\"charId\":\"a7bfe8c8\",\"unicodeChar\":\"𫐑\",\"unicodeCodePoint\":\"2B411\",\"pinYinChars\":[{\"char\":\"GUAN3\"}],\"splitChars\":[{\"char\":\"车官\"}],\"weight\":\"10\"},{\"charId\":\"f08c3206\",\"unicodeChar\":\"𫐌\",\"unicodeCodePoint\":\"2B40C\",\"pinYinChars\":[{\"char\":\"PING2\"}],\"splitChars\":[{\"char\":\"车并\"}],\"weight\":\"10\"},{\"charId\":\"336a10bb\",\"unicodeChar\":\"𫐉\",\"unicodeCodePoint\":\"2B409\",\"pinYinChars\":[{\"char\":\"LING2\"}],\"splitChars\":[{\"char\":\"车令\"}],\"weight\":\"10\"},{\"charId\":\"e2eccb59\",\"unicodeChar\":\"𫏐\",\"unicodeCodePoint\":\"2B3D0\",\"pinYinChars\":[{\"char\":\"ZAN4\"}],\"splitChars\":[{\"char\":\"斩足\"}],\"weight\":\"10\"},{\"charId\":\"589a2823\",\"unicodeChar\":\"𫏋\",\"unicodeCodePoint\":\"2B3CB\",\"pinYinChars\":[{\"char\":\"QIAO1\"}],\"splitChars\":[{\"char\":\"𧾷乔\"}],\"weight\":\"10\"},{\"charId\":\"847cf4f0\",\"unicodeChar\":\"𫎬\",\"unicodeCodePoint\":\"2B3AC\",\"pinYinChars\":[{\"char\":\"GONG4\"}],\"splitChars\":[{\"char\":\"章贡\"}],\"weight\":\"10\"},{\"charId\":\"6cd310de\",\"unicodeChar\":\"𫍻\",\"unicodeCodePoint\":\"2B37B\",\"pinYinChars\":[{\"char\":\"XI1\"}],\"splitChars\":[{\"char\":\"讠喜\"}],\"weight\":\"10\"},{\"charId\":\"97afeb16\",\"unicodeChar\":\"𫍰\",\"unicodeCodePoint\":\"2B370\",\"pinYinChars\":[{\"char\":\"XI3\"}],\"splitChars\":[{\"char\":\"讠思\"}],\"weight\":\"10\"},{\"charId\":\"1ff49fb0\",\"unicodeChar\":\"𫍧\",\"unicodeCodePoint\":\"2B367\",\"pinYinChars\":[{\"char\":\"CHI1\"}],\"splitChars\":[{\"char\":\"讠来\"}],\"weight\":\"10\"},{\"charId\":\"5e47f8eb\",\"unicodeChar\":\"𫍤\",\"unicodeCodePoint\":\"2B364\",\"pinYinChars\":[{\"char\":\"JIAO3\"}],\"splitChars\":[{\"char\":\"讠乔\"}],\"weight\":\"10\"},{\"charId\":\"c1f4e0d9\",\"unicodeChar\":\"𫍟\",\"unicodeCodePoint\":\"2B35F\",\"pinYinChars\":[{\"char\":\"dan4\"}],\"splitChars\":[{\"char\":\"讠 也\"}],\"weight\":\"10\"},{\"charId\":\"b4100b2f\",\"unicodeChar\":\"𫍛\",\"unicodeCodePoint\":\"2B35B\",\"pinYinChars\":[{\"char\":\"fen1\"}],\"splitChars\":[{\"char\":\"讠 分\"}],\"weight\":\"10\"},{\"charId\":\"e996edc8\",\"unicodeChar\":\"𫌨\",\"unicodeCodePoint\":\"2B328\",\"pinYinChars\":[{\"char\":\"LUO2\"}],\"splitChars\":[{\"char\":\"尔见\"}],\"weight\":\"10\"},{\"charId\":\"45608322\",\"unicodeChar\":\"𫌉\",\"unicodeCodePoint\":\"2B309\",\"pinYinChars\":[{\"char\":\"zhuo2\"}],\"splitChars\":[{\"char\":\"衤 羔\"}],\"weight\":\"10\"},{\"charId\":\"eaa4c557\",\"unicodeChar\":\"𫊻\",\"unicodeCodePoint\":\"2B2BB\",\"pinYinChars\":[{\"char\":\"XUN2\"}],\"splitChars\":[{\"char\":\"虫寻\"}],\"weight\":\"10\"},{\"charId\":\"5e29d039\",\"unicodeChar\":\"𫊵\",\"unicodeCodePoint\":\"2B2B5\",\"pinYinChars\":[{\"char\":\"chi1\"}],\"splitChars\":[{\"char\":\"虫寺\"}],\"weight\":\"10\"},{\"charId\":\"1836dabc\",\"unicodeChar\":\"𫉤\",\"unicodeCodePoint\":\"2B264\",\"pinYinChars\":[{\"char\":\"艹 陽\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"c46dd91e\",\"unicodeChar\":\"𫉅\",\"unicodeCodePoint\":\"2B245\",\"pinYinChars\":[{\"char\":\"nu4\"}],\"splitChars\":[{\"char\":\"艹恕\"}],\"weight\":\"10\"},{\"charId\":\"f0eefaa4\",\"unicodeChar\":\"𫉁\",\"unicodeCodePoint\":\"2B241\",\"pinYinChars\":[{\"char\":\"AI4\"}],\"splitChars\":[{\"char\":\"艹爱\"}],\"weight\":\"10\"},{\"charId\":\"86201dde\",\"unicodeChar\":\"𫈟\",\"unicodeCodePoint\":\"2B21F\",\"pinYinChars\":[{\"char\":\"chen2\"}],\"splitChars\":[{\"char\":\"艹 陈\"}],\"weight\":\"10\"},{\"charId\":\"7ac00744\",\"unicodeChar\":\"𫈉\",\"unicodeCodePoint\":\"2B209\",\"pinYinChars\":[{\"char\":\"jian1\"}],\"splitChars\":[{\"char\":\"艹间\"}],\"weight\":\"10\"},{\"charId\":\"9e4658f1\",\"unicodeChar\":\"𫄥\",\"unicodeCodePoint\":\"2B125\",\"pinYinChars\":[{\"char\":\"XI3\"}],\"splitChars\":[{\"char\":\"纟丽\"}],\"weight\":\"10\"},{\"charId\":\"d6b7f0af\",\"unicodeChar\":\"𫄡\",\"unicodeCodePoint\":\"2B121\",\"pinYinChars\":[{\"char\":\"DONG4\"}],\"splitChars\":[{\"char\":\"纟同\"}],\"weight\":\"10\"},{\"charId\":\"76aa5859\",\"unicodeChar\":\"𫄟\",\"unicodeCodePoint\":\"2B11F\",\"pinYinChars\":[{\"char\":\"SHI1\"}],\"splitChars\":[{\"char\":\"纟㐌\"}],\"weight\":\"10\"},{\"charId\":\"742f1981\",\"unicodeChar\":\"𫄞\",\"unicodeCodePoint\":\"2B11E\",\"pinYinChars\":[{\"char\":\"BI4\"}],\"splitChars\":[{\"char\":\"纟丕\"}],\"weight\":\"10\"},{\"charId\":\"d66b707a\",\"unicodeChar\":\"𫄙\",\"unicodeCodePoint\":\"2B119\",\"pinYinChars\":[{\"char\":\"jiu1\"}],\"splitChars\":[{\"char\":\"纟 乙\"}],\"weight\":\"10\"},{\"charId\":\"2e42f03c\",\"unicodeChar\":\"𫁷\",\"unicodeCodePoint\":\"2B077\",\"pinYinChars\":[{\"char\":\"SHUANG1\"}],\"splitChars\":[{\"char\":\"𥫗双\"}],\"weight\":\"10\"},{\"charId\":\"3f0a8e13\",\"unicodeChar\":\"𫁳\",\"unicodeCodePoint\":\"2B073\",\"pinYinChars\":[{\"char\":\"wei3\"}],\"splitChars\":[{\"char\":\"竹 韦\"}],\"weight\":\"10\"},{\"charId\":\"31c2336f\",\"unicodeChar\":\"𪼟\",\"unicodeCodePoint\":\"2AF1F\",\"pinYinChars\":[{\"char\":\"chi2\"}],\"splitChars\":[{\"char\":\"王 犀\"}],\"weight\":\"10\"},{\"charId\":\"0f6f3f60\",\"unicodeChar\":\"𪼞\",\"unicodeCodePoint\":\"2AF1E\",\"pinYinChars\":[{\"char\":\"王 戈\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"fa1f9bd2\",\"unicodeChar\":\"𪻺\",\"unicodeCodePoint\":\"2AEFA\",\"pinYinChars\":[{\"char\":\"GUI1\"}],\"splitChars\":[{\"char\":\"王贵\"}],\"weight\":\"10\"},{\"charId\":\"98b44c36\",\"unicodeChar\":\"𪻨\",\"unicodeCodePoint\":\"2AEE8\",\"pinYinChars\":[{\"char\":\"DU2\"}],\"splitChars\":[{\"char\":\"王卖\"}],\"weight\":\"10\"},{\"charId\":\"55cdc74b\",\"unicodeChar\":\"𪻥\",\"unicodeCodePoint\":\"2AEE5\",\"pinYinChars\":[{\"char\":\"王 亨\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"10440308\",\"unicodeChar\":\"𪻍\",\"unicodeCodePoint\":\"2AECD\",\"pinYinChars\":[{\"char\":\"王 又\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"41a05b01\",\"unicodeChar\":\"𪹨\",\"unicodeCodePoint\":\"2AE68\",\"pinYinChars\":[{\"char\":\"火 庸\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"72aa5aca\",\"unicodeChar\":\"𪸩\",\"unicodeCodePoint\":\"2AE29\",\"pinYinChars\":[{\"char\":\"HUI1\"}],\"splitChars\":[{\"char\":\"火军\"}],\"weight\":\"10\"},{\"charId\":\"ea834fd9\",\"unicodeChar\":\"𪷽\",\"unicodeCodePoint\":\"2ADFD\",\"pinYinChars\":[{\"char\":\"ZAN4\"}],\"splitChars\":[{\"char\":\"氵赞\"}],\"weight\":\"10\"},{\"charId\":\"9e1c2762\",\"unicodeChar\":\"𪷰\",\"unicodeCodePoint\":\"2ADF0\",\"pinYinChars\":[{\"char\":\"氵 韶\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"0665a992\",\"unicodeChar\":\"𪷦\",\"unicodeCodePoint\":\"2ADE6\",\"pinYinChars\":[{\"char\":\"氵 運\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"2bc6e6d4\",\"unicodeChar\":\"𪷤\",\"unicodeCodePoint\":\"2ADE4\",\"pinYinChars\":[{\"char\":\"lin3\"}],\"splitChars\":[{\"char\":\"氵 禀\"}],\"weight\":\"10\"},{\"charId\":\"aefe43ea\",\"unicodeChar\":\"𪷛\",\"unicodeCodePoint\":\"2ADDB\",\"pinYinChars\":[{\"char\":\"氵 富\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"7486ec22\",\"unicodeChar\":\"𪷍\",\"unicodeCodePoint\":\"2ADCD\",\"pinYinChars\":[{\"char\":\"QING4\"}],\"splitChars\":[{\"char\":\"氵靓\"}],\"weight\":\"10\"},{\"charId\":\"1164528d\",\"unicodeChar\":\"𪶒\",\"unicodeCodePoint\":\"2AD92\",\"pinYinChars\":[{\"char\":\"LUO2\"}],\"splitChars\":[{\"char\":\"氵罗\"}],\"weight\":\"10\"},{\"charId\":\"03eb53c3\",\"unicodeChar\":\"𪴯\",\"unicodeCodePoint\":\"2AD2F\",\"pinYinChars\":[{\"char\":\"e1\"},{\"char\":\"e4\"}],\"splitChars\":[{\"char\":\"显 欠\"}],\"weight\":\"10\"},{\"charId\":\"a0bcf97d\",\"unicodeChar\":\"𪴙\",\"unicodeCodePoint\":\"2AD19\",\"pinYinChars\":[{\"char\":\"CUAN2\"}],\"splitChars\":[{\"char\":\"木赞\"}],\"weight\":\"10\"},{\"charId\":\"b1df2d94\",\"unicodeChar\":\"𪳍\",\"unicodeCodePoint\":\"2ACCD\",\"pinYinChars\":[{\"char\":\"SHE4\"}],\"splitChars\":[{\"char\":\"木聂\"}],\"weight\":\"10\"},{\"charId\":\"eaca294c\",\"unicodeChar\":\"𪳉\",\"unicodeCodePoint\":\"2ACC9\",\"pinYinChars\":[{\"char\":\"木 心\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"021e7bbc\",\"unicodeChar\":\"𪲎\",\"unicodeCodePoint\":\"2AC8E\",\"pinYinChars\":[{\"char\":\"JI1\"}],\"splitChars\":[{\"char\":\"木齐\"}],\"weight\":\"10\"},{\"charId\":\"bbd0c67f\",\"unicodeChar\":\"𪱷\",\"unicodeCodePoint\":\"2AC77\",\"pinYinChars\":[{\"char\":\"BEI4\"}],\"splitChars\":[{\"char\":\"木贝\"}],\"weight\":\"10\"},{\"charId\":\"640596b3\",\"unicodeChar\":\"𪱚\",\"unicodeCodePoint\":\"2AC5A\",\"pinYinChars\":[{\"char\":\"月 上\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"e8fb49f9\",\"unicodeChar\":\"𪰶\",\"unicodeCodePoint\":\"2AC36\",\"pinYinChars\":[{\"char\":\"FEI4\"}],\"splitChars\":[{\"char\":\"日费\"}],\"weight\":\"10\"},{\"charId\":\"1dca25d9\",\"unicodeChar\":\"𪰣\",\"unicodeCodePoint\":\"2AC23\",\"pinYinChars\":[{\"char\":\"YU4\"}],\"splitChars\":[{\"char\":\"日羽\"}],\"weight\":\"10\"},{\"charId\":\"a3575112\",\"unicodeChar\":\"𪮢\",\"unicodeCodePoint\":\"2ABA2\",\"pinYinChars\":[{\"char\":\"扌 原\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"a6821b71\",\"unicodeChar\":\"𪭷\",\"unicodeCodePoint\":\"2AB77\",\"pinYinChars\":[{\"char\":\"bao4\"}],\"splitChars\":[{\"char\":\"扌呆\"}],\"weight\":\"10\"},{\"charId\":\"12039732\",\"unicodeChar\":\"𪭝\",\"unicodeCodePoint\":\"2AB5D\",\"pinYinChars\":[{\"char\":\"WEI3\"}],\"splitChars\":[{\"char\":\"扌韦\"}],\"weight\":\"10\"},{\"charId\":\"c3fd50b2\",\"unicodeChar\":\"𪬏\",\"unicodeCodePoint\":\"2AB0F\",\"pinYinChars\":[{\"char\":\"hang\"}],\"splitChars\":[{\"char\":\"忄 香\"}],\"weight\":\"10\"},{\"charId\":\"d1140cfa\",\"unicodeChar\":\"𪪏\",\"unicodeCodePoint\":\"2AA8F\",\"pinYinChars\":[{\"char\":\"lu2\"}],\"splitChars\":[{\"char\":\"广 卢\"}],\"weight\":\"10\"},{\"charId\":\"6f62acdd\",\"unicodeChar\":\"𪨷\",\"unicodeCodePoint\":\"2AA37\",\"pinYinChars\":[{\"char\":\"YAN2\"}],\"splitChars\":[{\"char\":\"山严\"}],\"weight\":\"10\"},{\"charId\":\"a9409e7e\",\"unicodeChar\":\"𪨊\",\"unicodeCodePoint\":\"2AA0A\",\"pinYinChars\":[{\"char\":\"SONG2\"}],\"splitChars\":[{\"char\":\"尸从\"}],\"weight\":\"10\"},{\"charId\":\"d1235811\",\"unicodeChar\":\"𪨇\",\"unicodeCodePoint\":\"2AA07\",\"pinYinChars\":[{\"char\":\"TUI2\"}],\"splitChars\":[{\"char\":\"兀贵\"}],\"weight\":\"10\"},{\"charId\":\"f95d5fce\",\"unicodeChar\":\"𪥿\",\"unicodeCodePoint\":\"2A97F\",\"pinYinChars\":[{\"char\":\"DU2\"}],\"splitChars\":[{\"char\":\"女卖\"}],\"weight\":\"10\"},{\"charId\":\"2d0178f3\",\"unicodeChar\":\"𪤕\",\"unicodeCodePoint\":\"2A915\",\"pinYinChars\":[{\"char\":\"chan3\"}],\"splitChars\":[{\"char\":\"土產\"}],\"weight\":\"10\"},{\"charId\":\"630c38ec\",\"unicodeChar\":\"𪤓\",\"unicodeCodePoint\":\"2A913\",\"pinYinChars\":[{\"char\":\"土敏\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"0269e7ca\",\"unicodeChar\":\"𪢷\",\"unicodeCodePoint\":\"2A8B7\",\"pinYinChars\":[{\"char\":\"土亡\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"5f6e2ccc\",\"unicodeChar\":\"𪢮\",\"unicodeCodePoint\":\"2A8AE\",\"pinYinChars\":[{\"char\":\"LUAN2\"}],\"splitChars\":[{\"char\":\"囗栾\"}],\"weight\":\"10\"},{\"charId\":\"c7086281\",\"unicodeChar\":\"𪢐\",\"unicodeCodePoint\":\"2A890\",\"pinYinChars\":[{\"char\":\"LAI4\"}],\"splitChars\":[{\"char\":\"口赖\"}],\"weight\":\"10\"},{\"charId\":\"80860788\",\"unicodeChar\":\"𪢂\",\"unicodeCodePoint\":\"2A882\",\"pinYinChars\":[{\"char\":\"口着\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"d7fe4f0e\",\"unicodeChar\":\"𪡗\",\"unicodeCodePoint\":\"2A857\",\"pinYinChars\":[{\"char\":\"han\"}],\"splitChars\":[{\"char\":\"口欣\"}],\"weight\":\"10\"},{\"charId\":\"14090e4f\",\"unicodeChar\":\"𪡋\",\"unicodeCodePoint\":\"2A84B\",\"pinYinChars\":[{\"char\":\"YAN3\"}],\"splitChars\":[{\"char\":\"口佥\"}],\"weight\":\"10\"},{\"charId\":\"8775584d\",\"unicodeChar\":\"𪡀\",\"unicodeCodePoint\":\"2A840\",\"pinYinChars\":[{\"char\":\"QIAO2\"}],\"splitChars\":[{\"char\":\"口乔\"}],\"weight\":\"10\"},{\"charId\":\"b212f7b3\",\"unicodeChar\":\"𪞝\",\"unicodeCodePoint\":\"2A79D\",\"pinYinChars\":[{\"char\":\"DUO2\"}],\"splitChars\":[{\"char\":\"冫𠬤\"}],\"weight\":\"10\"},{\"charId\":\"74a72a09\",\"unicodeChar\":\"𪜐\",\"unicodeCodePoint\":\"2A710\",\"pinYinChars\":[{\"char\":\"wa1\"},{\"char\":\"wa2\"},{\"char\":\"wa4\"},{\"char\":\"hua4\"}],\"splitChars\":[{\"char\":\"乙化\"}],\"weight\":\"10\"},{\"charId\":\"6a0e8a34\",\"unicodeChar\":\"𪌙\",\"unicodeCodePoint\":\"2A319\",\"pinYinChars\":[{\"char\":\"SHU2\"}],\"splitChars\":[{\"char\":\"麥戊\"}],\"weight\":\"10\"},{\"charId\":\"4537da2d\",\"unicodeChar\":\"𪋫\",\"unicodeCodePoint\":\"2A2EB\",\"pinYinChars\":[{\"char\":\"YE4\"}],\"splitChars\":[{\"char\":\"鹿業\"}],\"weight\":\"10\"},{\"charId\":\"bcf2bb14\",\"unicodeChar\":\"𪋟\",\"unicodeCodePoint\":\"2A2DF\",\"pinYinChars\":[{\"char\":\"zhang1\"}],\"splitChars\":[{\"char\":\"鹿 章\"}],\"weight\":\"10\"},{\"charId\":\"6ba0f772\",\"unicodeChar\":\"𪊿\",\"unicodeCodePoint\":\"2A2BF\",\"pinYinChars\":[{\"char\":\"lin2\"}],\"splitChars\":[{\"char\":\"鹿 谷\"}],\"weight\":\"10\"},{\"charId\":\"7b86b31c\",\"unicodeChar\":\"𪊸\",\"unicodeCodePoint\":\"2A2B8\",\"pinYinChars\":[{\"char\":\"TU2\"}],\"splitChars\":[{\"char\":\"鹿余\"}],\"weight\":\"10\"},{\"charId\":\"b3829570\",\"unicodeChar\":\"𪊲\",\"unicodeCodePoint\":\"2A2B2\",\"pinYinChars\":[{\"char\":\"lin2\"}],\"splitChars\":[{\"char\":\"鹿各\"}],\"weight\":\"10\"},{\"charId\":\"549e4d33\",\"unicodeChar\":\"𪊟\",\"unicodeCodePoint\":\"2A29F\",\"pinYinChars\":[{\"char\":\"sheng1\"}],\"splitChars\":[{\"char\":\"鹿 生\"}],\"weight\":\"10\"},{\"charId\":\"3908c51b\",\"unicodeChar\":\"𪊖\",\"unicodeCodePoint\":\"2A296\",\"pinYinChars\":[{\"char\":\"HU3\"}],\"splitChars\":[{\"char\":\"鹿勿\"}],\"weight\":\"10\"},{\"charId\":\"b88d2e31\",\"unicodeChar\":\"𪉓\",\"unicodeCodePoint\":\"2A253\",\"pinYinChars\":[{\"char\":\"NIAO3\"}],\"splitChars\":[{\"char\":\"鸟鸟鸟\"}],\"weight\":\"10\"},{\"charId\":\"128833c6\",\"unicodeChar\":\"𪉊\",\"unicodeCodePoint\":\"2A24A\",\"pinYinChars\":[{\"char\":\"HUA2\"}],\"splitChars\":[{\"char\":\"华鸟\"}],\"weight\":\"10\"},{\"charId\":\"cbc56806\",\"unicodeChar\":\"𪉈\",\"unicodeCodePoint\":\"2A248\",\"pinYinChars\":[{\"char\":\"CI2\"}],\"splitChars\":[{\"char\":\"此鸟\"}],\"weight\":\"10\"},{\"charId\":\"bb6ec58c\",\"unicodeChar\":\"𪉃\",\"unicodeCodePoint\":\"2A243\",\"pinYinChars\":[{\"char\":\"WEN2\"}],\"splitChars\":[{\"char\":\"文鸟\"}],\"weight\":\"10\"},{\"charId\":\"f7f6d0b1\",\"unicodeChar\":\"𪆫\",\"unicodeCodePoint\":\"2A1AB\",\"pinYinChars\":[{\"char\":\"QU2\"}],\"splitChars\":[{\"char\":\"鳥渠\"}],\"weight\":\"10\"},{\"charId\":\"f979e315\",\"unicodeChar\":\"𪆉\",\"unicodeCodePoint\":\"2A189\",\"pinYinChars\":[{\"char\":\"KOU4\"}],\"splitChars\":[{\"char\":\"十冖隹鳥\"}],\"weight\":\"10\"},{\"charId\":\"2ba168fd\",\"unicodeChar\":\"𪃸\",\"unicodeCodePoint\":\"2A0F8\",\"pinYinChars\":[{\"char\":\"zhan1\"}],\"splitChars\":[{\"char\":\"枼 鳥\"}],\"weight\":\"10\"},{\"charId\":\"4dc24d9e\",\"unicodeChar\":\"𪁌\",\"unicodeCodePoint\":\"2A04C\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"赤鳥\"}],\"weight\":\"10\"},{\"charId\":\"3d549699\",\"unicodeChar\":\"𩷔\",\"unicodeCodePoint\":\"29DD4\",\"pinYinChars\":[{\"char\":\"SHEN1\"}],\"splitChars\":[{\"char\":\"魚辛\"}],\"weight\":\"10\"},{\"charId\":\"3037a598\",\"unicodeChar\":\"𩵴\",\"unicodeCodePoint\":\"29D74\",\"pinYinChars\":[{\"char\":\"mu4\"}],\"splitChars\":[{\"char\":\"木 魚\"}],\"weight\":\"10\"},{\"charId\":\"5f9c1ce1\",\"unicodeChar\":\"𩵮\",\"unicodeCodePoint\":\"29D6E\",\"pinYinChars\":[{\"char\":\"SHA1\"}],\"splitChars\":[{\"char\":\"少魚\"}],\"weight\":\"10\"},{\"charId\":\"19094dd2\",\"unicodeChar\":\"𩵋\",\"unicodeCodePoint\":\"29D4B\",\"pinYinChars\":[{\"char\":\"YU2\"}],\"splitChars\":[{\"char\":\"⺈田大\"}],\"weight\":\"10\"},{\"charId\":\"c5b268e6\",\"unicodeChar\":\"𩮪\",\"unicodeCodePoint\":\"29BAA\",\"pinYinChars\":[{\"char\":\"ZONG1\"}],\"splitChars\":[{\"char\":\"髟罒一心\"}],\"weight\":\"10\"},{\"charId\":\"679007e4\",\"unicodeChar\":\"𩫇\",\"unicodeCodePoint\":\"29AC7\",\"pinYinChars\":[{\"char\":\"AI3\"}],\"splitChars\":[{\"char\":\"不高\"}],\"weight\":\"10\"},{\"charId\":\"9ebd478c\",\"unicodeChar\":\"𩪆\",\"unicodeCodePoint\":\"29A86\",\"pinYinChars\":[{\"char\":\"TI3\"}],\"splitChars\":[{\"char\":\"骨骨\"}],\"weight\":\"10\"},{\"charId\":\"9a5331d5\",\"unicodeChar\":\"𩨎\",\"unicodeCodePoint\":\"29A0E\",\"pinYinChars\":[{\"char\":\"yi4\"}],\"splitChars\":[{\"char\":\"马 異\"}],\"weight\":\"10\"},{\"charId\":\"6f4d91ed\",\"unicodeChar\":\"𩨄\",\"unicodeCodePoint\":\"29A04\",\"pinYinChars\":[{\"char\":\"SOU1\"}],\"splitChars\":[{\"char\":\"马叟\"}],\"weight\":\"10\"},{\"charId\":\"1edf0d34\",\"unicodeChar\":\"𩨂\",\"unicodeCodePoint\":\"29A02\",\"pinYinChars\":[{\"char\":\"CONG1\"}],\"splitChars\":[{\"char\":\"马总\"}],\"weight\":\"10\"},{\"charId\":\"ead371ac\",\"unicodeChar\":\"𩨁\",\"unicodeCodePoint\":\"29A01\",\"pinYinChars\":[{\"char\":\"CHUN3\"}],\"splitChars\":[{\"char\":\"马春\"}],\"weight\":\"10\"},{\"charId\":\"e64b2439\",\"unicodeChar\":\"𩨀\",\"unicodeCodePoint\":\"29A00\",\"pinYinChars\":[{\"char\":\"GE2\"}],\"splitChars\":[{\"char\":\"马曷\"}],\"weight\":\"10\"},{\"charId\":\"d22fe73b\",\"unicodeChar\":\"𩧼\",\"unicodeCodePoint\":\"299FC\",\"pinYinChars\":[{\"char\":\"BEN1\"}],\"splitChars\":[{\"char\":\"马奔\"}],\"weight\":\"10\"},{\"charId\":\"8b2f658c\",\"unicodeChar\":\"𩧴\",\"unicodeCodePoint\":\"299F4\",\"pinYinChars\":[{\"char\":\"QUAN1\"}],\"splitChars\":[{\"char\":\"马全\"}],\"weight\":\"10\"},{\"charId\":\"7d3766f4\",\"unicodeChar\":\"𩧳\",\"unicodeCodePoint\":\"299F3\",\"pinYinChars\":[{\"char\":\"ZHOU1\"}],\"splitChars\":[{\"char\":\"马舟\"}],\"weight\":\"10\"},{\"charId\":\"11f2197d\",\"unicodeChar\":\"𩧲\",\"unicodeCodePoint\":\"299F2\",\"pinYinChars\":[{\"char\":\"DONG4\"}],\"splitChars\":[{\"char\":\"马同\"}],\"weight\":\"10\"},{\"charId\":\"308647d6\",\"unicodeChar\":\"𩧰\",\"unicodeCodePoint\":\"299F0\",\"pinYinChars\":[{\"char\":\"HUN2\"}],\"splitChars\":[{\"char\":\"马军\"}],\"weight\":\"10\"},{\"charId\":\"f98fa083\",\"unicodeChar\":\"𩧭\",\"unicodeCodePoint\":\"299ED\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"马失\"}],\"weight\":\"10\"},{\"charId\":\"77f00d09\",\"unicodeChar\":\"𩧫\",\"unicodeCodePoint\":\"299EB\",\"pinYinChars\":[{\"char\":\"YANG3\"}],\"splitChars\":[{\"char\":\"马央\"}],\"weight\":\"10\"},{\"charId\":\"c61cee5a\",\"unicodeChar\":\"𩧪\",\"unicodeCodePoint\":\"299EA\",\"pinYinChars\":[{\"char\":\"LONG2\"}],\"splitChars\":[{\"char\":\"马龙\"}],\"weight\":\"10\"},{\"charId\":\"f5f7af1d\",\"unicodeChar\":\"𩧢\",\"unicodeCodePoint\":\"299E2\",\"pinYinChars\":[{\"char\":\"CHENG3\"}],\"splitChars\":[{\"char\":\"馬騳\"}],\"weight\":\"10\"},{\"charId\":\"8d7ff4c8\",\"unicodeChar\":\"𩧂\",\"unicodeCodePoint\":\"299C2\",\"pinYinChars\":[{\"char\":\"LI4\"}],\"splitChars\":[{\"char\":\"馬樂\"}],\"weight\":\"10\"},{\"charId\":\"bb8772a0\",\"unicodeChar\":\"𩦐\",\"unicodeCodePoint\":\"29990\",\"pinYinChars\":[{\"char\":\"SHAN4\"}],\"splitChars\":[{\"char\":\"馬善\"}],\"weight\":\"10\"},{\"charId\":\"e7c98a5e\",\"unicodeChar\":\"𩥪\",\"unicodeCodePoint\":\"2996A\",\"pinYinChars\":[{\"char\":\"馬 夆\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"113a77c0\",\"unicodeChar\":\"𩤮\",\"unicodeCodePoint\":\"2992E\",\"pinYinChars\":[{\"char\":\"wei3\"}],\"splitChars\":[{\"char\":\"馬 韋\"}],\"weight\":\"10\"},{\"charId\":\"ab208242\",\"unicodeChar\":\"𩤅\",\"unicodeCodePoint\":\"29905\",\"pinYinChars\":[{\"char\":\"ju4\"}],\"splitChars\":[{\"char\":\"馬 居\"}],\"weight\":\"10\"},{\"charId\":\"1d9d9a18\",\"unicodeChar\":\"𩣑\",\"unicodeCodePoint\":\"298D1\",\"pinYinChars\":[{\"char\":\"AN1\"}],\"splitChars\":[{\"char\":\"馬安\"}],\"weight\":\"10\"},{\"charId\":\"5b6f973f\",\"unicodeChar\":\"𩣌\",\"unicodeCodePoint\":\"298CC\",\"pinYinChars\":[{\"char\":\"QU1\"}],\"splitChars\":[{\"char\":\"馬业馬丱一\"}],\"weight\":\"10\"},{\"charId\":\"11550dd9\",\"unicodeChar\":\"𩣆\",\"unicodeCodePoint\":\"298C6\",\"pinYinChars\":[{\"char\":\"馬羊\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"eea600ae\",\"unicodeChar\":\"𩢤\",\"unicodeCodePoint\":\"298A4\",\"pinYinChars\":[{\"char\":\"馬 玉\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"e36dccda\",\"unicodeChar\":\"𩡐\",\"unicodeCodePoint\":\"29850\",\"pinYinChars\":[{\"char\":\"XIANG1\"}],\"splitChars\":[{\"char\":\"香香\"}],\"weight\":\"10\"},{\"charId\":\"da6ee34c\",\"unicodeChar\":\"𩡄\",\"unicodeCodePoint\":\"29844\",\"pinYinChars\":[{\"char\":\"TAN2\"}],\"splitChars\":[{\"char\":\"香禾\"}],\"weight\":\"10\"},{\"charId\":\"32ef77b4\",\"unicodeChar\":\"𩞦\",\"unicodeCodePoint\":\"297A6\",\"pinYinChars\":[{\"char\":\"CHENG1\"}],\"splitChars\":[{\"char\":\"飠掌\"}],\"weight\":\"10\"},{\"charId\":\"c239ea15\",\"unicodeChar\":\"𩝱\",\"unicodeCodePoint\":\"29771\",\"pinYinChars\":[{\"char\":\"yi4\"}],\"splitChars\":[{\"char\":\"食 益\"}],\"weight\":\"10\"},{\"charId\":\"fb1ef091\",\"unicodeChar\":\"𩙪\",\"unicodeCodePoint\":\"2966A\",\"pinYinChars\":[{\"char\":\"BIAO1\"}],\"splitChars\":[{\"char\":\"风炎\"}],\"weight\":\"10\"},{\"charId\":\"d01f3558\",\"unicodeChar\":\"𩙦\",\"unicodeCodePoint\":\"29666\",\"pinYinChars\":[{\"char\":\"BO2\"}],\"splitChars\":[{\"char\":\"风白\"}],\"weight\":\"10\"},{\"charId\":\"190167e3\",\"unicodeChar\":\"𩗹\",\"unicodeCodePoint\":\"295F9\",\"pinYinChars\":[{\"char\":\"biao1\"}],\"splitChars\":[{\"char\":\"炎 風\"}],\"weight\":\"10\"},{\"charId\":\"a5ca3932\",\"unicodeChar\":\"𩖧\",\"unicodeCodePoint\":\"295A7\",\"pinYinChars\":[{\"char\":\"BIAO1\"}],\"splitChars\":[{\"char\":\"風火\"}],\"weight\":\"10\"},{\"charId\":\"7dd31819\",\"unicodeChar\":\"𩖢\",\"unicodeCodePoint\":\"295A2\",\"pinYinChars\":[{\"char\":\"HONG2\"}],\"splitChars\":[{\"char\":\"風厷\"}],\"weight\":\"10\"},{\"charId\":\"dd8f49cd\",\"unicodeChar\":\"𩖖\",\"unicodeCodePoint\":\"29596\",\"pinYinChars\":[{\"char\":\"TAN2\"}],\"splitChars\":[{\"char\":\"炎页\"}],\"weight\":\"10\"},{\"charId\":\"c7d0eaf4\",\"unicodeChar\":\"𩖏\",\"unicodeCodePoint\":\"2958F\",\"pinYinChars\":[{\"char\":\"BI4\"}],\"splitChars\":[{\"char\":\"頁𩔊\"}],\"weight\":\"10\"},{\"charId\":\"ccf821f6\",\"unicodeChar\":\"𩕟\",\"unicodeCodePoint\":\"2955F\",\"pinYinChars\":[{\"char\":\"E4\"}],\"splitChars\":[{\"char\":\"業頁\"}],\"weight\":\"10\"},{\"charId\":\"2516ef9f\",\"unicodeChar\":\"𩔗\",\"unicodeCodePoint\":\"29517\",\"pinYinChars\":[{\"char\":\"LEI4\"}],\"splitChars\":[{\"char\":\"娄頁\"}],\"weight\":\"10\"},{\"charId\":\"699c2382\",\"unicodeChar\":\"𩓐\",\"unicodeCodePoint\":\"294D0\",\"pinYinChars\":[{\"char\":\"BO2\"}],\"splitChars\":[{\"char\":\"孛頁\"}],\"weight\":\"10\"},{\"charId\":\"5ee75f75\",\"unicodeChar\":\"𩓁\",\"unicodeCodePoint\":\"294C1\",\"pinYinChars\":[{\"char\":\"AO4\"}],\"splitChars\":[{\"char\":\"𫠤頁土方頁\"}],\"weight\":\"10\"},{\"charId\":\"d8324ff9\",\"unicodeChar\":\"𩒗\",\"unicodeCodePoint\":\"29497\",\"pinYinChars\":[{\"char\":\"DONG3\"}],\"splitChars\":[{\"char\":\"同頁\"}],\"weight\":\"10\"},{\"charId\":\"1810f541\",\"unicodeChar\":\"𩐳\",\"unicodeCodePoint\":\"29433\",\"pinYinChars\":[{\"char\":\"yun4\"}],\"splitChars\":[{\"char\":\"音 頁\"}],\"weight\":\"10\"},{\"charId\":\"b00d9123\",\"unicodeChar\":\"𩎸\",\"unicodeCodePoint\":\"293B8\",\"pinYinChars\":[{\"char\":\"QUAN4\"}],\"splitChars\":[{\"char\":\"韋卷\"}],\"weight\":\"10\"},{\"charId\":\"5a112814\",\"unicodeChar\":\"𩎣\",\"unicodeCodePoint\":\"293A3\",\"pinYinChars\":[{\"char\":\"TAO2\"}],\"splitChars\":[{\"char\":\"韋召\"}],\"weight\":\"10\"},{\"charId\":\"a505a2b5\",\"unicodeChar\":\"𩋾\",\"unicodeCodePoint\":\"292FE\",\"pinYinChars\":[{\"char\":\"WEI2\"}],\"splitChars\":[{\"char\":\"革韋\"}],\"weight\":\"10\"},{\"charId\":\"03827e8a\",\"unicodeChar\":\"𩈳\",\"unicodeCodePoint\":\"29233\",\"pinYinChars\":[{\"char\":\"MIAN3\"}],\"splitChars\":[{\"char\":\"面面\"}],\"weight\":\"10\"},{\"charId\":\"b33f7d93\",\"unicodeChar\":\"𩇛\",\"unicodeCodePoint\":\"291DB\",\"pinYinChars\":[{\"char\":\"QING2\"}],\"splitChars\":[{\"char\":\"生青\"}],\"weight\":\"10\"},{\"charId\":\"95246fe0\",\"unicodeChar\":\"𩇙\",\"unicodeCodePoint\":\"291D9\",\"pinYinChars\":[{\"char\":\"ling2\"}],\"splitChars\":[{\"char\":\"青 令\"}],\"weight\":\"10\"},{\"charId\":\"f3b9241b\",\"unicodeChar\":\"𩅣\",\"unicodeCodePoint\":\"29163\",\"pinYinChars\":[{\"char\":\"DUI4\"}],\"splitChars\":[{\"char\":\"雲云云\"}],\"weight\":\"10\"},{\"charId\":\"2e807f22\",\"unicodeChar\":\"𩄄\",\"unicodeCodePoint\":\"29104\",\"pinYinChars\":[{\"char\":\"JI4\"}],\"splitChars\":[{\"char\":\"雨春\"}],\"weight\":\"10\"},{\"charId\":\"f0da6c04\",\"unicodeChar\":\"𩂰\",\"unicodeCodePoint\":\"290B0\",\"pinYinChars\":[{\"char\":\"雨 如\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"c120d5df\",\"unicodeChar\":\"𩂮\",\"unicodeCodePoint\":\"290AE\",\"pinYinChars\":[{\"char\":\"mi3\"}],\"splitChars\":[{\"char\":\"雨米\"}],\"weight\":\"10\"},{\"charId\":\"d471fd5d\",\"unicodeChar\":\"𩂉\",\"unicodeCodePoint\":\"29089\",\"pinYinChars\":[{\"char\":\"XU1\"}],\"splitChars\":[{\"char\":\"雨天\"}],\"weight\":\"10\"},{\"charId\":\"1812edf9\",\"unicodeChar\":\"𩁻\",\"unicodeCodePoint\":\"2907B\",\"pinYinChars\":[{\"char\":\"LING2\"}],\"splitChars\":[{\"char\":\"雨女\"}],\"weight\":\"10\"},{\"charId\":\"0025e8a5\",\"unicodeChar\":\"𩁸\",\"unicodeCodePoint\":\"29078\",\"pinYinChars\":[{\"char\":\"ji1\"}],\"splitChars\":[{\"char\":\"雨 几\"}],\"weight\":\"10\"},{\"charId\":\"82f249d4\",\"unicodeChar\":\"𨾷\",\"unicodeCodePoint\":\"28FB7\",\"pinYinChars\":[{\"char\":\"XIAN3\"}],\"splitChars\":[{\"char\":\"先隹\"}],\"weight\":\"10\"},{\"charId\":\"78a7b825\",\"unicodeChar\":\"𨺽\",\"unicodeCodePoint\":\"28EBD\",\"pinYinChars\":[{\"char\":\"DUAN4\"}],\"splitChars\":[{\"char\":\"阝叚\"}],\"weight\":\"10\"},{\"charId\":\"201e44c6\",\"unicodeChar\":\"𨺋\",\"unicodeCodePoint\":\"28E8B\",\"pinYinChars\":[{\"char\":\"wan3\"}],\"splitChars\":[{\"char\":\"阝 宛\"}],\"weight\":\"10\"},{\"charId\":\"4cf377bb\",\"unicodeChar\":\"𨹫\",\"unicodeCodePoint\":\"28E6B\",\"pinYinChars\":[{\"char\":\"LEI3\"}],\"splitChars\":[{\"char\":\"阝坐\"}],\"weight\":\"10\"},{\"charId\":\"dd0d95aa\",\"unicodeChar\":\"𨹂\",\"unicodeCodePoint\":\"28E42\",\"pinYinChars\":[{\"char\":\"GUANG1\"}],\"splitChars\":[{\"char\":\"阝光\"}],\"weight\":\"10\"},{\"charId\":\"13a0bc2f\",\"unicodeChar\":\"𨸬\",\"unicodeCodePoint\":\"28E2C\",\"pinYinChars\":[{\"char\":\"CHEN2\"}],\"splitChars\":[{\"char\":\"阝申\"}],\"weight\":\"10\"},{\"charId\":\"1566d5ef\",\"unicodeChar\":\"𨸖\",\"unicodeCodePoint\":\"28E16\",\"pinYinChars\":[{\"char\":\"HONG2\"}],\"splitChars\":[{\"char\":\"阝工\"}],\"weight\":\"10\"},{\"charId\":\"a95c5d7a\",\"unicodeChar\":\"𨸁\",\"unicodeCodePoint\":\"28E01\",\"pinYinChars\":[{\"char\":\"TING3\"}],\"splitChars\":[{\"char\":\"门亡\"}],\"weight\":\"10\"},{\"charId\":\"ca92a4cb\",\"unicodeChar\":\"𨱓\",\"unicodeCodePoint\":\"28C53\",\"pinYinChars\":[{\"char\":\"JIAO1\"}],\"splitChars\":[{\"char\":\"钅焦\"}],\"weight\":\"10\"},{\"charId\":\"d8150258\",\"unicodeChar\":\"𨱍\",\"unicodeCodePoint\":\"28C4D\",\"pinYinChars\":[{\"char\":\"LUO3\"}],\"splitChars\":[{\"char\":\"钅郎\"}],\"weight\":\"10\"},{\"charId\":\"3414249e\",\"unicodeChar\":\"𨱋\",\"unicodeCodePoint\":\"28C4B\",\"pinYinChars\":[{\"char\":\"LING2\"}],\"splitChars\":[{\"char\":\"钅夌\"}],\"weight\":\"10\"},{\"charId\":\"b48d0557\",\"unicodeChar\":\"𨱉\",\"unicodeCodePoint\":\"28C49\",\"pinYinChars\":[{\"char\":\"LIANG4\"}],\"splitChars\":[{\"char\":\"钅京\"}],\"weight\":\"10\"},{\"charId\":\"788af2e8\",\"unicodeChar\":\"𨱆\",\"unicodeCodePoint\":\"28C46\",\"pinYinChars\":[{\"char\":\"wu4\"}],\"splitChars\":[{\"char\":\"钅 戊\"}],\"weight\":\"10\"},{\"charId\":\"a397e2c9\",\"unicodeChar\":\"𨱅\",\"unicodeCodePoint\":\"28C45\",\"pinYinChars\":[{\"char\":\"ZHEN1\"}],\"splitChars\":[{\"char\":\"钅㐱\"}],\"weight\":\"10\"},{\"charId\":\"be9b69f3\",\"unicodeChar\":\"𨰦\",\"unicodeCodePoint\":\"28C26\",\"pinYinChars\":[{\"char\":\"BAO3\"}],\"splitChars\":[{\"char\":\"金寳\"}],\"weight\":\"10\"},{\"charId\":\"8b86da92\",\"unicodeChar\":\"𨫼\",\"unicodeCodePoint\":\"28AFC\",\"pinYinChars\":[{\"char\":\"AO4\"}],\"splitChars\":[{\"char\":\"金敖\"}],\"weight\":\"10\"},{\"charId\":\"24d33dd2\",\"unicodeChar\":\"𨫟\",\"unicodeCodePoint\":\"28ADF\",\"pinYinChars\":[{\"char\":\"金 梁\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"79fb8456\",\"unicodeChar\":\"𨩉\",\"unicodeCodePoint\":\"28A49\",\"pinYinChars\":[{\"char\":\"金 奂\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"02c71d7a\",\"unicodeChar\":\"𨧿\",\"unicodeCodePoint\":\"289FF\",\"pinYinChars\":[{\"char\":\"ying2\"}],\"splitChars\":[{\"char\":\"火 金\"}],\"weight\":\"10\"},{\"charId\":\"9d77ba9c\",\"unicodeChar\":\"𨧸\",\"unicodeCodePoint\":\"289F8\",\"pinYinChars\":[{\"char\":\"pan4\"}],\"splitChars\":[{\"char\":\"板金\"}],\"weight\":\"10\"},{\"charId\":\"16366abc\",\"unicodeChar\":\"𨦠\",\"unicodeCodePoint\":\"289A0\",\"pinYinChars\":[{\"char\":\"ZI1\"}],\"splitChars\":[{\"char\":\"次金\"}],\"weight\":\"10\"},{\"charId\":\"3f471af8\",\"unicodeChar\":\"𨥽\",\"unicodeCodePoint\":\"2897D\",\"pinYinChars\":[{\"char\":\"xing2\"},{\"char\":\"jian1\"}],\"splitChars\":[{\"char\":\"金冋\"}],\"weight\":\"10\"},{\"charId\":\"c72d1aa2\",\"unicodeChar\":\"𨥨\",\"unicodeCodePoint\":\"28968\",\"pinYinChars\":[{\"char\":\"MAO2\"}],\"splitChars\":[{\"char\":\"金矛\"}],\"weight\":\"10\"},{\"charId\":\"a15de9fb\",\"unicodeChar\":\"𨥒\",\"unicodeCodePoint\":\"28952\",\"pinYinChars\":[{\"char\":\"JUN1\"}],\"splitChars\":[{\"char\":\"匀金勻金\"}],\"weight\":\"10\"},{\"charId\":\"97dd9eb6\",\"unicodeChar\":\"𨤍\",\"unicodeCodePoint\":\"2890D\",\"pinYinChars\":[{\"char\":\"ling2\"}],\"splitChars\":[{\"char\":\"酉 靈\"}],\"weight\":\"10\"},{\"charId\":\"090e5206\",\"unicodeChar\":\"𨢤\",\"unicodeCodePoint\":\"288A4\",\"pinYinChars\":[{\"char\":\"HU2\"}],\"splitChars\":[{\"char\":\"殸酉\"}],\"weight\":\"10\"},{\"charId\":\"2aeafc8e\",\"unicodeChar\":\"𨠫\",\"unicodeCodePoint\":\"2882B\",\"pinYinChars\":[{\"char\":\"酋 尤\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"c8dd01c0\",\"unicodeChar\":\"𨠠\",\"unicodeCodePoint\":\"28820\",\"pinYinChars\":[{\"char\":\"TI3\"}],\"splitChars\":[{\"char\":\"酉生\"}],\"weight\":\"10\"},{\"charId\":\"59ec5474\",\"unicodeChar\":\"𨠄\",\"unicodeCodePoint\":\"28804\",\"pinYinChars\":[{\"char\":\"酉 尤\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"28d53293\",\"unicodeChar\":\"𨞹\",\"unicodeCodePoint\":\"287B9\",\"pinYinChars\":[{\"char\":\"BIN1\"}],\"splitChars\":[{\"char\":\"𧇃阝\"}],\"weight\":\"10\"},{\"charId\":\"9732508a\",\"unicodeChar\":\"𨝗\",\"unicodeCodePoint\":\"28757\",\"pinYinChars\":[{\"char\":\"SHANG1\"}],\"splitChars\":[{\"char\":\"商阝\"}],\"weight\":\"10\"},{\"charId\":\"9b2e761c\",\"unicodeChar\":\"𨛁\",\"unicodeCodePoint\":\"286C1\",\"pinYinChars\":[{\"char\":\"BANG1\"}],\"splitChars\":[{\"char\":\"羊阝\"}],\"weight\":\"10\"},{\"charId\":\"c7e00f7f\",\"unicodeChar\":\"𨚓\",\"unicodeCodePoint\":\"28693\",\"pinYinChars\":[{\"char\":\"FU2\"}],\"splitChars\":[{\"char\":\"弗阝\"}],\"weight\":\"10\"},{\"charId\":\"66cd2614\",\"unicodeChar\":\"𨗄\",\"unicodeCodePoint\":\"285C4\",\"pinYinChars\":[{\"char\":\"LIN4\"}],\"splitChars\":[{\"char\":\"辶焱\"}],\"weight\":\"10\"},{\"charId\":\"ab6922f9\",\"unicodeChar\":\"𨖴\",\"unicodeCodePoint\":\"285B4\",\"pinYinChars\":[{\"char\":\"WU3\"}],\"splitChars\":[{\"char\":\"辶無\"}],\"weight\":\"10\"},{\"charId\":\"f76531ee\",\"unicodeChar\":\"𨕱\",\"unicodeCodePoint\":\"28571\",\"pinYinChars\":[{\"char\":\"feng1\"}],\"splitChars\":[{\"char\":\"辶 峯\"}],\"weight\":\"10\"},{\"charId\":\"9cc8aa27\",\"unicodeChar\":\"𨕅\",\"unicodeCodePoint\":\"28545\",\"pinYinChars\":[{\"char\":\"yin1\"}],\"splitChars\":[{\"char\":\"辶 土\"}],\"weight\":\"10\"},{\"charId\":\"0d195ef5\",\"unicodeChar\":\"𨔝\",\"unicodeCodePoint\":\"2851D\",\"pinYinChars\":[{\"char\":\"DONG4\"}],\"splitChars\":[{\"char\":\"辶重\"}],\"weight\":\"10\"},{\"charId\":\"a7838504\",\"unicodeChar\":\"𨔛\",\"unicodeCodePoint\":\"2851B\",\"pinYinChars\":[{\"char\":\"TI1\"}],\"splitChars\":[{\"char\":\"辶虎\"}],\"weight\":\"10\"},{\"charId\":\"f39313c0\",\"unicodeChar\":\"𨓦\",\"unicodeCodePoint\":\"284E6\",\"pinYinChars\":[{\"char\":\"LI3\"}],\"splitChars\":[{\"char\":\"辶里\"}],\"weight\":\"10\"},{\"charId\":\"6a923067\",\"unicodeChar\":\"𨒿\",\"unicodeCodePoint\":\"284BF\",\"pinYinChars\":[{\"char\":\"QIAN1\"}],\"splitChars\":[{\"char\":\"辶覀\"}],\"weight\":\"10\"},{\"charId\":\"fd44eaf0\",\"unicodeChar\":\"𨒗\",\"unicodeCodePoint\":\"28497\",\"pinYinChars\":[{\"char\":\"yong4\"}],\"splitChars\":[{\"char\":\"辶用\"}],\"weight\":\"10\"},{\"charId\":\"52d45145\",\"unicodeChar\":\"𨑸\",\"unicodeCodePoint\":\"28478\",\"pinYinChars\":[{\"char\":\"ER3\"}],\"splitChars\":[{\"char\":\"辶介\"}],\"weight\":\"10\"},{\"charId\":\"73c4df49\",\"unicodeChar\":\"𨑳\",\"unicodeCodePoint\":\"28473\",\"pinYinChars\":[{\"char\":\"wang4\"},{\"char\":\"kuang1\"},{\"char\":\"ting2\"}],\"splitChars\":[{\"char\":\"辶 壬\"}],\"weight\":\"10\"},{\"charId\":\"5914d3c0\",\"unicodeChar\":\"𨑧\",\"unicodeCodePoint\":\"28467\",\"pinYinChars\":[{\"char\":\"TUI4\"}],\"splitChars\":[{\"char\":\"辶内辶內\"}],\"weight\":\"10\"},{\"charId\":\"a9bbf2f7\",\"unicodeChar\":\"𨑙\",\"unicodeCodePoint\":\"28459\",\"pinYinChars\":[{\"char\":\"fan2\"}],\"splitChars\":[{\"char\":\"辶凡\"}],\"weight\":\"10\"},{\"charId\":\"6d0a624d\",\"unicodeChar\":\"𨑒\",\"unicodeCodePoint\":\"28452\",\"pinYinChars\":[{\"char\":\"TU2\"}],\"splitChars\":[{\"char\":\"辶土\"}],\"weight\":\"10\"},{\"charId\":\"1f836aed\",\"unicodeChar\":\"𨑍\",\"unicodeCodePoint\":\"2844D\",\"pinYinChars\":[{\"char\":\"GUI3\"}],\"splitChars\":[{\"char\":\"辶九\"}],\"weight\":\"10\"},{\"charId\":\"a78ddd43\",\"unicodeChar\":\"𨐚\",\"unicodeCodePoint\":\"2841A\",\"pinYinChars\":[{\"char\":\"qun2\"}],\"splitChars\":[{\"char\":\"君 辛\"}],\"weight\":\"10\"},{\"charId\":\"7a9e6bdf\",\"unicodeChar\":\"𨐇\",\"unicodeCodePoint\":\"28407\",\"pinYinChars\":[{\"char\":\"LONG2\"}],\"splitChars\":[{\"char\":\"车龙\"}],\"weight\":\"10\"},{\"charId\":\"5a401b86\",\"unicodeChar\":\"𨉣\",\"unicodeCodePoint\":\"28263\",\"pinYinChars\":[{\"char\":\"HA1\"}],\"splitChars\":[{\"char\":\"身叚\"}],\"weight\":\"10\"},{\"charId\":\"2181692d\",\"unicodeChar\":\"𨈒\",\"unicodeCodePoint\":\"28212\",\"pinYinChars\":[{\"char\":\"身卜\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"ecade918\",\"unicodeChar\":\"𨆢\",\"unicodeCodePoint\":\"281A2\",\"pinYinChars\":[{\"char\":\"足 雷\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"5aa74b32\",\"unicodeChar\":\"𨂂\",\"unicodeCodePoint\":\"28082\",\"pinYinChars\":[{\"char\":\"ZHI2\"}],\"splitChars\":[{\"char\":\"𧾷炙\"}],\"weight\":\"10\"},{\"charId\":\"d44a983a\",\"unicodeChar\":\"𨀍\",\"unicodeCodePoint\":\"2800D\",\"pinYinChars\":[{\"char\":\"YONG1\"},{\"char\":\"LA2\"}],\"splitChars\":[{\"char\":\"𧾷用\"}],\"weight\":\"10\"},{\"charId\":\"c4e8c9a5\",\"unicodeChar\":\"𨀁\",\"unicodeCodePoint\":\"28001\",\"pinYinChars\":[{\"char\":\"LONG2\"}],\"splitChars\":[{\"char\":\"𧾷龙\"}],\"weight\":\"10\"},{\"charId\":\"b8c14d36\",\"unicodeChar\":\"𧿬\",\"unicodeCodePoint\":\"27FEC\",\"pinYinChars\":[{\"char\":\"dun1\"}],\"splitChars\":[{\"char\":\"𧾷屯\"}],\"weight\":\"10\"},{\"charId\":\"39657892\",\"unicodeChar\":\"𧿛\",\"unicodeCodePoint\":\"27FDB\",\"pinYinChars\":[{\"char\":\"ZONG1\"}],\"splitChars\":[{\"char\":\"𧾷从\"}],\"weight\":\"10\"},{\"charId\":\"3c49d661\",\"unicodeChar\":\"𧿈\",\"unicodeCodePoint\":\"27FC8\",\"pinYinChars\":[{\"char\":\"KUANG4\"}],\"splitChars\":[{\"char\":\"𧾷广\"}],\"weight\":\"10\"},{\"charId\":\"05486ec3\",\"unicodeChar\":\"𧽘\",\"unicodeCodePoint\":\"27F58\",\"pinYinChars\":[{\"char\":\"ru4\"}],\"splitChars\":[{\"char\":\"走 辱\"}],\"weight\":\"10\"},{\"charId\":\"19015dad\",\"unicodeChar\":\"𧻉\",\"unicodeCodePoint\":\"27EC9\",\"pinYinChars\":[{\"char\":\"you4\"}],\"splitChars\":[{\"char\":\"走 由\"}],\"weight\":\"10\"},{\"charId\":\"ea75741e\",\"unicodeChar\":\"𧺴\",\"unicodeCodePoint\":\"27EB4\",\"pinYinChars\":[{\"char\":\"WU3\"}],\"splitChars\":[{\"char\":\"走午\"}],\"weight\":\"10\"},{\"charId\":\"d9b39aac\",\"unicodeChar\":\"𧺌\",\"unicodeCodePoint\":\"27E8C\",\"pinYinChars\":[{\"char\":\"ru4\"}],\"splitChars\":[{\"char\":\"走入\"}],\"weight\":\"10\"},{\"charId\":\"b8335ea4\",\"unicodeChar\":\"𧹜\",\"unicodeCodePoint\":\"27E5C\",\"pinYinChars\":[{\"char\":\"nan3\"}],\"splitChars\":[{\"char\":\"赤 及\"}],\"weight\":\"10\"},{\"charId\":\"dcb3973c\",\"unicodeChar\":\"𧹗\",\"unicodeCodePoint\":\"27E57\",\"pinYinChars\":[{\"char\":\"WAN4\"}],\"splitChars\":[{\"char\":\"贝患\"}],\"weight\":\"10\"},{\"charId\":\"1e951de1\",\"unicodeChar\":\"𧹒\",\"unicodeCodePoint\":\"27E52\",\"pinYinChars\":[{\"char\":\"MAAI5\"}],\"splitChars\":[{\"char\":\"罒贝\"}],\"weight\":\"10\"},{\"charId\":\"3bb6379e\",\"unicodeChar\":\"𧸩\",\"unicodeCodePoint\":\"27E29\",\"pinYinChars\":[{\"char\":\"XUN4\"}],\"splitChars\":[{\"char\":\"貝𥈠\"}],\"weight\":\"10\"},{\"charId\":\"c988aec4\",\"unicodeChar\":\"𧵏\",\"unicodeCodePoint\":\"27D4F\",\"pinYinChars\":[{\"char\":\"SHAN3\"}],\"splitChars\":[{\"char\":\"外貝\"}],\"weight\":\"10\"},{\"charId\":\"b51ca582\",\"unicodeChar\":\"𧴭\",\"unicodeCodePoint\":\"27D2D\",\"pinYinChars\":[{\"char\":\"SHAN3\"}],\"splitChars\":[{\"char\":\"彡貝\"}],\"weight\":\"10\"},{\"charId\":\"9e43d82d\",\"unicodeChar\":\"𧳓\",\"unicodeCodePoint\":\"27CD3\",\"pinYinChars\":[{\"char\":\"mao4\"},{\"char\":\"lang2\"}],\"splitChars\":[{\"char\":\"豸良\"}],\"weight\":\"10\"},{\"charId\":\"5cbf9e8f\",\"unicodeChar\":\"𧲣\",\"unicodeCodePoint\":\"27CA3\",\"pinYinChars\":[{\"char\":\"cai2\"}],\"splitChars\":[{\"char\":\"豸寸\"}],\"weight\":\"10\"},{\"charId\":\"1e9d5e35\",\"unicodeChar\":\"𧯸\",\"unicodeCodePoint\":\"27BF8\",\"pinYinChars\":[{\"char\":\"GU3\"}],\"splitChars\":[{\"char\":\"壹殳\"}],\"weight\":\"10\"},{\"charId\":\"6d9fb292\",\"unicodeChar\":\"𧯙\",\"unicodeCodePoint\":\"27BD9\",\"pinYinChars\":[{\"char\":\"LING2\"}],\"splitChars\":[{\"char\":\"谷靈\"}],\"weight\":\"10\"},{\"charId\":\"b9629b59\",\"unicodeChar\":\"𧮲\",\"unicodeCodePoint\":\"27BB2\",\"pinYinChars\":[{\"char\":\"YAN3\"}],\"splitChars\":[{\"char\":\"⺊冖谷\"}],\"weight\":\"10\"},{\"charId\":\"bec25a7e\",\"unicodeChar\":\"𧮢\",\"unicodeCodePoint\":\"27BA2\",\"pinYinChars\":[{\"char\":\"LEI3\"}],\"splitChars\":[{\"char\":\"言纍\"}],\"weight\":\"10\"},{\"charId\":\"f90b9d3b\",\"unicodeChar\":\"𧭛\",\"unicodeCodePoint\":\"27B5B\",\"pinYinChars\":[{\"char\":\"TA4\"}],\"splitChars\":[{\"char\":\"言誩\"}],\"weight\":\"10\"},{\"charId\":\"6c7f482b\",\"unicodeChar\":\"𧭙\",\"unicodeCodePoint\":\"27B59\",\"pinYinChars\":[{\"char\":\"meng2\"}],\"splitChars\":[{\"char\":\"言 豕\"}],\"weight\":\"10\"},{\"charId\":\"0b80636e\",\"unicodeChar\":\"𧬸\",\"unicodeCodePoint\":\"27B38\",\"pinYinChars\":[{\"char\":\"言 誊\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"3e07c573\",\"unicodeChar\":\"𧬤\",\"unicodeCodePoint\":\"27B24\",\"pinYinChars\":[{\"char\":\"ZHONG4\"}],\"splitChars\":[{\"char\":\"言童\"}],\"weight\":\"10\"},{\"charId\":\"05c911af\",\"unicodeChar\":\"𧬁\",\"unicodeCodePoint\":\"27B01\",\"pinYinChars\":[{\"char\":\"HAO4\"}],\"splitChars\":[{\"char\":\"言臯\"}],\"weight\":\"10\"},{\"charId\":\"8e74d3ff\",\"unicodeChar\":\"𧫦\",\"unicodeCodePoint\":\"27AE6\",\"pinYinChars\":[{\"char\":\"YI1\"}],\"splitChars\":[{\"char\":\"殹言\"}],\"weight\":\"10\"},{\"charId\":\"5a422eb2\",\"unicodeChar\":\"𧫙\",\"unicodeCodePoint\":\"27AD9\",\"pinYinChars\":[{\"char\":\"JING4\"}],\"splitChars\":[{\"char\":\"言竟\"}],\"weight\":\"10\"},{\"charId\":\"cff09d2d\",\"unicodeChar\":\"𧪽\",\"unicodeCodePoint\":\"27ABD\",\"pinYinChars\":[{\"char\":\"言 晋\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"9d029687\",\"unicodeChar\":\"𧪼\",\"unicodeCodePoint\":\"27ABC\",\"pinYinChars\":[{\"char\":\"yun4\"}],\"splitChars\":[{\"char\":\"言員\"}],\"weight\":\"10\"},{\"charId\":\"536a829f\",\"unicodeChar\":\"𧪙\",\"unicodeCodePoint\":\"27A99\",\"pinYinChars\":[{\"char\":\"AN2\"}],\"splitChars\":[{\"char\":\"言峲\"}],\"weight\":\"10\"},{\"charId\":\"e475f5a0\",\"unicodeChar\":\"𧪏\",\"unicodeCodePoint\":\"27A8F\",\"pinYinChars\":[{\"char\":\"wei1\"}],\"splitChars\":[{\"char\":\"言 畏\"}],\"weight\":\"10\"},{\"charId\":\"a89cd78a\",\"unicodeChar\":\"𧪍\",\"unicodeCodePoint\":\"27A8D\",\"pinYinChars\":[{\"char\":\"wen1\"}],\"splitChars\":[{\"char\":\"言昷\"}],\"weight\":\"10\"},{\"charId\":\"d0b5a717\",\"unicodeChar\":\"𧪄\",\"unicodeCodePoint\":\"27A84\",\"pinYinChars\":[{\"char\":\"XUN4\"}],\"splitChars\":[{\"char\":\"言信\"}],\"weight\":\"10\"},{\"charId\":\"e5f18c7d\",\"unicodeChar\":\"𧧹\",\"unicodeCodePoint\":\"279F9\",\"pinYinChars\":[{\"char\":\"XI4\"}],\"splitChars\":[{\"char\":\"亻只言\"}],\"weight\":\"10\"},{\"charId\":\"f64e21fa\",\"unicodeChar\":\"𧦬\",\"unicodeCodePoint\":\"279AC\",\"pinYinChars\":[{\"char\":\"BIAN4\"}],\"splitChars\":[{\"char\":\"工几言\"}],\"weight\":\"10\"},{\"charId\":\"1b73c51e\",\"unicodeChar\":\"𧦥\",\"unicodeCodePoint\":\"279A5\",\"pinYinChars\":[{\"char\":\"MOU2\"}],\"splitChars\":[{\"char\":\"母言\"}],\"weight\":\"10\"},{\"charId\":\"4e51fbbc\",\"unicodeChar\":\"𧦉\",\"unicodeCodePoint\":\"27989\",\"pinYinChars\":[{\"char\":\"gai4\"}],\"splitChars\":[{\"char\":\"言 丐\"}],\"weight\":\"10\"},{\"charId\":\"4332ef2f\",\"unicodeChar\":\"𧥿\",\"unicodeCodePoint\":\"2797F\",\"pinYinChars\":[{\"char\":\"XUN4\"}],\"splitChars\":[{\"char\":\"水言\"}],\"weight\":\"10\"},{\"charId\":\"b04ec1fa\",\"unicodeChar\":\"𧤤\",\"unicodeCodePoint\":\"27924\",\"pinYinChars\":[{\"char\":\"XI1\"}],\"splitChars\":[{\"char\":\"角隽\"}],\"weight\":\"10\"},{\"charId\":\"a0dd6c21\",\"unicodeChar\":\"𧣾\",\"unicodeCodePoint\":\"278FE\",\"pinYinChars\":[{\"char\":\"ZHI4\"}],\"splitChars\":[{\"char\":\"角虎\"}],\"weight\":\"10\"},{\"charId\":\"817348ee\",\"unicodeChar\":\"𧢌\",\"unicodeCodePoint\":\"2788C\",\"pinYinChars\":[{\"char\":\"GAO1\"}],\"splitChars\":[{\"char\":\"臯見\"}],\"weight\":\"10\"},{\"charId\":\"e6887cfe\",\"unicodeChar\":\"𧟪\",\"unicodeCodePoint\":\"277EA\",\"pinYinChars\":[{\"char\":\"ZHEN1\"}],\"splitChars\":[{\"char\":\"覀玉西玉\"}],\"weight\":\"10\"},{\"charId\":\"cd02800e\",\"unicodeChar\":\"𧟑\",\"unicodeCodePoint\":\"277D1\",\"pinYinChars\":[{\"char\":\"QIAN1\"}],\"splitChars\":[{\"char\":\"衤騫\"}],\"weight\":\"10\"},{\"charId\":\"08d0e640\",\"unicodeChar\":\"𧝈\",\"unicodeCodePoint\":\"27748\",\"pinYinChars\":[{\"char\":\"JIAO3\"}],\"splitChars\":[{\"char\":\"衤焦\"}],\"weight\":\"10\"},{\"charId\":\"e85e0221\",\"unicodeChar\":\"𧜖\",\"unicodeCodePoint\":\"27716\",\"pinYinChars\":[{\"char\":\"chan3\"}],\"splitChars\":[{\"char\":\"衤真\"}],\"weight\":\"10\"},{\"charId\":\"c3f9fc71\",\"unicodeChar\":\"𧜀\",\"unicodeCodePoint\":\"27700\",\"pinYinChars\":[{\"char\":\"MI4\"}],\"splitChars\":[{\"char\":\"衤冥\"}],\"weight\":\"10\"},{\"charId\":\"e925762b\",\"unicodeChar\":\"𧛱\",\"unicodeCodePoint\":\"276F1\",\"pinYinChars\":[{\"char\":\"bao1\"}],\"splitChars\":[{\"char\":\"保衣\"}],\"weight\":\"10\"},{\"charId\":\"003d79d3\",\"unicodeChar\":\"𧛑\",\"unicodeCodePoint\":\"276D1\",\"pinYinChars\":[{\"char\":\"YIN1\"}],\"splitChars\":[{\"char\":\"衤垔\"}],\"weight\":\"10\"},{\"charId\":\"c5b1c9e4\",\"unicodeChar\":\"𧚮\",\"unicodeCodePoint\":\"276AE\",\"pinYinChars\":[{\"char\":\"DIAO3\"}],\"splitChars\":[{\"char\":\"衤隹\"}],\"weight\":\"10\"},{\"charId\":\"0bd3c4e7\",\"unicodeChar\":\"𧚥\",\"unicodeCodePoint\":\"276A5\",\"pinYinChars\":[{\"char\":\"CUI4\"}],\"splitChars\":[{\"char\":\"衤取\"}],\"weight\":\"10\"},{\"charId\":\"5b8b1eef\",\"unicodeChar\":\"𧚄\",\"unicodeCodePoint\":\"27684\",\"pinYinChars\":[{\"char\":\"E2\"}],\"splitChars\":[{\"char\":\"衤我\"}],\"weight\":\"10\"},{\"charId\":\"912453c6\",\"unicodeChar\":\"𧙿\",\"unicodeCodePoint\":\"2767F\",\"pinYinChars\":[{\"char\":\"lv3\"},{\"char\":\"yi1\"}],\"splitChars\":[{\"char\":\"衤衣\"}],\"weight\":\"10\"},{\"charId\":\"d9eae094\",\"unicodeChar\":\"𧙪\",\"unicodeCodePoint\":\"2766A\",\"pinYinChars\":[{\"char\":\"HUAI2\"}],\"splitChars\":[{\"char\":\"㐭𧘇\"}],\"weight\":\"10\"},{\"charId\":\"e8abc3ac\",\"unicodeChar\":\"𧙟\",\"unicodeCodePoint\":\"2765F\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"衤曳\"}],\"weight\":\"10\"},{\"charId\":\"c2762f3f\",\"unicodeChar\":\"𧙗\",\"unicodeCodePoint\":\"27657\",\"pinYinChars\":[{\"char\":\"tuo1\"}],\"splitChars\":[{\"char\":\"衤右\"}],\"weight\":\"10\"},{\"charId\":\"d30d9643\",\"unicodeChar\":\"𧙓\",\"unicodeCodePoint\":\"27653\",\"pinYinChars\":[{\"char\":\"zuo4\"}],\"splitChars\":[{\"char\":\"衤乍\"}],\"weight\":\"10\"},{\"charId\":\"b71322f4\",\"unicodeChar\":\"𧘣\",\"unicodeCodePoint\":\"27623\",\"pinYinChars\":[{\"char\":\"ZHU1\"}],\"splitChars\":[{\"char\":\"衤殳\"}],\"weight\":\"10\"},{\"charId\":\"7956a532\",\"unicodeChar\":\"𧘌\",\"unicodeCodePoint\":\"2760C\",\"pinYinChars\":[{\"char\":\"衤 乃\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"997e8f91\",\"unicodeChar\":\"𧘋\",\"unicodeCodePoint\":\"2760B\",\"pinYinChars\":[{\"char\":\"PAN4\"}],\"splitChars\":[{\"char\":\"衤八\"}],\"weight\":\"10\"},{\"charId\":\"2f08c8a1\",\"unicodeChar\":\"𧗪\",\"unicodeCodePoint\":\"275EA\",\"pinYinChars\":[{\"char\":\"YU4\"}],\"splitChars\":[{\"char\":\"征亍\"}],\"weight\":\"10\"},{\"charId\":\"dba36dfc\",\"unicodeChar\":\"𧗤\",\"unicodeCodePoint\":\"275E4\",\"pinYinChars\":[{\"char\":\"kan4\"}],\"splitChars\":[{\"char\":\"行 千\"}],\"weight\":\"10\"},{\"charId\":\"9d6e8e90\",\"unicodeChar\":\"𧗝\",\"unicodeCodePoint\":\"275DD\",\"pinYinChars\":[{\"char\":\"GUI3\"}],\"splitChars\":[{\"char\":\"彳九亍\"}],\"weight\":\"10\"},{\"charId\":\"d2fd12ce\",\"unicodeChar\":\"𧒌\",\"unicodeCodePoint\":\"2748C\",\"pinYinChars\":[{\"char\":\"虫路\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"0e02d532\",\"unicodeChar\":\"𧐡\",\"unicodeCodePoint\":\"27421\",\"pinYinChars\":[{\"char\":\"hu2\"},{\"char\":\"ao2\"}],\"splitChars\":[{\"char\":\"殸虫\"}],\"weight\":\"10\"},{\"charId\":\"3858bceb\",\"unicodeChar\":\"𧋨\",\"unicodeCodePoint\":\"272E8\",\"pinYinChars\":[{\"char\":\"tu2\"}],\"splitChars\":[{\"char\":\"虫走\"}],\"weight\":\"10\"},{\"charId\":\"12ec84eb\",\"unicodeChar\":\"𧋄\",\"unicodeCodePoint\":\"272C4\",\"pinYinChars\":[{\"char\":\"qiong2\"}],\"splitChars\":[{\"char\":\"虫共\"}],\"weight\":\"10\"},{\"charId\":\"e77751cf\",\"unicodeChar\":\"𧊐\",\"unicodeCodePoint\":\"27290\",\"pinYinChars\":[{\"char\":\"LV4\"}],\"splitChars\":[{\"char\":\"虫聿\"}],\"weight\":\"10\"},{\"charId\":\"f8f5b4ad\",\"unicodeChar\":\"𧉼\",\"unicodeCodePoint\":\"2727C\",\"pinYinChars\":[{\"char\":\"li4\"}],\"splitChars\":[{\"char\":\"虫立\"}],\"weight\":\"10\"},{\"charId\":\"eafa00ec\",\"unicodeChar\":\"𧈹\",\"unicodeCodePoint\":\"27239\",\"pinYinChars\":[{\"char\":\"ZAO3\"}],\"splitChars\":[{\"char\":\"大虫\"}],\"weight\":\"10\"},{\"charId\":\"8323333a\",\"unicodeChar\":\"𧈳\",\"unicodeCodePoint\":\"27233\",\"pinYinChars\":[{\"char\":\"yin3\"}],\"splitChars\":[{\"char\":\"虫刃\"}],\"weight\":\"10\"},{\"charId\":\"7b7108a1\",\"unicodeChar\":\"𧈮\",\"unicodeCodePoint\":\"2722E\",\"pinYinChars\":[{\"char\":\"YUAN2\"}],\"splitChars\":[{\"char\":\"虫丸\"}],\"weight\":\"10\"},{\"charId\":\"6793c17c\",\"unicodeChar\":\"𧈫\",\"unicodeCodePoint\":\"2722B\",\"pinYinChars\":[{\"char\":\"HONG2\"}],\"splitChars\":[{\"char\":\"工虫\"}],\"weight\":\"10\"},{\"charId\":\"e0af74a3\",\"unicodeChar\":\"𧅥\",\"unicodeCodePoint\":\"27165\",\"pinYinChars\":[{\"char\":\"艹 馨\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"6c2c2d34\",\"unicodeChar\":\"𧄧\",\"unicodeCodePoint\":\"27127\",\"pinYinChars\":[{\"char\":\"yun4\"}],\"splitChars\":[{\"char\":\"艹 昷\"}],\"weight\":\"10\"},{\"charId\":\"c9cc4600\",\"unicodeChar\":\"𧄦\",\"unicodeCodePoint\":\"27126\",\"pinYinChars\":[{\"char\":\"fu4\"}],\"splitChars\":[{\"char\":\"艹 馥\"}],\"weight\":\"10\"},{\"charId\":\"39869d85\",\"unicodeChar\":\"𧄉\",\"unicodeCodePoint\":\"27109\",\"pinYinChars\":[{\"char\":\"zong3\"}],\"splitChars\":[{\"char\":\"艹 总\"}],\"weight\":\"10\"},{\"charId\":\"8a64e447\",\"unicodeChar\":\"𧃲\",\"unicodeCodePoint\":\"270F2\",\"pinYinChars\":[{\"char\":\"MI2\"}],\"splitChars\":[{\"char\":\"艹糜\"}],\"weight\":\"10\"},{\"charId\":\"a236b568\",\"unicodeChar\":\"𧃮\",\"unicodeCodePoint\":\"270EE\",\"pinYinChars\":[{\"char\":\"LIN2\"}],\"splitChars\":[{\"char\":\"艹燐\"}],\"weight\":\"10\"},{\"charId\":\"ebea3606\",\"unicodeChar\":\"𧂮\",\"unicodeCodePoint\":\"270AE\",\"pinYinChars\":[{\"char\":\"艹 静\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"bb0784df\",\"unicodeChar\":\"𧁎\",\"unicodeCodePoint\":\"2704E\",\"pinYinChars\":[{\"char\":\"KUI2\"}],\"splitChars\":[{\"char\":\"䒤冖政\"}],\"weight\":\"10\"},{\"charId\":\"04f976c2\",\"unicodeChar\":\"𧁈\",\"unicodeCodePoint\":\"27048\",\"pinYinChars\":[{\"char\":\"NIE4\"}],\"splitChars\":[{\"char\":\"艹槷\"}],\"weight\":\"10\"},{\"charId\":\"e33b800b\",\"unicodeChar\":\"𧀒\",\"unicodeCodePoint\":\"27012\",\"pinYinChars\":[{\"char\":\"艹嫩\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"94b065ae\",\"unicodeChar\":\"𧀀\",\"unicodeCodePoint\":\"27000\",\"pinYinChars\":[{\"char\":\"yu4\"}],\"splitChars\":[{\"char\":\"艹 獄\"}],\"weight\":\"10\"},{\"charId\":\"4135bccd\",\"unicodeChar\":\"𦿰\",\"unicodeCodePoint\":\"26FF0\",\"pinYinChars\":[{\"char\":\"ma3\"}],\"splitChars\":[{\"char\":\"艹 瑪\"}],\"weight\":\"10\"},{\"charId\":\"b59921f3\",\"unicodeChar\":\"𦾯\",\"unicodeCodePoint\":\"26FAF\",\"pinYinChars\":[{\"char\":\"LU4\"}],\"splitChars\":[{\"char\":\"艹緑艹綠\"}],\"weight\":\"10\"},{\"charId\":\"c9f1cb0c\",\"unicodeChar\":\"𦾈\",\"unicodeCodePoint\":\"26F88\",\"pinYinChars\":[{\"char\":\"zao3\"}],\"splitChars\":[{\"char\":\"艹 喿\"}],\"weight\":\"10\"},{\"charId\":\"721e1c1e\",\"unicodeChar\":\"𦽧\",\"unicodeCodePoint\":\"26F67\",\"pinYinChars\":[{\"char\":\"YOU3\"}],\"splitChars\":[{\"char\":\"艹䅎\"}],\"weight\":\"10\"},{\"charId\":\"6336a6ec\",\"unicodeChar\":\"𦼥\",\"unicodeCodePoint\":\"26F25\",\"pinYinChars\":[{\"char\":\"gan4\"}],\"splitChars\":[{\"char\":\"艹渚\"}],\"weight\":\"10\"},{\"charId\":\"0885673d\",\"unicodeChar\":\"𦼍\",\"unicodeCodePoint\":\"26F0D\",\"pinYinChars\":[{\"char\":\"GUAN1\"}],\"splitChars\":[{\"char\":\"艹皖\"}],\"weight\":\"10\"},{\"charId\":\"3c79dde8\",\"unicodeChar\":\"𦻵\",\"unicodeCodePoint\":\"26EF5\",\"pinYinChars\":[{\"char\":\"qin2\"}],\"splitChars\":[{\"char\":\"艹 勤\"}],\"weight\":\"10\"},{\"charId\":\"a7b5fc3a\",\"unicodeChar\":\"𦻳\",\"unicodeCodePoint\":\"26EF3\",\"pinYinChars\":[{\"char\":\"zan1\"}],\"splitChars\":[{\"char\":\"艹 日\"}],\"weight\":\"10\"},{\"charId\":\"cbbe5e4b\",\"unicodeChar\":\"𦻘\",\"unicodeCodePoint\":\"26ED8\",\"pinYinChars\":[{\"char\":\"ti4\"}],\"splitChars\":[{\"char\":\"艹 替\"}],\"weight\":\"10\"},{\"charId\":\"49c41a31\",\"unicodeChar\":\"𦻕\",\"unicodeCodePoint\":\"26ED5\",\"pinYinChars\":[{\"char\":\"YIN3\"}],\"splitChars\":[{\"char\":\"艹隐\"}],\"weight\":\"10\"},{\"charId\":\"488f1651\",\"unicodeChar\":\"𦹷\",\"unicodeCodePoint\":\"26E77\",\"pinYinChars\":[{\"char\":\"bei4\"}],\"splitChars\":[{\"char\":\"艹培\"}],\"weight\":\"10\"},{\"charId\":\"b6d5268f\",\"unicodeChar\":\"𦹮\",\"unicodeCodePoint\":\"26E6E\",\"pinYinChars\":[{\"char\":\"cai3\"}],\"splitChars\":[{\"char\":\"艹 彩\"}],\"weight\":\"10\"},{\"charId\":\"c9f7879d\",\"unicodeChar\":\"𦹃\",\"unicodeCodePoint\":\"26E43\",\"pinYinChars\":[{\"char\":\"lao4\"},{\"char\":\"lao2\"}],\"splitChars\":[{\"char\":\"艹 咅\"}],\"weight\":\"10\"},{\"charId\":\"8d315c85\",\"unicodeChar\":\"𦸒\",\"unicodeCodePoint\":\"26E12\",\"pinYinChars\":[{\"char\":\"YI1\"}],\"splitChars\":[{\"char\":\"艹猗\"}],\"weight\":\"10\"},{\"charId\":\"080cd1a2\",\"unicodeChar\":\"𦷳\",\"unicodeCodePoint\":\"26DF3\",\"pinYinChars\":[{\"char\":\"HU2\"}],\"splitChars\":[{\"char\":\"艹𧯜\"}],\"weight\":\"10\"},{\"charId\":\"0b26e6e6\",\"unicodeChar\":\"𦷰\",\"unicodeCodePoint\":\"26DF0\",\"pinYinChars\":[{\"char\":\"fu2\"}],\"splitChars\":[{\"char\":\"艹 浮\"}],\"weight\":\"10\"},{\"charId\":\"81574782\",\"unicodeChar\":\"𦷮\",\"unicodeCodePoint\":\"26DEE\",\"pinYinChars\":[{\"char\":\"shu4\"},{\"char\":\"wu2\"},{\"char\":\"yu2\"}],\"splitChars\":[{\"char\":\"艹悟\"}],\"weight\":\"10\"},{\"charId\":\"3ebbb017\",\"unicodeChar\":\"𦷛\",\"unicodeCodePoint\":\"26DDB\",\"pinYinChars\":[{\"char\":\"BENG1\"}],\"splitChars\":[{\"char\":\"艹倗\"}],\"weight\":\"10\"},{\"charId\":\"b19cc7b6\",\"unicodeChar\":\"𦷂\",\"unicodeCodePoint\":\"26DC2\",\"pinYinChars\":[{\"char\":\"geng1\"}],\"splitChars\":[{\"char\":\"艹 耕\"}],\"weight\":\"10\"},{\"charId\":\"b2a33340\",\"unicodeChar\":\"𦶷\",\"unicodeCodePoint\":\"26DB7\",\"pinYinChars\":[{\"char\":\"han2\"}],\"splitChars\":[{\"char\":\"艹 涵\"}],\"weight\":\"10\"},{\"charId\":\"083b4c9b\",\"unicodeChar\":\"𦶮\",\"unicodeCodePoint\":\"26DAE\",\"pinYinChars\":[{\"char\":\"YUN2\"}],\"splitChars\":[{\"char\":\"艹耘\"}],\"weight\":\"10\"},{\"charId\":\"73fbf862\",\"unicodeChar\":\"𦶦\",\"unicodeCodePoint\":\"26DA6\",\"pinYinChars\":[{\"char\":\"han4\"},{\"char\":\"nan4\"},{\"char\":\"tan\"}],\"splitChars\":[{\"char\":\"艹 娜\"}],\"weight\":\"10\"},{\"charId\":\"6e280987\",\"unicodeChar\":\"𦶢\",\"unicodeCodePoint\":\"26DA2\",\"pinYinChars\":[{\"char\":\"jian4\"},{\"char\":\"lan3\"},{\"char\":\"lan4\"}],\"splitChars\":[{\"char\":\"艹 航\"}],\"weight\":\"10\"},{\"charId\":\"715f022d\",\"unicodeChar\":\"𦶈\",\"unicodeCodePoint\":\"26D88\",\"pinYinChars\":[{\"char\":\"NAN2\"}],\"splitChars\":[{\"char\":\"艹耼\"}],\"weight\":\"10\"},{\"charId\":\"12829cce\",\"unicodeChar\":\"𦵹\",\"unicodeCodePoint\":\"26D79\",\"pinYinChars\":[{\"char\":\"TAN3\"}],\"splitChars\":[{\"char\":\"艹剡\"}],\"weight\":\"10\"},{\"charId\":\"dfc062fd\",\"unicodeChar\":\"𦵜\",\"unicodeCodePoint\":\"26D5C\",\"pinYinChars\":[{\"char\":\"sao\"}],\"splitChars\":[{\"char\":\"艹洒\"}],\"weight\":\"10\"},{\"charId\":\"6b38fb6f\",\"unicodeChar\":\"𦵑\",\"unicodeCodePoint\":\"26D51\",\"pinYinChars\":[{\"char\":\"JU3\"}],\"splitChars\":[{\"char\":\"艹𥩞\"}],\"weight\":\"10\"},{\"charId\":\"feb77519\",\"unicodeChar\":\"𦵁\",\"unicodeCodePoint\":\"26D41\",\"pinYinChars\":[{\"char\":\"yu4\"}],\"splitChars\":[{\"char\":\"艹郁\"}],\"weight\":\"10\"},{\"charId\":\"43890fd3\",\"unicodeChar\":\"𦴿\",\"unicodeCodePoint\":\"26D3F\",\"pinYinChars\":[{\"char\":\"ling2\"}],\"splitChars\":[{\"char\":\"艹 玲\"}],\"weight\":\"10\"},{\"charId\":\"0099db7b\",\"unicodeChar\":\"𦴤\",\"unicodeCodePoint\":\"26D24\",\"pinYinChars\":[{\"char\":\"sheng\"}],\"splitChars\":[{\"char\":\"艹 映\"}],\"weight\":\"10\"},{\"charId\":\"558f223d\",\"unicodeChar\":\"𦴣\",\"unicodeCodePoint\":\"26D23\",\"pinYinChars\":[{\"char\":\"tu\"}],\"splitChars\":[{\"char\":\"艹 㛄\"}],\"weight\":\"10\"},{\"charId\":\"d3111d46\",\"unicodeChar\":\"𦴢\",\"unicodeCodePoint\":\"26D22\",\"pinYinChars\":[{\"char\":\"shi\"}],\"splitChars\":[{\"char\":\"艹 泚\"}],\"weight\":\"10\"},{\"charId\":\"f680c017\",\"unicodeChar\":\"𦳵\",\"unicodeCodePoint\":\"26CF5\",\"pinYinChars\":[{\"char\":\"ZHUO2\"}],\"splitChars\":[{\"char\":\"艹斫\"}],\"weight\":\"10\"},{\"charId\":\"8c24df6b\",\"unicodeChar\":\"𦳙\",\"unicodeCodePoint\":\"26CD9\",\"pinYinChars\":[{\"char\":\"DAO4\"}],\"splitChars\":[{\"char\":\"艹致\"}],\"weight\":\"10\"},{\"charId\":\"23f5db99\",\"unicodeChar\":\"𦲽\",\"unicodeCodePoint\":\"26CBD\",\"pinYinChars\":[{\"char\":\"xin1\"}],\"splitChars\":[{\"char\":\"艹 欣\"}],\"weight\":\"10\"},{\"charId\":\"3ef25432\",\"unicodeChar\":\"𦲷\",\"unicodeCodePoint\":\"26CB7\",\"pinYinChars\":[{\"char\":\"li4\"}],\"splitChars\":[{\"char\":\"艹泣\"}],\"weight\":\"10\"},{\"charId\":\"1380c03f\",\"unicodeChar\":\"𦲵\",\"unicodeCodePoint\":\"26CB5\",\"pinYinChars\":[{\"char\":\"JING1\"}],\"splitChars\":[{\"char\":\"艹征\"}],\"weight\":\"10\"},{\"charId\":\"d15983c8\",\"unicodeChar\":\"𦲥\",\"unicodeCodePoint\":\"26CA5\",\"pinYinChars\":[{\"char\":\"mao1\"}],\"splitChars\":[{\"char\":\"艹 由\"}],\"weight\":\"10\"},{\"charId\":\"536631c8\",\"unicodeChar\":\"𦲂\",\"unicodeCodePoint\":\"26C82\",\"pinYinChars\":[{\"char\":\"zi\"}],\"splitChars\":[{\"char\":\"艹 勺\"}],\"weight\":\"10\"},{\"charId\":\"7e7e19a5\",\"unicodeChar\":\"𦲀\",\"unicodeCodePoint\":\"26C80\",\"pinYinChars\":[{\"char\":\"de2\"}],\"splitChars\":[{\"char\":\"艹 怡\"}],\"weight\":\"10\"},{\"charId\":\"039ffa60\",\"unicodeChar\":\"𦱍\",\"unicodeCodePoint\":\"26C4D\",\"pinYinChars\":[{\"char\":\"ma2\"}],\"splitChars\":[{\"char\":\"艹𣏟\"}],\"weight\":\"10\"},{\"charId\":\"19c44038\",\"unicodeChar\":\"𦰿\",\"unicodeCodePoint\":\"26C3F\",\"pinYinChars\":[{\"char\":\"BENG1\"}],\"splitChars\":[{\"char\":\"艹侈\"}],\"weight\":\"10\"},{\"charId\":\"4fdd04d9\",\"unicodeChar\":\"𦰮\",\"unicodeCodePoint\":\"26C2E\",\"pinYinChars\":[{\"char\":\"FU2\"}],\"splitChars\":[{\"char\":\"芖包\"}],\"weight\":\"10\"},{\"charId\":\"749dbbaf\",\"unicodeChar\":\"𦯹\",\"unicodeCodePoint\":\"26BF9\",\"pinYinChars\":[{\"char\":\"qin4\"}],\"splitChars\":[{\"char\":\"艹 沁\"}],\"weight\":\"10\"},{\"charId\":\"2c17af1e\",\"unicodeChar\":\"𦮴\",\"unicodeCodePoint\":\"26BB4\",\"pinYinChars\":[{\"char\":\"hua2\"},{\"char\":\"hua4\"}],\"splitChars\":[{\"char\":\"艹年\"}],\"weight\":\"10\"},{\"charId\":\"9a264569\",\"unicodeChar\":\"𦮳\",\"unicodeCodePoint\":\"26BB3\",\"pinYinChars\":[{\"char\":\"qi4\"}],\"splitChars\":[{\"char\":\"艹 企\"}],\"weight\":\"10\"},{\"charId\":\"1c3f4bba\",\"unicodeChar\":\"𦮝\",\"unicodeCodePoint\":\"26B9D\",\"pinYinChars\":[{\"char\":\"mang2\"}],\"splitChars\":[{\"char\":\"艹 忙\"}],\"weight\":\"10\"},{\"charId\":\"fc755a9b\",\"unicodeChar\":\"𦭔\",\"unicodeCodePoint\":\"26B54\",\"pinYinChars\":[{\"char\":\"yong3\"}],\"splitChars\":[{\"char\":\"艹 永\"}],\"weight\":\"10\"},{\"charId\":\"f6f5d499\",\"unicodeChar\":\"𦭒\",\"unicodeCodePoint\":\"26B52\",\"pinYinChars\":[{\"char\":\"pang\"}],\"splitChars\":[{\"char\":\"艹 正\"}],\"weight\":\"10\"},{\"charId\":\"ac39cdb9\",\"unicodeChar\":\"𦬾\",\"unicodeCodePoint\":\"26B3E\",\"pinYinChars\":[{\"char\":\"JUAN1\"}],\"splitChars\":[{\"char\":\"艹玄\"}],\"weight\":\"10\"},{\"charId\":\"9f5d4e9c\",\"unicodeChar\":\"𦬻\",\"unicodeCodePoint\":\"26B3B\",\"pinYinChars\":[{\"char\":\"NA2\"}],\"splitChars\":[{\"char\":\"艹奴\"}],\"weight\":\"10\"},{\"charId\":\"f1a80ef7\",\"unicodeChar\":\"𦬸\",\"unicodeCodePoint\":\"26B38\",\"pinYinChars\":[{\"char\":\"ZHU2\"}],\"splitChars\":[{\"char\":\"艹术艹朮\"}],\"weight\":\"10\"},{\"charId\":\"c5046203\",\"unicodeChar\":\"𦫽\",\"unicodeCodePoint\":\"26AFD\",\"pinYinChars\":[{\"char\":\"lan2\"}],\"splitChars\":[{\"char\":\"艹 二\"}],\"weight\":\"10\"},{\"charId\":\"8778aed4\",\"unicodeChar\":\"𦫼\",\"unicodeCodePoint\":\"26AFC\",\"pinYinChars\":[{\"char\":\"KAI3\"}],\"splitChars\":[{\"char\":\"艹了\"}],\"weight\":\"10\"},{\"charId\":\"05d09d28\",\"unicodeChar\":\"𦪋\",\"unicodeCodePoint\":\"26A8B\",\"pinYinChars\":[{\"char\":\"XIU1\"}],\"splitChars\":[{\"char\":\"舟羞\"}],\"weight\":\"10\"},{\"charId\":\"11b28343\",\"unicodeChar\":\"𦩊\",\"unicodeCodePoint\":\"26A4A\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"舟兒\"}],\"weight\":\"10\"},{\"charId\":\"4f35a254\",\"unicodeChar\":\"𦨽\",\"unicodeCodePoint\":\"26A3D\",\"pinYinChars\":[{\"char\":\"JIN4\"}],\"splitChars\":[{\"char\":\"舟岑\"}],\"weight\":\"10\"},{\"charId\":\"c970e35a\",\"unicodeChar\":\"𦨬\",\"unicodeCodePoint\":\"26A2C\",\"pinYinChars\":[{\"char\":\"YONG3\"}],\"splitChars\":[{\"char\":\"舟永\"}],\"weight\":\"10\"},{\"charId\":\"034d2bae\",\"unicodeChar\":\"𦤆\",\"unicodeCodePoint\":\"26906\",\"pinYinChars\":[{\"char\":\"YUN2\"}],\"splitChars\":[{\"char\":\"自云\"}],\"weight\":\"10\"},{\"charId\":\"9781b0b0\",\"unicodeChar\":\"𦠛\",\"unicodeCodePoint\":\"2681B\",\"pinYinChars\":[{\"char\":\"ZA1\"}],\"splitChars\":[{\"char\":\"月替\"}],\"weight\":\"10\"},{\"charId\":\"58bb463a\",\"unicodeChar\":\"𦝻\",\"unicodeCodePoint\":\"2677B\",\"pinYinChars\":[{\"char\":\"xuan1\"}],\"splitChars\":[{\"char\":\"月 宣\"}],\"weight\":\"10\"},{\"charId\":\"bd6e4561\",\"unicodeChar\":\"𦝁\",\"unicodeCodePoint\":\"26741\",\"pinYinChars\":[{\"char\":\"qi2\"}],\"splitChars\":[{\"char\":\"月 其\"}],\"weight\":\"10\"},{\"charId\":\"c6f8fc7c\",\"unicodeChar\":\"𦜳\",\"unicodeCodePoint\":\"26733\",\"pinYinChars\":[{\"char\":\"JING1\"}],\"splitChars\":[{\"char\":\"月朋\"}],\"weight\":\"10\"},{\"charId\":\"8fbefd47\",\"unicodeChar\":\"𦛨\",\"unicodeCodePoint\":\"266E8\",\"pinYinChars\":[{\"char\":\"er2\"}],\"splitChars\":[{\"char\":\"月劳\"}],\"weight\":\"10\"},{\"charId\":\"4541632b\",\"unicodeChar\":\"𦛜\",\"unicodeCodePoint\":\"266DC\",\"pinYinChars\":[{\"char\":\"HE2\"}],\"splitChars\":[{\"char\":\"月含⺼含\"}],\"weight\":\"10\"},{\"charId\":\"f646d20d\",\"unicodeChar\":\"𦚸\",\"unicodeCodePoint\":\"266B8\",\"pinYinChars\":[{\"char\":\"GENG4\"}],\"splitChars\":[{\"char\":\"月亘⺼亘\"}],\"weight\":\"10\"},{\"charId\":\"8671d891\",\"unicodeChar\":\"𦚶\",\"unicodeCodePoint\":\"266B6\",\"pinYinChars\":[{\"char\":\"he2\"}],\"splitChars\":[{\"char\":\"合 月\"}],\"weight\":\"10\"},{\"charId\":\"6c41cf5d\",\"unicodeChar\":\"𦚭\",\"unicodeCodePoint\":\"266AD\",\"pinYinChars\":[{\"char\":\"JU1\"}],\"splitChars\":[{\"char\":\"月虫⺼虫\"}],\"weight\":\"10\"},{\"charId\":\"81fbee8e\",\"unicodeChar\":\"𦚣\",\"unicodeCodePoint\":\"266A3\",\"pinYinChars\":[{\"char\":\"HEN2\"}],\"splitChars\":[{\"char\":\"月艮⺼艮\"}],\"weight\":\"10\"},{\"charId\":\"ff84b392\",\"unicodeChar\":\"𦚎\",\"unicodeCodePoint\":\"2668E\",\"pinYinChars\":[{\"char\":\"JING3\"}],\"splitChars\":[{\"char\":\"立月立⺼\"}],\"weight\":\"10\"},{\"charId\":\"53ac3038\",\"unicodeChar\":\"𦙟\",\"unicodeCodePoint\":\"2665F\",\"pinYinChars\":[{\"char\":\"QI2\"}],\"splitChars\":[{\"char\":\"文⺝文⺼\"}],\"weight\":\"10\"},{\"charId\":\"7e0e5b3a\",\"unicodeChar\":\"𦙓\",\"unicodeCodePoint\":\"26653\",\"pinYinChars\":[{\"char\":\"you3\"}],\"splitChars\":[{\"char\":\"月 友\"}],\"weight\":\"10\"},{\"charId\":\"cbd5caa7\",\"unicodeChar\":\"𦙅\",\"unicodeCodePoint\":\"26645\",\"pinYinChars\":[{\"char\":\"DU1\"}],\"splitChars\":[{\"char\":\"月户⺼戶\"}],\"weight\":\"10\"},{\"charId\":\"7bf6ad66\",\"unicodeChar\":\"𦘭\",\"unicodeCodePoint\":\"2662D\",\"pinYinChars\":[{\"char\":\"DING4\"}],\"splitChars\":[{\"char\":\"月丁⺼丁\"}],\"weight\":\"10\"},{\"charId\":\"0749099d\",\"unicodeChar\":\"𦘦\",\"unicodeCodePoint\":\"26626\",\"pinYinChars\":[{\"char\":\"zhao4\"}],\"splitChars\":[{\"char\":\"启 聿\"}],\"weight\":\"10\"},{\"charId\":\"55242ecb\",\"unicodeChar\":\"𦖻\",\"unicodeCodePoint\":\"265BB\",\"pinYinChars\":[{\"char\":\"cong1\"}],\"splitChars\":[{\"char\":\"耳思\"}],\"weight\":\"10\"},{\"charId\":\"f28e9f25\",\"unicodeChar\":\"𦕃\",\"unicodeCodePoint\":\"26543\",\"pinYinChars\":[{\"char\":\"DAN1\"}],\"splitChars\":[{\"char\":\"耳丹\"}],\"weight\":\"10\"},{\"charId\":\"c89ebe0f\",\"unicodeChar\":\"𦔾\",\"unicodeCodePoint\":\"2653E\",\"pinYinChars\":[{\"char\":\"FU2\"}],\"splitChars\":[{\"char\":\"耳夫\"}],\"weight\":\"10\"},{\"charId\":\"ed3c0fb6\",\"unicodeChar\":\"𦔼\",\"unicodeCodePoint\":\"2653C\",\"pinYinChars\":[{\"char\":\"XIE4\"}],\"splitChars\":[{\"char\":\"耳攴\"}],\"weight\":\"10\"},{\"charId\":\"ef067cd1\",\"unicodeChar\":\"𦔴\",\"unicodeCodePoint\":\"26534\",\"pinYinChars\":[{\"char\":\"WEN2\"}],\"splitChars\":[{\"char\":\"人耳\"}],\"weight\":\"10\"},{\"charId\":\"87f4e8bc\",\"unicodeChar\":\"𦓒\",\"unicodeCodePoint\":\"264D2\",\"pinYinChars\":[{\"char\":\"ER2\"}],\"splitChars\":[{\"char\":\"火而\"}],\"weight\":\"10\"},{\"charId\":\"4d8ede08\",\"unicodeChar\":\"𦒎\",\"unicodeCodePoint\":\"2648E\",\"pinYinChars\":[{\"char\":\"HUI4\"}],\"splitChars\":[{\"char\":\"羽惠\"}],\"weight\":\"10\"},{\"charId\":\"fa842fb2\",\"unicodeChar\":\"𦑱\",\"unicodeCodePoint\":\"26471\",\"pinYinChars\":[{\"char\":\"ZHAI2\"}],\"splitChars\":[{\"char\":\"隺羽\"}],\"weight\":\"10\"},{\"charId\":\"25661918\",\"unicodeChar\":\"𦑕\",\"unicodeCodePoint\":\"26455\",\"pinYinChars\":[{\"char\":\"yu3\"}],\"splitChars\":[{\"char\":\"羽 金\"}],\"weight\":\"10\"},{\"charId\":\"1101b2df\",\"unicodeChar\":\"𦑊\",\"unicodeCodePoint\":\"2644A\",\"pinYinChars\":[{\"char\":\"JING1\"}],\"splitChars\":[{\"char\":\"羽青\"}],\"weight\":\"10\"},{\"charId\":\"88201f2b\",\"unicodeChar\":\"𦐼\",\"unicodeCodePoint\":\"2643C\",\"pinYinChars\":[{\"char\":\"CHI1\"}],\"splitChars\":[{\"char\":\"志羽\"}],\"weight\":\"10\"},{\"charId\":\"31ec76ef\",\"unicodeChar\":\"𦐒\",\"unicodeCodePoint\":\"26412\",\"pinYinChars\":[{\"char\":\"lian3\"}],\"splitChars\":[{\"char\":\"羽升\"}],\"weight\":\"10\"},{\"charId\":\"87cd6080\",\"unicodeChar\":\"𦐐\",\"unicodeCodePoint\":\"26410\",\"pinYinChars\":[{\"char\":\"wen2\"}],\"splitChars\":[{\"char\":\"羽 文\"}],\"weight\":\"10\"},{\"charId\":\"236df4a1\",\"unicodeChar\":\"𦐌\",\"unicodeCodePoint\":\"2640C\",\"pinYinChars\":[{\"char\":\"HONG2\"}],\"splitChars\":[{\"char\":\"羽厷\"}],\"weight\":\"10\"},{\"charId\":\"a96040c3\",\"unicodeChar\":\"𦏁\",\"unicodeCodePoint\":\"263C1\",\"pinYinChars\":[{\"char\":\"XI1\"}],\"splitChars\":[{\"char\":\"𦍌秀戈𦍌亻戈人乃\"}],\"weight\":\"10\"},{\"charId\":\"0eaa0344\",\"unicodeChar\":\"𦍩\",\"unicodeCodePoint\":\"26369\",\"pinYinChars\":[{\"char\":\"GU3\"}],\"splitChars\":[{\"char\":\"羊古\"}],\"weight\":\"10\"},{\"charId\":\"f11c5e81\",\"unicodeChar\":\"𦍌\",\"unicodeCodePoint\":\"2634C\",\"pinYinChars\":[{\"char\":\"REN4\"}],\"splitChars\":[{\"char\":\"丷王\"}],\"weight\":\"10\"},{\"charId\":\"84f437ec\",\"unicodeChar\":\"𦋝\",\"unicodeCodePoint\":\"262DD\",\"pinYinChars\":[{\"char\":\"LUO2\"}],\"splitChars\":[{\"char\":\"罒紂\"}],\"weight\":\"10\"},{\"charId\":\"7f08279c\",\"unicodeChar\":\"𦊢\",\"unicodeCodePoint\":\"262A2\",\"pinYinChars\":[{\"char\":\"li4\"}],\"splitChars\":[{\"char\":\"四 立\"}],\"weight\":\"10\"},{\"charId\":\"e52fe82e\",\"unicodeChar\":\"𦈠\",\"unicodeCodePoint\":\"26220\",\"pinYinChars\":[{\"char\":\"YIN3\"}],\"splitChars\":[{\"char\":\"纟㥯\"}],\"weight\":\"10\"},{\"charId\":\"032cd4d8\",\"unicodeChar\":\"𦈘\",\"unicodeCodePoint\":\"26218\",\"pinYinChars\":[{\"char\":\"DA1\"}],\"splitChars\":[{\"char\":\"纟荅\"}],\"weight\":\"10\"},{\"charId\":\"a6fd01d3\",\"unicodeChar\":\"𦈕\",\"unicodeCodePoint\":\"26215\",\"pinYinChars\":[{\"char\":\"TOU2\"}],\"splitChars\":[{\"char\":\"纟俞\"}],\"weight\":\"10\"},{\"charId\":\"60dc8204\",\"unicodeChar\":\"𦈎\",\"unicodeCodePoint\":\"2620E\",\"pinYinChars\":[{\"char\":\"CHAN3\"}],\"splitChars\":[{\"char\":\"纟单\"}],\"weight\":\"10\"},{\"charId\":\"562d08fd\",\"unicodeChar\":\"𦈌\",\"unicodeCodePoint\":\"2620C\",\"pinYinChars\":[{\"char\":\"SHU1\"}],\"splitChars\":[{\"char\":\"纟束\"}],\"weight\":\"10\"},{\"charId\":\"629e51c5\",\"unicodeChar\":\"𦅡\",\"unicodeCodePoint\":\"26161\",\"pinYinChars\":[{\"char\":\"jing3\"}],\"splitChars\":[{\"char\":\"糹 景\"}],\"weight\":\"10\"},{\"charId\":\"42d79561\",\"unicodeChar\":\"𦅁\",\"unicodeCodePoint\":\"26141\",\"pinYinChars\":[{\"char\":\"ZHA3\"}],\"splitChars\":[{\"char\":\"糸奢\"}],\"weight\":\"10\"},{\"charId\":\"4ef62e65\",\"unicodeChar\":\"𦄙\",\"unicodeCodePoint\":\"26119\",\"pinYinChars\":[{\"char\":\"CI1\"}],\"splitChars\":[{\"char\":\"糸䇥\"}],\"weight\":\"10\"},{\"charId\":\"53dba3e9\",\"unicodeChar\":\"𦂱\",\"unicodeCodePoint\":\"260B1\",\"pinYinChars\":[{\"char\":\"feng1\"}],\"splitChars\":[{\"char\":\"糸風\"}],\"weight\":\"10\"},{\"charId\":\"a2a4b431\",\"unicodeChar\":\"𦂃\",\"unicodeCodePoint\":\"26083\",\"pinYinChars\":[{\"char\":\"TING1\"}],\"splitChars\":[{\"char\":\"糸亭\"}],\"weight\":\"10\"},{\"charId\":\"7bdf9db1\",\"unicodeChar\":\"𦁫\",\"unicodeCodePoint\":\"2606B\",\"pinYinChars\":[{\"char\":\"jin3\"}],\"splitChars\":[{\"char\":\"取 糸\"}],\"weight\":\"10\"},{\"charId\":\"2c858af5\",\"unicodeChar\":\"𦀿\",\"unicodeCodePoint\":\"2603F\",\"pinYinChars\":[{\"char\":\"zhi4\"}],\"splitChars\":[{\"char\":\"糸尾\"}],\"weight\":\"10\"},{\"charId\":\"23eab1d7\",\"unicodeChar\":\"𦀲\",\"unicodeCodePoint\":\"26032\",\"pinYinChars\":[{\"char\":\"qun2\"}],\"splitChars\":[{\"char\":\"糹 君\"}],\"weight\":\"10\"},{\"charId\":\"24b79cdb\",\"unicodeChar\":\"𦀠\",\"unicodeCodePoint\":\"26020\",\"pinYinChars\":[{\"char\":\"LIU2\"}],\"splitChars\":[{\"char\":\"糸㐬\"}],\"weight\":\"10\"},{\"charId\":\"2a196c85\",\"unicodeChar\":\"𦀚\",\"unicodeCodePoint\":\"2601A\",\"pinYinChars\":[{\"char\":\"TING1\"}],\"splitChars\":[{\"char\":\"糸呈\"}],\"weight\":\"10\"},{\"charId\":\"446c8333\",\"unicodeChar\":\"𥿽\",\"unicodeCodePoint\":\"25FFD\",\"pinYinChars\":[{\"char\":\"an1\"}],\"splitChars\":[{\"char\":\"糸安\"}],\"weight\":\"10\"},{\"charId\":\"1e7635c0\",\"unicodeChar\":\"𥿑\",\"unicodeCodePoint\":\"25FD1\",\"pinYinChars\":[{\"char\":\"guan\"},{\"char\":\"lun2\"}],\"splitChars\":[{\"char\":\"糹 册\"}],\"weight\":\"10\"},{\"charId\":\"715f4824\",\"unicodeChar\":\"𥺃\",\"unicodeCodePoint\":\"25E83\",\"pinYinChars\":[{\"char\":\"xin\"}],\"splitChars\":[{\"char\":\"米 志\"}],\"weight\":\"10\"},{\"charId\":\"110061dc\",\"unicodeChar\":\"𥹀\",\"unicodeCodePoint\":\"25E40\",\"pinYinChars\":[{\"char\":\"cu2\"},{\"char\":\"zu3\"}],\"splitChars\":[{\"char\":\"米心\"}],\"weight\":\"10\"},{\"charId\":\"d7db6996\",\"unicodeChar\":\"𥵉\",\"unicodeCodePoint\":\"25D49\",\"pinYinChars\":[{\"char\":\"lei2\"}],\"splitChars\":[{\"char\":\"竹 雷\"}],\"weight\":\"10\"},{\"charId\":\"1cf6f4dd\",\"unicodeChar\":\"𥵆\",\"unicodeCodePoint\":\"25D46\",\"pinYinChars\":[{\"char\":\"yi4\"}],\"splitChars\":[{\"char\":\"竹 意\"}],\"weight\":\"10\"},{\"charId\":\"121614fc\",\"unicodeChar\":\"𥱼\",\"unicodeCodePoint\":\"25C7C\",\"pinYinChars\":[{\"char\":\"PAI2\"}],\"splitChars\":[{\"char\":\"𥫗渒\"}],\"weight\":\"10\"},{\"charId\":\"65686547\",\"unicodeChar\":\"𥱰\",\"unicodeCodePoint\":\"25C70\",\"pinYinChars\":[{\"char\":\"jie4\"},{\"char\":\"xie4\"}],\"splitChars\":[{\"char\":\"𥫗徒\"}],\"weight\":\"10\"},{\"charId\":\"c7f06f74\",\"unicodeChar\":\"𥯐\",\"unicodeCodePoint\":\"25BD0\",\"pinYinChars\":[{\"char\":\"lu4\"}],\"splitChars\":[{\"char\":\"竹 水\"}],\"weight\":\"10\"},{\"charId\":\"a2c3d9e9\",\"unicodeChar\":\"𥯀\",\"unicodeCodePoint\":\"25BC0\",\"pinYinChars\":[{\"char\":\"gan4\"}],\"splitChars\":[{\"char\":\"竹 金\"}],\"weight\":\"10\"},{\"charId\":\"4192bfc2\",\"unicodeChar\":\"𥮾\",\"unicodeCodePoint\":\"25BBE\",\"pinYinChars\":[{\"char\":\"CEN1\"}],\"splitChars\":[{\"char\":\"𥫗参\"}],\"weight\":\"10\"},{\"charId\":\"4f061019\",\"unicodeChar\":\"𥮆\",\"unicodeCodePoint\":\"25B86\",\"pinYinChars\":[{\"char\":\"he2\"}],\"splitChars\":[{\"char\":\"竹 何\"}],\"weight\":\"10\"},{\"charId\":\"a67bab63\",\"unicodeChar\":\"𥭨\",\"unicodeCodePoint\":\"25B68\",\"pinYinChars\":[{\"char\":\"GUAN3\"}],\"splitChars\":[{\"char\":\"𥫗皃\"}],\"weight\":\"10\"},{\"charId\":\"23bbdcb6\",\"unicodeChar\":\"𥫿\",\"unicodeCodePoint\":\"25AFF\",\"pinYinChars\":[{\"char\":\"hu4\"}],\"splitChars\":[{\"char\":\"竹 户\"}],\"weight\":\"10\"},{\"charId\":\"7f436455\",\"unicodeChar\":\"𥫩\",\"unicodeCodePoint\":\"25AE9\",\"pinYinChars\":[{\"char\":\"mang2\"},{\"char\":\"peng2\"},{\"char\":\"pang2\"}],\"splitChars\":[{\"char\":\"竹 勺\"}],\"weight\":\"10\"},{\"charId\":\"b6f5a93a\",\"unicodeChar\":\"𥪼\",\"unicodeCodePoint\":\"25ABC\",\"pinYinChars\":[{\"char\":\"JI3\"}],\"splitChars\":[{\"char\":\"竒竒\"}],\"weight\":\"10\"},{\"charId\":\"a63fbb16\",\"unicodeChar\":\"𥨣\",\"unicodeCodePoint\":\"25A23\",\"pinYinChars\":[{\"char\":\"jun4\"}],\"splitChars\":[{\"char\":\"穴 雋\"}],\"weight\":\"10\"},{\"charId\":\"3692f3d7\",\"unicodeChar\":\"𥦭\",\"unicodeCodePoint\":\"259AD\",\"pinYinChars\":[{\"char\":\"xing4\"}],\"splitChars\":[{\"char\":\"穴 幸\"}],\"weight\":\"10\"},{\"charId\":\"189e548b\",\"unicodeChar\":\"𥥷\",\"unicodeCodePoint\":\"25977\",\"pinYinChars\":[{\"char\":\"DOU4\"}],\"splitChars\":[{\"char\":\"穴豆\"}],\"weight\":\"10\"},{\"charId\":\"9d46f8ad\",\"unicodeChar\":\"𥥖\",\"unicodeCodePoint\":\"25956\",\"pinYinChars\":[{\"char\":\"huang2\"}],\"splitChars\":[{\"char\":\"穴 古\"}],\"weight\":\"10\"},{\"charId\":\"a9edad24\",\"unicodeChar\":\"𥥉\",\"unicodeCodePoint\":\"25949\",\"pinYinChars\":[{\"char\":\"XIU4\"}],\"splitChars\":[{\"char\":\"穴由\"}],\"weight\":\"10\"},{\"charId\":\"a897c05f\",\"unicodeChar\":\"𥢗\",\"unicodeCodePoint\":\"25897\",\"pinYinChars\":[{\"char\":\"sheng\"},{\"char\":\"xing4\"}],\"splitChars\":[{\"char\":\"禾 喜\"}],\"weight\":\"10\"},{\"charId\":\"7a64ddda\",\"unicodeChar\":\"𥢐\",\"unicodeCodePoint\":\"25890\",\"pinYinChars\":[{\"char\":\"GAO1\"}],\"splitChars\":[{\"char\":\"禾臯\"}],\"weight\":\"10\"},{\"charId\":\"f905ff08\",\"unicodeChar\":\"𥡝\",\"unicodeCodePoint\":\"2585D\",\"pinYinChars\":[{\"char\":\"JIAN1\"}],\"splitChars\":[{\"char\":\"秉秉\"}],\"weight\":\"10\"},{\"charId\":\"c217b546\",\"unicodeChar\":\"𥡜\",\"unicodeCodePoint\":\"2585C\",\"pinYinChars\":[{\"char\":\"LUO2\"}],\"splitChars\":[{\"char\":\"禾累\"}],\"weight\":\"10\"},{\"charId\":\"223eff5a\",\"unicodeChar\":\"𥟢\",\"unicodeCodePoint\":\"257E2\",\"pinYinChars\":[{\"char\":\"YAN2\"}],\"splitChars\":[{\"char\":\"禾 炎\"}],\"weight\":\"10\"},{\"charId\":\"ef107667\",\"unicodeChar\":\"𥟏\",\"unicodeCodePoint\":\"257CF\",\"pinYinChars\":[{\"char\":\"YI1\"}],\"splitChars\":[{\"char\":\"禾奇\"}],\"weight\":\"10\"},{\"charId\":\"f03bb215\",\"unicodeChar\":\"𥟀\",\"unicodeCodePoint\":\"257C0\",\"pinYinChars\":[{\"char\":\"LENG2\"}],\"splitChars\":[{\"char\":\"禾麦\"}],\"weight\":\"10\"},{\"charId\":\"a7ed9ce0\",\"unicodeChar\":\"𥞈\",\"unicodeCodePoint\":\"25788\",\"pinYinChars\":[{\"char\":\"GAN1\"}],\"splitChars\":[{\"char\":\"禾 甘\"}],\"weight\":\"10\"},{\"charId\":\"7d8bfe1f\",\"unicodeChar\":\"𥝲\",\"unicodeCodePoint\":\"25772\",\"pinYinChars\":[{\"char\":\"DUO4\"},{\"char\":\"HUI4\"}],\"splitChars\":[{\"char\":\"禾 允\"}],\"weight\":\"10\"},{\"charId\":\"dc0ecfc8\",\"unicodeChar\":\"𥝤\",\"unicodeCodePoint\":\"25764\",\"pinYinChars\":[{\"char\":\"LI4\"}],\"splitChars\":[{\"char\":\"禾勿\"}],\"weight\":\"10\"},{\"charId\":\"c477b811\",\"unicodeChar\":\"𥜥\",\"unicodeCodePoint\":\"25725\",\"pinYinChars\":[{\"char\":\"SI4\"}],\"splitChars\":[{\"char\":\"示冀\"}],\"weight\":\"10\"},{\"charId\":\"c6f04650\",\"unicodeChar\":\"𥜔\",\"unicodeCodePoint\":\"25714\",\"pinYinChars\":[{\"char\":\"TIAO1\"}],\"splitChars\":[{\"char\":\"示翟\"}],\"weight\":\"10\"},{\"charId\":\"ce6cc621\",\"unicodeChar\":\"𥜇\",\"unicodeCodePoint\":\"25707\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"礻 意\"}],\"weight\":\"10\"},{\"charId\":\"181e3517\",\"unicodeChar\":\"𥛱\",\"unicodeCodePoint\":\"256F1\",\"pinYinChars\":[{\"char\":\"BENG1\"}],\"splitChars\":[{\"char\":\"彭示\"}],\"weight\":\"10\"},{\"charId\":\"4a94e591\",\"unicodeChar\":\"𥚺\",\"unicodeCodePoint\":\"256BA\",\"pinYinChars\":[{\"char\":\"JIE1\"}],\"splitChars\":[{\"char\":\"示皆\"}],\"weight\":\"10\"},{\"charId\":\"db1dfcf3\",\"unicodeChar\":\"𥚃\",\"unicodeCodePoint\":\"25683\",\"pinYinChars\":[{\"char\":\"LI3\"}],\"splitChars\":[{\"char\":\"示里\"}],\"weight\":\"10\"},{\"charId\":\"8167fc69\",\"unicodeChar\":\"𥙷\",\"unicodeCodePoint\":\"25677\",\"pinYinChars\":[{\"char\":\"FU3\"}],\"splitChars\":[{\"char\":\"示甫\"}],\"weight\":\"10\"},{\"charId\":\"7581e565\",\"unicodeChar\":\"𥙛\",\"unicodeCodePoint\":\"2565B\",\"pinYinChars\":[{\"char\":\"REN4\"}],\"splitChars\":[{\"char\":\"示任\"}],\"weight\":\"10\"},{\"charId\":\"094fa00e\",\"unicodeChar\":\"𥘸\",\"unicodeCodePoint\":\"25638\",\"pinYinChars\":[{\"char\":\"WEI4\"}],\"splitChars\":[{\"char\":\"示立\"}],\"weight\":\"10\"},{\"charId\":\"3701d567\",\"unicodeChar\":\"𥘭\",\"unicodeCodePoint\":\"2562D\",\"pinYinChars\":[{\"char\":\"ZHU3\"}],\"splitChars\":[{\"char\":\"示主\"}],\"weight\":\"10\"},{\"charId\":\"f4537faf\",\"unicodeChar\":\"𥘟\",\"unicodeCodePoint\":\"2561F\",\"pinYinChars\":[{\"char\":\"YUN2\"}],\"splitChars\":[{\"char\":\"示云\"}],\"weight\":\"10\"},{\"charId\":\"c5d5bd11\",\"unicodeChar\":\"𥘞\",\"unicodeCodePoint\":\"2561E\",\"pinYinChars\":[{\"char\":\"JIN\"}],\"splitChars\":[{\"char\":\"示今\"}],\"weight\":\"10\"},{\"charId\":\"907ad158\",\"unicodeChar\":\"𥘝\",\"unicodeCodePoint\":\"2561D\",\"pinYinChars\":[{\"char\":\"WANG\"}],\"splitChars\":[{\"char\":\"礻 冈\"}],\"weight\":\"10\"},{\"charId\":\"aeaec432\",\"unicodeChar\":\"𥗉\",\"unicodeCodePoint\":\"255C9\",\"pinYinChars\":[{\"char\":\"LEI3\"}],\"splitChars\":[{\"char\":\"砳砳\"}],\"weight\":\"10\"},{\"charId\":\"498ecb89\",\"unicodeChar\":\"𥖉\",\"unicodeCodePoint\":\"25589\",\"pinYinChars\":[{\"char\":\"JING3\"}],\"splitChars\":[{\"char\":\"石 景\"}],\"weight\":\"10\"},{\"charId\":\"e65fc928\",\"unicodeChar\":\"𥕤\",\"unicodeCodePoint\":\"25564\",\"pinYinChars\":[{\"char\":\"KE1\"}],\"splitChars\":[{\"char\":\"石盖\"}],\"weight\":\"10\"},{\"charId\":\"1108672c\",\"unicodeChar\":\"𥕛\",\"unicodeCodePoint\":\"2555B\",\"pinYinChars\":[{\"char\":\"ME\"}],\"splitChars\":[{\"char\":\"石 基\"}],\"weight\":\"10\"},{\"charId\":\"da548cdb\",\"unicodeChar\":\"𥔲\",\"unicodeCodePoint\":\"25532\",\"pinYinChars\":[{\"char\":\"E4\"}],\"splitChars\":[{\"char\":\"石咢\"}],\"weight\":\"10\"},{\"charId\":\"5cacf8ff\",\"unicodeChar\":\"𥔩\",\"unicodeCodePoint\":\"25529\",\"pinYinChars\":[{\"char\":\"QI3\"}],\"splitChars\":[{\"char\":\"砍石\"}],\"weight\":\"10\"},{\"charId\":\"337d4eab\",\"unicodeChar\":\"𥔧\",\"unicodeCodePoint\":\"25527\",\"pinYinChars\":[{\"char\":\"ZONG1\"}],\"splitChars\":[{\"char\":\"石重\"}],\"weight\":\"10\"},{\"charId\":\"2d58bfbe\",\"unicodeChar\":\"𥓵\",\"unicodeCodePoint\":\"254F5\",\"pinYinChars\":[{\"char\":\"QIN2\"}],\"splitChars\":[{\"char\":\"石底\"}],\"weight\":\"10\"},{\"charId\":\"d51b2039\",\"unicodeChar\":\"𥓞\",\"unicodeCodePoint\":\"254DE\",\"pinYinChars\":[{\"char\":\"HAN2\"}],\"splitChars\":[{\"char\":\"石 函\"}],\"weight\":\"10\"},{\"charId\":\"9ae95604\",\"unicodeChar\":\"𥓙\",\"unicodeCodePoint\":\"254D9\",\"pinYinChars\":[{\"char\":\"NIAN3\"}],\"splitChars\":[{\"char\":\"林石\"}],\"weight\":\"10\"},{\"charId\":\"80d5a14a\",\"unicodeChar\":\"𥓏\",\"unicodeCodePoint\":\"254CF\",\"pinYinChars\":[{\"char\":\"DAI4\"}],\"splitChars\":[{\"char\":\"石隶\"}],\"weight\":\"10\"},{\"charId\":\"f745c58c\",\"unicodeChar\":\"𥓋\",\"unicodeCodePoint\":\"254CB\",\"pinYinChars\":[{\"char\":\"YAN2\"}],\"splitChars\":[{\"char\":\"石兒\"}],\"weight\":\"10\"},{\"charId\":\"a3fa9aa8\",\"unicodeChar\":\"𥒌\",\"unicodeCodePoint\":\"2548C\",\"pinYinChars\":[{\"char\":\"XU4\"}],\"splitChars\":[{\"char\":\"石 血\"}],\"weight\":\"10\"},{\"charId\":\"cbb2d38d\",\"unicodeChar\":\"𥑻\",\"unicodeCodePoint\":\"2547B\",\"pinYinChars\":[{\"char\":\"XIAN1\"}],\"splitChars\":[{\"char\":\"石先\"}],\"weight\":\"10\"},{\"charId\":\"bf3472fe\",\"unicodeChar\":\"𥑪\",\"unicodeCodePoint\":\"2546A\",\"pinYinChars\":[{\"char\":\"NAO2\"}],\"splitChars\":[{\"char\":\"石勹𠃊乂\"}],\"weight\":\"10\"},{\"charId\":\"818958e5\",\"unicodeChar\":\"𥑤\",\"unicodeCodePoint\":\"25464\",\"pinYinChars\":[{\"char\":\"YOU4\"}],\"splitChars\":[{\"char\":\"石由\"}],\"weight\":\"10\"},{\"charId\":\"77514978\",\"unicodeChar\":\"𥑍\",\"unicodeCodePoint\":\"2544D\",\"pinYinChars\":[{\"char\":\"PAN2\"}],\"splitChars\":[{\"char\":\"石半\"}],\"weight\":\"10\"},{\"charId\":\"9c5d9a2d\",\"unicodeChar\":\"𥑂\",\"unicodeCodePoint\":\"25442\",\"pinYinChars\":[{\"char\":\"TANG2\"}],\"splitChars\":[{\"char\":\"石支\"}],\"weight\":\"10\"},{\"charId\":\"61fe1520\",\"unicodeChar\":\"𥑁\",\"unicodeCodePoint\":\"25441\",\"pinYinChars\":[{\"char\":\"BIAN1\"}],\"splitChars\":[{\"char\":\"石巴\"}],\"weight\":\"10\"},{\"charId\":\"691a3eb7\",\"unicodeChar\":\"𥐨\",\"unicodeCodePoint\":\"25428\",\"pinYinChars\":[{\"char\":\"TUO2\"}],\"splitChars\":[{\"char\":\"石也\"}],\"weight\":\"10\"},{\"charId\":\"d12f7e5f\",\"unicodeChar\":\"𥎸\",\"unicodeCodePoint\":\"253B8\",\"pinYinChars\":[{\"char\":\"QIA4\"}],\"splitChars\":[{\"char\":\"矢玄\"}],\"weight\":\"10\"},{\"charId\":\"586967ad\",\"unicodeChar\":\"𥍩\",\"unicodeCodePoint\":\"25369\",\"pinYinChars\":[{\"char\":\"YU4\"}],\"splitChars\":[{\"char\":\"矛 同\"}],\"weight\":\"10\"},{\"charId\":\"2d502d22\",\"unicodeChar\":\"𥍓\",\"unicodeCodePoint\":\"25353\",\"pinYinChars\":[{\"char\":\"KAN4\"}],\"splitChars\":[{\"char\":\"目嚴\"}],\"weight\":\"10\"},{\"charId\":\"386f5ab5\",\"unicodeChar\":\"𥌑\",\"unicodeCodePoint\":\"25311\",\"pinYinChars\":[{\"char\":\"WU2\"}],\"splitChars\":[{\"char\":\"目 睿\"}],\"weight\":\"10\"},{\"charId\":\"2f7788b8\",\"unicodeChar\":\"𥈶\",\"unicodeCodePoint\":\"25236\",\"pinYinChars\":[{\"char\":\"DAN4\"}],\"splitChars\":[{\"char\":\"目南\"}],\"weight\":\"10\"},{\"charId\":\"34ba2b40\",\"unicodeChar\":\"𥈧\",\"unicodeCodePoint\":\"25227\",\"pinYinChars\":[{\"char\":\"KAN4\"}],\"splitChars\":[{\"char\":\"目看\"}],\"weight\":\"10\"},{\"charId\":\"2740d6cf\",\"unicodeChar\":\"𥇷\",\"unicodeCodePoint\":\"251F7\",\"pinYinChars\":[{\"char\":\"YAO3\"}],\"splitChars\":[{\"char\":\"目岩\"}],\"weight\":\"10\"},{\"charId\":\"b4c022c4\",\"unicodeChar\":\"𥇶\",\"unicodeCodePoint\":\"251F6\",\"pinYinChars\":[{\"char\":\"HIM\"}],\"splitChars\":[{\"char\":\"目金\"}],\"weight\":\"10\"},{\"charId\":\"e6841844\",\"unicodeChar\":\"𥇪\",\"unicodeCodePoint\":\"251EA\",\"pinYinChars\":[{\"char\":\"FEI1\"}],\"splitChars\":[{\"char\":\"目非\"}],\"weight\":\"10\"},{\"charId\":\"166719f6\",\"unicodeChar\":\"𥇊\",\"unicodeCodePoint\":\"251CA\",\"pinYinChars\":[{\"char\":\"GUN4\"}],\"splitChars\":[{\"char\":\"目昆\"}],\"weight\":\"10\"},{\"charId\":\"8cab636a\",\"unicodeChar\":\"𥅴\",\"unicodeCodePoint\":\"25174\",\"pinYinChars\":[{\"char\":\"JIE2\"}],\"splitChars\":[{\"char\":\"目夹\"}],\"weight\":\"10\"},{\"charId\":\"00cbda8a\",\"unicodeChar\":\"𥄨\",\"unicodeCodePoint\":\"25128\",\"pinYinChars\":[{\"char\":\"CHOU3\"}],\"splitChars\":[{\"char\":\"目丑\"}],\"weight\":\"10\"},{\"charId\":\"f90b355d\",\"unicodeChar\":\"𥄅\",\"unicodeCodePoint\":\"25105\",\"pinYinChars\":[{\"char\":\"HU4\"}],\"splitChars\":[{\"char\":\"目户目戶\"}],\"weight\":\"10\"},{\"charId\":\"5c8a56ea\",\"unicodeChar\":\"𥃻\",\"unicodeCodePoint\":\"250FB\",\"pinYinChars\":[{\"char\":\"SHOU3\"}],\"splitChars\":[{\"char\":\"小目\"}],\"weight\":\"10\"},{\"charId\":\"648585de\",\"unicodeChar\":\"𥂩\",\"unicodeCodePoint\":\"250A9\",\"pinYinChars\":[{\"char\":\"GU3\"}],\"splitChars\":[{\"char\":\"古勹𠙻皿古匋皿\"}],\"weight\":\"10\"},{\"charId\":\"6a4b258b\",\"unicodeChar\":\"𥁙\",\"unicodeCodePoint\":\"25059\",\"pinYinChars\":[{\"char\":\"ZI3\"}],\"splitChars\":[{\"char\":\"仔 皿\"}],\"weight\":\"10\"},{\"charId\":\"3baeeb51\",\"unicodeChar\":\"𤾗\",\"unicodeCodePoint\":\"24F97\",\"pinYinChars\":[{\"char\":\"KUANG4\"}],\"splitChars\":[{\"char\":\"光皇\"}],\"weight\":\"10\"},{\"charId\":\"d6eda373\",\"unicodeChar\":\"𤾏\",\"unicodeCodePoint\":\"24F8F\",\"pinYinChars\":[{\"char\":\"HAO4\"}],\"splitChars\":[{\"char\":\"白 木\"}],\"weight\":\"10\"},{\"charId\":\"00c07941\",\"unicodeChar\":\"𤽾\",\"unicodeCodePoint\":\"24F7E\",\"pinYinChars\":[{\"char\":\"SHUANG3\"},{\"char\":\"SONG3\"}],\"splitChars\":[{\"char\":\"白 虎\"}],\"weight\":\"10\"},{\"charId\":\"51306815\",\"unicodeChar\":\"𤽟\",\"unicodeCodePoint\":\"24F5F\",\"pinYinChars\":[{\"char\":\"GAO3\"}],\"splitChars\":[{\"char\":\"白 丨\"}],\"weight\":\"10\"},{\"charId\":\"d5ecf8a2\",\"unicodeChar\":\"𤽙\",\"unicodeCodePoint\":\"24F59\",\"pinYinChars\":[{\"char\":\"HUANG2\"}],\"splitChars\":[{\"char\":\"白由\"}],\"weight\":\"10\"},{\"charId\":\"7375384f\",\"unicodeChar\":\"𤺬\",\"unicodeCodePoint\":\"24EAC\",\"pinYinChars\":[{\"char\":\"PENG4\"}],\"splitChars\":[{\"char\":\"疒彭\"}],\"weight\":\"10\"},{\"charId\":\"46c621ab\",\"unicodeChar\":\"𤹍\",\"unicodeCodePoint\":\"24E4D\",\"pinYinChars\":[{\"char\":\"YAN4\"}],\"splitChars\":[{\"char\":\"疒能\"}],\"weight\":\"10\"},{\"charId\":\"b92a6f0b\",\"unicodeChar\":\"𤳹\",\"unicodeCodePoint\":\"24CF9\",\"pinYinChars\":[{\"char\":\"LEI2\"}],\"splitChars\":[{\"char\":\"田田一田田\"}],\"weight\":\"10\"},{\"charId\":\"bf79a531\",\"unicodeChar\":\"𤳳\",\"unicodeCodePoint\":\"24CF3\",\"pinYinChars\":[{\"char\":\"LEI2\"}],\"splitChars\":[{\"char\":\"畕畕田田田田\"}],\"weight\":\"10\"},{\"charId\":\"faef1fc3\",\"unicodeChar\":\"𤳗\",\"unicodeCodePoint\":\"24CD7\",\"pinYinChars\":[{\"char\":\"BAN1\"}],\"splitChars\":[{\"char\":\"去番\"}],\"weight\":\"10\"},{\"charId\":\"d91cc582\",\"unicodeChar\":\"𤳈\",\"unicodeCodePoint\":\"24CC8\",\"pinYinChars\":[{\"char\":\"SHANG1\"}],\"splitChars\":[{\"char\":\"田𬀷\"}],\"weight\":\"10\"},{\"charId\":\"89b6a3d5\",\"unicodeChar\":\"𤲘\",\"unicodeCodePoint\":\"24C98\",\"pinYinChars\":[{\"char\":\"CHANG4\"}],\"splitChars\":[{\"char\":\"田長\"}],\"weight\":\"10\"},{\"charId\":\"9176068f\",\"unicodeChar\":\"𤲅\",\"unicodeCodePoint\":\"24C85\",\"pinYinChars\":[{\"char\":\"AN1\"}],\"splitChars\":[{\"char\":\"共电\"}],\"weight\":\"10\"},{\"charId\":\"0cccf61b\",\"unicodeChar\":\"𤱶\",\"unicodeCodePoint\":\"24C76\",\"pinYinChars\":[{\"char\":\"QUAN3\"}],\"splitChars\":[{\"char\":\"亩犬\"}],\"weight\":\"10\"},{\"charId\":\"91902f7a\",\"unicodeChar\":\"𤱓\",\"unicodeCodePoint\":\"24C53\",\"pinYinChars\":[{\"char\":\"SHEN1\"}],\"splitChars\":[{\"char\":\"申申\"}],\"weight\":\"10\"},{\"charId\":\"db29df21\",\"unicodeChar\":\"𤱂\",\"unicodeCodePoint\":\"24C42\",\"pinYinChars\":[{\"char\":\"MENG2\"}],\"splitChars\":[{\"char\":\"田云\"}],\"weight\":\"10\"},{\"charId\":\"ae29bcd7\",\"unicodeChar\":\"𤰯\",\"unicodeCodePoint\":\"24C2F\",\"pinYinChars\":[{\"char\":\"CE4\"}],\"splitChars\":[{\"char\":\"田八又田儿又\"}],\"weight\":\"10\"},{\"charId\":\"0519c001\",\"unicodeChar\":\"𤯾\",\"unicodeCodePoint\":\"24BFE\",\"pinYinChars\":[{\"char\":\"RUI2\"}],\"splitChars\":[{\"char\":\"蒙 生\"}],\"weight\":\"10\"},{\"charId\":\"e5e0145e\",\"unicodeChar\":\"𤯷\",\"unicodeCodePoint\":\"24BF7\",\"pinYinChars\":[{\"char\":\"HUANG2\"}],\"splitChars\":[{\"char\":\"舜生\"}],\"weight\":\"10\"},{\"charId\":\"8c7483f6\",\"unicodeChar\":\"𤯦\",\"unicodeCodePoint\":\"24BE6\",\"pinYinChars\":[{\"char\":\"NEN4\"}],\"splitChars\":[{\"char\":\"初生\"}],\"weight\":\"10\"},{\"charId\":\"3ab8f500\",\"unicodeChar\":\"𤯏\",\"unicodeCodePoint\":\"24BCF\",\"pinYinChars\":[{\"char\":\"MEI2\"}],\"splitChars\":[{\"char\":\"甘𡭕甘朩\"}],\"weight\":\"10\"},{\"charId\":\"fbb83627\",\"unicodeChar\":\"𤯋\",\"unicodeCodePoint\":\"24BCB\",\"pinYinChars\":[{\"char\":\"ZHE4\"}],\"splitChars\":[{\"char\":\"甘庶\"}],\"weight\":\"10\"},{\"charId\":\"50c2ae4c\",\"unicodeChar\":\"𤭾\",\"unicodeCodePoint\":\"24B7E\",\"pinYinChars\":[{\"char\":\"ZHEN\"}],\"splitChars\":[{\"char\":\"西 瓦\"}],\"weight\":\"10\"},{\"charId\":\"a483b6ba\",\"unicodeChar\":\"𤭛\",\"unicodeCodePoint\":\"24B5B\",\"pinYinChars\":[{\"char\":\"GANG1\"}],\"splitChars\":[{\"char\":\"岡瓦\"}],\"weight\":\"10\"},{\"charId\":\"1e256f92\",\"unicodeChar\":\"𤬻\",\"unicodeCodePoint\":\"24B3B\",\"pinYinChars\":[{\"char\":\"LING2\"}],\"splitChars\":[{\"char\":\"瓦令\"}],\"weight\":\"10\"},{\"charId\":\"b43c09f7\",\"unicodeChar\":\"𤬬\",\"unicodeCodePoint\":\"24B2C\",\"pinYinChars\":[{\"char\":\"ZHOU4\"}],\"splitChars\":[{\"char\":\"火瓦\"}],\"weight\":\"10\"},{\"charId\":\"960de6ad\",\"unicodeChar\":\"𤫩\",\"unicodeCodePoint\":\"24AE9\",\"pinYinChars\":[{\"char\":\"LING2\"}],\"splitChars\":[{\"char\":\"王靈\"}],\"weight\":\"10\"},{\"charId\":\"12b34675\",\"unicodeChar\":\"𤫢\",\"unicodeCodePoint\":\"24AE2\",\"pinYinChars\":[{\"char\":\"LOU\"}],\"splitChars\":[{\"char\":\"王 露\"}],\"weight\":\"10\"},{\"charId\":\"d76ae7f9\",\"unicodeChar\":\"𤫠\",\"unicodeCodePoint\":\"24AE0\",\"pinYinChars\":[{\"char\":\"王 嚴\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"207db911\",\"unicodeChar\":\"𤫟\",\"unicodeCodePoint\":\"24ADF\",\"pinYinChars\":[{\"char\":\"LI4\"}],\"splitChars\":[{\"char\":\"王 麗\"}],\"weight\":\"10\"},{\"charId\":\"22f52e08\",\"unicodeChar\":\"𤫙\",\"unicodeCodePoint\":\"24AD9\",\"pinYinChars\":[{\"char\":\"王爕\"},{\"char\":\"王 火\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"0f1f3106\",\"unicodeChar\":\"𤫑\",\"unicodeCodePoint\":\"24AD1\",\"pinYinChars\":[{\"char\":\"LI4\"}],\"splitChars\":[{\"char\":\"王 麗\"}],\"weight\":\"10\"},{\"charId\":\"85c77c6a\",\"unicodeChar\":\"𤫎\",\"unicodeCodePoint\":\"24ACE\",\"pinYinChars\":[{\"char\":\"YING2\"}],\"splitChars\":[{\"char\":\"王營\"}],\"weight\":\"10\"},{\"charId\":\"ddb0bba0\",\"unicodeChar\":\"𤫇\",\"unicodeCodePoint\":\"24AC7\",\"pinYinChars\":[{\"char\":\"JIN3\"}],\"splitChars\":[{\"char\":\"王 燕\"}],\"weight\":\"10\"},{\"charId\":\"fc5b217c\",\"unicodeChar\":\"𤫂\",\"unicodeCodePoint\":\"24AC2\",\"pinYinChars\":[{\"char\":\"XING1\"}],\"splitChars\":[{\"char\":\"王 興\"}],\"weight\":\"10\"},{\"charId\":\"1e882f55\",\"unicodeChar\":\"𤪻\",\"unicodeCodePoint\":\"24ABB\",\"pinYinChars\":[{\"char\":\"xuan2\"}],\"splitChars\":[{\"char\":\"王 目\"}],\"weight\":\"10\"},{\"charId\":\"334d96a9\",\"unicodeChar\":\"𤪪\",\"unicodeCodePoint\":\"24AAA\",\"pinYinChars\":[{\"char\":\"ZHUAN4\"}],\"splitChars\":[{\"char\":\"王篆\"}],\"weight\":\"10\"},{\"charId\":\"c6833a9d\",\"unicodeChar\":\"𤪜\",\"unicodeCodePoint\":\"24A9C\",\"pinYinChars\":[{\"char\":\"RONG2\"}],\"splitChars\":[{\"char\":\"王 蓉\"}],\"weight\":\"10\"},{\"charId\":\"3e248b6b\",\"unicodeChar\":\"𤪗\",\"unicodeCodePoint\":\"24A97\",\"pinYinChars\":[{\"char\":\"HAO2\"}],\"splitChars\":[{\"char\":\"王 豪\"}],\"weight\":\"10\"},{\"charId\":\"c3337716\",\"unicodeChar\":\"𤪂\",\"unicodeCodePoint\":\"24A82\",\"pinYinChars\":[{\"char\":\"YU4\"}],\"splitChars\":[{\"char\":\"王 愈\"}],\"weight\":\"10\"},{\"charId\":\"3f4cabc2\",\"unicodeChar\":\"𤩿\",\"unicodeCodePoint\":\"24A7F\",\"pinYinChars\":[{\"char\":\"CONG1\"}],\"splitChars\":[{\"char\":\"王 葱\"}],\"weight\":\"10\"},{\"charId\":\"d7dba925\",\"unicodeChar\":\"𤩸\",\"unicodeCodePoint\":\"24A78\",\"pinYinChars\":[{\"char\":\"王 葵\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"aa890004\",\"unicodeChar\":\"𤩬\",\"unicodeCodePoint\":\"24A6C\",\"pinYinChars\":[{\"char\":\"XIANG4\"}],\"splitChars\":[{\"char\":\"王鄉\"}],\"weight\":\"10\"},{\"charId\":\"9d69dedc\",\"unicodeChar\":\"𤩧\",\"unicodeCodePoint\":\"24A67\",\"pinYinChars\":[{\"char\":\"CHEN2\"}],\"splitChars\":[{\"char\":\"王 單\"}],\"weight\":\"10\"},{\"charId\":\"3642e7eb\",\"unicodeChar\":\"𤩗\",\"unicodeCodePoint\":\"24A57\",\"pinYinChars\":[{\"char\":\"SU4\"}],\"splitChars\":[{\"char\":\"王 粟\"}],\"weight\":\"10\"},{\"charId\":\"f133fd63\",\"unicodeChar\":\"𤩓\",\"unicodeCodePoint\":\"24A53\",\"pinYinChars\":[{\"char\":\"PU3\"}],\"splitChars\":[{\"char\":\"王 普\"}],\"weight\":\"10\"},{\"charId\":\"7128d030\",\"unicodeChar\":\"𤩐\",\"unicodeCodePoint\":\"24A50\",\"pinYinChars\":[{\"char\":\"PU3\"}],\"splitChars\":[{\"char\":\"王斯\"}],\"weight\":\"10\"},{\"charId\":\"6639a844\",\"unicodeChar\":\"𤩁\",\"unicodeCodePoint\":\"24A41\",\"pinYinChars\":[{\"char\":\"QU2\"}],\"splitChars\":[{\"char\":\"王䖏\"}],\"weight\":\"10\"},{\"charId\":\"9773e4ad\",\"unicodeChar\":\"𤨭\",\"unicodeCodePoint\":\"24A2D\",\"pinYinChars\":[{\"char\":\"YONG1\"}],\"splitChars\":[{\"char\":\"王 庸\"}],\"weight\":\"10\"},{\"charId\":\"87799565\",\"unicodeChar\":\"𤨦\",\"unicodeCodePoint\":\"24A26\",\"pinYinChars\":[{\"char\":\"JI1\"}],\"splitChars\":[{\"char\":\"王 奇\"}],\"weight\":\"10\"},{\"charId\":\"4a338873\",\"unicodeChar\":\"𤨡\",\"unicodeCodePoint\":\"24A21\",\"pinYinChars\":[{\"char\":\"LANG3\"}],\"splitChars\":[{\"char\":\"王朗\"}],\"weight\":\"10\"},{\"charId\":\"894382ea\",\"unicodeChar\":\"𤨠\",\"unicodeCodePoint\":\"24A20\",\"pinYinChars\":[{\"char\":\"王 堂\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"73238b6f\",\"unicodeChar\":\"𤨎\",\"unicodeCodePoint\":\"24A0E\",\"pinYinChars\":[{\"char\":\"QU2\"}],\"splitChars\":[{\"char\":\"王 家\"}],\"weight\":\"10\"},{\"charId\":\"8573da6f\",\"unicodeChar\":\"𤧻\",\"unicodeCodePoint\":\"249FB\",\"pinYinChars\":[{\"char\":\"TING2\"}],\"splitChars\":[{\"char\":\"王 庭\"}],\"weight\":\"10\"},{\"charId\":\"ee78777f\",\"unicodeChar\":\"𤧸\",\"unicodeCodePoint\":\"249F8\",\"pinYinChars\":[{\"char\":\"HEI2\"}],\"splitChars\":[{\"char\":\"王 豈\"}],\"weight\":\"10\"},{\"charId\":\"99de54b4\",\"unicodeChar\":\"𤧵\",\"unicodeCodePoint\":\"249F5\",\"pinYinChars\":[{\"char\":\"王 尃\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"3f97001c\",\"unicodeChar\":\"𤧑\",\"unicodeCodePoint\":\"249D1\",\"pinYinChars\":[{\"char\":\"FENG1\"}],\"splitChars\":[{\"char\":\"王風\"}],\"weight\":\"10\"},{\"charId\":\"42c33a75\",\"unicodeChar\":\"𤧍\",\"unicodeCodePoint\":\"249CD\",\"pinYinChars\":[{\"char\":\"LING2\"}],\"splitChars\":[{\"char\":\"王 令\"}],\"weight\":\"10\"},{\"charId\":\"68efdc1b\",\"unicodeChar\":\"𤧅\",\"unicodeCodePoint\":\"249C5\",\"pinYinChars\":[{\"char\":\"PING2\"}],\"splitChars\":[{\"char\":\"王 屏\"}],\"weight\":\"10\"},{\"charId\":\"2ed66a9e\",\"unicodeChar\":\"𤧄\",\"unicodeCodePoint\":\"249C4\",\"pinYinChars\":[{\"char\":\"YAO1\"}],\"splitChars\":[{\"char\":\"王 要\"}],\"weight\":\"10\"},{\"charId\":\"3e78c74d\",\"unicodeChar\":\"𤧃\",\"unicodeCodePoint\":\"249C3\",\"pinYinChars\":[{\"char\":\"QI4\"}],\"splitChars\":[{\"char\":\"王 契\"}],\"weight\":\"10\"},{\"charId\":\"763f7316\",\"unicodeChar\":\"𤧀\",\"unicodeCodePoint\":\"249C0\",\"pinYinChars\":[{\"char\":\"MOU3\"}],\"splitChars\":[{\"char\":\"王 某\"}],\"weight\":\"10\"},{\"charId\":\"8e90905b\",\"unicodeChar\":\"𤦽\",\"unicodeCodePoint\":\"249BD\",\"pinYinChars\":[{\"char\":\"YOU2\"}],\"splitChars\":[{\"char\":\"王 子\"}],\"weight\":\"10\"},{\"charId\":\"56f638c1\",\"unicodeChar\":\"𤦻\",\"unicodeCodePoint\":\"249BB\",\"pinYinChars\":[{\"char\":\"王 亮\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"ed334fe8\",\"unicodeChar\":\"𤦸\",\"unicodeCodePoint\":\"249B8\",\"pinYinChars\":[{\"char\":\"王 保\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"97373194\",\"unicodeChar\":\"𤦷\",\"unicodeCodePoint\":\"249B7\",\"pinYinChars\":[{\"char\":\"JIN2\"}],\"splitChars\":[{\"char\":\"王 衍\"}],\"weight\":\"10\"},{\"charId\":\"fca66b71\",\"unicodeChar\":\"𤦭\",\"unicodeCodePoint\":\"249AD\",\"pinYinChars\":[{\"char\":\"JING1\"}],\"splitChars\":[{\"char\":\"王 青\"}],\"weight\":\"10\"},{\"charId\":\"c3fd88ac\",\"unicodeChar\":\"𤦫\",\"unicodeCodePoint\":\"249AB\",\"pinYinChars\":[{\"char\":\"LING2\"}],\"splitChars\":[{\"char\":\"王 夌\"}],\"weight\":\"10\"},{\"charId\":\"a580bf3d\",\"unicodeChar\":\"𤦩\",\"unicodeCodePoint\":\"249A9\",\"pinYinChars\":[{\"char\":\"E4\"}],\"splitChars\":[{\"char\":\"王亞\"}],\"weight\":\"10\"},{\"charId\":\"4d6c9809\",\"unicodeChar\":\"𤦧\",\"unicodeCodePoint\":\"249A7\",\"pinYinChars\":[{\"char\":\"ZI1\"}],\"splitChars\":[{\"char\":\"王 芝\"}],\"weight\":\"10\"},{\"charId\":\"55ab69e1\",\"unicodeChar\":\"𤦝\",\"unicodeCodePoint\":\"2499D\",\"pinYinChars\":[{\"char\":\"JIN3\"}],\"splitChars\":[{\"char\":\"王 帛\"}],\"weight\":\"10\"},{\"charId\":\"aee144bf\",\"unicodeChar\":\"𤦖\",\"unicodeCodePoint\":\"24996\",\"pinYinChars\":[{\"char\":\"MAO2\"}],\"splitChars\":[{\"char\":\"王 毛\"}],\"weight\":\"10\"},{\"charId\":\"89995bf5\",\"unicodeChar\":\"𤦌\",\"unicodeCodePoint\":\"2498C\",\"pinYinChars\":[{\"char\":\"王 宜\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"7601d6a0\",\"unicodeChar\":\"𤦈\",\"unicodeCodePoint\":\"24988\",\"pinYinChars\":[{\"char\":\"王 芬\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"6a451b21\",\"unicodeChar\":\"𤦇\",\"unicodeCodePoint\":\"24987\",\"pinYinChars\":[{\"char\":\"gang1\"}],\"splitChars\":[{\"char\":\"王岡\"}],\"weight\":\"10\"},{\"charId\":\"2cd1727b\",\"unicodeChar\":\"𤦄\",\"unicodeCodePoint\":\"24984\",\"pinYinChars\":[{\"char\":\"ZHI4\"}],\"splitChars\":[{\"char\":\"王巛乚日\"}],\"weight\":\"10\"},{\"charId\":\"a5763ccd\",\"unicodeChar\":\"𤥺\",\"unicodeCodePoint\":\"2497A\",\"pinYinChars\":[{\"char\":\"HUAN4\"}],\"splitChars\":[{\"char\":\"王奂\"}],\"weight\":\"10\"},{\"charId\":\"975e5dfa\",\"unicodeChar\":\"𤥶\",\"unicodeCodePoint\":\"24976\",\"pinYinChars\":[{\"char\":\"NA4\"}],\"splitChars\":[{\"char\":\"王 那\"}],\"weight\":\"10\"},{\"charId\":\"77a5abd7\",\"unicodeChar\":\"𤥩\",\"unicodeCodePoint\":\"24969\",\"pinYinChars\":[{\"char\":\"PI3\"}],\"splitChars\":[{\"char\":\"王 疋\"}],\"weight\":\"10\"},{\"charId\":\"f92b2a51\",\"unicodeChar\":\"𤥠\",\"unicodeCodePoint\":\"24960\",\"pinYinChars\":[{\"char\":\"王 宏\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"a7d84979\",\"unicodeChar\":\"𤥚\",\"unicodeCodePoint\":\"2495A\",\"pinYinChars\":[{\"char\":\"GAN1\"}],\"splitChars\":[{\"char\":\"王旱\"}],\"weight\":\"10\"},{\"charId\":\"f654ebea\",\"unicodeChar\":\"𤥗\",\"unicodeCodePoint\":\"24957\",\"pinYinChars\":[{\"char\":\"LIU2\"}],\"splitChars\":[{\"char\":\"王丣\"}],\"weight\":\"10\"},{\"charId\":\"e7a71ed2\",\"unicodeChar\":\"𤥃\",\"unicodeCodePoint\":\"24943\",\"pinYinChars\":[{\"char\":\"AN1\"}],\"splitChars\":[{\"char\":\"王 安\"}],\"weight\":\"10\"},{\"charId\":\"a08096f2\",\"unicodeChar\":\"𤥂\",\"unicodeCodePoint\":\"24942\",\"pinYinChars\":[{\"char\":\"王 亦\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"d6139c70\",\"unicodeChar\":\"𤥀\",\"unicodeCodePoint\":\"24940\",\"pinYinChars\":[{\"char\":\"duo1\"}],\"splitChars\":[{\"char\":\"王 多\"}],\"weight\":\"10\"},{\"charId\":\"39605153\",\"unicodeChar\":\"𤤾\",\"unicodeCodePoint\":\"2493E\",\"pinYinChars\":[{\"char\":\"heng2\"}],\"splitChars\":[{\"char\":\"王 亍\"}],\"weight\":\"10\"},{\"charId\":\"6a0555fc\",\"unicodeChar\":\"𤤹\",\"unicodeCodePoint\":\"24939\",\"pinYinChars\":[{\"char\":\"JI2\"}],\"splitChars\":[{\"char\":\"王朿\"}],\"weight\":\"10\"},{\"charId\":\"94c060bc\",\"unicodeChar\":\"𤤳\",\"unicodeCodePoint\":\"24933\",\"pinYinChars\":[{\"char\":\"王 以\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"9a429c88\",\"unicodeChar\":\"𤤯\",\"unicodeCodePoint\":\"2492F\",\"pinYinChars\":[{\"char\":\"YONG3\"}],\"splitChars\":[{\"char\":\"王 永\"}],\"weight\":\"10\"},{\"charId\":\"bfef5059\",\"unicodeChar\":\"𤤤\",\"unicodeCodePoint\":\"24924\",\"pinYinChars\":[{\"char\":\"HE2\"}],\"splitChars\":[{\"char\":\"王 禾\"}],\"weight\":\"10\"},{\"charId\":\"85f94113\",\"unicodeChar\":\"𤤠\",\"unicodeCodePoint\":\"24920\",\"pinYinChars\":[{\"char\":\"YANG\"}],\"splitChars\":[{\"char\":\"王央\"}],\"weight\":\"10\"},{\"charId\":\"ec385442\",\"unicodeChar\":\"𤤟\",\"unicodeCodePoint\":\"2491F\",\"pinYinChars\":[{\"char\":\"DU4\"},{\"char\":\"SHI2\"}],\"splitChars\":[{\"char\":\"王 石\"}],\"weight\":\"10\"},{\"charId\":\"ba2939b0\",\"unicodeChar\":\"𤤖\",\"unicodeCodePoint\":\"24916\",\"pinYinChars\":[{\"char\":\"王 弗\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"626f71b6\",\"unicodeChar\":\"𤤔\",\"unicodeCodePoint\":\"24914\",\"pinYinChars\":[{\"char\":\"li4\"}],\"splitChars\":[{\"char\":\"王立\"}],\"weight\":\"10\"},{\"charId\":\"6aef6deb\",\"unicodeChar\":\"𤤉\",\"unicodeCodePoint\":\"24909\",\"pinYinChars\":[{\"char\":\"BU4\"}],\"splitChars\":[{\"char\":\"王少\"}],\"weight\":\"10\"},{\"charId\":\"402f5e33\",\"unicodeChar\":\"𤤁\",\"unicodeCodePoint\":\"24901\",\"pinYinChars\":[{\"char\":\"王 方\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"2cea29c0\",\"unicodeChar\":\"𤤀\",\"unicodeCodePoint\":\"24900\",\"pinYinChars\":[{\"char\":\"王 屯\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"aff39345\",\"unicodeChar\":\"𤣳\",\"unicodeCodePoint\":\"248F3\",\"pinYinChars\":[{\"char\":\"gan1\"}],\"splitChars\":[{\"char\":\"王 千\"}],\"weight\":\"10\"},{\"charId\":\"5419da97\",\"unicodeChar\":\"𤣮\",\"unicodeCodePoint\":\"248EE\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"王乞\"}],\"weight\":\"10\"},{\"charId\":\"ceecbfef\",\"unicodeChar\":\"𤠋\",\"unicodeCodePoint\":\"2480B\",\"pinYinChars\":[{\"char\":\"LOU2\"}],\"splitChars\":[{\"char\":\"犭娄\"}],\"weight\":\"10\"},{\"charId\":\"aa1f5dad\",\"unicodeChar\":\"𤞏\",\"unicodeCodePoint\":\"2478F\",\"pinYinChars\":[{\"char\":\"XI1\"}],\"splitChars\":[{\"char\":\"犭西\"}],\"weight\":\"10\"},{\"charId\":\"05736428\",\"unicodeChar\":\"𤜱\",\"unicodeCodePoint\":\"24731\",\"pinYinChars\":[{\"char\":\"BA1\"}],\"splitChars\":[{\"char\":\"犭巴\"}],\"weight\":\"10\"},{\"charId\":\"f8edb95e\",\"unicodeChar\":\"𤜥\",\"unicodeCodePoint\":\"24725\",\"pinYinChars\":[{\"char\":\"犭 义\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"ed281135\",\"unicodeChar\":\"𤛁\",\"unicodeCodePoint\":\"246C1\",\"pinYinChars\":[{\"char\":\"WEN4\"}],\"splitChars\":[{\"char\":\"牛昷\"}],\"weight\":\"10\"},{\"charId\":\"b137485d\",\"unicodeChar\":\"𤘯\",\"unicodeCodePoint\":\"2462F\",\"pinYinChars\":[{\"char\":\"MU4\"}],\"splitChars\":[{\"char\":\"牛 欠\"}],\"weight\":\"10\"},{\"charId\":\"ac69b9fd\",\"unicodeChar\":\"𤓖\",\"unicodeCodePoint\":\"244D6\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"䜌火\"}],\"weight\":\"10\"},{\"charId\":\"d1b6163c\",\"unicodeChar\":\"𤒝\",\"unicodeCodePoint\":\"2449D\",\"pinYinChars\":[{\"char\":\"YAO4\"}],\"splitChars\":[{\"char\":\"自 火\"}],\"weight\":\"10\"},{\"charId\":\"c8df42b3\",\"unicodeChar\":\"𤑚\",\"unicodeCodePoint\":\"2445A\",\"pinYinChars\":[{\"char\":\"YING4\"}],\"splitChars\":[{\"char\":\"火 瑩\"}],\"weight\":\"10\"},{\"charId\":\"aa9b14eb\",\"unicodeChar\":\"𤑒\",\"unicodeCodePoint\":\"24452\",\"pinYinChars\":[{\"char\":\"WEI4\"}],\"splitChars\":[{\"char\":\"艹熭\"}],\"weight\":\"10\"},{\"charId\":\"f42abb99\",\"unicodeChar\":\"𤐷\",\"unicodeCodePoint\":\"24437\",\"pinYinChars\":[{\"char\":\"EN1\"}],\"splitChars\":[{\"char\":\"火 塵\"}],\"weight\":\"10\"},{\"charId\":\"d9e896d6\",\"unicodeChar\":\"𤐯\",\"unicodeCodePoint\":\"2442F\",\"pinYinChars\":[{\"char\":\"YUE4\"}],\"splitChars\":[{\"char\":\"火 龠\"}],\"weight\":\"10\"},{\"charId\":\"e89cb465\",\"unicodeChar\":\"𤏖\",\"unicodeCodePoint\":\"243D6\",\"pinYinChars\":[{\"char\":\"JIAN1\"}],\"splitChars\":[{\"char\":\"火替\"}],\"weight\":\"10\"},{\"charId\":\"d4a9c113\",\"unicodeChar\":\"𤎻\",\"unicodeCodePoint\":\"243BB\",\"pinYinChars\":[{\"char\":\"XIAO1\"}],\"splitChars\":[{\"char\":\"火萧\"}],\"weight\":\"10\"},{\"charId\":\"fef4e5c3\",\"unicodeChar\":\"𤎰\",\"unicodeCodePoint\":\"243B0\",\"pinYinChars\":[{\"char\":\"ZENG1\"}],\"splitChars\":[{\"char\":\"曾灬\"}],\"weight\":\"10\"},{\"charId\":\"97de6a57\",\"unicodeChar\":\"𤍢\",\"unicodeCodePoint\":\"24362\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"火 土\"}],\"weight\":\"10\"},{\"charId\":\"5ca75601\",\"unicodeChar\":\"𤍐\",\"unicodeCodePoint\":\"24350\",\"pinYinChars\":[{\"char\":\"TUI4\"}],\"splitChars\":[{\"char\":\"推火\"}],\"weight\":\"10\"},{\"charId\":\"44870765\",\"unicodeChar\":\"𤍈\",\"unicodeCodePoint\":\"24348\",\"pinYinChars\":[{\"char\":\"QI3\"}],\"splitChars\":[{\"char\":\"火 豈\"}],\"weight\":\"10\"},{\"charId\":\"3aedba3f\",\"unicodeChar\":\"𤌣\",\"unicodeCodePoint\":\"24323\",\"pinYinChars\":[{\"char\":\"LI4\"}],\"splitChars\":[{\"char\":\"火栗\"}],\"weight\":\"10\"},{\"charId\":\"ca52fc74\",\"unicodeChar\":\"𤌗\",\"unicodeCodePoint\":\"24317\",\"pinYinChars\":[{\"char\":\"HUANG2\"}],\"splitChars\":[{\"char\":\"火 正\"}],\"weight\":\"10\"},{\"charId\":\"9c50b638\",\"unicodeChar\":\"𤌀\",\"unicodeCodePoint\":\"24300\",\"pinYinChars\":[{\"char\":\"火 急\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"c8291b53\",\"unicodeChar\":\"𤋾\",\"unicodeCodePoint\":\"242FE\",\"pinYinChars\":[{\"char\":\"YIN1\"}],\"splitChars\":[{\"char\":\"火音\"}],\"weight\":\"10\"},{\"charId\":\"3d5b2e59\",\"unicodeChar\":\"𤋟\",\"unicodeCodePoint\":\"242DF\",\"pinYinChars\":[{\"char\":\"FU4\"}],\"splitChars\":[{\"char\":\"火 复\"}],\"weight\":\"10\"},{\"charId\":\"8b046c4a\",\"unicodeChar\":\"𤊨\",\"unicodeCodePoint\":\"242A8\",\"pinYinChars\":[{\"char\":\"FU2\"}],\"splitChars\":[{\"char\":\"火 或\"}],\"weight\":\"10\"},{\"charId\":\"851d23c4\",\"unicodeChar\":\"𤊧\",\"unicodeCodePoint\":\"242A7\",\"pinYinChars\":[{\"char\":\"火直\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"216304d7\",\"unicodeChar\":\"𤊥\",\"unicodeCodePoint\":\"242A5\",\"pinYinChars\":[{\"char\":\"LING2\"}],\"splitChars\":[{\"char\":\"火夌\"}],\"weight\":\"10\"},{\"charId\":\"20b2805a\",\"unicodeChar\":\"𤊤\",\"unicodeCodePoint\":\"242A4\",\"pinYinChars\":[{\"char\":\"火岩\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"87e55ba6\",\"unicodeChar\":\"𤊢\",\"unicodeCodePoint\":\"242A2\",\"pinYinChars\":[{\"char\":\"火 得\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"45947d8f\",\"unicodeChar\":\"𤊓\",\"unicodeCodePoint\":\"24293\",\"pinYinChars\":[{\"char\":\"NI2\"}],\"splitChars\":[{\"char\":\"火 兒\"}],\"weight\":\"10\"},{\"charId\":\"17681ddd\",\"unicodeChar\":\"𤊒\",\"unicodeCodePoint\":\"24292\",\"pinYinChars\":[{\"char\":\"LV4\"}],\"splitChars\":[{\"char\":\"火 录\"}],\"weight\":\"10\"},{\"charId\":\"588367c3\",\"unicodeChar\":\"𤊎\",\"unicodeCodePoint\":\"2428E\",\"pinYinChars\":[{\"char\":\"GU4\"}],\"splitChars\":[{\"char\":\"火 固\"}],\"weight\":\"10\"},{\"charId\":\"19c99dbe\",\"unicodeChar\":\"𤊄\",\"unicodeCodePoint\":\"24284\",\"pinYinChars\":[{\"char\":\"QI4\"}],\"splitChars\":[{\"char\":\"火其\"}],\"weight\":\"10\"},{\"charId\":\"e5bafc0f\",\"unicodeChar\":\"𤉘\",\"unicodeCodePoint\":\"24258\",\"pinYinChars\":[{\"char\":\"火 言\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"3fd77506\",\"unicodeChar\":\"𤉋\",\"unicodeCodePoint\":\"2424B\",\"pinYinChars\":[{\"char\":\"ZHENG2\"},{\"char\":\"ZHENG3\"}],\"splitChars\":[{\"char\":\"𠄘灬\"}],\"weight\":\"10\"},{\"charId\":\"65348086\",\"unicodeChar\":\"𤈽\",\"unicodeCodePoint\":\"2423D\",\"pinYinChars\":[{\"char\":\"PENG\"}],\"splitChars\":[{\"char\":\"火亨\"}],\"weight\":\"10\"},{\"charId\":\"bb38ce9a\",\"unicodeChar\":\"𤈻\",\"unicodeCodePoint\":\"2423B\",\"pinYinChars\":[{\"char\":\"HONG2\"}],\"splitChars\":[{\"char\":\"火 宏\"}],\"weight\":\"10\"},{\"charId\":\"618f88af\",\"unicodeChar\":\"𤈺\",\"unicodeCodePoint\":\"2423A\",\"pinYinChars\":[{\"char\":\"YING2\"}],\"splitChars\":[{\"char\":\"火 凡\"}],\"weight\":\"10\"},{\"charId\":\"9561daf6\",\"unicodeChar\":\"𤈷\",\"unicodeCodePoint\":\"24237\",\"pinYinChars\":[{\"char\":\"XIAN1\"}],\"splitChars\":[{\"char\":\"火佥\"}],\"weight\":\"10\"},{\"charId\":\"da497199\",\"unicodeChar\":\"𤈶\",\"unicodeCodePoint\":\"24236\",\"pinYinChars\":[{\"char\":\"YUN2\"}],\"splitChars\":[{\"char\":\"火员\"}],\"weight\":\"10\"},{\"charId\":\"ef3a49ca\",\"unicodeChar\":\"𤈠\",\"unicodeCodePoint\":\"24220\",\"pinYinChars\":[{\"char\":\"火聿\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"92762e66\",\"unicodeChar\":\"𤈜\",\"unicodeCodePoint\":\"2421C\",\"pinYinChars\":[{\"char\":\"ting1\"}],\"splitChars\":[{\"char\":\"火至\"}],\"weight\":\"10\"},{\"charId\":\"f372a0b1\",\"unicodeChar\":\"𤈛\",\"unicodeCodePoint\":\"2421B\",\"pinYinChars\":[{\"char\":\"GUANG\"}],\"splitChars\":[{\"char\":\"火光\"}],\"weight\":\"10\"},{\"charId\":\"ba9abf92\",\"unicodeChar\":\"𤈇\",\"unicodeCodePoint\":\"24207\",\"pinYinChars\":[{\"char\":\"XI1\"}],\"splitChars\":[{\"char\":\"火西\"}],\"weight\":\"10\"},{\"charId\":\"be52cf05\",\"unicodeChar\":\"𤇺\",\"unicodeCodePoint\":\"241FA\",\"pinYinChars\":[{\"char\":\"FENG\"}],\"splitChars\":[{\"char\":\"火 夅\"}],\"weight\":\"10\"},{\"charId\":\"8ad2b9b5\",\"unicodeChar\":\"𤇹\",\"unicodeCodePoint\":\"241F9\",\"pinYinChars\":[{\"char\":\"BI4\"}],\"splitChars\":[{\"char\":\"火毕\"}],\"weight\":\"10\"},{\"charId\":\"41d18198\",\"unicodeChar\":\"𤇶\",\"unicodeCodePoint\":\"241F6\",\"pinYinChars\":[{\"char\":\"ZHENG\"}],\"splitChars\":[{\"char\":\"火 丞\"}],\"weight\":\"10\"},{\"charId\":\"f075602d\",\"unicodeChar\":\"𤇭\",\"unicodeCodePoint\":\"241ED\",\"pinYinChars\":[{\"char\":\"LONG2\"}],\"splitChars\":[{\"char\":\"火龙\"}],\"weight\":\"10\"},{\"charId\":\"fb442f44\",\"unicodeChar\":\"𤇨\",\"unicodeCodePoint\":\"241E8\",\"pinYinChars\":[{\"char\":\"PEI1\"}],\"splitChars\":[{\"char\":\"火丕\"}],\"weight\":\"10\"},{\"charId\":\"f7031a84\",\"unicodeChar\":\"𤇥\",\"unicodeCodePoint\":\"241E5\",\"pinYinChars\":[{\"char\":\"火立\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"5749f41a\",\"unicodeChar\":\"𤇣\",\"unicodeCodePoint\":\"241E3\",\"pinYinChars\":[{\"char\":\"XING4\"}],\"splitChars\":[{\"char\":\"火生\"}],\"weight\":\"10\"},{\"charId\":\"953a459e\",\"unicodeChar\":\"𤇒\",\"unicodeCodePoint\":\"241D2\",\"pinYinChars\":[{\"char\":\"CE4\"}],\"splitChars\":[{\"char\":\"火 册\"}],\"weight\":\"10\"},{\"charId\":\"566eb5c9\",\"unicodeChar\":\"𤇅\",\"unicodeCodePoint\":\"241C5\",\"pinYinChars\":[{\"char\":\"火 且\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"31ced6fd\",\"unicodeChar\":\"𤇄\",\"unicodeCodePoint\":\"241C4\",\"pinYinChars\":[{\"char\":\"SHAN3\"}],\"splitChars\":[{\"char\":\"火闪\"}],\"weight\":\"10\"},{\"charId\":\"ff09a649\",\"unicodeChar\":\"𤇂\",\"unicodeCodePoint\":\"241C2\",\"pinYinChars\":[{\"char\":\"SHENG4\"}],\"splitChars\":[{\"char\":\"火圣\"}],\"weight\":\"10\"},{\"charId\":\"8cc9291f\",\"unicodeChar\":\"𤇁\",\"unicodeCodePoint\":\"241C1\",\"pinYinChars\":[{\"char\":\"HE2\"},{\"char\":\"GAI4\"},{\"char\":\"GE3\"}],\"splitChars\":[{\"char\":\"火 旦\"}],\"weight\":\"10\"},{\"charId\":\"35ab0aba\",\"unicodeChar\":\"𤆶\",\"unicodeCodePoint\":\"241B6\",\"pinYinChars\":[{\"char\":\"FEN2\"}],\"splitChars\":[{\"char\":\"火分\"}],\"weight\":\"10\"},{\"charId\":\"1516bbdd\",\"unicodeChar\":\"𤆥\",\"unicodeCodePoint\":\"241A5\",\"pinYinChars\":[{\"char\":\"zhuo2\"}],\"splitChars\":[{\"char\":\"火勻\"}],\"weight\":\"10\"},{\"charId\":\"e1fc87b1\",\"unicodeChar\":\"𤆢\",\"unicodeCodePoint\":\"241A2\",\"pinYinChars\":[{\"char\":\"LUN2\"}],\"splitChars\":[{\"char\":\"火仑\"}],\"weight\":\"10\"},{\"charId\":\"f6b22d50\",\"unicodeChar\":\"𤆘\",\"unicodeCodePoint\":\"24198\",\"pinYinChars\":[{\"char\":\"FAN2\"}],\"splitChars\":[{\"char\":\"火凡\"}],\"weight\":\"10\"},{\"charId\":\"2269fc40\",\"unicodeChar\":\"𤆓\",\"unicodeCodePoint\":\"24193\",\"pinYinChars\":[{\"char\":\"KUANG4\"}],\"splitChars\":[{\"char\":\"火广\"}],\"weight\":\"10\"},{\"charId\":\"25fe3e0d\",\"unicodeChar\":\"𤆍\",\"unicodeCodePoint\":\"2418D\",\"pinYinChars\":[{\"char\":\"CHI4\"}],\"splitChars\":[{\"char\":\"大火\"}],\"weight\":\"10\"},{\"charId\":\"a90bc5fe\",\"unicodeChar\":\"𤆀\",\"unicodeCodePoint\":\"24180\",\"pinYinChars\":[{\"char\":\"BIAO1\"}],\"splitChars\":[{\"char\":\"氵驫\"}],\"weight\":\"10\"},{\"charId\":\"aa2f9bbd\",\"unicodeChar\":\"𤅮\",\"unicodeCodePoint\":\"2416E\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"氵 懿\"}],\"weight\":\"10\"},{\"charId\":\"685b843a\",\"unicodeChar\":\"𤅟\",\"unicodeCodePoint\":\"2415F\",\"pinYinChars\":[{\"char\":\"lou4\"}],\"splitChars\":[{\"char\":\"氵露\"}],\"weight\":\"10\"},{\"charId\":\"98aaf617\",\"unicodeChar\":\"𤅀\",\"unicodeCodePoint\":\"24140\",\"pinYinChars\":[{\"char\":\"YING2\"}],\"splitChars\":[{\"char\":\"氵羸\"}],\"weight\":\"10\"},{\"charId\":\"4943655e\",\"unicodeChar\":\"𤃇\",\"unicodeCodePoint\":\"240C7\",\"pinYinChars\":[{\"char\":\"yan4\"}],\"splitChars\":[{\"char\":\"氵燕\"}],\"weight\":\"10\"},{\"charId\":\"c27e1a62\",\"unicodeChar\":\"𤂪\",\"unicodeCodePoint\":\"240AA\",\"pinYinChars\":[{\"char\":\"氵震\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"9ce9ff66\",\"unicodeChar\":\"𤂖\",\"unicodeCodePoint\":\"24096\",\"pinYinChars\":[{\"char\":\"YING3\"}],\"splitChars\":[{\"char\":\"氵 影\"}],\"weight\":\"10\"},{\"charId\":\"99f56455\",\"unicodeChar\":\"𤂔\",\"unicodeCodePoint\":\"24094\",\"pinYinChars\":[{\"char\":\"BIN1\"}],\"splitChars\":[{\"char\":\"氵 頁\"}],\"weight\":\"10\"},{\"charId\":\"3021c488\",\"unicodeChar\":\"𤁇\",\"unicodeCodePoint\":\"24047\",\"pinYinChars\":[{\"char\":\"RONG2\"}],\"splitChars\":[{\"char\":\"氵 蓉\"}],\"weight\":\"10\"},{\"charId\":\"5ae0df1d\",\"unicodeChar\":\"𣿼\",\"unicodeCodePoint\":\"23FFC\",\"pinYinChars\":[{\"char\":\"JUN4\"}],\"splitChars\":[{\"char\":\"氵 目\"}],\"weight\":\"10\"},{\"charId\":\"abc8ccd3\",\"unicodeChar\":\"𣿰\",\"unicodeCodePoint\":\"23FF0\",\"pinYinChars\":[{\"char\":\"jun4\"},{\"char\":\"xun4\"}],\"splitChars\":[{\"char\":\"氵 目\"}],\"weight\":\"10\"},{\"charId\":\"a99ff0cd\",\"unicodeChar\":\"𣿭\",\"unicodeCodePoint\":\"23FED\",\"pinYinChars\":[{\"char\":\"diàn\"}],\"splitChars\":[{\"char\":\"氵 義\"}],\"weight\":\"10\"},{\"charId\":\"c412117e\",\"unicodeChar\":\"𣾴\",\"unicodeCodePoint\":\"23FB4\",\"pinYinChars\":[{\"char\":\"pu2\"}],\"splitChars\":[{\"char\":\"氵 菐\"}],\"weight\":\"10\"},{\"charId\":\"4f58f558\",\"unicodeChar\":\"𣾐\",\"unicodeCodePoint\":\"23F90\",\"pinYinChars\":[{\"char\":\"YI3\"}],\"splitChars\":[{\"char\":\"氵 椅\"}],\"weight\":\"10\"},{\"charId\":\"de4ea775\",\"unicodeChar\":\"𣾏\",\"unicodeCodePoint\":\"23F8F\",\"pinYinChars\":[{\"char\":\"QI2\"}],\"splitChars\":[{\"char\":\"氵 奇\"}],\"weight\":\"10\"},{\"charId\":\"67f857d8\",\"unicodeChar\":\"𣽊\",\"unicodeCodePoint\":\"23F4A\",\"pinYinChars\":[{\"char\":\"JUN4\"}],\"splitChars\":[{\"char\":\"氵䜭\"}],\"weight\":\"10\"},{\"charId\":\"c4c033bf\",\"unicodeChar\":\"𣽀\",\"unicodeCodePoint\":\"23F40\",\"pinYinChars\":[{\"char\":\"氵 介\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"e2e1e205\",\"unicodeChar\":\"𣻺\",\"unicodeCodePoint\":\"23EFA\",\"pinYinChars\":[{\"char\":\"氵 基\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"995bb050\",\"unicodeChar\":\"𣻄\",\"unicodeCodePoint\":\"23EC4\",\"pinYinChars\":[{\"char\":\"chu2\"}],\"splitChars\":[{\"char\":\"氵徐\"}],\"weight\":\"10\"},{\"charId\":\"83610aec\",\"unicodeChar\":\"𣺼\",\"unicodeCodePoint\":\"23EBC\",\"pinYinChars\":[{\"char\":\"DANG3\"},{\"char\":\"TANG3\"}],\"splitChars\":[{\"char\":\"氵党\"}],\"weight\":\"10\"},{\"charId\":\"7c89e431\",\"unicodeChar\":\"𣺫\",\"unicodeCodePoint\":\"23EAB\",\"pinYinChars\":[{\"char\":\"XIU3\"}],\"splitChars\":[{\"char\":\"氵修\"}],\"weight\":\"10\"},{\"charId\":\"01db4911\",\"unicodeChar\":\"𣺢\",\"unicodeCodePoint\":\"23EA2\",\"pinYinChars\":[{\"char\":\"DI2\"}],\"splitChars\":[{\"char\":\"氵 条\"}],\"weight\":\"10\"},{\"charId\":\"c018376c\",\"unicodeChar\":\"𣺖\",\"unicodeCodePoint\":\"23E96\",\"pinYinChars\":[{\"char\":\"GONG1\"}],\"splitChars\":[{\"char\":\"氵 恭\"}],\"weight\":\"10\"},{\"charId\":\"404ea61a\",\"unicodeChar\":\"𣹏\",\"unicodeCodePoint\":\"23E4F\",\"pinYinChars\":[{\"char\":\"chan2\"}],\"splitChars\":[{\"char\":\"氵孨\"}],\"weight\":\"10\"},{\"charId\":\"134d52e5\",\"unicodeChar\":\"𣸹\",\"unicodeCodePoint\":\"23E39\",\"pinYinChars\":[{\"char\":\"PING2\"}],\"splitChars\":[{\"char\":\"氵 屏\"}],\"weight\":\"10\"},{\"charId\":\"14e40376\",\"unicodeChar\":\"𣸭\",\"unicodeCodePoint\":\"23E2D\",\"pinYinChars\":[{\"char\":\"氵 昱\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"9fcab4a4\",\"unicodeChar\":\"𣸪\",\"unicodeCodePoint\":\"23E2A\",\"pinYinChars\":[{\"char\":\"FU4\"}],\"splitChars\":[{\"char\":\"氵 复\"}],\"weight\":\"10\"},{\"charId\":\"395afcc2\",\"unicodeChar\":\"𣸩\",\"unicodeCodePoint\":\"23E29\",\"pinYinChars\":[{\"char\":\"dun4\"}],\"splitChars\":[{\"char\":\"氵 盾\"}],\"weight\":\"10\"},{\"charId\":\"6121e399\",\"unicodeChar\":\"𣸕\",\"unicodeCodePoint\":\"23E15\",\"pinYinChars\":[{\"char\":\"SHUI3\"}],\"splitChars\":[{\"char\":\"井 泉\"}],\"weight\":\"10\"},{\"charId\":\"def9aba6\",\"unicodeChar\":\"𣸐\",\"unicodeCodePoint\":\"23E10\",\"pinYinChars\":[{\"char\":\"ZA2\"}],\"splitChars\":[{\"char\":\"水砅\"}],\"weight\":\"10\"},{\"charId\":\"5fb93294\",\"unicodeChar\":\"𣸅\",\"unicodeCodePoint\":\"23E05\",\"pinYinChars\":[{\"char\":\"GUO2\"}],\"splitChars\":[{\"char\":\"氵括\"}],\"weight\":\"10\"},{\"charId\":\"9149cacb\",\"unicodeChar\":\"𣷸\",\"unicodeCodePoint\":\"23DF8\",\"pinYinChars\":[{\"char\":\"FAN\"}],\"splitChars\":[{\"char\":\"氵芝\"}],\"weight\":\"10\"},{\"charId\":\"428bc322\",\"unicodeChar\":\"𣷵\",\"unicodeCodePoint\":\"23DF5\",\"pinYinChars\":[{\"char\":\"QI1\"}],\"splitChars\":[{\"char\":\"氵 束\"}],\"weight\":\"10\"},{\"charId\":\"86428c0c\",\"unicodeChar\":\"𣷂\",\"unicodeCodePoint\":\"23DC2\",\"pinYinChars\":[{\"char\":\"BAO3\"}],\"splitChars\":[{\"char\":\"氵 宝\"}],\"weight\":\"10\"},{\"charId\":\"3b172274\",\"unicodeChar\":\"𣶽\",\"unicodeCodePoint\":\"23DBD\",\"pinYinChars\":[{\"char\":\"fa3\"}],\"splitChars\":[{\"char\":\"氵 芸\"}],\"weight\":\"10\"},{\"charId\":\"a3ecec52\",\"unicodeChar\":\"𣶼\",\"unicodeCodePoint\":\"23DBC\",\"pinYinChars\":[{\"char\":\"氵 芬\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"651db2fc\",\"unicodeChar\":\"𣶺\",\"unicodeCodePoint\":\"23DBA\",\"pinYinChars\":[{\"char\":\"氵宜\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"5e152bef\",\"unicodeChar\":\"𣶴\",\"unicodeCodePoint\":\"23DB4\",\"pinYinChars\":[{\"char\":\"chong1\"}],\"splitChars\":[{\"char\":\"氵 肿\"}],\"weight\":\"10\"},{\"charId\":\"dd21e0d3\",\"unicodeChar\":\"𣶇\",\"unicodeCodePoint\":\"23D87\",\"pinYinChars\":[{\"char\":\"SA3\"}],\"splitChars\":[{\"char\":\"氵 丽\"}],\"weight\":\"10\"},{\"charId\":\"5c94f375\",\"unicodeChar\":\"𣶀\",\"unicodeCodePoint\":\"23D80\",\"pinYinChars\":[{\"char\":\"MAO4\"}],\"splitChars\":[{\"char\":\"氵冐\"}],\"weight\":\"10\"},{\"charId\":\"7496ff1e\",\"unicodeChar\":\"𣵦\",\"unicodeCodePoint\":\"23D66\",\"pinYinChars\":[{\"char\":\"DIAN4\"}],\"splitChars\":[{\"char\":\"氵甸\"}],\"weight\":\"10\"},{\"charId\":\"45538f81\",\"unicodeChar\":\"𣵗\",\"unicodeCodePoint\":\"23D57\",\"pinYinChars\":[{\"char\":\"WU2\"}],\"splitChars\":[{\"char\":\"氵 夭\"}],\"weight\":\"10\"},{\"charId\":\"f6b4b8ba\",\"unicodeChar\":\"𣵁\",\"unicodeCodePoint\":\"23D41\",\"pinYinChars\":[{\"char\":\"YAN1\"}],\"splitChars\":[{\"char\":\"氵伯\"}],\"weight\":\"10\"},{\"charId\":\"dc05a161\",\"unicodeChar\":\"𣴺\",\"unicodeCodePoint\":\"23D3A\",\"pinYinChars\":[{\"char\":\"YUAN1\"}],\"splitChars\":[{\"char\":\"氵囦\"}],\"weight\":\"10\"},{\"charId\":\"136c00c8\",\"unicodeChar\":\"𣴶\",\"unicodeCodePoint\":\"23D36\",\"pinYinChars\":[{\"char\":\"QI1\"}],\"splitChars\":[{\"char\":\"氵坐\"}],\"weight\":\"10\"},{\"charId\":\"b0958b77\",\"unicodeChar\":\"𣴊\",\"unicodeCodePoint\":\"23D0A\",\"pinYinChars\":[{\"char\":\"SE4\"}],\"splitChars\":[{\"char\":\"氵色\"}],\"weight\":\"10\"},{\"charId\":\"0d375ec6\",\"unicodeChar\":\"𣴆\",\"unicodeCodePoint\":\"23D06\",\"pinYinChars\":[{\"char\":\"YU3\"}],\"splitChars\":[{\"char\":\"氵 羽\"}],\"weight\":\"10\"},{\"charId\":\"d651ceb4\",\"unicodeChar\":\"𣳽\",\"unicodeCodePoint\":\"23CFD\",\"pinYinChars\":[{\"char\":\"氵 佩\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"05779ee3\",\"unicodeChar\":\"𣳳\",\"unicodeCodePoint\":\"23CF3\",\"pinYinChars\":[{\"char\":\"XIAN3\"}],\"splitChars\":[{\"char\":\"覀水\"}],\"weight\":\"10\"},{\"charId\":\"10832b49\",\"unicodeChar\":\"𣳮\",\"unicodeCodePoint\":\"23CEE\",\"pinYinChars\":[{\"char\":\"CHI2\"}],\"splitChars\":[{\"char\":\"氵 吕\"}],\"weight\":\"10\"},{\"charId\":\"6bc52b31\",\"unicodeChar\":\"𣳗\",\"unicodeCodePoint\":\"23CD7\",\"pinYinChars\":[{\"char\":\"MU3\"}],\"splitChars\":[{\"char\":\"水母\"}],\"weight\":\"10\"},{\"charId\":\"077f8961\",\"unicodeChar\":\"𣳆\",\"unicodeCodePoint\":\"23CC6\",\"pinYinChars\":[{\"char\":\"PING2\"}],\"splitChars\":[{\"char\":\"冯水\"}],\"weight\":\"10\"},{\"charId\":\"80e61130\",\"unicodeChar\":\"𣲙\",\"unicodeCodePoint\":\"23C99\",\"pinYinChars\":[{\"char\":\"NI4\"},{\"char\":\"NIAO4\"}],\"splitChars\":[{\"char\":\"氵水\"}],\"weight\":\"10\"},{\"charId\":\"a67ab8e6\",\"unicodeChar\":\"𣱶\",\"unicodeCodePoint\":\"23C76\",\"pinYinChars\":[{\"char\":\"BU3\"}],\"splitChars\":[{\"char\":\"氵卜\"}],\"weight\":\"10\"},{\"charId\":\"d36b4b3a\",\"unicodeChar\":\"𣭚\",\"unicodeCodePoint\":\"23B5A\",\"pinYinChars\":[{\"char\":\"PAO3\"}],\"splitChars\":[{\"char\":\"毛 包\"}],\"weight\":\"10\"},{\"charId\":\"a7e2ffdb\",\"unicodeChar\":\"𣭇\",\"unicodeCodePoint\":\"23B47\",\"pinYinChars\":[{\"char\":\"LV3\"}],\"splitChars\":[{\"char\":\"毛母\"}],\"weight\":\"10\"},{\"charId\":\"c18188ff\",\"unicodeChar\":\"𣬵\",\"unicodeCodePoint\":\"23B35\",\"pinYinChars\":[{\"char\":\"MAO2\"}],\"splitChars\":[{\"char\":\"方毛\"}],\"weight\":\"10\"},{\"charId\":\"d9665b4c\",\"unicodeChar\":\"𣬥\",\"unicodeCodePoint\":\"23B25\",\"pinYinChars\":[{\"char\":\"MAO1\"}],\"splitChars\":[{\"char\":\"毛 子\"}],\"weight\":\"10\"},{\"charId\":\"6a4a73b8\",\"unicodeChar\":\"𣫺\",\"unicodeCodePoint\":\"23AFA\",\"pinYinChars\":[{\"char\":\"YU4\"}],\"splitChars\":[{\"char\":\"每育\"}],\"weight\":\"10\"},{\"charId\":\"49420f0f\",\"unicodeChar\":\"𣫴\",\"unicodeCodePoint\":\"23AF4\",\"pinYinChars\":[{\"char\":\"XIE2\"}],\"splitChars\":[{\"char\":\"圭母\"}],\"weight\":\"10\"},{\"charId\":\"6a35414a\",\"unicodeChar\":\"𣫯\",\"unicodeCodePoint\":\"23AEF\",\"pinYinChars\":[{\"char\":\"FAN2\"}],\"splitChars\":[{\"char\":\"母母\"}],\"weight\":\"10\"},{\"charId\":\"6ba21afb\",\"unicodeChar\":\"𣪺\",\"unicodeCodePoint\":\"23ABA\",\"pinYinChars\":[{\"char\":\"HU2\"}],\"splitChars\":[{\"char\":\"殼糸\"}],\"weight\":\"10\"},{\"charId\":\"2619bf65\",\"unicodeChar\":\"𣪱\",\"unicodeCodePoint\":\"23AB1\",\"pinYinChars\":[{\"char\":\"AI2\"}],\"splitChars\":[{\"char\":\"豈殳\"}],\"weight\":\"10\"},{\"charId\":\"2536ca7c\",\"unicodeChar\":\"𣪞\",\"unicodeCodePoint\":\"23A9E\",\"pinYinChars\":[{\"char\":\"YIN1\"}],\"splitChars\":[{\"char\":\"白廾殳\"}],\"weight\":\"10\"},{\"charId\":\"db1b4546\",\"unicodeChar\":\"𣥖\",\"unicodeCodePoint\":\"23956\",\"pinYinChars\":[{\"char\":\"QI2\"}],\"splitChars\":[{\"char\":\"止止\"}],\"weight\":\"10\"},{\"charId\":\"3f4e554d\",\"unicodeChar\":\"𣡍\",\"unicodeCodePoint\":\"2384D\",\"pinYinChars\":[{\"char\":\"JI2\"}],\"splitChars\":[{\"char\":\"朿 朿\"}],\"weight\":\"10\"},{\"charId\":\"db71e0ad\",\"unicodeChar\":\"𣟛\",\"unicodeCodePoint\":\"237DB\",\"pinYinChars\":[{\"char\":\"YAN4\"}],\"splitChars\":[{\"char\":\"木燕\"}],\"weight\":\"10\"},{\"charId\":\"28ba7790\",\"unicodeChar\":\"𣟕\",\"unicodeCodePoint\":\"237D5\",\"pinYinChars\":[{\"char\":\"木 木\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"c0e4c39f\",\"unicodeChar\":\"𣞢\",\"unicodeCodePoint\":\"237A2\",\"pinYinChars\":[{\"char\":\"ZE3\"}],\"splitChars\":[{\"char\":\"木 蔗\"}],\"weight\":\"10\"},{\"charId\":\"a6db1abe\",\"unicodeChar\":\"𣞍\",\"unicodeCodePoint\":\"2378D\",\"pinYinChars\":[{\"char\":\"木 署\"}],\"splitChars\":[{\"char\":\"木署\"}],\"weight\":\"10\"},{\"charId\":\"d098e8d5\",\"unicodeChar\":\"𣞁\",\"unicodeCodePoint\":\"23781\",\"pinYinChars\":[{\"char\":\"RONG2\"}],\"splitChars\":[{\"char\":\"木 榮\"}],\"weight\":\"10\"},{\"charId\":\"063febf7\",\"unicodeChar\":\"𣝲\",\"unicodeCodePoint\":\"23772\",\"pinYinChars\":[{\"char\":\"FENG4\"}],\"splitChars\":[{\"char\":\"木 鳳\"}],\"weight\":\"10\"},{\"charId\":\"81a1eafc\",\"unicodeChar\":\"𣝢\",\"unicodeCodePoint\":\"23762\",\"pinYinChars\":[{\"char\":\"pu3\"},{\"char\":\"po1\"},{\"char\":\"po4\"},{\"char\":\"piao2\"}],\"splitChars\":[{\"char\":\"木 美\"}],\"weight\":\"10\"},{\"charId\":\"de25a632\",\"unicodeChar\":\"𣝀\",\"unicodeCodePoint\":\"23740\",\"pinYinChars\":[{\"char\":\"木勤\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"250a55f1\",\"unicodeChar\":\"𣜒\",\"unicodeCodePoint\":\"23712\",\"pinYinChars\":[{\"char\":\"CONG2\"}],\"splitChars\":[{\"char\":\"木 取\"}],\"weight\":\"10\"},{\"charId\":\"385cc9e0\",\"unicodeChar\":\"𣜃\",\"unicodeCodePoint\":\"23703\",\"pinYinChars\":[{\"char\":\"YOU3\"}],\"splitChars\":[{\"char\":\"木𤋃\"}],\"weight\":\"10\"},{\"charId\":\"5bf8f6f0\",\"unicodeChar\":\"𣛃\",\"unicodeCodePoint\":\"236C3\",\"pinYinChars\":[{\"char\":\"JUN4\"}],\"splitChars\":[{\"char\":\"木 菌\"}],\"weight\":\"10\"},{\"charId\":\"95930143\",\"unicodeChar\":\"𣚰\",\"unicodeCodePoint\":\"236B0\",\"pinYinChars\":[{\"char\":\"ZHUO2\"}],\"splitChars\":[{\"char\":\"木着\"}],\"weight\":\"10\"},{\"charId\":\"7d0d8d11\",\"unicodeChar\":\"𣚦\",\"unicodeCodePoint\":\"236A6\",\"pinYinChars\":[{\"char\":\"JIANG4\"}],\"splitChars\":[{\"char\":\"木强木強\"}],\"weight\":\"10\"},{\"charId\":\"4c89521d\",\"unicodeChar\":\"𣚣\",\"unicodeCodePoint\":\"236A3\",\"pinYinChars\":[{\"char\":\"GENG1\"}],\"splitChars\":[{\"char\":\"木異\"}],\"weight\":\"10\"},{\"charId\":\"93e2e2b2\",\"unicodeChar\":\"𣚘\",\"unicodeCodePoint\":\"23698\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"9399e8c3\",\"unicodeChar\":\"𣙷\",\"unicodeCodePoint\":\"23677\",\"pinYinChars\":[{\"char\":\"MANG2\"}],\"splitChars\":[{\"char\":\"木莽\"}],\"weight\":\"10\"},{\"charId\":\"c98b8986\",\"unicodeChar\":\"𣙢\",\"unicodeCodePoint\":\"23662\",\"pinYinChars\":[{\"char\":\"JUAN4\"}],\"splitChars\":[{\"char\":\"木圈\"}],\"weight\":\"10\"},{\"charId\":\"2f9a2dc1\",\"unicodeChar\":\"𣙟\",\"unicodeCodePoint\":\"2365F\",\"pinYinChars\":[{\"char\":\"TANG2\"}],\"splitChars\":[{\"char\":\"木常\"}],\"weight\":\"10\"},{\"charId\":\"8f016306\",\"unicodeChar\":\"𣘼\",\"unicodeCodePoint\":\"2363C\",\"pinYinChars\":[{\"char\":\"qi3\"}],\"splitChars\":[{\"char\":\"啟木\"}],\"weight\":\"10\"},{\"charId\":\"2a2affc4\",\"unicodeChar\":\"𣘩\",\"unicodeCodePoint\":\"23629\",\"pinYinChars\":[{\"char\":\"SI4\"}],\"splitChars\":[{\"char\":\"木徙\"}],\"weight\":\"10\"},{\"charId\":\"ebad216d\",\"unicodeChar\":\"𣘢\",\"unicodeCodePoint\":\"23622\",\"pinYinChars\":[{\"char\":\"AO2\"}],\"splitChars\":[{\"char\":\"敖木\"}],\"weight\":\"10\"},{\"charId\":\"f9581715\",\"unicodeChar\":\"𣘁\",\"unicodeCodePoint\":\"23601\",\"pinYinChars\":[{\"char\":\"木哥\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"556a8138\",\"unicodeChar\":\"𣗙\",\"unicodeCodePoint\":\"235D9\",\"pinYinChars\":[{\"char\":\"NUO2\"}],\"splitChars\":[{\"char\":\"木难\"}],\"weight\":\"10\"},{\"charId\":\"38b4f572\",\"unicodeChar\":\"𣗖\",\"unicodeCodePoint\":\"235D6\",\"pinYinChars\":[{\"char\":\"LI4\"}],\"splitChars\":[{\"char\":\"木栗\"}],\"weight\":\"10\"},{\"charId\":\"650cda8f\",\"unicodeChar\":\"𣗏\",\"unicodeCodePoint\":\"235CF\",\"pinYinChars\":[{\"char\":\"木 峯\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"0b63c92c\",\"unicodeChar\":\"𣗎\",\"unicodeCodePoint\":\"235CE\",\"pinYinChars\":[{\"char\":\"木 荃\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"4af2da54\",\"unicodeChar\":\"𣗇\",\"unicodeCodePoint\":\"235C7\",\"pinYinChars\":[{\"char\":\"木西灬\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"5297f0cc\",\"unicodeChar\":\"𣖵\",\"unicodeCodePoint\":\"235B5\",\"pinYinChars\":[{\"char\":\"CUO2\"}],\"splitChars\":[{\"char\":\"木座\"}],\"weight\":\"10\"},{\"charId\":\"dfd414b3\",\"unicodeChar\":\"𣖧\",\"unicodeCodePoint\":\"235A7\",\"pinYinChars\":[{\"char\":\"木柴\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"9bbf4aaf\",\"unicodeChar\":\"𣖕\",\"unicodeCodePoint\":\"23595\",\"pinYinChars\":[{\"char\":\"PING2\"}],\"splitChars\":[{\"char\":\"木屏\"}],\"weight\":\"10\"},{\"charId\":\"999e9ecb\",\"unicodeChar\":\"𣖂\",\"unicodeCodePoint\":\"23582\",\"pinYinChars\":[{\"char\":\"NIE4\"}],\"splitChars\":[{\"char\":\"木羍\"}],\"weight\":\"10\"},{\"charId\":\"f4e341af\",\"unicodeChar\":\"𣕯\",\"unicodeCodePoint\":\"2356F\",\"pinYinChars\":[{\"char\":\"CHEN1\"}],\"splitChars\":[{\"char\":\"林 令\"}],\"weight\":\"10\"},{\"charId\":\"0c1e9f64\",\"unicodeChar\":\"𣕚\",\"unicodeCodePoint\":\"2355A\",\"pinYinChars\":[{\"char\":\"木茂\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"2ed2ab9e\",\"unicodeChar\":\"𣔭\",\"unicodeCodePoint\":\"2352D\",\"pinYinChars\":[{\"char\":\"JUE2\"}],\"splitChars\":[{\"char\":\"木坴\"}],\"weight\":\"10\"},{\"charId\":\"c716ced5\",\"unicodeChar\":\"𣓿\",\"unicodeCodePoint\":\"234FF\",\"pinYinChars\":[{\"char\":\"LAO4\"}],\"splitChars\":[{\"char\":\"木劳\"}],\"weight\":\"10\"},{\"charId\":\"90ce6549\",\"unicodeChar\":\"𣓶\",\"unicodeCodePoint\":\"234F6\",\"pinYinChars\":[{\"char\":\"MENG4\"}],\"splitChars\":[{\"char\":\"木 孟\"}],\"weight\":\"10\"},{\"charId\":\"0955bd2c\",\"unicodeChar\":\"𣓳\",\"unicodeCodePoint\":\"234F3\",\"pinYinChars\":[{\"char\":\"RONG2\"}],\"splitChars\":[{\"char\":\"火 木\"}],\"weight\":\"10\"},{\"charId\":\"abca8f60\",\"unicodeChar\":\"𣓖\",\"unicodeCodePoint\":\"234D6\",\"pinYinChars\":[{\"char\":\"JI1\"}],\"splitChars\":[{\"char\":\"木肩\"}],\"weight\":\"10\"},{\"charId\":\"022887a8\",\"unicodeChar\":\"𣓎\",\"unicodeCodePoint\":\"234CE\",\"pinYinChars\":[{\"char\":\"YAO1\"}],\"splitChars\":[{\"char\":\"木芺\"}],\"weight\":\"10\"},{\"charId\":\"7c833cfd\",\"unicodeChar\":\"𣒣\",\"unicodeCodePoint\":\"234A3\",\"pinYinChars\":[{\"char\":\"MANG2\"}],\"splitChars\":[{\"char\":\"木芒\"}],\"weight\":\"10\"},{\"charId\":\"94a75323\",\"unicodeChar\":\"𣑲\",\"unicodeCodePoint\":\"23472\",\"pinYinChars\":[{\"char\":\"PEI4\"}],\"splitChars\":[{\"char\":\"木𫥞\"}],\"weight\":\"10\"},{\"charId\":\"9180b5e3\",\"unicodeChar\":\"𣑖\",\"unicodeCodePoint\":\"23456\",\"pinYinChars\":[{\"char\":\"QIA4\"}],\"splitChars\":[{\"char\":\"木圶\"}],\"weight\":\"10\"},{\"charId\":\"3b666d59\",\"unicodeChar\":\"𣑕\",\"unicodeCodePoint\":\"23455\",\"pinYinChars\":[{\"char\":\"CHENG2\"}],\"splitChars\":[{\"char\":\"木丞\"}],\"weight\":\"10\"},{\"charId\":\"8bc83d3e\",\"unicodeChar\":\"𣑐\",\"unicodeCodePoint\":\"23450\",\"pinYinChars\":[{\"char\":\"MOU3\"}],\"splitChars\":[{\"char\":\"木吊\"}],\"weight\":\"10\"},{\"charId\":\"8afdf493\",\"unicodeChar\":\"𣐹\",\"unicodeCodePoint\":\"23439\",\"pinYinChars\":[{\"char\":\"JIAO1\"}],\"splitChars\":[{\"char\":\"木尗\"}],\"weight\":\"10\"},{\"charId\":\"1048c40d\",\"unicodeChar\":\"𣐬\",\"unicodeCodePoint\":\"2342C\",\"pinYinChars\":[{\"char\":\"NIU3\"}],\"splitChars\":[{\"char\":\"木田\"}],\"weight\":\"10\"},{\"charId\":\"eec386de\",\"unicodeChar\":\"𣐩\",\"unicodeCodePoint\":\"23429\",\"pinYinChars\":[{\"char\":\"BAI2\"}],\"splitChars\":[{\"char\":\"白木\"}],\"weight\":\"10\"},{\"charId\":\"e14fa3c2\",\"unicodeChar\":\"𣐡\",\"unicodeCodePoint\":\"23421\",\"pinYinChars\":[{\"char\":\"MIN2\"}],\"splitChars\":[{\"char\":\"木民\"}],\"weight\":\"10\"},{\"charId\":\"ea083358\",\"unicodeChar\":\"𣐕\",\"unicodeCodePoint\":\"23415\",\"pinYinChars\":[{\"char\":\"JING4\"}],\"splitChars\":[{\"char\":\"木𢀖\"}],\"weight\":\"10\"},{\"charId\":\"3285e57a\",\"unicodeChar\":\"𣐀\",\"unicodeCodePoint\":\"23400\",\"pinYinChars\":[{\"char\":\"WEN2\"}],\"splitChars\":[{\"char\":\"木文\"}],\"weight\":\"10\"},{\"charId\":\"6f3a37ed\",\"unicodeChar\":\"𣏹\",\"unicodeCodePoint\":\"233F9\",\"pinYinChars\":[{\"char\":\"ZAI1\"}],\"splitChars\":[{\"char\":\"木火\"}],\"weight\":\"10\"},{\"charId\":\"d5d04592\",\"unicodeChar\":\"𣏬\",\"unicodeCodePoint\":\"233EC\",\"pinYinChars\":[{\"char\":\"RI4\"}],\"splitChars\":[{\"char\":\"木 日\"}],\"weight\":\"10\"},{\"charId\":\"0206a31f\",\"unicodeChar\":\"𣏨\",\"unicodeCodePoint\":\"233E8\",\"pinYinChars\":[{\"char\":\"JING3\"}],\"splitChars\":[{\"char\":\"木井\"}],\"weight\":\"10\"},{\"charId\":\"74fa0d95\",\"unicodeChar\":\"𣎶\",\"unicodeCodePoint\":\"233B6\",\"pinYinChars\":[{\"char\":\"JIE2\"}],\"splitChars\":[{\"char\":\"木一\"}],\"weight\":\"10\"},{\"charId\":\"2d7e1b8b\",\"unicodeChar\":\"𣎮\",\"unicodeCodePoint\":\"233AE\",\"pinYinChars\":[{\"char\":\"XI1\"}],\"splitChars\":[{\"char\":\"月羲\"}],\"weight\":\"10\"},{\"charId\":\"65913a74\",\"unicodeChar\":\"𣍱\",\"unicodeCodePoint\":\"23371\",\"pinYinChars\":[{\"char\":\"MOU3\"}],\"splitChars\":[{\"char\":\"月 宏\"}],\"weight\":\"10\"},{\"charId\":\"0576d22a\",\"unicodeChar\":\"𣍬\",\"unicodeCodePoint\":\"2336C\",\"pinYinChars\":[{\"char\":\"CHUAN2\"}],\"splitChars\":[{\"char\":\"月 口\"}],\"weight\":\"10\"},{\"charId\":\"6ce85ddc\",\"unicodeChar\":\"𣍪\",\"unicodeCodePoint\":\"2336A\",\"pinYinChars\":[{\"char\":\"MOU3\"}],\"splitChars\":[{\"char\":\"月丙\"}],\"weight\":\"10\"},{\"charId\":\"cc79a019\",\"unicodeChar\":\"𣌭\",\"unicodeCodePoint\":\"2332D\",\"pinYinChars\":[{\"char\":\"HUI4\"}],\"splitChars\":[{\"char\":\"合日\"}],\"weight\":\"10\"},{\"charId\":\"886d90c2\",\"unicodeChar\":\"𣌟\",\"unicodeCodePoint\":\"2331F\",\"pinYinChars\":[{\"char\":\"LING2\"}],\"splitChars\":[{\"char\":\"日靈\"}],\"weight\":\"10\"},{\"charId\":\"888f8486\",\"unicodeChar\":\"𣌊\",\"unicodeCodePoint\":\"2330A\",\"pinYinChars\":[{\"char\":\"日 霞\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"8fae560f\",\"unicodeChar\":\"𣋅\",\"unicodeCodePoint\":\"232C5\",\"pinYinChars\":[{\"char\":\"YAN4\"}],\"splitChars\":[{\"char\":\"廿北\"}],\"weight\":\"10\"},{\"charId\":\"e80d19b3\",\"unicodeChar\":\"𣊬\",\"unicodeCodePoint\":\"232AC\",\"pinYinChars\":[{\"char\":\"SHUN4\"}],\"splitChars\":[{\"char\":\"日 舜\"}],\"weight\":\"10\"},{\"charId\":\"2678da3c\",\"unicodeChar\":\"𣊧\",\"unicodeCodePoint\":\"232A7\",\"pinYinChars\":[{\"char\":\"LANG3\"}],\"splitChars\":[{\"char\":\"明明\"}],\"weight\":\"10\"},{\"charId\":\"12f2981a\",\"unicodeChar\":\"𣈶\",\"unicodeCodePoint\":\"23236\",\"pinYinChars\":[{\"char\":\"XUAN3\"}],\"splitChars\":[{\"char\":\"日恆\"}],\"weight\":\"10\"},{\"charId\":\"e2509bd9\",\"unicodeChar\":\"𣈲\",\"unicodeCodePoint\":\"23232\",\"pinYinChars\":[{\"char\":\"MEI4\"}],\"splitChars\":[{\"char\":\"日 眉\"}],\"weight\":\"10\"},{\"charId\":\"e083e0cc\",\"unicodeChar\":\"𣈏\",\"unicodeCodePoint\":\"2320F\",\"pinYinChars\":[{\"char\":\"XI1\"}],\"splitChars\":[{\"char\":\"日昔\"}],\"weight\":\"10\"},{\"charId\":\"c1be4ad9\",\"unicodeChar\":\"𣇷\",\"unicodeCodePoint\":\"231F7\",\"pinYinChars\":[{\"char\":\"日 芳\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"ee9556f2\",\"unicodeChar\":\"𣇲\",\"unicodeCodePoint\":\"231F2\",\"pinYinChars\":[{\"char\":\"HUN1\"}],\"splitChars\":[{\"char\":\"日昏\"}],\"weight\":\"10\"},{\"charId\":\"230db4cb\",\"unicodeChar\":\"𣇉\",\"unicodeCodePoint\":\"231C9\",\"pinYinChars\":[{\"char\":\"日 君\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"d1a85c37\",\"unicodeChar\":\"𣆥\",\"unicodeCodePoint\":\"231A5\",\"pinYinChars\":[{\"char\":\"huang4\"}],\"splitChars\":[{\"char\":\"光日\"}],\"weight\":\"10\"},{\"charId\":\"c464a707\",\"unicodeChar\":\"𣆚\",\"unicodeCodePoint\":\"2319A\",\"pinYinChars\":[{\"char\":\"NUO3\"}],\"splitChars\":[{\"char\":\"日多\"}],\"weight\":\"10\"},{\"charId\":\"469a74dc\",\"unicodeChar\":\"𣆀\",\"unicodeCodePoint\":\"23180\",\"pinYinChars\":[{\"char\":\"DAN\"}],\"splitChars\":[{\"char\":\"日冉\"}],\"weight\":\"10\"},{\"charId\":\"1362d59b\",\"unicodeChar\":\"𣅿\",\"unicodeCodePoint\":\"2317F\",\"pinYinChars\":[{\"char\":\"yi2\"},{\"char\":\"chi4\"}],\"splitChars\":[{\"char\":\"日台\"}],\"weight\":\"10\"},{\"charId\":\"4050d0b4\",\"unicodeChar\":\"𣅽\",\"unicodeCodePoint\":\"2317D\",\"pinYinChars\":[{\"char\":\"PO4\"}],\"splitChars\":[{\"char\":\"日出\"}],\"weight\":\"10\"},{\"charId\":\"9d578929\",\"unicodeChar\":\"𣅋\",\"unicodeCodePoint\":\"2314B\",\"pinYinChars\":[{\"char\":\"DOU4\"}],\"splitChars\":[{\"char\":\"日䒑\"}],\"weight\":\"10\"},{\"charId\":\"3651b47f\",\"unicodeChar\":\"𣄻\",\"unicodeCodePoint\":\"2313B\",\"pinYinChars\":[{\"char\":\"ZHUO1\"}],\"splitChars\":[{\"char\":\"日乙\"}],\"weight\":\"10\"},{\"charId\":\"5fd2d4c5\",\"unicodeChar\":\"𣄃\",\"unicodeCodePoint\":\"23103\",\"pinYinChars\":[{\"char\":\"QI2\"}],\"splitChars\":[{\"char\":\"方其\"}],\"weight\":\"10\"},{\"charId\":\"bb735fa2\",\"unicodeChar\":\"𣃚\",\"unicodeCodePoint\":\"230DA\",\"pinYinChars\":[{\"char\":\"HANG2\"}],\"splitChars\":[{\"char\":\"方亢\"}],\"weight\":\"10\"},{\"charId\":\"d4ec42b0\",\"unicodeChar\":\"𣂎\",\"unicodeCodePoint\":\"2308E\",\"pinYinChars\":[{\"char\":\"满 斗\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"2c42631c\",\"unicodeChar\":\"𣁾\",\"unicodeCodePoint\":\"2307E\",\"pinYinChars\":[{\"char\":\"斗 斗\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"e687b1bf\",\"unicodeChar\":\"𣀸\",\"unicodeCodePoint\":\"23038\",\"pinYinChars\":[{\"char\":\"JIAN3\"}],\"splitChars\":[{\"char\":\"繭攵\"}],\"weight\":\"10\"},{\"charId\":\"7483616e\",\"unicodeChar\":\"𢿇\",\"unicodeCodePoint\":\"22FC7\",\"pinYinChars\":[{\"char\":\"LU4\"}],\"splitChars\":[{\"char\":\"鹿攴\"}],\"weight\":\"10\"},{\"charId\":\"ca82bc06\",\"unicodeChar\":\"𢾝\",\"unicodeCodePoint\":\"22F9D\",\"pinYinChars\":[{\"char\":\"WEI2\"}],\"splitChars\":[{\"char\":\"韋攵\"}],\"weight\":\"10\"},{\"charId\":\"4b62f138\",\"unicodeChar\":\"𢾚\",\"unicodeCodePoint\":\"22F9A\",\"pinYinChars\":[{\"char\":\"YAN3\"}],\"splitChars\":[{\"char\":\"音攵\"}],\"weight\":\"10\"},{\"charId\":\"b9786b36\",\"unicodeChar\":\"𢾖\",\"unicodeCodePoint\":\"22F96\",\"pinYinChars\":[{\"char\":\"DU4\"}],\"splitChars\":[{\"char\":\"度攴广龷又攴\"}],\"weight\":\"10\"},{\"charId\":\"d19e5c08\",\"unicodeChar\":\"𢾅\",\"unicodeCodePoint\":\"22F85\",\"pinYinChars\":[{\"char\":\"DU4\"}],\"splitChars\":[{\"char\":\"度攵\"}],\"weight\":\"10\"},{\"charId\":\"0394a16b\",\"unicodeChar\":\"𢽾\",\"unicodeCodePoint\":\"22F7E\",\"pinYinChars\":[{\"char\":\"XIAO4\"}],\"splitChars\":[{\"char\":\"学攴\"}],\"weight\":\"10\"},{\"charId\":\"f234321b\",\"unicodeChar\":\"𢽠\",\"unicodeCodePoint\":\"22F60\",\"pinYinChars\":[{\"char\":\"ZHENG1\"}],\"splitChars\":[{\"char\":\"𱖔攵山丆土攵\"}],\"weight\":\"10\"},{\"charId\":\"60392f17\",\"unicodeChar\":\"𢽉\",\"unicodeCodePoint\":\"22F49\",\"pinYinChars\":[{\"char\":\"KOU4\"}],\"splitChars\":[{\"char\":\"完攵\"}],\"weight\":\"10\"},{\"charId\":\"c8511a30\",\"unicodeChar\":\"𢼉\",\"unicodeCodePoint\":\"22F09\",\"pinYinChars\":[{\"char\":\"SHI1\"}],\"splitChars\":[{\"char\":\"台攵\"}],\"weight\":\"10\"},{\"charId\":\"2b71865f\",\"unicodeChar\":\"𢼄\",\"unicodeCodePoint\":\"22F04\",\"pinYinChars\":[{\"char\":\"QI3\"}],\"splitChars\":[{\"char\":\"户攵\"}],\"weight\":\"10\"},{\"charId\":\"444c2be2\",\"unicodeChar\":\"𢻴\",\"unicodeCodePoint\":\"22EF4\",\"pinYinChars\":[{\"char\":\"DEN4\"}],\"splitChars\":[{\"char\":\"屯攴\"}],\"weight\":\"10\"},{\"charId\":\"d34324ad\",\"unicodeChar\":\"𢻮\",\"unicodeCodePoint\":\"22EEE\",\"pinYinChars\":[{\"char\":\"JIE2\"}],\"splitChars\":[{\"char\":\"卪攵\"}],\"weight\":\"10\"},{\"charId\":\"bcebd5ae\",\"unicodeChar\":\"𢻁\",\"unicodeCodePoint\":\"22EC1\",\"pinYinChars\":[{\"char\":\"HUAN4\"}],\"splitChars\":[{\"char\":\"刀 支\"}],\"weight\":\"10\"},{\"charId\":\"a6fcb5f9\",\"unicodeChar\":\"𢸳\",\"unicodeCodePoint\":\"22E33\",\"pinYinChars\":[{\"char\":\"SU4\"}],\"splitChars\":[{\"char\":\"扌蕭\"}],\"weight\":\"10\"},{\"charId\":\"9d7de295\",\"unicodeChar\":\"𢷏\",\"unicodeCodePoint\":\"22DCF\",\"pinYinChars\":[{\"char\":\"PU1\"}],\"splitChars\":[{\"char\":\"扌僕\"}],\"weight\":\"10\"},{\"charId\":\"7a5ed25a\",\"unicodeChar\":\"𢷊\",\"unicodeCodePoint\":\"22DCA\",\"pinYinChars\":[{\"char\":\"SUI4\"}],\"splitChars\":[{\"char\":\"扌 遂\"}],\"weight\":\"10\"},{\"charId\":\"8cd79c36\",\"unicodeChar\":\"𢳟\",\"unicodeCodePoint\":\"22CDF\",\"pinYinChars\":[{\"char\":\"TONG3\"}],\"splitChars\":[{\"char\":\"扌通\"}],\"weight\":\"10\"},{\"charId\":\"eb4e1db6\",\"unicodeChar\":\"𢮝\",\"unicodeCodePoint\":\"22B9D\",\"pinYinChars\":[{\"char\":\"NA2\"}],\"splitChars\":[{\"char\":\"取手\"}],\"weight\":\"10\"},{\"charId\":\"48afd1fd\",\"unicodeChar\":\"𢮎\",\"unicodeCodePoint\":\"22B8E\",\"pinYinChars\":[{\"char\":\"GUAI1\"}],\"splitChars\":[{\"char\":\"扌虎\"}],\"weight\":\"10\"},{\"charId\":\"eb2d725a\",\"unicodeChar\":\"𢮋\",\"unicodeCodePoint\":\"22B8B\",\"pinYinChars\":[{\"char\":\"ZHENG3\"}],\"splitChars\":[{\"char\":\"扌承\"}],\"weight\":\"10\"},{\"charId\":\"21453b9f\",\"unicodeChar\":\"𢭭\",\"unicodeCodePoint\":\"22B6D\",\"pinYinChars\":[{\"char\":\"扌灶\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"6ad0bc32\",\"unicodeChar\":\"𢫱\",\"unicodeCodePoint\":\"22AF1\",\"pinYinChars\":[{\"char\":\"YAN3\"}],\"splitChars\":[{\"char\":\"扌行\"}],\"weight\":\"10\"},{\"charId\":\"066b5c82\",\"unicodeChar\":\"𢫦\",\"unicodeCodePoint\":\"22AE6\",\"pinYinChars\":[{\"char\":\"PAI1\"}],\"splitChars\":[{\"char\":\"扌百\"}],\"weight\":\"10\"},{\"charId\":\"7d7c6a7b\",\"unicodeChar\":\"𢪘\",\"unicodeCodePoint\":\"22A98\",\"pinYinChars\":[{\"char\":\"bai1\"}],\"splitChars\":[{\"char\":\"分手\"}],\"weight\":\"10\"},{\"charId\":\"215e25e1\",\"unicodeChar\":\"𢪒\",\"unicodeCodePoint\":\"22A92\",\"pinYinChars\":[{\"char\":\"GONG3\"}],\"splitChars\":[{\"char\":\"手手\"}],\"weight\":\"10\"},{\"charId\":\"f50bf170\",\"unicodeChar\":\"𢩭\",\"unicodeCodePoint\":\"22A6D\",\"pinYinChars\":[{\"char\":\"CUN3\"}],\"splitChars\":[{\"char\":\"扌寸\"}],\"weight\":\"10\"},{\"charId\":\"c0055ad8\",\"unicodeChar\":\"𢩙\",\"unicodeCodePoint\":\"22A59\",\"pinYinChars\":[{\"char\":\"LING2\"}],\"splitChars\":[{\"char\":\"启启\"}],\"weight\":\"10\"},{\"charId\":\"65e0f092\",\"unicodeChar\":\"𢩉\",\"unicodeCodePoint\":\"22A49\",\"pinYinChars\":[{\"char\":\"户共\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"0b3919d3\",\"unicodeChar\":\"𢨋\",\"unicodeCodePoint\":\"22A0B\",\"pinYinChars\":[{\"char\":\"BEI4\"}],\"splitChars\":[{\"char\":\"或 或\"}],\"weight\":\"10\"},{\"charId\":\"2b1d8c08\",\"unicodeChar\":\"𢦏\",\"unicodeCodePoint\":\"2298F\",\"pinYinChars\":[{\"char\":\"ZAI1\"}],\"splitChars\":[{\"char\":\"十 戈\"}],\"weight\":\"10\"},{\"charId\":\"d98f2fa3\",\"unicodeChar\":\"𢥞\",\"unicodeCodePoint\":\"2295E\",\"pinYinChars\":[{\"char\":\"CHONG1\"}],\"splitChars\":[{\"char\":\"忄蟲\"}],\"weight\":\"10\"},{\"charId\":\"03d8a0e7\",\"unicodeChar\":\"𢤀\",\"unicodeCodePoint\":\"22900\",\"pinYinChars\":[{\"char\":\"HONG1\"}],\"splitChars\":[{\"char\":\"興心\"}],\"weight\":\"10\"},{\"charId\":\"4be6e5a3\",\"unicodeChar\":\"𢢩\",\"unicodeCodePoint\":\"228A9\",\"pinYinChars\":[{\"char\":\"jing\"}],\"splitChars\":[{\"char\":\"忄敬\"}],\"weight\":\"10\"},{\"charId\":\"1180d0f4\",\"unicodeChar\":\"𢡟\",\"unicodeCodePoint\":\"2285F\",\"pinYinChars\":[{\"char\":\"mao4\"}],\"splitChars\":[{\"char\":\"棥心\"}],\"weight\":\"10\"},{\"charId\":\"a1de01d7\",\"unicodeChar\":\"𢡋\",\"unicodeCodePoint\":\"2284B\",\"pinYinChars\":[{\"char\":\"GAO1\"}],\"splitChars\":[{\"char\":\"忄臯\"}],\"weight\":\"10\"},{\"charId\":\"a64036e7\",\"unicodeChar\":\"𢠨\",\"unicodeCodePoint\":\"22828\",\"pinYinChars\":[{\"char\":\"忄敏\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"b9d5f61b\",\"unicodeChar\":\"𢠢\",\"unicodeCodePoint\":\"22822\",\"pinYinChars\":[{\"char\":\"WEI4\"}],\"splitChars\":[{\"char\":\"忄尉\"}],\"weight\":\"10\"},{\"charId\":\"fb1aa511\",\"unicodeChar\":\"𢠆\",\"unicodeCodePoint\":\"22806\",\"pinYinChars\":[{\"char\":\"忄通\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"4514a349\",\"unicodeChar\":\"𢠄\",\"unicodeCodePoint\":\"22804\",\"pinYinChars\":[{\"char\":\"忄崇\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"42882766\",\"unicodeChar\":\"𢞓\",\"unicodeCodePoint\":\"22793\",\"pinYinChars\":[{\"char\":\"LIU2\"}],\"splitChars\":[{\"char\":\"忄留\"}],\"weight\":\"10\"},{\"charId\":\"13b3d17f\",\"unicodeChar\":\"𢜞\",\"unicodeCodePoint\":\"2271E\",\"pinYinChars\":[{\"char\":\"忄來\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"a12886ce\",\"unicodeChar\":\"𢜔\",\"unicodeCodePoint\":\"22714\",\"pinYinChars\":[{\"char\":\"ZHI4\"}],\"splitChars\":[{\"char\":\"知心\"}],\"weight\":\"10\"},{\"charId\":\"4906356b\",\"unicodeChar\":\"𢜀\",\"unicodeCodePoint\":\"22700\",\"pinYinChars\":[{\"char\":\"JIE2\"}],\"splitChars\":[{\"char\":\"忄 疌\"}],\"weight\":\"10\"},{\"charId\":\"41eeebc0\",\"unicodeChar\":\"𢛧\",\"unicodeCodePoint\":\"226E7\",\"pinYinChars\":[{\"char\":\"WEI2\"}],\"splitChars\":[{\"char\":\"隹心\"}],\"weight\":\"10\"},{\"charId\":\"f8de9340\",\"unicodeChar\":\"𢚾\",\"unicodeCodePoint\":\"226BE\",\"pinYinChars\":[{\"char\":\"HUAN4\"}],\"splitChars\":[{\"char\":\"忄奂\"}],\"weight\":\"10\"},{\"charId\":\"77a094ca\",\"unicodeChar\":\"𢙓\",\"unicodeCodePoint\":\"22653\",\"pinYinChars\":[{\"char\":\"WEI4\"}],\"splitChars\":[{\"char\":\"忄会\"}],\"weight\":\"10\"},{\"charId\":\"05a324fb\",\"unicodeChar\":\"𢙐\",\"unicodeCodePoint\":\"22650\",\"pinYinChars\":[{\"char\":\"NAO2\"}],\"splitChars\":[{\"char\":\"忄农\"}],\"weight\":\"10\"},{\"charId\":\"6e3ffea1\",\"unicodeChar\":\"𢙏\",\"unicodeCodePoint\":\"2264F\",\"pinYinChars\":[{\"char\":\"XUN4\"}],\"splitChars\":[{\"char\":\"孙心\"}],\"weight\":\"10\"},{\"charId\":\"a8c3076f\",\"unicodeChar\":\"𢘙\",\"unicodeCodePoint\":\"22619\",\"pinYinChars\":[{\"char\":\"LONG3\"}],\"splitChars\":[{\"char\":\"忄龙\"}],\"weight\":\"10\"},{\"charId\":\"354d4540\",\"unicodeChar\":\"𢗋\",\"unicodeCodePoint\":\"225CB\",\"pinYinChars\":[{\"char\":\"QIONG2\"}],\"splitChars\":[{\"char\":\"忄匀忄勻\"}],\"weight\":\"10\"},{\"charId\":\"d119eda2\",\"unicodeChar\":\"𢖱\",\"unicodeCodePoint\":\"225B1\",\"pinYinChars\":[{\"char\":\"NAI3\"}],\"splitChars\":[{\"char\":\"忄乃\"}],\"weight\":\"10\"},{\"charId\":\"4c01a54a\",\"unicodeChar\":\"𢔏\",\"unicodeCodePoint\":\"2250F\",\"pinYinChars\":[{\"char\":\"HOU4\"}],\"splitChars\":[{\"char\":\"彳受\"}],\"weight\":\"10\"},{\"charId\":\"7aaf14b1\",\"unicodeChar\":\"𢓶\",\"unicodeCodePoint\":\"224F6\",\"pinYinChars\":[{\"char\":\"TONG1\"}],\"splitChars\":[{\"char\":\"彳甬\"}],\"weight\":\"10\"},{\"charId\":\"877f8edd\",\"unicodeChar\":\"𢓭\",\"unicodeCodePoint\":\"224ED\",\"pinYinChars\":[{\"char\":\"QUN1\"}],\"splitChars\":[{\"char\":\"彳夋\"}],\"weight\":\"10\"},{\"charId\":\"c48d480d\",\"unicodeChar\":\"𢓊\",\"unicodeCodePoint\":\"224CA\",\"pinYinChars\":[{\"char\":\"XI3\"}],\"splitChars\":[{\"char\":\"彳止\"}],\"weight\":\"10\"},{\"charId\":\"41a6df1c\",\"unicodeChar\":\"𢓁\",\"unicodeCodePoint\":\"224C1\",\"pinYinChars\":[{\"char\":\"彳工\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"a42e31f9\",\"unicodeChar\":\"𢒋\",\"unicodeCodePoint\":\"2248B\",\"pinYinChars\":[{\"char\":\"永 彡\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"6ebf66f0\",\"unicodeChar\":\"𢑆\",\"unicodeCodePoint\":\"22446\",\"pinYinChars\":[{\"char\":\"QUAN2\"}],\"splitChars\":[{\"char\":\"弓雚\"}],\"weight\":\"10\"},{\"charId\":\"1d133bf5\",\"unicodeChar\":\"𢐧\",\"unicodeCodePoint\":\"22427\",\"pinYinChars\":[{\"char\":\"QING2\"}],\"splitChars\":[{\"char\":\"敬弓\"}],\"weight\":\"10\"},{\"charId\":\"51060dfa\",\"unicodeChar\":\"𢏈\",\"unicodeCodePoint\":\"223C8\",\"pinYinChars\":[{\"char\":\"ZHEN3\"}],\"splitChars\":[{\"char\":\"弓㠯\"}],\"weight\":\"10\"},{\"charId\":\"e184b268\",\"unicodeChar\":\"𢍉\",\"unicodeCodePoint\":\"22349\",\"pinYinChars\":[{\"char\":\"BI4\"}],\"splitChars\":[{\"char\":\"甶廾\"}],\"weight\":\"10\"},{\"charId\":\"ca7c9c79\",\"unicodeChar\":\"𢌴\",\"unicodeCodePoint\":\"22334\",\"pinYinChars\":[{\"char\":\"XUN4\"}],\"splitChars\":[{\"char\":\"巳 廾\"}],\"weight\":\"10\"},{\"charId\":\"7d31ca09\",\"unicodeChar\":\"𢉘\",\"unicodeCodePoint\":\"22258\",\"pinYinChars\":[{\"char\":\"YAN2\"}],\"splitChars\":[{\"char\":\"广炎\"}],\"weight\":\"10\"},{\"charId\":\"0946925b\",\"unicodeChar\":\"𢈭\",\"unicodeCodePoint\":\"2222D\",\"pinYinChars\":[{\"char\":\"XIAO1\"}],\"splitChars\":[{\"char\":\"广肖\"}],\"weight\":\"10\"},{\"charId\":\"a3f0aab3\",\"unicodeChar\":\"𢈠\",\"unicodeCodePoint\":\"22220\",\"pinYinChars\":[{\"char\":\"CU4\"}],\"splitChars\":[{\"char\":\"广束\"}],\"weight\":\"10\"},{\"charId\":\"241456b7\",\"unicodeChar\":\"𢇍\",\"unicodeCodePoint\":\"221CD\",\"pinYinChars\":[{\"char\":\"JUE2\"}],\"splitChars\":[{\"char\":\"幺 乙\"}],\"weight\":\"10\"},{\"charId\":\"248a729b\",\"unicodeChar\":\"𢃼\",\"unicodeCodePoint\":\"220FC\",\"pinYinChars\":[{\"char\":\"MEI4\"}],\"splitChars\":[{\"char\":\"巾 眉\"}],\"weight\":\"10\"},{\"charId\":\"82c77544\",\"unicodeChar\":\"𢁀\",\"unicodeCodePoint\":\"22040\",\"pinYinChars\":[{\"char\":\"FU2\"}],\"splitChars\":[{\"char\":\"共包\"}],\"weight\":\"10\"},{\"charId\":\"d887bdd0\",\"unicodeChar\":\"𢀖\",\"unicodeCodePoint\":\"22016\",\"pinYinChars\":[{\"char\":\"JING\"},{\"char\":\"XING2\"}],\"splitChars\":[{\"char\":\"ス工\"}],\"weight\":\"10\"},{\"charId\":\"02561c19\",\"unicodeChar\":\"𡿪\",\"unicodeCodePoint\":\"21FEA\",\"pinYinChars\":[{\"char\":\"LIE4\"}],\"splitChars\":[{\"char\":\"巛夕\"}],\"weight\":\"10\"},{\"charId\":\"63037297\",\"unicodeChar\":\"𡾲\",\"unicodeCodePoint\":\"21FB2\",\"pinYinChars\":[{\"char\":\"NIE4\"}],\"splitChars\":[{\"char\":\"山薛\"}],\"weight\":\"10\"},{\"charId\":\"0eb43418\",\"unicodeChar\":\"𡽄\",\"unicodeCodePoint\":\"21F44\",\"pinYinChars\":[{\"char\":\"YAO2\"}],\"splitChars\":[{\"char\":\"山敫\"}],\"weight\":\"10\"},{\"charId\":\"eb9676ae\",\"unicodeChar\":\"𡼫\",\"unicodeCodePoint\":\"21F2B\",\"pinYinChars\":[{\"char\":\"JIN1\"}],\"splitChars\":[{\"char\":\"山替\"}],\"weight\":\"10\"},{\"charId\":\"d7d7e668\",\"unicodeChar\":\"𡻎\",\"unicodeCodePoint\":\"21ECE\",\"pinYinChars\":[{\"char\":\"XI1\"}],\"splitChars\":[{\"char\":\"山隽\"}],\"weight\":\"10\"},{\"charId\":\"ba56455e\",\"unicodeChar\":\"𡺩\",\"unicodeCodePoint\":\"21EA9\",\"pinYinChars\":[{\"char\":\"tuo2\"}],\"splitChars\":[{\"char\":\"山咼\"}],\"weight\":\"10\"},{\"charId\":\"8ea1939e\",\"unicodeChar\":\"𡺟\",\"unicodeCodePoint\":\"21E9F\",\"pinYinChars\":[{\"char\":\"QUAN2\"}],\"splitChars\":[{\"char\":\"山宣\"}],\"weight\":\"10\"},{\"charId\":\"39bb0504\",\"unicodeChar\":\"𡺞\",\"unicodeCodePoint\":\"21E9E\",\"pinYinChars\":[{\"char\":\"SHI2\"}],\"splitChars\":[{\"char\":\"山音\"}],\"weight\":\"10\"},{\"charId\":\"f3d7ae95\",\"unicodeChar\":\"𡹦\",\"unicodeCodePoint\":\"21E66\",\"pinYinChars\":[{\"char\":\"山定\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"0c62c4f5\",\"unicodeChar\":\"𡹚\",\"unicodeCodePoint\":\"21E5A\",\"pinYinChars\":[{\"char\":\"CHEN1\"}],\"splitChars\":[{\"char\":\"林山\"}],\"weight\":\"10\"},{\"charId\":\"6422079f\",\"unicodeChar\":\"𡹈\",\"unicodeCodePoint\":\"21E48\",\"pinYinChars\":[{\"char\":\"JIE2\"}],\"splitChars\":[{\"char\":\"山疌\"}],\"weight\":\"10\"},{\"charId\":\"8e67ed2c\",\"unicodeChar\":\"𡸷\",\"unicodeCodePoint\":\"21E37\",\"pinYinChars\":[{\"char\":\"山 其\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"119a69d1\",\"unicodeChar\":\"𡸶\",\"unicodeCodePoint\":\"21E36\",\"pinYinChars\":[{\"char\":\"CHONG2\"}],\"splitChars\":[{\"char\":\"山 宗\"}],\"weight\":\"10\"},{\"charId\":\"6965d3e5\",\"unicodeChar\":\"𡸄\",\"unicodeCodePoint\":\"21E04\",\"pinYinChars\":[{\"char\":\"DUI1\"}],\"splitChars\":[{\"char\":\"山坐\"}],\"weight\":\"10\"},{\"charId\":\"fa5a4cad\",\"unicodeChar\":\"𡷾\",\"unicodeCodePoint\":\"21DFE\",\"pinYinChars\":[{\"char\":\"QIU2\"}],\"splitChars\":[{\"char\":\"山酉\"}],\"weight\":\"10\"},{\"charId\":\"9cc24d29\",\"unicodeChar\":\"𡷭\",\"unicodeCodePoint\":\"21DED\",\"pinYinChars\":[{\"char\":\"CHAN2\"}],\"splitChars\":[{\"char\":\"山免\"}],\"weight\":\"10\"},{\"charId\":\"bf38ce30\",\"unicodeChar\":\"𡷔\",\"unicodeCodePoint\":\"21DD4\",\"pinYinChars\":[{\"char\":\"DUO3\"}],\"splitChars\":[{\"char\":\"山朵\"}],\"weight\":\"10\"},{\"charId\":\"4753b2ac\",\"unicodeChar\":\"𡶧\",\"unicodeCodePoint\":\"21DA7\",\"pinYinChars\":[{\"char\":\"LI4\"}],\"splitChars\":[{\"char\":\"山立\"}],\"weight\":\"10\"},{\"charId\":\"f89d83dc\",\"unicodeChar\":\"𡶣\",\"unicodeCodePoint\":\"21DA3\",\"pinYinChars\":[{\"char\":\"SUI4\"}],\"splitChars\":[{\"char\":\"山 夂\"}],\"weight\":\"10\"},{\"charId\":\"91fbcf7b\",\"unicodeChar\":\"𡶌\",\"unicodeCodePoint\":\"21D8C\",\"pinYinChars\":[{\"char\":\"PI2\"}],\"splitChars\":[{\"char\":\"山石\"}],\"weight\":\"10\"},{\"charId\":\"6b0f4d96\",\"unicodeChar\":\"𡵼\",\"unicodeCodePoint\":\"21D7C\",\"pinYinChars\":[{\"char\":\"TAN4\"}],\"splitChars\":[{\"char\":\"山火\"}],\"weight\":\"10\"},{\"charId\":\"52f464e2\",\"unicodeChar\":\"𡵸\",\"unicodeCodePoint\":\"21D78\",\"pinYinChars\":[{\"char\":\"yi4\"}],\"splitChars\":[{\"char\":\"山尺\"}],\"weight\":\"10\"},{\"charId\":\"d33a2775\",\"unicodeChar\":\"𡵱\",\"unicodeCodePoint\":\"21D71\",\"pinYinChars\":[{\"char\":\"QI2\"}],\"splitChars\":[{\"char\":\"山斤\"}],\"weight\":\"10\"},{\"charId\":\"6ef25ac7\",\"unicodeChar\":\"𡵰\",\"unicodeCodePoint\":\"21D70\",\"pinYinChars\":[{\"char\":\"LIU2\"}],\"splitChars\":[{\"char\":\"山水\"}],\"weight\":\"10\"},{\"charId\":\"e4056f9e\",\"unicodeChar\":\"𡵟\",\"unicodeCodePoint\":\"21D5F\",\"pinYinChars\":[{\"char\":\"pa1\"},{\"char\":\"ba4\"}],\"splitChars\":[{\"char\":\"山巴\"}],\"weight\":\"10\"},{\"charId\":\"0d3acae4\",\"unicodeChar\":\"𡵝\",\"unicodeCodePoint\":\"21D5D\",\"pinYinChars\":[{\"char\":\"ZONG1\"}],\"splitChars\":[{\"char\":\"山从\"}],\"weight\":\"10\"},{\"charId\":\"ca65e1f4\",\"unicodeChar\":\"𡴵\",\"unicodeCodePoint\":\"21D35\",\"pinYinChars\":[{\"char\":\"TING1\"}],\"splitChars\":[{\"char\":\"山丁\"}],\"weight\":\"10\"},{\"charId\":\"4b829571\",\"unicodeChar\":\"𡱰\",\"unicodeCodePoint\":\"21C70\",\"pinYinChars\":[{\"char\":\"ZHUO2\"}],\"splitChars\":[{\"char\":\"尸豕\"}],\"weight\":\"10\"},{\"charId\":\"0203f5bc\",\"unicodeChar\":\"𡱒\",\"unicodeCodePoint\":\"21C52\",\"pinYinChars\":[{\"char\":\"TUN2\"}],\"splitChars\":[{\"char\":\"尸共\"}],\"weight\":\"10\"},{\"charId\":\"c2a0ae28\",\"unicodeChar\":\"𡰷\",\"unicodeCodePoint\":\"21C37\",\"pinYinChars\":[{\"char\":\"HU4\"}],\"splitChars\":[{\"char\":\"尸斗\"}],\"weight\":\"10\"},{\"charId\":\"ed61722e\",\"unicodeChar\":\"𡰪\",\"unicodeCodePoint\":\"21C2A\",\"pinYinChars\":[{\"char\":\"ZHUO2\"}],\"splitChars\":[{\"char\":\"尸口\"}],\"weight\":\"10\"},{\"charId\":\"e9de0728\",\"unicodeChar\":\"𡯂\",\"unicodeCodePoint\":\"21BC2\",\"pinYinChars\":[{\"char\":\"WANG1\"}],\"splitChars\":[{\"char\":\"八几\"}],\"weight\":\"10\"},{\"charId\":\"708c1a78\",\"unicodeChar\":\"𡭄\",\"unicodeCodePoint\":\"21B44\",\"pinYinChars\":[{\"char\":\"堯 寸\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"5d09066a\",\"unicodeChar\":\"𡨤\",\"unicodeCodePoint\":\"21A24\",\"pinYinChars\":[{\"char\":\"ZHUO2\"}],\"splitChars\":[{\"char\":\"宀叕\"}],\"weight\":\"10\"},{\"charId\":\"3a7091fb\",\"unicodeChar\":\"𡧳\",\"unicodeCodePoint\":\"219F3\",\"pinYinChars\":[{\"char\":\"SAI\"}],\"splitChars\":[{\"char\":\"宀西\"}],\"weight\":\"10\"},{\"charId\":\"c487b654\",\"unicodeChar\":\"𡧨\",\"unicodeCodePoint\":\"219E8\",\"pinYinChars\":[{\"char\":\"ZHU2\"}],\"splitChars\":[{\"char\":\"宀出\"}],\"weight\":\"10\"},{\"charId\":\"b9484e4d\",\"unicodeChar\":\"𡧛\",\"unicodeCodePoint\":\"219DB\",\"pinYinChars\":[{\"char\":\"fu4\"}],\"splitChars\":[{\"char\":\"宀付\"}],\"weight\":\"10\"},{\"charId\":\"a023a0a3\",\"unicodeChar\":\"𡦈\",\"unicodeCodePoint\":\"21988\",\"pinYinChars\":[{\"char\":\"ling4\"}],\"splitChars\":[{\"char\":\"令孤\"}],\"weight\":\"10\"},{\"charId\":\"02d61c16\",\"unicodeChar\":\"𡥐\",\"unicodeCodePoint\":\"21950\",\"pinYinChars\":[{\"char\":\"SHI3\"}],\"splitChars\":[{\"char\":\"㞤子\"}],\"weight\":\"10\"},{\"charId\":\"2a9c4344\",\"unicodeChar\":\"𡥆\",\"unicodeCodePoint\":\"21946\",\"pinYinChars\":[{\"char\":\"HAO3\"}],\"splitChars\":[{\"char\":\"丑子\"}],\"weight\":\"10\"},{\"charId\":\"1d3e95a6\",\"unicodeChar\":\"𡣙\",\"unicodeCodePoint\":\"218D9\",\"pinYinChars\":[{\"char\":\"qi2\"}],\"splitChars\":[{\"char\":\"女齊\"}],\"weight\":\"10\"},{\"charId\":\"2f8f202e\",\"unicodeChar\":\"𡣋\",\"unicodeCodePoint\":\"218CB\",\"pinYinChars\":[{\"char\":\"PIAO1\"}],\"splitChars\":[{\"char\":\"嫖寸\"}],\"weight\":\"10\"},{\"charId\":\"fcf02eff\",\"unicodeChar\":\"𡣆\",\"unicodeCodePoint\":\"218C6\",\"pinYinChars\":[{\"char\":\"WU3\"}],\"splitChars\":[{\"char\":\"女舞\"}],\"weight\":\"10\"},{\"charId\":\"1975e4da\",\"unicodeChar\":\"𡢽\",\"unicodeCodePoint\":\"218BD\",\"pinYinChars\":[{\"char\":\"sui\"}],\"splitChars\":[{\"char\":\"女雷\"}],\"weight\":\"10\"},{\"charId\":\"5015b77d\",\"unicodeChar\":\"𡢟\",\"unicodeCodePoint\":\"2189F\",\"pinYinChars\":[{\"char\":\"女 楚\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"114cb6ae\",\"unicodeChar\":\"𡡢\",\"unicodeCodePoint\":\"21862\",\"pinYinChars\":[{\"char\":\"女 棠\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"59892cfb\",\"unicodeChar\":\"𡡞\",\"unicodeCodePoint\":\"2185E\",\"pinYinChars\":[{\"char\":\"女 舜\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"4eabbe86\",\"unicodeChar\":\"𡡛\",\"unicodeCodePoint\":\"2185B\",\"pinYinChars\":[{\"char\":\"CHENG2\"}],\"splitChars\":[{\"char\":\"女盛\"}],\"weight\":\"10\"},{\"charId\":\"f2b49a7a\",\"unicodeChar\":\"𡡁\",\"unicodeCodePoint\":\"21841\",\"pinYinChars\":[{\"char\":\"XI2\"}],\"splitChars\":[{\"char\":\"女悉\"}],\"weight\":\"10\"},{\"charId\":\"41d94dba\",\"unicodeChar\":\"𡠩\",\"unicodeCodePoint\":\"21829\",\"pinYinChars\":[{\"char\":\"女 堅\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"f3dad5aa\",\"unicodeChar\":\"𡠖\",\"unicodeCodePoint\":\"21816\",\"pinYinChars\":[{\"char\":\"HAO4\"}],\"splitChars\":[{\"char\":\"女臯\"}],\"weight\":\"10\"},{\"charId\":\"90b05708\",\"unicodeChar\":\"𡠓\",\"unicodeCodePoint\":\"21813\",\"pinYinChars\":[{\"char\":\"HUI1\"}],\"splitChars\":[{\"char\":\"倠女\"}],\"weight\":\"10\"},{\"charId\":\"24d9f089\",\"unicodeChar\":\"𡟻\",\"unicodeCodePoint\":\"217FB\",\"pinYinChars\":[{\"char\":\"女 茵\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"ea4a0f07\",\"unicodeChar\":\"𡟺\",\"unicodeCodePoint\":\"217FA\",\"pinYinChars\":[{\"char\":\"女夏\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"d7536b3e\",\"unicodeChar\":\"𡟸\",\"unicodeCodePoint\":\"217F8\",\"pinYinChars\":[{\"char\":\"女 翁\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"5cf22d2e\",\"unicodeChar\":\"𡟵\",\"unicodeCodePoint\":\"217F5\",\"pinYinChars\":[{\"char\":\"GO1\"}],\"splitChars\":[{\"char\":\"女 哥\"}],\"weight\":\"10\"},{\"charId\":\"3f2ac539\",\"unicodeChar\":\"𡟝\",\"unicodeCodePoint\":\"217DD\",\"pinYinChars\":[{\"char\":\"SUI4\"}],\"splitChars\":[{\"char\":\"女㒸\"}],\"weight\":\"10\"},{\"charId\":\"b48d57dc\",\"unicodeChar\":\"𡞵\",\"unicodeCodePoint\":\"217B5\",\"pinYinChars\":[{\"char\":\"huan4\"}],\"splitChars\":[{\"char\":\"女 奂\"}],\"weight\":\"10\"},{\"charId\":\"c5d8c054\",\"unicodeChar\":\"𡞲\",\"unicodeCodePoint\":\"217B2\",\"pinYinChars\":[{\"char\":\"ping1\"}],\"splitChars\":[{\"char\":\"女𦥚\"}],\"weight\":\"10\"},{\"charId\":\"f505af09\",\"unicodeChar\":\"𡞱\",\"unicodeCodePoint\":\"217B1\",\"pinYinChars\":[{\"char\":\"LV3\"}],\"splitChars\":[{\"char\":\"女娄\"}],\"weight\":\"10\"},{\"charId\":\"4be8dd1d\",\"unicodeChar\":\"𡞗\",\"unicodeCodePoint\":\"21797\",\"pinYinChars\":[{\"char\":\"bong2\"}],\"splitChars\":[{\"char\":\"女奉\"}],\"weight\":\"10\"},{\"charId\":\"f0a7ca9d\",\"unicodeChar\":\"𡞏\",\"unicodeCodePoint\":\"2178F\",\"pinYinChars\":[{\"char\":\"NAI4\"}],\"splitChars\":[{\"char\":\"女奈\"}],\"weight\":\"10\"},{\"charId\":\"7c66b56b\",\"unicodeChar\":\"𡝳\",\"unicodeCodePoint\":\"21773\",\"pinYinChars\":[{\"char\":\"女 芝\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"78fc89a1\",\"unicodeChar\":\"𡝱\",\"unicodeCodePoint\":\"21771\",\"pinYinChars\":[{\"char\":\"女 芬\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"d9e4704f\",\"unicodeChar\":\"𡝯\",\"unicodeCodePoint\":\"2176F\",\"pinYinChars\":[{\"char\":\"女 隶\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"9380731a\",\"unicodeChar\":\"𡝮\",\"unicodeCodePoint\":\"2176E\",\"pinYinChars\":[{\"char\":\"女 宜\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"37de9e88\",\"unicodeChar\":\"𡝬\",\"unicodeCodePoint\":\"2176C\",\"pinYinChars\":[{\"char\":\"bao3\"}],\"splitChars\":[{\"char\":\"女 宝\"}],\"weight\":\"10\"},{\"charId\":\"999c39cc\",\"unicodeChar\":\"𡜻\",\"unicodeCodePoint\":\"2173B\",\"pinYinChars\":[{\"char\":\"女 宋\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"3cb284da\",\"unicodeChar\":\"𡜠\",\"unicodeCodePoint\":\"21720\",\"pinYinChars\":[{\"char\":\"FENG1\"}],\"splitChars\":[{\"char\":\"女夅\"}],\"weight\":\"10\"},{\"charId\":\"498c4b58\",\"unicodeChar\":\"𡜍\",\"unicodeCodePoint\":\"2170D\",\"pinYinChars\":[{\"char\":\"JI2\"}],\"splitChars\":[{\"char\":\"女自\"}],\"weight\":\"10\"},{\"charId\":\"58236a85\",\"unicodeChar\":\"𡛨\",\"unicodeCodePoint\":\"216E8\",\"pinYinChars\":[{\"char\":\"女 卡\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"c6373cc9\",\"unicodeChar\":\"𡛖\",\"unicodeCodePoint\":\"216D6\",\"pinYinChars\":[{\"char\":\"NUO3\"}],\"splitChars\":[{\"char\":\"女厄\"}],\"weight\":\"10\"},{\"charId\":\"eb069098\",\"unicodeChar\":\"𡛔\",\"unicodeCodePoint\":\"216D4\",\"pinYinChars\":[{\"char\":\"女丐\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"b11b7baa\",\"unicodeChar\":\"𡛒\",\"unicodeCodePoint\":\"216D2\",\"pinYinChars\":[{\"char\":\"CAN4\"}],\"splitChars\":[{\"char\":\"双女\"}],\"weight\":\"10\"},{\"charId\":\"e7cd9c17\",\"unicodeChar\":\"𡛂\",\"unicodeCodePoint\":\"216C2\",\"pinYinChars\":[{\"char\":\"yi1\"}],\"splitChars\":[{\"char\":\"女 尹\"}],\"weight\":\"10\"},{\"charId\":\"14dbc890\",\"unicodeChar\":\"𡚼\",\"unicodeCodePoint\":\"216BC\",\"pinYinChars\":[{\"char\":\"SHI2\"}],\"splitChars\":[{\"char\":\"女氏\"}],\"weight\":\"10\"},{\"charId\":\"1398354d\",\"unicodeChar\":\"𡚺\",\"unicodeCodePoint\":\"216BA\",\"pinYinChars\":[{\"char\":\"FAN4\"}],\"splitChars\":[{\"char\":\"女丸\"}],\"weight\":\"10\"},{\"charId\":\"af3b9619\",\"unicodeChar\":\"𡗨\",\"unicodeCodePoint\":\"215E8\",\"pinYinChars\":[{\"char\":\"DI1\"}],\"splitChars\":[{\"char\":\"大互\"}],\"weight\":\"10\"},{\"charId\":\"18bbad8f\",\"unicodeChar\":\"𡗝\",\"unicodeCodePoint\":\"215DD\",\"pinYinChars\":[{\"char\":\"YI2\"}],\"splitChars\":[{\"char\":\"大弓\"}],\"weight\":\"10\"},{\"charId\":\"9fe7d227\",\"unicodeChar\":\"𡗗\",\"unicodeCodePoint\":\"215D7\",\"pinYinChars\":[{\"char\":\"en1\"}],\"splitChars\":[{\"char\":\"三 人\"}],\"weight\":\"10\"},{\"charId\":\"4d05d608\",\"unicodeChar\":\"𡖖\",\"unicodeCodePoint\":\"21596\",\"pinYinChars\":[{\"char\":\"QING1\"}],\"splitChars\":[{\"char\":\"夕即\"}],\"weight\":\"10\"},{\"charId\":\"5afbd6a1\",\"unicodeChar\":\"𡓇\",\"unicodeCodePoint\":\"214C7\",\"pinYinChars\":[{\"char\":\"lu3\"}],\"splitChars\":[{\"char\":\"土魯\"}],\"weight\":\"10\"},{\"charId\":\"be807cd3\",\"unicodeChar\":\"𡒗\",\"unicodeCodePoint\":\"21497\",\"pinYinChars\":[{\"char\":\"滿土\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"1a60fb81\",\"unicodeChar\":\"𡑡\",\"unicodeCodePoint\":\"21461\",\"pinYinChars\":[{\"char\":\"HUAN2\"}],\"splitChars\":[{\"char\":\"土睘\"}],\"weight\":\"10\"},{\"charId\":\"a7bcf232\",\"unicodeChar\":\"𡑀\",\"unicodeCodePoint\":\"21440\",\"pinYinChars\":[{\"char\":\"YE3\"}],\"splitChars\":[{\"char\":\"棥土\"}],\"weight\":\"10\"},{\"charId\":\"50aef963\",\"unicodeChar\":\"𡏬\",\"unicodeCodePoint\":\"213EC\",\"pinYinChars\":[{\"char\":\"liu2\"}],\"splitChars\":[{\"char\":\"流土\"}],\"weight\":\"10\"},{\"charId\":\"a401284f\",\"unicodeChar\":\"𡏟\",\"unicodeCodePoint\":\"213DF\",\"pinYinChars\":[{\"char\":\"YAO2\"}],\"splitChars\":[{\"char\":\"土䍃\"}],\"weight\":\"10\"},{\"charId\":\"3a54c8fc\",\"unicodeChar\":\"𡏆\",\"unicodeCodePoint\":\"213C6\",\"pinYinChars\":[{\"char\":\"土 养\"}],\"splitChars\":[{\"char\":\"𡒶\"}],\"weight\":\"10\"},{\"charId\":\"8d9a4f36\",\"unicodeChar\":\"𡎴\",\"unicodeCodePoint\":\"213B4\",\"pinYinChars\":[{\"char\":\"GONG4\"}],\"splitChars\":[{\"char\":\"土貢\"}],\"weight\":\"10\"},{\"charId\":\"4b5f69e3\",\"unicodeChar\":\"𡎞\",\"unicodeCodePoint\":\"2139E\",\"pinYinChars\":[{\"char\":\"土貞\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"efb1ff5f\",\"unicodeChar\":\"𡎝\",\"unicodeCodePoint\":\"2139D\",\"pinYinChars\":[{\"char\":\"COI\"}],\"splitChars\":[{\"char\":\"土癸\"}],\"weight\":\"10\"},{\"charId\":\"8251505f\",\"unicodeChar\":\"𡎏\",\"unicodeCodePoint\":\"2138F\",\"pinYinChars\":[{\"char\":\"NIE4\"}],\"splitChars\":[{\"char\":\"土泉\"}],\"weight\":\"10\"},{\"charId\":\"fef5ec81\",\"unicodeChar\":\"𡎎\",\"unicodeCodePoint\":\"2138E\",\"pinYinChars\":[{\"char\":\"XU4\"}],\"splitChars\":[{\"char\":\"土咠\"}],\"weight\":\"10\"},{\"charId\":\"8a22c3a8\",\"unicodeChar\":\"𡍸\",\"unicodeCodePoint\":\"21378\",\"pinYinChars\":[{\"char\":\"NIE4\"}],\"splitChars\":[{\"char\":\"品土\"}],\"weight\":\"10\"},{\"charId\":\"a3d4140d\",\"unicodeChar\":\"𡍨\",\"unicodeCodePoint\":\"21368\",\"pinYinChars\":[{\"char\":\"DU4\"}],\"splitChars\":[{\"char\":\"土度\"}],\"weight\":\"10\"},{\"charId\":\"102fc4c4\",\"unicodeChar\":\"𡍚\",\"unicodeCodePoint\":\"2135A\",\"pinYinChars\":[{\"char\":\"LAM\"}],\"splitChars\":[{\"char\":\"土林\"}],\"weight\":\"10\"},{\"charId\":\"6bd4130b\",\"unicodeChar\":\"𡌡\",\"unicodeCodePoint\":\"21321\",\"pinYinChars\":[{\"char\":\"JIE2\"}],\"splitChars\":[{\"char\":\"土弟\"}],\"weight\":\"10\"},{\"charId\":\"ae98ef7b\",\"unicodeChar\":\"𡌗\",\"unicodeCodePoint\":\"21317\",\"pinYinChars\":[{\"char\":\"HUAN2\"}],\"splitChars\":[{\"char\":\"土皃\"}],\"weight\":\"10\"},{\"charId\":\"3409967b\",\"unicodeChar\":\"𡌔\",\"unicodeCodePoint\":\"21314\",\"pinYinChars\":[{\"char\":\"QIAO1\"}],\"splitChars\":[{\"char\":\"土肖\"}],\"weight\":\"10\"},{\"charId\":\"6af82971\",\"unicodeChar\":\"𡌑\",\"unicodeCodePoint\":\"21311\",\"pinYinChars\":[{\"char\":\"XING2\"}],\"splitChars\":[{\"char\":\"形土\"}],\"weight\":\"10\"},{\"charId\":\"36a533bc\",\"unicodeChar\":\"𡌃\",\"unicodeCodePoint\":\"21303\",\"pinYinChars\":[{\"char\":\"GAO4\"}],\"splitChars\":[{\"char\":\"土吿\"}],\"weight\":\"10\"},{\"charId\":\"41985d7f\",\"unicodeChar\":\"𡋱\",\"unicodeCodePoint\":\"212F1\",\"pinYinChars\":[{\"char\":\"LONG4\"}],\"splitChars\":[{\"char\":\"土弄\"}],\"weight\":\"10\"},{\"charId\":\"681a0011\",\"unicodeChar\":\"𡋤\",\"unicodeCodePoint\":\"212E4\",\"pinYinChars\":[{\"char\":\"JIN4\"}],\"splitChars\":[{\"char\":\"土尽\"}],\"weight\":\"10\"},{\"charId\":\"066bd7f0\",\"unicodeChar\":\"𡋂\",\"unicodeCodePoint\":\"212C2\",\"pinYinChars\":[{\"char\":\"NEN4\"}],\"splitChars\":[{\"char\":\"土年\"}],\"weight\":\"10\"},{\"charId\":\"16e8def8\",\"unicodeChar\":\"𡊨\",\"unicodeCodePoint\":\"212A8\",\"pinYinChars\":[{\"char\":\"TAN2\"}],\"splitChars\":[{\"char\":\"土玄\"}],\"weight\":\"10\"},{\"charId\":\"b1aba160\",\"unicodeChar\":\"𡊢\",\"unicodeCodePoint\":\"212A2\",\"pinYinChars\":[{\"char\":\"TAN1\"}],\"splitChars\":[{\"char\":\"土册\"}],\"weight\":\"10\"},{\"charId\":\"facafbd8\",\"unicodeChar\":\"𡊑\",\"unicodeCodePoint\":\"21291\",\"pinYinChars\":[{\"char\":\"XI3\"}],\"splitChars\":[{\"char\":\"土尔\"}],\"weight\":\"10\"},{\"charId\":\"85100a3d\",\"unicodeChar\":\"𡊀\",\"unicodeCodePoint\":\"21280\",\"pinYinChars\":[{\"char\":\"TAI4\"}],\"splitChars\":[{\"char\":\"土太\"}],\"weight\":\"10\"},{\"charId\":\"93339870\",\"unicodeChar\":\"𡉴\",\"unicodeCodePoint\":\"21274\",\"pinYinChars\":[{\"char\":\"LU2\"}],\"splitChars\":[{\"char\":\"土户土戶\"}],\"weight\":\"10\"},{\"charId\":\"5217bdce\",\"unicodeChar\":\"𡉃\",\"unicodeCodePoint\":\"21243\",\"pinYinChars\":[{\"char\":\"yan4\"}],\"splitChars\":[{\"char\":\"土厂\"}],\"weight\":\"10\"},{\"charId\":\"d6e1a9e9\",\"unicodeChar\":\"𡇈\",\"unicodeCodePoint\":\"211C8\",\"pinYinChars\":[{\"char\":\"DANG4\"}],\"splitChars\":[{\"char\":\"囗石\"}],\"weight\":\"10\"},{\"charId\":\"6cefc8d8\",\"unicodeChar\":\"𡆳\",\"unicodeCodePoint\":\"211B3\",\"pinYinChars\":[{\"char\":\"HU1\"}],\"splitChars\":[{\"char\":\"囗巳\"}],\"weight\":\"10\"},{\"charId\":\"09266ae6\",\"unicodeChar\":\"𡆑\",\"unicodeCodePoint\":\"21191\",\"pinYinChars\":[{\"char\":\"YAN2\"}],\"splitChars\":[{\"char\":\"口巖\"}],\"weight\":\"10\"},{\"charId\":\"655b4939\",\"unicodeChar\":\"𠾐\",\"unicodeCodePoint\":\"20F90\",\"pinYinChars\":[{\"char\":\"LONG2\"}],\"splitChars\":[{\"char\":\"口隆\"}],\"weight\":\"10\"},{\"charId\":\"45e7e9c0\",\"unicodeChar\":\"𠼦\",\"unicodeCodePoint\":\"20F26\",\"pinYinChars\":[{\"char\":\"MAN2\"}],\"splitChars\":[{\"char\":\"口曼\"}],\"weight\":\"10\"},{\"charId\":\"a6cbc3b1\",\"unicodeChar\":\"𠻸\",\"unicodeCodePoint\":\"20EF8\",\"pinYinChars\":[{\"char\":\"si4\"}],\"splitChars\":[{\"char\":\"𠀷司\"}],\"weight\":\"10\"},{\"charId\":\"0b56e6b2\",\"unicodeChar\":\"𠻵\",\"unicodeCodePoint\":\"20EF5\",\"pinYinChars\":[{\"char\":\"MANG3\"}],\"splitChars\":[{\"char\":\"口莽\"}],\"weight\":\"10\"},{\"charId\":\"81aa47fb\",\"unicodeChar\":\"𠻘\",\"unicodeCodePoint\":\"20ED8\",\"pinYinChars\":[{\"char\":\"JIAO2\"}],\"splitChars\":[{\"char\":\"口雀\"}],\"weight\":\"10\"},{\"charId\":\"b97b646a\",\"unicodeChar\":\"𠹟\",\"unicodeCodePoint\":\"20E5F\",\"pinYinChars\":[{\"char\":\"JIAN3\"}],\"splitChars\":[{\"char\":\"𡨄口\"}],\"weight\":\"10\"},{\"charId\":\"8aae1510\",\"unicodeChar\":\"𠹒\",\"unicodeCodePoint\":\"20E52\",\"pinYinChars\":[{\"char\":\"HONG4\"}],\"splitChars\":[{\"char\":\"口宫口宮\"}],\"weight\":\"10\"},{\"charId\":\"5a942e35\",\"unicodeChar\":\"𠷿\",\"unicodeCodePoint\":\"20DFF\",\"pinYinChars\":[{\"char\":\"ZA3\"}],\"splitChars\":[{\"char\":\"口怎\"}],\"weight\":\"10\"},{\"charId\":\"05703acb\",\"unicodeChar\":\"𠷊\",\"unicodeCodePoint\":\"20DCA\",\"pinYinChars\":[{\"char\":\"PIAN2\"}],\"splitChars\":[{\"char\":\"口便\"}],\"weight\":\"10\"},{\"charId\":\"35310f00\",\"unicodeChar\":\"𠶓\",\"unicodeCodePoint\":\"20D93\",\"pinYinChars\":[{\"char\":\"口表\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"d27a8de6\",\"unicodeChar\":\"𠵸\",\"unicodeCodePoint\":\"20D78\",\"pinYinChars\":[{\"char\":\"HAN1\"}],\"splitChars\":[{\"char\":\"口弥\"}],\"weight\":\"10\"},{\"charId\":\"ab8efed7\",\"unicodeChar\":\"𠵇\",\"unicodeCodePoint\":\"20D47\",\"pinYinChars\":[{\"char\":\"QI3\"}],\"splitChars\":[{\"char\":\"口奇\"}],\"weight\":\"10\"},{\"charId\":\"dcac3491\",\"unicodeChar\":\"𠴔\",\"unicodeCodePoint\":\"20D14\",\"pinYinChars\":[{\"char\":\"CHENG2\"}],\"splitChars\":[{\"char\":\"口呈\"}],\"weight\":\"10\"},{\"charId\":\"17d622fe\",\"unicodeChar\":\"𠳾\",\"unicodeCodePoint\":\"20CFE\",\"pinYinChars\":[{\"char\":\"HAN3\"}],\"splitChars\":[{\"char\":\"口罕\"}],\"weight\":\"10\"},{\"charId\":\"27e714b0\",\"unicodeChar\":\"𠳯\",\"unicodeCodePoint\":\"20CEF\",\"pinYinChars\":[{\"char\":\"HAO2\"}],\"splitChars\":[{\"char\":\"号 号\"}],\"weight\":\"10\"},{\"charId\":\"8d1bafd1\",\"unicodeChar\":\"𠳬\",\"unicodeCodePoint\":\"20CEC\",\"pinYinChars\":[{\"char\":\"JING4\"}],\"splitChars\":[{\"char\":\"古古\"}],\"weight\":\"10\"},{\"charId\":\"e6068858\",\"unicodeChar\":\"𠳚\",\"unicodeCodePoint\":\"20CDA\",\"pinYinChars\":[{\"char\":\"CAI\"}],\"splitChars\":[{\"char\":\"口改\"}],\"weight\":\"10\"},{\"charId\":\"c23e2b64\",\"unicodeChar\":\"𠳀\",\"unicodeCodePoint\":\"20CC0\",\"pinYinChars\":[{\"char\":\"YONG3\"}],\"splitChars\":[{\"char\":\"口甬\"}],\"weight\":\"10\"},{\"charId\":\"ede04650\",\"unicodeChar\":\"𠲸\",\"unicodeCodePoint\":\"20CB8\",\"pinYinChars\":[{\"char\":\"NAN2\"}],\"splitChars\":[{\"char\":\"口男\"}],\"weight\":\"10\"},{\"charId\":\"ca524976\",\"unicodeChar\":\"𠲰\",\"unicodeCodePoint\":\"20CB0\",\"pinYinChars\":[{\"char\":\"YUN3\"}],\"splitChars\":[{\"char\":\"口君\"}],\"weight\":\"10\"},{\"charId\":\"7909de8e\",\"unicodeChar\":\"𠲡\",\"unicodeCodePoint\":\"20CA1\",\"pinYinChars\":[{\"char\":\"hao3\"}],\"splitChars\":[{\"char\":\"口好\"}],\"weight\":\"10\"},{\"charId\":\"2466fa0d\",\"unicodeChar\":\"𠲖\",\"unicodeCodePoint\":\"20C96\",\"pinYinChars\":[{\"char\":\"YI1\"}],\"splitChars\":[{\"char\":\"口衣\"}],\"weight\":\"10\"},{\"charId\":\"fb8fbac4\",\"unicodeChar\":\"𠲕\",\"unicodeCodePoint\":\"20C95\",\"pinYinChars\":[{\"char\":\"CHUANG2\"}],\"splitChars\":[{\"char\":\"口庄\"}],\"weight\":\"10\"},{\"charId\":\"daea5f4e\",\"unicodeChar\":\"𠱴\",\"unicodeCodePoint\":\"20C74\",\"pinYinChars\":[{\"char\":\"JIN4\"}],\"splitChars\":[{\"char\":\"口全\"}],\"weight\":\"10\"},{\"charId\":\"257faed2\",\"unicodeChar\":\"𠱅\",\"unicodeCodePoint\":\"20C45\",\"pinYinChars\":[{\"char\":\"sheng4\"}],\"splitChars\":[{\"char\":\"口圣\"}],\"weight\":\"10\"},{\"charId\":\"004426cc\",\"unicodeChar\":\"𠰍\",\"unicodeCodePoint\":\"20C0D\",\"pinYinChars\":[{\"char\":\"ZHU3\"}],\"splitChars\":[{\"char\":\"口主\"}],\"weight\":\"10\"},{\"charId\":\"1d9c2b9e\",\"unicodeChar\":\"𠰃\",\"unicodeCodePoint\":\"20C03\",\"pinYinChars\":[{\"char\":\"nen4\"}],\"splitChars\":[{\"char\":\"口壬\"}],\"weight\":\"10\"},{\"charId\":\"79d47925\",\"unicodeChar\":\"𠰁\",\"unicodeCodePoint\":\"20C01\",\"pinYinChars\":[{\"char\":\"GAY\"}],\"splitChars\":[{\"char\":\"口丐\"}],\"weight\":\"10\"},{\"charId\":\"029191bb\",\"unicodeChar\":\"𠯏\",\"unicodeCodePoint\":\"20BCF\",\"pinYinChars\":[{\"char\":\"CHI1\"}],\"splitChars\":[{\"char\":\"口气\"}],\"weight\":\"10\"},{\"charId\":\"fc6bb883\",\"unicodeChar\":\"𠮨\",\"unicodeCodePoint\":\"20BA8\",\"pinYinChars\":[{\"char\":\"RENG2\"}],\"splitChars\":[{\"char\":\"口乃\"}],\"weight\":\"10\"},{\"charId\":\"2c634411\",\"unicodeChar\":\"𠮉\",\"unicodeCodePoint\":\"20B89\",\"pinYinChars\":[{\"char\":\"RUI4\"}],\"splitChars\":[{\"char\":\"𥈠又⺊厂一八𥃦又\"}],\"weight\":\"10\"},{\"charId\":\"d86930e3\",\"unicodeChar\":\"𠭯\",\"unicodeCodePoint\":\"20B6F\",\"pinYinChars\":[{\"char\":\"ZHA1\"}],\"splitChars\":[{\"char\":\"虘又\"}],\"weight\":\"10\"},{\"charId\":\"c8d68a40\",\"unicodeChar\":\"𠬤\",\"unicodeCodePoint\":\"20B24\",\"pinYinChars\":[{\"char\":\"YI4\"}],\"splitChars\":[{\"char\":\"又𰀁\"}],\"weight\":\"10\"},{\"charId\":\"07b56375\",\"unicodeChar\":\"𠬑\",\"unicodeCodePoint\":\"20B11\",\"pinYinChars\":[{\"char\":\"QU4\"}],\"splitChars\":[{\"char\":\"去去去\"}],\"weight\":\"10\"},{\"charId\":\"26d561f6\",\"unicodeChar\":\"𠫵\",\"unicodeCodePoint\":\"20AF5\",\"pinYinChars\":[{\"char\":\"SHEN1\"}],\"splitChars\":[{\"char\":\"厶大㣺\"}],\"weight\":\"10\"},{\"charId\":\"8cbde3a0\",\"unicodeChar\":\"𠫤\",\"unicodeCodePoint\":\"20AE4\",\"pinYinChars\":[{\"char\":\"LEON6\"}],\"splitChars\":[{\"char\":\"乂厷\"}],\"weight\":\"10\"},{\"charId\":\"a3ecaff1\",\"unicodeChar\":\"𠪚\",\"unicodeCodePoint\":\"20A9A\",\"pinYinChars\":[{\"char\":\"YIN2\"}],\"splitChars\":[{\"char\":\"厂敢\"}],\"weight\":\"10\"},{\"charId\":\"642c58f2\",\"unicodeChar\":\"𠪆\",\"unicodeCodePoint\":\"20A86\",\"pinYinChars\":[{\"char\":\"JUE2\"}],\"splitChars\":[{\"char\":\"厂封\"}],\"weight\":\"10\"},{\"charId\":\"f84daa09\",\"unicodeChar\":\"𠨺\",\"unicodeCodePoint\":\"20A3A\",\"pinYinChars\":[{\"char\":\"CHI4\"}],\"splitChars\":[{\"char\":\"厂午\"}],\"weight\":\"10\"},{\"charId\":\"316c3bd6\",\"unicodeChar\":\"𠦅\",\"unicodeCodePoint\":\"20985\",\"pinYinChars\":[{\"char\":\"NIAN2\"}],\"splitChars\":[{\"char\":\"千千\"}],\"weight\":\"10\"},{\"charId\":\"784ff589\",\"unicodeChar\":\"𠤲\",\"unicodeCodePoint\":\"20932\",\"pinYinChars\":[{\"char\":\"匚 屯\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"aa296d6e\",\"unicodeChar\":\"𠢔\",\"unicodeCodePoint\":\"20894\",\"pinYinChars\":[{\"char\":\"OU1\"}],\"splitChars\":[{\"char\":\"區力\"}],\"weight\":\"10\"},{\"charId\":\"095216ca\",\"unicodeChar\":\"𠡍\",\"unicodeCodePoint\":\"2084D\",\"pinYinChars\":[{\"char\":\"JING4\"}],\"splitChars\":[{\"char\":\"圣力\"}],\"weight\":\"10\"},{\"charId\":\"0f573bb9\",\"unicodeChar\":\"𠠛\",\"unicodeCodePoint\":\"2081B\",\"pinYinChars\":[{\"char\":\"KUO4\"}],\"splitChars\":[{\"char\":\"霍刂\"}],\"weight\":\"10\"},{\"charId\":\"2871e9f2\",\"unicodeChar\":\"𠞪\",\"unicodeCodePoint\":\"207AA\",\"pinYinChars\":[{\"char\":\"HAO2\"}],\"splitChars\":[{\"char\":\"敖刀\"}],\"weight\":\"10\"},{\"charId\":\"bf32142f\",\"unicodeChar\":\"𠜋\",\"unicodeCodePoint\":\"2070B\",\"pinYinChars\":[{\"char\":\"CHOU3\"}],\"splitChars\":[{\"char\":\"人丑刂\"}],\"weight\":\"10\"},{\"charId\":\"60372307\",\"unicodeChar\":\"𠚼\",\"unicodeCodePoint\":\"206BC\",\"pinYinChars\":[{\"char\":\"BAN1\"}],\"splitChars\":[{\"char\":\"分刂\"}],\"weight\":\"10\"},{\"charId\":\"2540d48c\",\"unicodeChar\":\"𠙽\",\"unicodeCodePoint\":\"2067D\",\"pinYinChars\":[{\"char\":\"KUAI4\"},{\"char\":\"KUI4\"}],\"splitChars\":[{\"char\":\"士 凵\"}],\"weight\":\"10\"},{\"charId\":\"30dda424\",\"unicodeChar\":\"𠙁\",\"unicodeCodePoint\":\"20641\",\"pinYinChars\":[{\"char\":\"CHANG2\"}],\"splitChars\":[{\"char\":\"正几\"}],\"weight\":\"10\"},{\"charId\":\"2e66c4d8\",\"unicodeChar\":\"𠘻\",\"unicodeCodePoint\":\"2063B\",\"pinYinChars\":[{\"char\":\"WU2\"}],\"splitChars\":[{\"char\":\"凡凡\"}],\"weight\":\"10\"},{\"charId\":\"fe1a753e\",\"unicodeChar\":\"𠘑\",\"unicodeCodePoint\":\"20611\",\"pinYinChars\":[{\"char\":\"XI1\"}],\"splitChars\":[{\"char\":\"冫 熙\"}],\"weight\":\"10\"},{\"charId\":\"3bb748b2\",\"unicodeChar\":\"𠔃\",\"unicodeCodePoint\":\"20503\",\"pinYinChars\":[{\"char\":\"XI1\"}],\"splitChars\":[{\"char\":\"丷丂\"}],\"weight\":\"10\"},{\"charId\":\"dda19b7a\",\"unicodeChar\":\"𠓢\",\"unicodeCodePoint\":\"204E2\",\"pinYinChars\":[{\"char\":\"JIE4\"}],\"splitChars\":[{\"char\":\"入 手\"}],\"weight\":\"10\"},{\"charId\":\"fff61bf9\",\"unicodeChar\":\"𠐳\",\"unicodeCodePoint\":\"20433\",\"pinYinChars\":[{\"char\":\"LV3\"}],\"splitChars\":[{\"char\":\"亻盧\"}],\"weight\":\"10\"},{\"charId\":\"9e6d9fc5\",\"unicodeChar\":\"𠐃\",\"unicodeCodePoint\":\"20403\",\"pinYinChars\":[{\"char\":\"SHU1\"}],\"splitChars\":[{\"char\":\"翛心\"}],\"weight\":\"10\"},{\"charId\":\"f5f4c311\",\"unicodeChar\":\"𠐁\",\"unicodeCodePoint\":\"20401\",\"pinYinChars\":[{\"char\":\"MENG2\"}],\"splitChars\":[{\"char\":\"亻蒙\"}],\"weight\":\"10\"},{\"charId\":\"a2d55bf1\",\"unicodeChar\":\"𠏼\",\"unicodeCodePoint\":\"203FC\",\"pinYinChars\":[{\"char\":\"GAA\"}],\"splitChars\":[{\"char\":\"亻 嘉\"}],\"weight\":\"10\"},{\"charId\":\"af58ba4c\",\"unicodeChar\":\"𠏟\",\"unicodeCodePoint\":\"203DF\",\"pinYinChars\":[{\"char\":\"BAM\"}],\"splitChars\":[{\"char\":\"亻稟\"}],\"weight\":\"10\"},{\"charId\":\"07b87281\",\"unicodeChar\":\"𠎽\",\"unicodeCodePoint\":\"203BD\",\"pinYinChars\":[{\"char\":\"QIONG2\"}],\"splitChars\":[{\"char\":\"亻煢\"}],\"weight\":\"10\"},{\"charId\":\"6a3d2df8\",\"unicodeChar\":\"𠎸\",\"unicodeCodePoint\":\"203B8\",\"pinYinChars\":[{\"char\":\"SE4\"}],\"splitChars\":[{\"char\":\"亻嗇\"}],\"weight\":\"10\"},{\"charId\":\"5cbdf8cc\",\"unicodeChar\":\"𠎦\",\"unicodeCodePoint\":\"203A6\",\"pinYinChars\":[{\"char\":\"JIANG4\"}],\"splitChars\":[{\"char\":\"亻强\"}],\"weight\":\"10\"},{\"charId\":\"69ba37bb\",\"unicodeChar\":\"𠎢\",\"unicodeCodePoint\":\"203A2\",\"pinYinChars\":[{\"char\":\"XING1\"}],\"splitChars\":[{\"char\":\"亻法心\"}],\"weight\":\"10\"},{\"charId\":\"709b5892\",\"unicodeChar\":\"𠍷\",\"unicodeCodePoint\":\"20377\",\"pinYinChars\":[{\"char\":\"BO2\"}],\"splitChars\":[{\"char\":\"亻棘\"}],\"weight\":\"10\"},{\"charId\":\"665d0220\",\"unicodeChar\":\"𠌾\",\"unicodeCodePoint\":\"2033E\",\"pinYinChars\":[{\"char\":\"YI2\"}],\"splitChars\":[{\"char\":\"亻莪\"}],\"weight\":\"10\"},{\"charId\":\"cd273e5b\",\"unicodeChar\":\"𠌘\",\"unicodeCodePoint\":\"20318\",\"pinYinChars\":[{\"char\":\"XIA4\"}],\"splitChars\":[{\"char\":\"亻夏\"}],\"weight\":\"10\"},{\"charId\":\"2426540e\",\"unicodeChar\":\"𠋶\",\"unicodeCodePoint\":\"202F6\",\"pinYinChars\":[{\"char\":\"MING3\"}],\"splitChars\":[{\"char\":\"亻冥\"}],\"weight\":\"10\"},{\"charId\":\"84ecf90b\",\"unicodeChar\":\"𠊿\",\"unicodeCodePoint\":\"202BF\",\"pinYinChars\":[{\"char\":\"SYUN1\"}],\"splitChars\":[{\"char\":\"亻 宣\"}],\"weight\":\"10\"},{\"charId\":\"913c75e0\",\"unicodeChar\":\"𠊷\",\"unicodeCodePoint\":\"202B7\",\"pinYinChars\":[{\"char\":\"ZHI4\"}],\"splitChars\":[{\"char\":\"亻致\"}],\"weight\":\"10\"},{\"charId\":\"c90a0f85\",\"unicodeChar\":\"𠊵\",\"unicodeCodePoint\":\"202B5\",\"pinYinChars\":[{\"char\":\"BENG1\"}],\"splitChars\":[{\"char\":\"亻𭖚\"}],\"weight\":\"10\"},{\"charId\":\"a8f873b7\",\"unicodeChar\":\"𠉴\",\"unicodeCodePoint\":\"20274\",\"pinYinChars\":[{\"char\":\"亻 雨\"}],\"splitChars\":[],\"weight\":\"10\"},{\"charId\":\"71d6f6f4\",\"unicodeChar\":\"𠉜\",\"unicodeCodePoint\":\"2025C\",\"pinYinChars\":[{\"char\":\"WEI3\"}],\"splitChars\":[{\"char\":\"亻尾\"}],\"weight\":\"10\"},{\"charId\":\"08cbf65c\",\"unicodeChar\":\"𠉂\",\"unicodeCodePoint\":\"20242\",\"pinYinChars\":[{\"char\":\"TA4\"}],\"splitChars\":[{\"char\":\"亻达\"}],\"weight\":\"10\"},{\"charId\":\"da82aa3d\",\"unicodeChar\":\"𠈹\",\"unicodeCodePoint\":\"20239\",\"pinYinChars\":[{\"char\":\"YOU1\"}],\"splitChars\":[{\"char\":\"亻㳊\"}],\"weight\":\"10\"},{\"charId\":\"52e60457\",\"unicodeChar\":\"𠇮\",\"unicodeCodePoint\":\"201EE\",\"pinYinChars\":[{\"char\":\"MING4\"}],\"splitChars\":[{\"char\":\"人丙\"}],\"weight\":\"10\"},{\"charId\":\"2501625c\",\"unicodeChar\":\"𠇍\",\"unicodeCodePoint\":\"201CD\",\"pinYinChars\":[{\"char\":\"ER3\"}],\"splitChars\":[{\"char\":\"人㣺\"}],\"weight\":\"10\"},{\"charId\":\"08dcedb8\",\"unicodeChar\":\"𠆺\",\"unicodeCodePoint\":\"201BA\",\"pinYinChars\":[{\"char\":\"XIAN2\"},{\"char\":\"XUAN2\"}],\"splitChars\":[{\"char\":\"亻𢆯\"}],\"weight\":\"10\"},{\"charId\":\"beec6748\",\"unicodeChar\":\"𠆶\",\"unicodeCodePoint\":\"201B6\",\"pinYinChars\":[{\"char\":\"DAN4\"}],\"splitChars\":[{\"char\":\"亻冘\"}],\"weight\":\"10\"},{\"charId\":\"98928320\",\"unicodeChar\":\"𠄕\",\"unicodeCodePoint\":\"20115\",\"pinYinChars\":[{\"char\":\"NAI3\"}],\"splitChars\":[{\"char\":\"了𰁒\"}],\"weight\":\"10\"},{\"charId\":\"8f995dc9\",\"unicodeChar\":\"𠃧\",\"unicodeCodePoint\":\"200E7\",\"pinYinChars\":[{\"char\":\"FEI1\"}],\"splitChars\":[{\"char\":\"飞飞\"}],\"weight\":\"10\"},{\"charId\":\"031579fe\",\"unicodeChar\":\"𠃓\",\"unicodeCodePoint\":\"200D3\",\"pinYinChars\":[{\"char\":\"YANG2\"}],\"splitChars\":[{\"char\":\"𠄎丿丿\"}],\"weight\":\"10\"},{\"charId\":\"8d6fb2b9\",\"unicodeChar\":\"𠃐\",\"unicodeCodePoint\":\"200D0\",\"pinYinChars\":[{\"char\":\"HUI4\"}],\"splitChars\":[{\"char\":\"乙乙\"}],\"weight\":\"10\"},{\"charId\":\"2026c1bd\",\"unicodeChar\":\"𠂉\",\"unicodeCodePoint\":\"20089\",\"pinYinChars\":[{\"char\":\"O\"}],\"splitChars\":[{\"char\":\"丿一\"}],\"weight\":\"10\"},{\"charId\":\"d8617765\",\"unicodeChar\":\"𠁷\",\"unicodeCodePoint\":\"20077\",\"pinYinChars\":[{\"char\":\"CHAN3\"}],\"splitChars\":[{\"char\":\"串串\"}],\"weight\":\"10\"},{\"charId\":\"0c538b01\",\"unicodeChar\":\"𠁆\",\"unicodeCodePoint\":\"20046\",\"pinYinChars\":[{\"char\":\"LIAO2\"},{\"char\":\"KUO4\"},{\"char\":\"WAI1\"}],\"splitChars\":[{\"char\":\"不直\"}],\"weight\":\"10\"},{\"charId\":\"48312f83\",\"unicodeChar\":\"𠀾\",\"unicodeCodePoint\":\"2003E\",\"pinYinChars\":[{\"char\":\"PEI1\"}],\"splitChars\":[{\"char\":\"不会\"}],\"weight\":\"10\"},{\"charId\":\"b984b101\",\"unicodeChar\":\"𠀘\",\"unicodeCodePoint\":\"20018\",\"pinYinChars\":[{\"char\":\"TIAN1\"}],\"splitChars\":[{\"char\":\"兀兀\"}],\"weight\":\"10\"}],\n};\n"
  },
  {
    "path": "src/Rate/index.axml",
    "content": "<view class=\"ant-rate {{ className || '' }}\" style=\"{{ style }}\">\n  <view\n    id=\"ant-rate-container{{ $id ? '-' + $id : '' }}\"\n    class=\"ant-rate-container\"\n    onTouchMove=\"handleStarMove\"\n    onTouchEnd=\"handleStarMoveEnd\"\n  >\n    <block a:for=\"{{ count }}\" a:for-index=\"index\" a:for-item=\"item\">\n      <view\n        class=\"ant-rate-star\"\n        onTap=\"handleStarTap\"\n        data-rate=\"{{ index }}\"\n        style=\"margin-right: {{ index === count - 1 ? 0 : gutter + 'px' }}\"\n      >\n        <view\n          a:if=\"{{ allowHalf && (displayValue !== null ? displayValue : mixin.value) === index + 0.5 }}\"\n          class=\"ant-rate-star-icon-active {{ characterClassName || '' }} {{ characterActiveClassName || '' }} ant-rate-star-icon-half-active\"\n        >\n          <!-- #if ALIPAY -->\n          <slot name=\"character\" index=\"{{ index }}\" isActive=\"{{ true }}\">\n            <!-- #endif -->\n            <ant-icon type=\"StarFill\" />\n            <!-- #if ALIPAY -->\n          </slot>\n          <!-- #endif -->\n        </view>\n        <view class=\"ant-rate-star-icon {{ (displayValue !== null ? displayValue : mixin.value) >= index + 1 ? 'ant-rate-star-icon-active' + ' ' + (characterClassName || '') + ' ' + (characterActiveClassName || '') : characterClassName }}\">\n          <!-- #if ALIPAY -->\n          <slot name=\"character\" index=\"{{ index }}\">\n            <!-- #endif -->\n            <ant-icon type=\"StarFill\" />\n            <!-- #if ALIPAY -->\n          </slot>\n          <!-- #endif -->\n        </view>\n      </view>\n    </block>\n  </view>\n</view>\n"
  },
  {
    "path": "src/Rate/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Feedback\n  order: 12\ntoc: 'content'\n---\n\n# Rate\n\nA component for showing things ratings and quick scoring.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-rate\": \"antd-mini/es/Rate/index\"\n#endif\n#if WECHAT\n  \"ant-radio\": \"antd-mini/Rate/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n> `count` property specifies the total number of stars, `allowHalf` Stats allow half a star, `allowClear` Property allows to clear after clicking again.\n\n```xml\n<ant-rate\n  defaultValue=\"{{3.5}}\"\n  count=\"{{5}}\"\n  allowHalf\n  allowClear\n#if ALIPAY\n  onChange=\"onChange\"\n#endif\n#if WECHAT\n  bindchange=\"onChange\"\n#endif\n/>\n```\n\n```js\nPage({\n  onChange(value) {\n    console.log(value);\n  },\n});\n```\n\n### Read Only\n\n```xml\n<ant-rate defaultValue=\"{{3}}\" readonly />\n```\n\n### Controlled Mode\n\n> `value` property and `change` Events, cooperation can achieve a controlled mode. Here's the example through `ant-stepper` Component change `value` Status,`ant-rate` Components `value` States can also change together.\n\n```xml\n<ant-rate\n  value=\"{{value}}\"\n#if ALIPAY\n  onChange=\"handleChange\"\n#endif\n#if WECHAT\n  bindchange=\"handleChange\"\n#endif\n/>\n<ant-stepper\n  value=\"{{value}}\"\n  min=\"{{0}}\"\n  max=\"{{5}}\"\n#if ALIPAY\n  onChange=\"handleChange\"\n#endif\n#if WECHAT\n  bindchange=\"handleChange\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    value: 3,\n  },\n  handleChange(value) {\n    console.log(value);\n#if WECHAT\n    this.setData({\n      value: value.detail,\n    });\n#endif\n#if ALIPAY\n    this.setData({\n      value,\n    });\n#endif\n  },\n});\n```\n\n### Custom\n\n> Reference below [Demo Code](#demo-代码) implementation in.\n\n### Demo Code\n\n<code src='../../demo/pages/Rate/index'></code>\n\n## Property\n\n| Property                     | Description                   | Type                     | Default Value                     |\n| ------------------------ | ---------------------- | ------------------------ | -------------------------- |\n| allowHalf                | Whether to allow half a star           | `boolean`                | `false`                    |\n| allowClear               | Allow to clear after clicking again | `boolean`                | `true`                     |\n| className                | Class Name                   | `string`                 | -                          |\n| character                | Custom Characters             | `slot`                   | `<icon type=\"StarFill\" />` |\n| characterActiveClassName | Custom Character Checked State Class Name | `string`                 | -                          |\n| characterClassName       | Custom Character Class Name         | `string`                 | -                          |\n| count                    | total number of stars              | `number`                 | `5`                        |\n| defaultValue             | Initial value                 | `number`                 | `0`                        |\n| gutter                   | Spacing, unit `px`        | `number`                 | `4`                        |\n| readonly                 | Read-only, unable to interact     | `boolean`                | `false`                    |\n| style                    | Style                   | `string`                 | -                          |\n| value                    | Star rating (controlled)           | `number`                 | -                          |\n| #if ALIPAY onChange      | scoring callback function           | `(rate: number) => void` | -                          |\n| #if WECHAT bindchange   | scoring callback function           | `(rate: number) => void` | -                          |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name             | Default Value                                                                                            | Dark Mode Default                                                                                    | Remarks                    |\n| ------------------ | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ----------------------- |\n| --rate-active-icon | <div style=\"width: 150px; height: 30px; background-color: #ff9f18; color: #ffffff;\">#ff9f18</div> | <div style=\"width: 150px; height: 30px; background-color: #ffa930; color: #ffffff;\">#ffa930</div> | Icon color of Rate activation state |\n| --rate-icon-color  | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #333333;\">#eeeeee</div> | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #ffffff;\">#2b2b2b</div> | Rate Default Icon Color       |\n"
  },
  {
    "path": "src/Rate/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-icon\": \"../Icon/index\"\n  }\n}\n"
  },
  {
    "path": "src/Rate/index.less",
    "content": "@import (reference) './variable.less';\n@import '../style/mixins/hairline.less';\n\n.ant-rate {\n  display: inline-flex;\n  font-size: 48 * @rpx;\n  user-select: none;\n\n  &-container {\n    display: flex;\n  }\n\n  &-star {\n    position: relative;\n    margin-right: 8 * @rpx;\n    line-height: 1;\n\n    &:last-child {\n      margin-right: 0;\n    }\n\n    &-icon {\n      color: @rate-icon-color;\n      .ant-icon {\n        color: @rate-icon-color;\n      }\n    }\n\n    &-icon-active {\n      color: @rate-active-icon;\n      .ant-icon {\n        color: @rate-active-icon;\n      }\n    }\n\n    &-icon-half-active {\n      position: absolute;\n      left: 0;\n      top: 0;\n      width: 50%;\n      overflow: hidden;\n    }\n  }\n\n  /// #if WECHAT\n  .ant-icon {\n    font-size: unset;\n  }\n  /// #endif\n}\n"
  },
  {
    "path": "src/Rate/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 反馈引导\n  order: 12\ntoc: 'content'\n---\n\n# Rate 评分\n\n用于展示事物评级以及快速打分的组件。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-rate\": \"antd-mini/es/Rate/index\"\n#endif\n#if WECHAT\n  \"ant-radio\": \"antd-mini/Rate/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n> `count` 属性指定 star 总数， `allowHalf` 属性允许半星， `allowClear` 属性允许再次点击后清除。\n\n```xml\n<ant-rate\n  defaultValue=\"{{3.5}}\"\n  count=\"{{5}}\"\n  allowHalf\n  allowClear\n#if ALIPAY\n  onChange=\"onChange\"\n#endif\n#if WECHAT\n  bindchange=\"onChange\"\n#endif\n/>\n```\n\n```js\nPage({\n  onChange(value) {\n    console.log(value);\n  },\n});\n```\n\n### 只读\n\n```xml\n<ant-rate defaultValue=\"{{3}}\" readonly />\n```\n\n### 受控模式\n\n> `value` 属性和 `change` 事件，配合可以实现受控模式。这里的例子中通过 `ant-stepper` 组件改变 `value` 状态，`ant-rate` 组件 `value` 状态也能一起变化。\n\n```xml\n<ant-rate\n  value=\"{{value}}\"\n#if ALIPAY\n  onChange=\"handleChange\"\n#endif\n#if WECHAT\n  bindchange=\"handleChange\"\n#endif\n/>\n<ant-stepper\n  value=\"{{value}}\"\n  min=\"{{0}}\"\n  max=\"{{5}}\"\n#if ALIPAY\n  onChange=\"handleChange\"\n#endif\n#if WECHAT\n  bindchange=\"handleChange\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    value: 3,\n  },\n  handleChange(value) {\n    console.log(value);\n#if WECHAT\n    this.setData({\n      value: value.detail,\n    });\n#endif\n#if ALIPAY\n    this.setData({\n      value,\n    });\n#endif\n  },\n});\n```\n\n### 自定义\n\n> 参考下面 [Demo 代码](#demo-代码) 中的实现。\n\n### Demo 代码\n\n<code src='../../demo/pages/Rate/index'></code>\n\n## 属性\n\n| 属性                     | 说明                   | 类型                     | 默认值                     |\n| ------------------------ | ---------------------- | ------------------------ | -------------------------- |\n| allowHalf                | 是否允许半星           | `boolean`                | `false`                    |\n| allowClear               | 是否允许再次点击后清除 | `boolean`                | `true`                     |\n| className                | 类名                   | `string`                 | -                          |\n| character                | 自定义字符             | `slot`                   | `<icon type=\"StarFill\" />` |\n| characterActiveClassName | 自定义字符选中状态类名 | `string`                 | -                          |\n| characterClassName       | 自定义字符类名         | `string`                 | -                          |\n| count                    | star 总数              | `number`                 | `5`                        |\n| defaultValue             | 初始值                 | `number`                 | `0`                        |\n| gutter                   | 间距，单位 `px`        | `number`                 | `4`                        |\n| readonly                 | 只读，无法进行交互     | `boolean`                | `false`                    |\n| style                    | 样式                   | `string`                 | -                          |\n| value                    | 星级（受控）           | `number`                 | -                          |\n| #if ALIPAY onChange      | 打分回调函数           | `(rate: number) => void` | -                          |\n| #if WECHAT bindchange   | 打分回调函数           | `(rate: number) => void` | -                          |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名             | 默认值                                                                                            | 深色模式默认值                                                                                    | 备注                    |\n| ------------------ | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ----------------------- |\n| --rate-active-icon | <div style=\"width: 150px; height: 30px; background-color: #ff9f18; color: #ffffff;\">#ff9f18</div> | <div style=\"width: 150px; height: 30px; background-color: #ffa930; color: #ffffff;\">#ffa930</div> | Rate 激活状态的图标颜色 |\n| --rate-icon-color  | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #333333;\">#eeeeee</div> | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #ffffff;\">#2b2b2b</div> | Rate 默认图标颜色       |\n"
  },
  {
    "path": "src/Rate/index.ts",
    "content": "import createValue from '../mixins/value';\nimport { getInstanceBoundingClientRect } from '../_util/jsapi/get-instance-bounding-client-rect';\nimport { Component, getValueFromProps, triggerEvent } from '../_util/simply';\nimport { RateDefaultProps } from './props';\n\nComponent({\n  props: RateDefaultProps,\n  data: { displayValue: null },\n  methods: {\n    getInstance() {\n      if (this.$id) {\n        return my;\n      }\n      return this;\n    },\n    async getRate(clientX: number) {\n      const [gutter, count, allowHalf] = getValueFromProps(this, [\n        'gutter',\n        'count',\n        'allowHalf',\n      ]);\n      const { left, width } = await getInstanceBoundingClientRect(\n        this.getInstance(),\n        `#ant-rate-container${this.$id ? `-${this.$id}` : ''}`\n      );\n      const halfRateWidth = (width - (count - 1) * gutter) / count / 2;\n      const num = clientX - left;\n      let halfRateCount = 0;\n      /* eslint-disable no-constant-condition */\n      while (true) {\n        const val =\n          halfRateWidth * halfRateCount +\n          gutter * Math.floor(halfRateCount / 2);\n        if (halfRateCount >= count * 2 || num <= val) {\n          break;\n        }\n        halfRateCount++;\n      }\n      const rate = allowHalf\n        ? halfRateCount * 0.5\n        : Math.ceil(halfRateCount * 0.5);\n      return rate;\n    },\n    async handleStarTap(e) {\n      const [readonly, allowClear] = getValueFromProps(this, [\n        'readonly',\n        'allowClear',\n      ]);\n      if (readonly) {\n        return;\n      }\n      const { clientX, x } = e.detail;\n\n      const clickX = typeof x === 'number' ? x : clientX;\n      const rateValue = this.getValue();\n      let rate = await this.getRate(clickX);\n      if (rateValue === rate && allowClear) {\n        rate = 0;\n      }\n      if (!this.isControlled()) {\n        this.update(rate);\n      }\n      if (rateValue !== rate) {\n        triggerEvent(this, 'change', rate);\n      }\n    },\n    async handleStarMove(e) {\n      const [readonly] = getValueFromProps(this, ['readonly']);\n      if (readonly) {\n        return;\n      }\n      const { touches } = e;\n      const { clientX } = touches[0];\n      if (!this.moveRate) {\n        this.moveRate = {\n          originalRate: this.getValue(),\n        };\n      }\n      const rate = await this.getRate(clientX);\n      if (this.moveRate) {\n        this.moveRate = {\n          ...this.moveRate,\n          currentRate: rate,\n        };\n        if (this.isControlled()) {\n          this.setData({ displayValue: rate });\n        } else {\n          this.update(rate);\n        }\n      }\n    },\n    handleStarMoveEnd() {\n      const readonly = getValueFromProps(this, 'readonly');\n      if (readonly) {\n        return;\n      }\n      if (!this.moveRate) {\n        return;\n      }\n\n      const { currentRate, originalRate } = this.moveRate;\n      this.moveRate = null;\n      if (this.isControlled()) {\n        this.setData({ displayValue: null });\n      }\n      if (currentRate !== originalRate) {\n        triggerEvent(this, 'change', currentRate);\n      }\n    },\n  },\n  mixins: [\n    createValue({\n      transformValue(value) {\n        const allowHalf = getValueFromProps(this, 'allowHalf');\n        if (allowHalf) {\n          return {\n            needUpdate: true,\n            value: value % 0.5 !== 0 ? Math.round(value) : value,\n          };\n        }\n        return {\n          needUpdate: true,\n          value: Math.ceil(value),\n        };\n      },\n    }),\n  ],\n});\n"
  },
  {
    "path": "src/Rate/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\nexport interface IRateProps extends IBaseProps {\n  /**\n   * @description 当前星级\n   */\n  value: number;\n\n  /**\n   * description 初始星级\n   */\n  defaultValue: number;\n\n  /**\n   * description 间距\n   */\n  gutter: number;\n\n  /**\n   * @description 是否允许半星\n   */\n  allowHalf: boolean;\n\n  /**\n   * @description 是否允许再次点击后清除\n   */\n  allowClear: boolean;\n\n  /**\n   * @description star 总数\n   */\n  count: number;\n\n  /**\n   *  @description 自定义字符选中状态类名\n   */\n  characterActiveClassName: string;\n\n  /**\n   *  @description 自定义字符类名\n   */\n  characterClassName: string;\n\n  /**\n   * @description 是否只读\n   */\n  readonly: boolean;\n\n  /**\n   * @description 打分结束回调\n   */\n  onChange?: (rate: number) => void;\n}\n\nexport const RateDefaultProps: Partial<IRateProps> = {\n  value: null,\n  defaultValue: null,\n  gutter: 4,\n  allowHalf: false,\n  allowClear: true,\n  count: 5,\n  characterActiveClassName: '',\n  characterClassName: '',\n  readonly: false,\n};\n"
  },
  {
    "path": "src/Rate/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n@rate-active-icon: var(--rate-active-icon, @COLOR_YELLOW);\n@rate-icon-color: var(--rate-icon-color, @COLOR_BORDER);\n"
  },
  {
    "path": "src/Result/index.axml",
    "content": "<import-sjs\n  from=\"./index.sjs\"\n  name=\"result\" />\n\n<view\n  class=\"ant-result {{ className ? className : '' }}\"\n  style=\"{{ style || '' }}\">\n  <view class=\"ant-result-main\">\n    <!-- #if ALIPAY -->\n    <slot name=\"image\">\n    <!-- #endif -->\n      <view\n        a:if=\"{{ type }}\"\n        class=\"ant-result-image\">\n        <ant-icon\n          type=\"{{ result.iconType(type) }}\"\n          className=\"ant-result-icon ant-result-image-{{ type }}\"\n        />\n      </view>\n      <image-icon\n        a:elif=\"{{ image }}\"\n        className=\"ant-result-image\"\n        image=\"{{ image }}\" />\n      <block a:else />\n    <!-- #if ALIPAY -->\n    </slot>\n    <!-- #endif -->\n    <view class=\"ant-result-title\">\n      <!-- #if ALIPAY -->\n      <slot name=\"title\">\n      <!-- #endif -->\n        {{ title }}\n      <!-- #if ALIPAY -->\n      </slot>\n      <!-- #endif -->\n    </view>\n    <view class=\"ant-result-message\">\n      <!-- #if ALIPAY -->\n      <slot name=\"message\">\n      <!-- #endif -->\n        <!-- display: inline -->\n        <text>{{ message }}</text>\n      <!-- #if ALIPAY -->\n      </slot>\n      <!-- #endif -->\n    </view>\n  </view>\n  <slot name=\"extra\" />\n</view>\n"
  },
  {
    "path": "src/Result/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Feedback\n  order: 12\ntoc: 'content'\n---\n\n# Result\n\nFeedback the results of the previous step. The Result component should be used when important operations need to inform the user of the processing results and the feedback content is complex.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-result\": \"antd-mini/es/Result/index\"\n#endif\n#if WECHAT\n  \"ant-result\": \"antd-mini/Result/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<ant-result type=\"success\" title=\"success\" message=\"subtitle content\" />\n\n<ant-result type=\"wait\" title=\"wait\" message=\"subtitle content\" />\n\n<ant-result type=\"info\" title=\"info\" message=\"subtitle content\" />\n\n<ant-result type=\"warning\" title=\"warning\" message=\"subtitle content\" />\n\n<ant-result type=\"error\" title=\"error\" message=\"subtitle content\" />\n```\n\n### Slot\n\n```xml\n<ant-result\n  image=\"https://gw.alipayobjects.com/mdn/miniProgram_mendian/afts/img/A*wiFYTo5I0m8AAAAAAAAAAABjAQAAAQ/original\">\n  <view slot=\"title\">Title slot</view>\n  <view slot=\"message\">Describe the slot</view>\n  <view slot=\"extra\" class=\"extra\">\n    Other Modules\n  </view>\n</ant-result>\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Result/index'></code>\n\n## API\n\n| Property      | Description                                                                                     | Type           | Default Value |\n| --------- | ---------------------------------------------------------------------------------------- | -------------- | ------ |\n| className | Class Name                                                                                     | string         | -      |\n| extra     | Bottom Custom Rendering                                                                           | slot           | -      |\n| image     | Custom Picture                                                                               | string \\| slot | -      |\n| message   | Deputy Copywriter                                                                                   | string \\| slot | -      |\n| style     | Style                                                                                     | string         | -      |\n| title     | Main Copy                                                                                   | string \\| slot | -      |\n| type      | Built-in type `success`(success),`error`(error/danger),`info`(information prompt),`wait`(Waiting for processing) | string         | -      |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                   | Default Value                                                                                            | Dark Mode Default                                                                                    | Remarks                |\n| ------------------------ | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------- |\n| --result-main-background | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | Result Main background color   |\n| --result-title-color     | <div style=\"width: 150px; height: 30px; background-color: #000000; color: #ffffff;\">#000000</div> | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #000000;\">#ffffff</div> | Result Title Color     |\n| --result-desc-color      | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | Result Description Text Color |\n| --result-success-color   | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | Result Success status color |\n| --result-error-color     | <div style=\"width: 150px; height: 30px; background-color: #ff3b30; color: #ffffff;\">#ff3b30</div> | <div style=\"width: 150px; height: 30px; background-color: #ff544a; color: #ffffff;\">#ff544a</div> | Result Error status color |\n| --result-warning-color   | <div style=\"width: 150px; height: 30px; background-color: #ff8f1f; color: #ffffff;\">#ff8f1f</div> | <div style=\"width: 150px; height: 30px; background-color: #ff9c38; color: #ffffff;\">#ff9c38</div> | Result Warning Status Color |\n| --result-wait-color      | <div style=\"width: 150px; height: 30px; background-color: #00b578; color: #ffffff;\">#00b578</div> | <div style=\"width: 150px; height: 30px; background-color: #12b57e; color: #ffffff;\">#12b57e</div> | Result Wait status color |\n"
  },
  {
    "path": "src/Result/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-icon\": \"../Icon/index\",\n    \"image-icon\": \"../ImageIcon/index\"\n  }\n}\n"
  },
  {
    "path": "src/Result/index.less",
    "content": "@import (reference) './variable.less';\n@import '../style/mixins/hairline.less';\n\n@resultPrefix: ant-result;\n\n.@{resultPrefix} {\n  position: relative;\n  text-align: center;\n  line-height: normal;\n  box-sizing: border-box;\n  // .hairline('bottom');\n\n  &-icon {\n    display: block;\n    font-size: 110 * @rpx;\n  }\n\n  &-main {\n    padding: 70 * @rpx 24 * @rpx;\n    margin-bottom: @size-5;\n    line-height: 1.4;\n    background-color: @result-main-background;\n  }\n\n  &-image {\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    width: @result-img-size;\n    height: @result-img-size;\n    margin: 0 auto;\n    overflow: hidden;\n    text-align: center;\n    line-height: @result-img-size;\n\n    &-success {\n      color: @result-success-color;\n    }\n\n    &-error {\n      color: @result-error-color;\n    }\n\n    &-info {\n      color: @result-success-color;\n    }\n\n    &-warning {\n      color: @result-warning-color;\n    }\n\n    &-wait {\n      color: @result-wait-color;\n    }\n  }\n\n  &-title {\n    padding-top: 40 * @rpx;\n    font-size: @result-title-size;\n    color: @result-title-color;\n\n    font-weight: 500;\n\n    &:empty {\n      display: none;\n    }\n  }\n\n  &-message {\n    padding-top: 16 * @rpx;\n    font-size: @result-desc-size;\n    color: @result-desc-color;\n\n    &:empty {\n      display: none;\n    }\n  }\n}\n"
  },
  {
    "path": "src/Result/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 反馈引导\n  order: 12\ntoc: 'content'\n---\n\n# Result 操作结果\n\n对前一步操作的结果进行反馈。当有重要操作需告知用户处理结果，且反馈内容较为复杂时，应使用 Result 组件。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-result\": \"antd-mini/es/Result/index\"\n#endif\n#if WECHAT\n  \"ant-result\": \"antd-mini/Result/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-result type=\"success\" title=\"success\" message=\"subtitle content\" />\n\n<ant-result type=\"wait\" title=\"wait\" message=\"subtitle content\" />\n\n<ant-result type=\"info\" title=\"info\" message=\"subtitle content\" />\n\n<ant-result type=\"warning\" title=\"warning\" message=\"subtitle content\" />\n\n<ant-result type=\"error\" title=\"error\" message=\"subtitle content\" />\n```\n\n### 插槽\n\n```xml\n<ant-result\n  image=\"https://gw.alipayobjects.com/mdn/miniProgram_mendian/afts/img/A*wiFYTo5I0m8AAAAAAAAAAABjAQAAAQ/original\">\n  <view slot=\"title\">标题插槽</view>\n  <view slot=\"message\">描述插槽</view>\n  <view slot=\"extra\" class=\"extra\">\n    其他模块\n  </view>\n</ant-result>\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Result/index'></code>\n\n## API\n\n| 属性      | 说明                                                                                     | 类型           | 默认值 |\n| --------- | ---------------------------------------------------------------------------------------- | -------------- | ------ |\n| className | 类名                                                                                     | string         | -      |\n| extra     | 底部自定义渲染                                                                           | slot           | -      |\n| image     | 自定义图片                                                                               | string \\| slot | -      |\n| message   | 副文案                                                                                   | string \\| slot | -      |\n| style     | 样式                                                                                     | string         | -      |\n| title     | 主文案                                                                                   | string \\| slot | -      |\n| type      | 内置类型 `success`（成功）、`error`（错误/危险）、`info`（信息提示）、`wait`（等待处理） | string         | -      |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                   | 默认值                                                                                            | 深色模式默认值                                                                                    | 备注                |\n| ------------------------ | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------- |\n| --result-main-background | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | Result 主背景颜色   |\n| --result-title-color     | <div style=\"width: 150px; height: 30px; background-color: #000000; color: #ffffff;\">#000000</div> | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #000000;\">#ffffff</div> | Result 标题颜色     |\n| --result-desc-color      | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | Result 描述文字颜色 |\n| --result-success-color   | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | Result 成功状态颜色 |\n| --result-error-color     | <div style=\"width: 150px; height: 30px; background-color: #ff3b30; color: #ffffff;\">#ff3b30</div> | <div style=\"width: 150px; height: 30px; background-color: #ff544a; color: #ffffff;\">#ff544a</div> | Result 错误状态颜色 |\n| --result-warning-color   | <div style=\"width: 150px; height: 30px; background-color: #ff8f1f; color: #ffffff;\">#ff8f1f</div> | <div style=\"width: 150px; height: 30px; background-color: #ff9c38; color: #ffffff;\">#ff9c38</div> | Result 警告状态颜色 |\n| --result-wait-color      | <div style=\"width: 150px; height: 30px; background-color: #00b578; color: #ffffff;\">#00b578</div> | <div style=\"width: 150px; height: 30px; background-color: #12b57e; color: #ffffff;\">#12b57e</div> | Result 等待状态颜色 |\n"
  },
  {
    "path": "src/Result/index.sjs.ts",
    "content": "const iconMap = {\n  'success': 'CheckCircleFill',\n  'error': 'CloseCircleFill',\n  'info': 'InformationCircleFill',\n  'warning': 'ExclamationCircleFill',\n  'wait': 'ClockCircleFill',\n};\n\nconst iconType = t => {\n  return iconMap[t];\n}\n\nexport default { iconType };\n"
  },
  {
    "path": "src/Result/index.ts",
    "content": "import { Component } from '../_util/simply';\nimport { IResultProps } from './props';\n\nComponent<IResultProps>({\n  props: {\n    type: null,\n    image: '',\n    title: '',\n    message: '',\n  },\n});\n"
  },
  {
    "path": "src/Result/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\n/**\n * @description 结果页，用于展示用户操作后的信息反馈。\n */\n\nexport interface IResultProps extends IBaseProps {\n  /**\n   * @description 内置类型 success=成功 error=错误/危险 info=信息提示 wait=等待处理\n   */\n  type: 'success' | 'error' | 'info' | 'warning' | 'wait';\n  \n  /**\n   * @description 自定义图片，如果配置了 type， 则不生效\n   */\n  image: string;\n\n  /**\n   * @description 主文案\n   */\n  title: string;\n\n  /**\n   * @description 副文案\n   */\n  message: string;\n}\n\nexport const ResultDefaultProps: Partial<IResultProps> = {\n};\n"
  },
  {
    "path": "src/Result/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n// 图片尺寸\n@result-img-size: 128 * @rpx;\n// 主区域背景\n@result-main-background: var(--result-main-background, @COLOR_CARD);\n// 左右边距\n@result-spacing-LR: @h-spacing-large;\n// 主标题颜色\n@result-title-color: var(--result-title-color, @COLOR_BLACK);\n// 主标题大小\n@result-title-size: 40 * @rpx;\n// 描述颜色\n@result-desc-color: var(--result-desc-color, @COLOR_TEXT_PRIMARY);\n// 描述大小\n@result-desc-size: 32 * @rpx;\n\n@result-success-color: var(--result-success-color, @COLOR_BRAND1);\n\n@result-error-color: var(--result-error-color, @COLOR_TEXT_WARNING);\n\n@result-warning-color: var(--result-warning-color, @COLOR_ORANGE_1);\n\n@result-wait-color: var(--result-wait-color, @COLOR_POMONAGREEN_1);\n"
  },
  {
    "path": "src/SafeArea/index.axml",
    "content": "<view class=\"{{`ant-safe-area-${position} ${className}`}}\" />\n"
  },
  {
    "path": "src/SafeArea/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: General\n  order: 2\ntoc: 'content'\n---\n\n# SafeArea\nWhen the web page is displayed in full screen, the top and bottom of the screen can be adapted by means of a safe zone, such as a bang screen.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-safe-area\": \"antd-mini/es/SafeArea/index\"\n#endif\n#if WECHAT\n  \"ant-safe-area\": \"antd-mini/SafeArea/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Top Safety Area\n```xml\n<ant-safe-area \n  position=\"top\" \n  className=\"ant-safe-area-top\"\n>\n  Content Area\n</ant-safe-area>\n```\n\n### Bottom safety zone\n```xml\n<ant-safe-area \n  position=\"bottom\" \n  className=\"ant-safe-area-bottom\"\n>\n  Content Area\n</ant-safe-area>\n```\n\n### Demo Code\n\n<code src=\"../../demo/pages/SafeArea/index\"></code>\n\n## Property\n\n| Property | Description | Type | Default Value |\n|-----|-----|-----|--------|\n| className | Container className | string | - |\n| position | Location of safety zone, optional`top`、`bottom` | string | - |\n\n## Slot\n\n| Name        | Description                 |\n| ----------- | -------------------- |\n| Default Slot    | Contents contained in the security zone |\n"
  },
  {
    "path": "src/SafeArea/index.json",
    "content": "{  \n  \"styleIsolation\": \"shared\",\n  \"component\": true\n}\n"
  },
  {
    "path": "src/SafeArea/index.less",
    "content": "@safeareaPrefix: ant-safe-area;\n\n.@{safeareaPrefix} {\n  &-top {\n    height: constant(safe-area-inset-top);\n    height: env(safe-area-inset-top);\n  }\n\n  &-bottom {\n    height: constant(safe-area-inset-bottom);\n    height: env(safe-area-inset-bottom);\n  }\n}\n"
  },
  {
    "path": "src/SafeArea/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 通用\n  order: 2\ntoc: 'content'\n---\n\n# SafeArea 安全区\n当网页被全屏展示时，可借助安全区进行屏幕顶部和底部适配，如刘海屏。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-safe-area\": \"antd-mini/es/SafeArea/index\"\n#endif\n#if WECHAT\n  \"ant-safe-area\": \"antd-mini/SafeArea/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 顶部安全区\n```xml\n<ant-safe-area \n  position=\"top\" \n  className=\"ant-safe-area-top\"\n>\n  内容区域\n</ant-safe-area>\n```\n\n### 底部安全区\n```xml\n<ant-safe-area \n  position=\"bottom\" \n  className=\"ant-safe-area-bottom\"\n>\n  内容区域\n</ant-safe-area>\n```\n\n### Demo 代码\n\n<code src=\"../../demo/pages/SafeArea/index\"></code>\n\n## 属性\n\n| 属性 | 说明 | 类型 | 默认值 |\n|-----|-----|-----|--------|\n| className | 容器 className | string | - |\n| position | 安全区的位置，可选`top`、`bottom` | string | - |\n\n## 插槽\n\n| 名称        | 说明                 |\n| ----------- | -------------------- |\n| 默认插槽    | 安全区中包含的内容 |\n"
  },
  {
    "path": "src/SafeArea/index.ts",
    "content": "import { Component } from '../_util/simply';\nimport { SafeAreaDefaultProps } from './props';\n\nComponent({ props: SafeAreaDefaultProps });\n"
  },
  {
    "path": "src/SafeArea/props.ts",
    "content": "export interface ISafeAreaProps {\n  className?: string;\n  position: 'top' | 'bottom' | '';\n}\n\nexport const SafeAreaDefaultProps: ISafeAreaProps = {\n  className: '',\n  position: '',\n};\n"
  },
  {
    "path": "src/SelectContact/index.axml",
    "content": "<import-sjs name=\"util\" from=\"./index.sjs\" />\n<view class=\"ant-select-contact-component {{className ? className : ''}}\" style=\"height:{{height}}\">\n  <!-- 搜索栏 -->\n  <view class=\"search-line\">\n    <input\n      placeholder=\"请输入\"\n      onChange=\"onChange\"\n      className=\"search-bar\"\n      focusClassName=\"search-bar-focus\"\n      confirm-type=\"search\"\n      allowClear\n      focus\n      onFocus=\"handleSearch\"\n      onConfirm=\"onConfirm\"\n    >\n      <ant-icon slot=\"prefix\" type=\"SearchOutline\" />\n    </input>\n    <view a:if=\"{{ searchable }}\" onTap=\"handleCancelSearch\" class=\"cancel\">取消</view>\n  </view>\n  <view class=\"scc-blank\" />\n\n  <!-- 展示推荐联系人 && 全部联系人 -->\n  <view class=\"scc-contact-wrap\" hidden=\"{{showSearch}}\">\n    <!-- 数据加载中 -->\n    <view a:if=\"{{ loading }}\" class=\"contact-loading\">\n      <skeleton animate paragraph=\"{{ {rows:10} }}\" />\n    </view>\n\n    <block a:else>\n      <scroll-view\n        a:if=\"{{ !contactListEmpty }}\"\n        scroll-y\n        class=\"contact-scroll\"\n        trap-scroll=\"{{false}}\"\n        scroll-into-view=\"{{toView}}\"\n      >\n        <list>\n          <block\n            a:for=\"{{ recommendContactsList }}\"\n            a:for-item=\"list\"\n            key=\"{{list}}\"\n          >\n            <!-- id用于字母表滚动定位 -->\n            <view id=\"{{ util.getId(list.name) }}\"></view>\n            <view class=\"{{ 'title ' + (list.className || '') + (isIOS ? ' title__ios' : '') }}\">\n              {{ list.name }}\n            </view>\n            <view\n              a:for=\"{{ list.value }}\"\n              a:for-item=\"item\"\n              class=\"contact-recommend\"\n              key=\"{{item.userId}}\"\n            >\n              <list-item\n                image=\"{{ item.avatar || 'https://gw.alipayobjects.com/zos/bmw-prod/84a917f8-0279-49c9-82e5-4effc58c4c85.svg' }}\"\n                upperSubtitle=\"{{ item.loginId }}\"\n                arrow=\"{{ true }}\"\n                data-item=\"{{ item }}\"\n                data-personSource=\"{{ list.personSource }}\"\n                onTap=\"onItemClick\"\n              >\n                {{ item.displayName }}\n                <view a:if=\"{{ item.tag }}\" class=\"tag\" slot=\"afterTitle\">{{ item.tag }}</view>\n              </list-item>\n            </view>\n            <!-- 全部联系人列表 -->\n            <view a:for=\"{{ allContactsList }}\" a:for-item=\"list\" key=\"{{list}}\">\n              <!-- id用于字母表滚动定位 -->\n              <view id=\"{{ util.getId(list.name) }}\"></view>\n              <view class=\"{{ 'title ' + (list.className || '') + (isIOS ? ' title__ios' : '') }}\">\n                {{ list.name }}\n              </view>\n              <view a:for=\"{{ list.value }}\" a:for-item=\"item\" key=\"{{item.userId}}\">\n                <list-item\n                  image=\"{{ item.avatar || 'https://gw.alipayobjects.com/zos/bmw-prod/84a917f8-0279-49c9-82e5-4effc58c4c85.svg' }}\"\n                  upperSubtitle=\"{{ item.loginId }}\"\n                  arrow=\"{{ true }}\"\n                  data-item=\"{{ item }}\"\n                  data-personSource=\"{{ list.personSource }}\"\n                  onTap=\"onItemClick\"\n                >\n                  {{ item.displayName }}\n                  <view a:if=\"{{ item.tag }}\" class=\"tag\" slot=\"afterTitle\">{{ item.tag }}</view>\n                </list-item>\n              </view>\n            </view>\n          </block>\n        </list>\n      </scroll-view>\n      <slot a:else name=\"contactListEmpty\"></slot>\n    </block>\n\n    <!-- 索引表 -->\n    <alphabet alphabet=\"{{alphabet}}\" onScrollIntoView=\"{{onScrollIntoView ? onScrollIntoView : 'onScrollIntoView'}}\" />\n  </view>\n\n  <!-- 搜索状态 -->\n  <view class=\"scc-search-wrap\" hidden=\"{{!showSearch}}\">\n    <scroll-view scroll-y class=\"normal {{ searchStatus !== 'normal' ? 'hidden' : '' }}\">\n      <list>\n        <list-item\n          a:for=\"{{ searchList }}\"\n          image=\"{{ item.avatar || 'https://gw.alipayobjects.com/zos/bmw-prod/84a917f8-0279-49c9-82e5-4effc58c4c85.svg' }}\"\n          upperSubtitle=\"{{ item.loginId }}\"\n          arrow=\"{{ true }}\"\n          data-item=\"{{ item }}\"\n          data-personSource=\"search\"\n          onClick=\"onItemClick\"\n        >\n          <view a:for=\"{{ item.nodes }}\" a:for-item=\"node\" class=\"display-name {{ node.className }}\">\n            {{ node.text }}\n          </view>\n          <view a:if=\"{{ item.tag }}\" class=\"tag\" slot=\"afterTitle\">{{ item.tag }}</view>\n        </list-item>\n      </list>\n    </scroll-view>\n\n    <view class=\"loading\" hidden=\"{{ searchStatus !== 'loading' }}\">\n      <view class=\"loading-text\">搜索中</view>\n      <loading type=\"mini\" miniSize=\"10rpx\" />\n    </view>\n\n    <view class=\"empty\" hidden=\"{{ searchStatus !== 'empty' }}\">\n      <image\n        class=\"empty-img\"\n        src=\"https://gw.alipayobjects.com/zos/bmw-prod/e8b05b36-d2bf-425b-9bb8-6c7ac6c00013.svg\"\n        mode=\"aspectFit\"\n      />\n      <view class=\"empty-text\">\n        <view>{{'没有找到你的好友，请确认信息是否正确'}}</view>\n      </view>\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "src/SelectContact/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Bizness Components\n  order: 15\ntoc: content\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# SelectContact\n\nThe ability to find people: the shared class is oriented to the business of C users, and in fact there are demands for this person. For example, the user of the main card of the love card \"finds someone\" to give the love card, and asks the user to \"find someone\" to help open it. The user who pays on behalf of the card needs to find someone to help pay on behalf of the card when using the card, and the user who has a small pocket needs to \"find someone\" to join when pulling the group.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-select-contact\": \"antd-mini/es/SelectContact/index\"\n#endif\n#if WECHAT\n  \"ant-select-contact\": \"antd-mini/SelectContact/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<SelectContact\n  className=\"stepper\"\n  value=\"{{0}}\"\n  min=\"{{0}}\"\n  max=\"{{10}}\"\n  step=\"{{1}}\"\n  disabled=\"{{false}}\"\n#if ALIPAY\n  onChange=\"handleChange\"\n#endif\n#if WECHAT\n  bindchange=\"handleChange\"\n#endif\n/>\n```\n\n```js\nPage({\n  handleChange(value) {\n    console.log(value);\n  },\n});\n```\n\n### Demo Code\n\n<code src='../../demo/pages/SelectContact/index'></code>\n\n## API\n\n| Property                  | Description                         | Type                      | Default Value |\n| --------------------- | ---------------------------- | ------------------------- | ------ |\n| className             | Class Name                         | string                    | -      |\n| height                | Component height                     | string                    | -      |\n| source                | Business sources, distinguishing between scenario monitoring and embedding points | string                    | -      |\n| bizScene              | Access party scenario, post-verification         | number                    | -      |\n| onError               | Get data interface error trigger         | (error: any) => void      | -      |\n| #if ALIPAY onSelect   | Trigger when contact is selected             | (IOnSelectParams) => void | -      |\n| #if WECHAT bindselect | Trigger when contact is selected             | (IOnSelectParams) => void | -      |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For more information, see ConfigProvider Components.\n\n| Variable name                                  | Default Value                                                                                            | Dark Mode Default                                                                                    | Remarks             |\n| --------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------- |\n| --select-contact-search-bar-focus-color | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | Search bar focus color   |\n| --select-contact-search-cancel-color    | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | Cancel Button Color     |\n| --select-contact-loading-bg             | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | Load Background Color     |\n| --select-contact-scroll-bg              | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | Scroll background color     |\n| --select-contact-list-bg                | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | List background color     |\n| --select-contact-title-bg               | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #000000; color: #ffffff;\">#000000</div> | Title background color     |\n| --select-contact-title-color            | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999</div>    | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999</div>    | Title Text Color     |\n| --select-contact-title-first-color      | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333</div>    | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #000000;\">#c5cad1</div> | Level 1 title color     |\n| --select-contact-title-first-border     | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #333333;\">#eee</div>    | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #ffffff;\">#2b2b2b</div> | First-level title border color |\n| --select-contact-tag-color              | <div style=\"width: 150px; height: 30px; background-color: #ff6010; color: #ffffff;\">#ff6010</div> | <div style=\"width: 150px; height: 30px; background-color: #ff6010; color: #ffffff;\">#ff6010</div> | Label Color         |\n| --select-contact-tag-border             | <div style=\"width: 150px; height: 30px; background-color: #ffcfb7; color: #333333;\">#ffcfb7</div> | <div style=\"width: 150px; height: 30px; background-color: #ffcfb7; color: #ffffff;\">#ffcfb7</div> | Label border color     |\n| --select-contact-empty-bg               | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | Empty state background color   |\n| --select-contact-empty-color            | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999</div>    | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | Empty status text color   |\n| --select-contact-loading-bg             | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999</div>    | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | Load Status Background Color |\n| --select-contact-display-light-color    | <div style=\"width: 150px; height: 30px; background-color: #fa6300; color: #ffffff;\">#fa6300</div> | <div style=\"width: 150px; height: 30px; background-color: #fa6300; color: #ffffff;\">#fa6300</div> | Highlight Color     |\n"
  },
  {
    "path": "src/SelectContact/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"list-item\": \"../List/ListItem/index\",\n    \"list\": \"../List/index\",\n    \"skeleton\": \"../Skeleton/index\",\n    \"loading\": \"../Loading/index\",\n    \"ant-icon\": \"../Icon/index\",\n    \"input\": \"../Input/index\",\n    \"swipe-action\": \"../SwipeAction/index\",\n    \"alphabet\": \"../Alphabet/index\"\n  }\n}\n"
  },
  {
    "path": "src/SelectContact/index.less",
    "content": "@import (reference) './variable.less';\n\n.ant-select-contact-component {\n  position: relative;\n  display: flex;\n  width: 100%;\n  flex-direction: column;\n\n  .search-line {\n    display: flex;\n    align-items: center;\n    padding: 16px;\n  }\n  .search-bar {\n    padding: 4px 0 4px 0;\n    border-radius: 4px;\n    border: 1px solid transparent;\n    transition: all 0.4s;\n    flex: 1;\n\n    &-focus {\n      border-color: @select-contact-search-bar-focus-color;\n    }\n  }\n\n  .cancel {\n    color:@select-contact-search-cancel-color;\n    margin-left: 8px;\n  }\n\n  // 取消搜索框右侧空白\n  .hidden-cancel-button {\n    .am-search-cancel {\n      display: none;\n    }\n  }\n\n  // 取消搜索框左边距\n  .am-search {\n    padding: 0;\n  }\n\n  .scc-blank {\n    height: 24rpx;\n    min-height: 24rpx;\n  }\n\n  .scc-contact-wrap {\n    flex: 1;\n    overflow: hidden;\n\n    .contact-loading {\n      height: 100%;\n      background: @select-wrap-contact-loading-bg;\n      border-radius: 12rpx;\n      padding: 24rpx;\n      box-sizing: border-box;\n    }\n\n    .contact-scroll {\n      position: relative;\n      height: 100%;\n      background-color: @select-contact-scroll-bg;\n      border-radius: 24rpx;\n\n      &::-webkit-scrollbar {\n        display: none;\n      }\n    }\n\n    .contact-recommend {\n      width: 100%;\n      height: 138rpx;\n    }\n\n    .contact-list {\n      padding: 0 24rpx 24rpx;\n      background: @select-contact-list-bg;\n      border-radius: 12rpx;\n\n      .title {\n        font-size: 28rpx;\n        line-height: 48rpx;\n        color: @select-contact-title-color;\n        background: @select-contact-title-bg;\n\n        &__ios {\n          position: -webkit-sticky;\n          position: sticky;\n          top: -1rpx;\n          z-index: 2;\n        }\n      }\n\n      .title.first-level {\n        font-size: 30rpx;\n        line-height: 80rpx;\n        color: @select-contact-title-first-color;\n        border-bottom: 2rpx solid @select-contact-title-first-border;\n      }\n\n      .tag {\n        padding: 0 8rpx;\n        margin-left: 8rpx;\n        font-size: 20rpx;\n        color: @select-contact-tag-color;\n        border: 0.5px solid @select-contact-tag-border;\n        border-radius: 6rpx;\n      }\n\n      .am-list-prefix {\n        padding-left: 0;\n      }\n      .am-list-line {\n        padding-right: 0;\n      }\n      .am-auto-sizer-content {\n        border-radius: 8rpx;\n      }\n    }\n\n    // 将字母表的位置设为聚合居中\n    .alphabet-container {\n      transform: translate(0, calc(-50% + 48rpx));\n    }\n  }\n\n  .scc-search-wrap {\n    overflow: hidden;\n    border-radius: 24rpx;\n    flex: 1;\n\n    .normal {\n      height: 100%;\n\n      .tag {\n        padding: 0 8rpx;\n        margin-left: 8rpx;\n        font-size: 20rpx;\n        color: @select-contact-tag-color;\n        border: 0.5px solid @select-contact-tag-border;\n        border-radius: 6rpx;\n      }\n\n      .am-list-item:nth-of-type(1) {\n        border-top-left-radius: 24rpx;\n        border-top-right-radius: 24rpx;\n      }\n      .am-list-item:nth-last-of-type(1) {\n        border-bottom-left-radius: 24rpx;\n        border-bottom-right-radius: 24rpx;\n      }\n    }\n\n    .empty {\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      flex-direction: column;\n      background-color: @select-contact-empty-bg;\n      border-radius: 24rpx;\n\n      &-img {\n        width: 200rpx;\n        height: 200rpx;\n        margin-top: 80rpx;\n        background: url(https://gw.alipayobjects.com/mdn/rms_a07f19/afts/img/A*ZN9XRokU8BIAAAAAAAAAAAAAARQnAQ)\n          no-repeat;\n      }\n\n      &-text {\n        margin: 24rpx 0 90rpx;\n        font-size: 30rpx;\n        color: @select-contact-empty-color;\n      }\n    }\n\n    .loading {\n      display: flex;\n      justify-content: center;\n      align-items: center;\n\n      &-text {\n        font-size: 28rpx;\n        color: @select-contact-loading-color;\n      }\n    }\n\n    .display-name {\n      display: inline-block;\n\n      &__light {\n        color: @select-contact-display-light-color;\n      }\n    }\n  }\n}\n\n.hidden {\n  display: none !important;\n}\n"
  },
  {
    "path": "src/SelectContact/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 业务组件\n  order: 15\ntoc: content\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# SelectContact 选人能力\n\n找人能力：共享类面向对 C 用户的业务，实际上都存在这找人的诉求。举例：亲情卡主卡用户“找人”赠送亲情卡，求赠卡用户“找人”帮忙开通，代付的用户在使用代付时找人帮忙代付，小荷包的用户拉群时需要“找人”来加入。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-select-contact\": \"antd-mini/es/SelectContact/index\"\n#endif\n#if WECHAT\n  \"ant-select-contact\": \"antd-mini/SelectContact/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<SelectContact\n  className=\"stepper\"\n  value=\"{{0}}\"\n  min=\"{{0}}\"\n  max=\"{{10}}\"\n  step=\"{{1}}\"\n  disabled=\"{{false}}\"\n#if ALIPAY\n  onChange=\"handleChange\"\n#endif\n#if WECHAT\n  bindchange=\"handleChange\"\n#endif\n/>\n```\n\n```js\nPage({\n  handleChange(value) {\n    console.log(value);\n  },\n});\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/SelectContact/index'></code>\n\n## API\n\n| 属性                  | 说明                         | 类型                      | 默认值 |\n| --------------------- | ---------------------------- | ------------------------- | ------ |\n| className             | 类名                         | string                    | -      |\n| height                | 组件高度                     | string                    | -      |\n| source                | 业务来源，区分场景监控、埋点 | string                    | -      |\n| bizScene              | 接入方场景，后段校验         | number                    | -      |\n| onError               | 获取数据接口报错触发         | (error: any) => void      | -      |\n| #if ALIPAY onSelect   | 选中联系人时触发             | (IOnSelectParams) => void | -      |\n| #if WECHAT bindselect | 选中联系人时触发             | (IOnSelectParams) => void | -      |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                                  | 默认值                                                                                            | 深色模式默认值                                                                                    | 备注             |\n| --------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------- |\n| --select-contact-search-bar-focus-color | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | 搜索栏聚焦颜色   |\n| --select-contact-search-cancel-color    | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | 取消按钮颜色     |\n| --select-contact-loading-bg             | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | 加载背景颜色     |\n| --select-contact-scroll-bg              | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | 滚动背景颜色     |\n| --select-contact-list-bg                | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | 列表背景颜色     |\n| --select-contact-title-bg               | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #000000; color: #ffffff;\">#000000</div> | 标题背景颜色     |\n| --select-contact-title-color            | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999</div>    | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999</div>    | 标题文字颜色     |\n| --select-contact-title-first-color      | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333</div>    | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #000000;\">#c5cad1</div> | 一级标题颜色     |\n| --select-contact-title-first-border     | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #333333;\">#eee</div>    | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #ffffff;\">#2b2b2b</div> | 一级标题边框颜色 |\n| --select-contact-tag-color              | <div style=\"width: 150px; height: 30px; background-color: #ff6010; color: #ffffff;\">#ff6010</div> | <div style=\"width: 150px; height: 30px; background-color: #ff6010; color: #ffffff;\">#ff6010</div> | 标签颜色         |\n| --select-contact-tag-border             | <div style=\"width: 150px; height: 30px; background-color: #ffcfb7; color: #333333;\">#ffcfb7</div> | <div style=\"width: 150px; height: 30px; background-color: #ffcfb7; color: #ffffff;\">#ffcfb7</div> | 标签边框颜色     |\n| --select-contact-empty-bg               | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | 空状态背景颜色   |\n| --select-contact-empty-color            | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999</div>    | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | 空状态文字颜色   |\n| --select-contact-loading-bg             | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999</div>    | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | 加载状态背景颜色 |\n| --select-contact-display-light-color    | <div style=\"width: 150px; height: 30px; background-color: #fa6300; color: #ffffff;\">#fa6300</div> | <div style=\"width: 150px; height: 30px; background-color: #fa6300; color: #ffffff;\">#fa6300</div> | 高亮显示颜色     |\n"
  },
  {
    "path": "src/SelectContact/index.sjs.ts",
    "content": "const getId = (str) => {\n  if (str === '推荐' || str === '推') {\n    return 'tui';\n  }\n  return str;\n};\n\nexport default {\n  getId,\n};\n"
  },
  {
    "path": "src/SelectContact/index.ts",
    "content": "import { Component, getValueFromProps, triggerEvent } from '../_util/simply';\nimport { assertAilpayNativeNotSupport } from '../_util/support';\nimport {\n  IContactInfo,\n  IContactUserInfo,\n  SelectContactDefaultProps,\n} from './props';\nimport { AlphabetMap, getFirstLetterInMap, getId } from './util';\n\nassertAilpayNativeNotSupport('SelectContact');\n\nComponent({\n  props: SelectContactDefaultProps,\n  data: {\n    /** 推荐联系人 */\n    recommendContactsList: [],\n\n    /** 全部联系人 */\n    allContactsList: [],\n\n    /** 字母表 */\n    alphabet: [],\n\n    /** 滚动到的 Element id */\n    toView: '',\n\n    /** 联系人为空 */\n    contactListEmpty: false,\n\n    /** 数据加载中 */\n    loading: true,\n\n    /** 输入框占位文案 */\n    placeholder: '输入手机号、电子邮箱、好友姓名查找',\n\n    /** 是否展示搜索页 */\n    showSearch: false,\n\n    /** 搜索关键词 */\n    searchValue: '',\n\n    /** 搜索页状态 */\n    searchStatus: 'normal',\n\n    /** 搜索结果 */\n    searchList: [],\n\n    /**\n     * 是否是 IOS\n     *\n     * 由于 Andriod 对于 sticky 的兼容性太差（会覆盖右侧索引表），暂时只开放 IOS 的 sticky\n     */\n    isIOS: false,\n\n    /** 全局删除推荐好友标识 */\n    deleteRecommendUserFlag: false,\n    /** 是否正在搜索 */\n    searchable: false,\n    onScrollIntoView: null,\n  },\n  methods: {\n    init() {\n      let platform;\n      /// #if ALIPAY\n      platform = my.getSystemInfoSync().platform;\n      /// #endif\n      /// #if WECHAT\n      // @ts-ignore\n      platform = wx.getDeviceInfo().platform;\n      /// #endif\n      this.setData({\n        isIOS: /ios/gi.test(platform),\n      });\n      try {\n        const [recommendContactsListFromProps, allContactsListFromProps] =\n          getValueFromProps(this, ['recommendContactsList', 'allContactsList']);\n        const recommendContactsList = this.handleRecommendContacts(\n          recommendContactsListFromProps\n        );\n        /** 全部联系人 */\n        const allContactsList = this.handleAllContacts(\n          allContactsListFromProps\n        );\n\n        /** 展示的联系人列表 */\n        const contactsList = recommendContactsList.concat(allContactsList);\n\n        /** 字母表 */\n        const alphabet = this.generateAlphabet(contactsList);\n        this.setData({\n          recommendContactsList,\n          allContactsList,\n          alphabet,\n        });\n      } catch (error) {\n        const onError = getValueFromProps(this, 'onError');\n        onError && onError(error);\n        this.setData({\n          contactListEmpty: true,\n        });\n      } finally {\n        this.setData({\n          loading: false,\n        });\n      }\n    },\n    /** 搜索栏输入 */\n    onSearchInput(searchValue: string) {\n      // 无搜索内容时\n      if (!searchValue) {\n        this.setData({\n          searchValue: '',\n          searchList: [],\n          searchStatus: 'normal',\n        });\n      } else {\n        this.setData({\n          searchValue,\n          searchStatus: 'loading',\n          searchList: [],\n        });\n        const searchContacts = getValueFromProps(this, 'searchContacts');\n        const { userInfos = [] } = searchContacts({\n          keyword: searchValue,\n        });\n\n        // 将 em 标签包含的内容高亮显示\n        userInfos.forEach((item) => {\n          item.nodes = [];\n          item.displayName\n            .replace(/<\\/em>/g, '<em>')\n            .split('<em>')\n            .forEach((str, index) => {\n              if (index % 2) {\n                item.nodes.push({\n                  text: str,\n                  className: 'display-name__light',\n                });\n              } else {\n                item.nodes.push({\n                  text: str,\n                  className: 'display-name__normal',\n                });\n              }\n            });\n          item.displayName = item.displayName\n            .replace(/<\\/em>/g, '<em>')\n            .replace(/<em>/g, '');\n        });\n\n        this.setData({\n          searchList: userInfos,\n          searchStatus: userInfos.length > 0 ? 'normal' : 'empty',\n        });\n      }\n    },\n\n    /** 清空输入框内容 */\n    onSearchClear() {\n      this.setData({\n        searchValue: '',\n        searchList: [],\n        searchStatus: 'normal',\n      });\n    },\n\n    /** 输入框聚焦 */\n    onSearchFocus() {\n      this.setData({\n        showSearch: true,\n      });\n    },\n\n    /** 搜索栏返回 */\n    onSearchCancel() {\n      this.setData({\n        searchValue: '',\n        showSearch: false,\n        searchStatus: 'normal',\n        searchList: [],\n      });\n    },\n\n    /** 联系人点击事件 */\n    onItemClick(e) {\n      const { item, personSource } = e.currentTarget.dataset;\n\n      triggerEvent(this, 'select', {\n        userInfo: item,\n        personSource,\n        sessionId: getValueFromProps(this, 'sessionId'),\n      });\n    },\n\n    /** 处理 推荐联系人 数据 */\n    handleRecommendContacts(recommendUserInfos: IContactInfo[]) {\n      const recommendContactsList: IContactUserInfo[] =\n        recommendUserInfos.length === 0\n          ? []\n          : [\n              {\n                name: '推荐',\n                value: recommendUserInfos,\n                className: 'first-level',\n                personSource: 'recommend',\n              },\n            ];\n\n      return recommendContactsList;\n    },\n\n    /** 处理 全部联系人 数据 */\n    handleAllContacts(contacts: IContactInfo[]) {\n      if (contacts.length === 0) {\n        return [];\n      }\n\n      const allContactsList: IContactUserInfo[] = [];\n      const allContactsTempKey = [];\n\n      contacts.forEach((item) => {\n        const firstLetter = getFirstLetterInMap(item.displayName);\n\n        if (allContactsTempKey.indexOf(firstLetter) === -1) {\n          allContactsList.push({\n            name: firstLetter,\n            value: [item],\n            personSource: 'all',\n          });\n          allContactsTempKey.push(firstLetter);\n        } else {\n          for (let index = 0; index < allContactsList.length; index++) {\n            if (allContactsList[index].name === firstLetter) {\n              allContactsList[index].value.push(item);\n            }\n          }\n        }\n      });\n      allContactsList.sort((a, b) =>\n        AlphabetMap[a.name] > AlphabetMap[b.name] ? 1 : -1\n      );\n      allContactsList.unshift({\n        name: '全部联系人',\n        value: [],\n        className: 'first-level',\n        personSource: 'all',\n      });\n\n      return allContactsList;\n    },\n\n    /** 根据 展示的联系人列表 生成 字母表 */\n    generateAlphabet(contactsList: IContactUserInfo[]) {\n      const alphabet: string[] = [];\n      contactsList.forEach((item) => {\n        if (item.name === '推荐') {\n          alphabet.push('推');\n        } else if (item.name !== '全部联系人') {\n          alphabet.push(item.name);\n        }\n      });\n\n      return alphabet;\n    },\n\n    /** 字母表滚动 */\n    onScrollIntoView(alphabetItem: string) {\n      const toView = getId(alphabetItem);\n\n      this.setData({ toView });\n    },\n\n    handleSearch() {\n      this.setData({ searchable: true });\n    },\n    handleCancelSearch() {\n      this.setData({ searchable: false });\n    },\n  },\n  /// #if ALIPAY\n  onInit() {\n    this.init();\n  },\n  /// #endif\n  /// #if WECHAT\n  attached() {\n    this.init();\n    this.setData({ onScrollIntoView: this.onScrollIntoView.bind(this) });\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/SelectContact/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n/**\n * @description 选人组件。\n */\n\n/**\n * 用户来源\n *\n * - 推荐联系人\n * - 全部联系人\n * - 搜索联系人\n *  */\ntype TPersonSource = 'recommend' | 'all' | 'search';\n\n/** onSelect 回调入参 */\nexport interface IOnSelectParams {\n  /** 选中的用户信息 */\n  userInfo: IContactInfo;\n\n  /** 用户来源 */\n  personSource: TPersonSource;\n}\n\n/** 获取推荐联系人和全部联系人接口返回数据 */\nexport interface IGetRecommendContactsListInfo {\n  success: boolean;\n\n  data: {\n    /** 当前登录人uid */\n    currentUserId: string;\n\n    /** 推荐联系人 */\n    recommendUserInfos: IContactInfo[];\n\n    /** 全部联系人 */\n    contacts: IContactInfo[];\n\n    /** 模糊搜索 */\n    fuzzyConsult?: {\n      /** 是否开启 */\n      enable: boolean;\n\n      /** 搜索框占位符 */\n      placeholder: string;\n    };\n\n    /** 当前请求会话ID */\n    sessionId?: string;\n  };\n}\n\n/** 联系人信息 */\nexport interface IContactInfo {\n  /** 用户 uid */\n  userId: string;\n\n  /** 展示名称 */\n  displayName: string;\n\n  /** 搜索时 - 高亮展示匹配内容（前端生成） */\n  nodes: Array<{\n    text: string;\n    className: string;\n  }>;\n\n  /** 脱敏登录id */\n  loginId: string;\n\n  /** 用户头像 */\n  avatar: string;\n\n  /** 联系人标签 */\n  tag?: string;\n\n  /** 推荐联系人标签（转为 tag 对外透出） */\n  recommendTypeDesc?: string;\n\n  /** 推荐联系人特有，取消推荐使用 */\n  archiveId?: string;\n}\n\n/** 组件展示联系人列表 */\nexport interface IContactUserInfo {\n  name: string;\n  value: IContactInfo[];\n  className?: string;\n  personSource: TPersonSource;\n}\n\nexport interface ISelectContactProps extends IBaseProps {\n  /** 自定义 class */\n  className: string;\n\n  /** 组件高度 */\n  height: string;\n\n  /** 选人组件初始化接口额外扩展参数 */\n  extParams?: Record<string, any>;\n\n  /** 推荐人列表 */\n  recommendContactsList?: IContactUserInfo[];\n\n  /** 全部联系人列表 */\n  allContactsList?: IContactInfo[];\n\n  /** 当前请求会话ID */\n  sessionId?: string;\n\n  /** 选中联系人 */\n  onSelect: (_params: IOnSelectParams) => void;\n\n  /** 获取数据接口报错 */\n  onError: (_e: any) => void;\n}\n\nexport const SelectContactDefaultProps: Partial<ISelectContactProps> = {\n  className: '',\n  height: '100%',\n  recommendContactsList: [],\n  allContactsList: [],\n  sessionId: '',\n  /** 其他扩展参数 */\n  extParams: {},\n  onSelect: (e) => {},\n  onError: (e) => {},\n};\n"
  },
  {
    "path": "src/SelectContact/util.ts",
    "content": "import getFirstLetter from 'pinyin-firstletter';\n\n/** 索引表枚举 */\nexport const AlphabetMap = {\n  A: 1,\n  B: 2,\n  C: 3,\n  D: 4,\n  E: 5,\n  F: 6,\n  G: 7,\n  H: 8,\n  I: 9,\n  J: 10,\n  K: 11,\n  L: 12,\n  M: 13,\n  N: 14,\n  O: 15,\n  P: 16,\n  Q: 17,\n  R: 18,\n  S: 19,\n  T: 20,\n  U: 21,\n  V: 22,\n  W: 23,\n  X: 24,\n  Y: 25,\n  Z: 26,\n  '#': 27,\n};\n\n/**\n * 获取首字母\n * A-Z之外的情况返回 #\n */\nexport function getFirstLetterInMap(str = '') {\n  const [a] = getFirstLetter(str) || [];\n  const letter = `${a}`.toUpperCase();\n  const Letter = AlphabetMap[letter] >= 0 ? letter : '#';\n\n  return Letter;\n}\n\nexport function getId(str: string) {\n  if (str === '推荐' || str === '推') {\n    return 'tui';\n  }\n\n  return str;\n}\n"
  },
  {
    "path": "src/SelectContact/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n@select-contact-search-bar-focus-color: var(--select-contact-search-bar-focus-color, @COLOR_BRAND1);\n@select-contact-search-cancel-color: var(--select-contact-search-cancel-color, @COLOR_TEXT_PRIMARY);\n@select-wrap-contact-loading-bg: var(--select-contact-wrap-loading-bg, #fff);\n\n@select-contact-scroll-bg: var(--select-contact-scroll-bg, #fff);\n@select-contact-list-bg: var(--select-contact-list-bg, #fff);\n@select-contact-title-bg: var(--select-contact-title-bg, #fff);\n@select-contact-title-color: var(--select-contact-title-color, #999);\n@select-contact-title-first-color: var(--select-contact-title-first-color, #333);\n@select-contact-title-first-border: var(--select-contact-title-first-border, #eee);\n@select-contact-tag-color: var(--select-contact-tag-color, #ff6010);\n@select-contact-tag-border: var(--select-contact-tag-border, #ffcfb7);\n@select-contact-empty-bg: var(--select-contact-empty-bg, #fff);\n@select-contact-empty-color: var(--select-contact-empty-color, #999);\n@select-contact-loading-color: var(--select-contact-loading-bg, #999);\n@select-contact-display-light-color: var(--select-contact-display-light-color, #fa6300);\n\n\n\n\n\n"
  },
  {
    "path": "src/Selector/index.axml",
    "content": "<import-sjs\n  from=\"./index.sjs\"\n  name=\"util\" />\n\n<view\n  class=\"ant-selector {{ className ? className : '' }} {{ disabled ? 'ant-selector-disabled' : '' }}\"\n  style=\"{{ style }}\">\n  <view class=\"ant-selector-content-container\">\n    <block\n      a:for=\"{{ options }}\"\n      a:for-index=\"index\"\n      a:for-item=\"item\"\n      a:key=\"value\">\n      <view\n        class=\"ant-selector-content {{ options.length <= 2 ? 'ant-selector-content-item2' : '' }}\">\n        <view\n          class=\"ant-selector-item {{ item.disabled ? 'ant-selector-item-disabled' : '' }} {{ util.getChecked(item.value, mixin.value, multiple) ? 'ant-selector-item-active ' + (activeItemClassName || '') : '' }}\"\n          style=\"{{ util.getChecked(item.value, mixin.value, multiple) ? activeItemStyle || '' : '' }}\"\n          data-value=\"{{ item.value }}\"\n          data-disabled=\"{{ item.disabled }}\"\n          onTap=\"onChange\">\n          <view\n            a:if=\"{{ item.text }}\"\n            class=\"ant-selector-item-text\">\n            {{ item.text }}\n          </view>\n          <view\n            a:if=\"{{ item.subText }}\"\n            class=\"ant-selector-item-subtext\">\n            {{ item.subText }}\n          </view>\n          <view\n            a:if=\"{{ util.getChecked(item.value, mixin.value, multiple) }}\"\n            class=\"ant-selector-item-badge-active\" />\n          <slot item=\"{{ item }}\" />\n        </view>\n      </view>\n    </block>\n  </view>\n</view>\n"
  },
  {
    "path": "src/Selector/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Information Entry\n  order: 10\ntoc: 'content'\n---\n\n# Selector\n\nSelect one or more in a set of options. Provides multiple options for users to select, typically used in filters and forms.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-selector\": \"antd-mini/es/Selector/index\"\n#endif\n#if WECHAT\n  \"ant-selector\": \"antd-mini/Selector/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n> [options](#selectoritem) property is an object that contains `text`(main copy), `subText`(Deputy Copywriter), `value`(option value), `disabled`(disabled or not).\n\n```xml\n  <ant-selector defaultValue=\"2\" options=\"{{options}}\" />\n```\n\n### multiple choice\n\n> Incoming `multiple` Properties can support multiple selection.\n\n```xml\n  <ant-selector defaultValue=\"{{['1', '2']}}\" options=\"{{options}}\" multiple />\n```\n\n### Limit the number of selections\n\n> `maxSelectedCount`、`minSelectedCount` property can limit the number of selections,`selectMax`、`selectMin` Event is triggered when the limit is exceeded.\n\n```xml\n<ant-selector\n  options=\"{{options}}\"\n  multiple\n  maxSelectedCount=\"{{4}}\"\n  minSelectedCount=\"{{2}}\"\n#if ALIPAY\n  onSelectMax=\"onSelectMax\"\n  onSelectMin=\"onSelectMin\"\n#endif\n#if WECHAT\n  bindselectmax=\"onSelectMax\"\n  bindselectmin=\"onSelectMin\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    items: [\n      { text: '选项一', value: '1' },\n      { text: '选项二', value: '2' },\n      { text: '选项三', value: '3' },\n    ],\n  },\n  onSelectMin(value, item) {\n    console.log(value, item);\n#if WECHAT\n    wx.showModal({ content: 'Emptying not allowed' });\n#endif\n#if ALIPAY\n    my.alert({ content: 'Emptying not allowed' });\n#endif\n  },\n  onSelectMax() {\n    console.log(value, item);\n#if WECHAT\n    wx.showModal({ content: '选择已达上限' });\n#endif\n#if ALIPAY\n    my.alert({ content: '选择已达上限' });\n#endif\n  },\n});\n```\n\n### Emptying not allowed\n\n> To achieve that emptying is not allowed, use `minSelectedCount` Property Set Minimum Limit Number of Digits `1` , can.\n\n```xml\n<ant-selector defaultValue=\"1\" options=\"{{options}}\" minSelectedCount=\"{{1}}\" />\n```\n\n### Controlled Mode\n\n```xml\n<ant-selector\n  value=\"{{value}}\"\n  options=\"{{items}}\"\n#if ALIPAY\n  onChange=\"handleChange\"\n#endif\n#if WECHAT\n  bindchange=\"handleChange\"\n#endif\n/>\n<ant-button\n  size=\"large\"\n#if ALIPAY\n  onTap=\"handleChangeValue\"\n#endif\n#if WECHAT\n  bindtap=\"handleChangeValue\"\n#endif\n>\n  Change the selected value to option three\n</ant-button>\n```\n\n```js\nPage({\n  data: {\n    items: [\n      { text: '选项一', value: '1' },\n      { text: '选项二', value: '2' },\n      { text: '选项三', value: '3' },\n    ],\n    value: '1',\n  },\n  handleChangeValue() {\n    this.setData({\n      value: '3',\n    });\n  },\n  handleChange(value, items, e) {\n#if WECHAT\n    this.setData({\n      value: value.detail[0],\n    });\n#endif\n#if ALIPAY\n    this.setData({\n      value,\n    });\n#endif\n    console.log(value, items, e);\n  },\n});\n```\n\n### Use Selector to customize the Filter\n\n> Reference below [Demo Code](#demo-代码) implementation in.\n\n### Demo Code\n\n<code src=\"../../demo/pages/Selector/index\"></code>\n\n## API\n\n| Property                      | Description                                                    | Type                                                                                                                                                                                                                                     | Default Value |\n| ------------------------- | ------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ |\n| activeItemClassName       | Class name of the selected option                                          | string                                                                                                                                                                                                                                   | -      |\n| activeItemStyle           | Styles for selected options                                          | string                                                                                                                                                                                                                                   | -      |\n| className                 | Class Name                                                    | string                                                                                                                                                                                                                                   | -      |\n| defaultValue              | The default selection item, when multiple selection type is array                            | string \\| number \\| string[] \\| number[]                                                                                                                                                                                                 | -      |\n| disabled                  | Whether the whole is disabled                                            | boolean                                                                                                                                                                                                                                  | false  |\n| maxSelectedCount          | Maximum Number of Optional Items                                      | number                                                                                                                                                                                                                                   | -      |\n| minSelectedCount          | Number of minimum selectable items                                      | number                                                                                                                                                                                                                                   | -      |\n| multiple                  | Whether to allow multi-selection, the current radio/multi-selection status will be displayed when the tab bar is displayed. | boolean                                                                                                                                                                                                                                  | false  |\n| options                   | Option Data Source                                              | [SelectorItem](#selectoritem)[]                                                                                                                                                                                                          | []     |\n| style                     | Style                                                    | string                                                                                                                                                                                                                                   | -      |\n| value                     | Current selection, array type for multiple selection                            | string \\| number \\| string[] \\| number[]                                                                                                                                                                                                 | -      |\n| #if ALIPAY onChange       | The selected value changes, triggering a callback                                | (v: string \\| number \\| undefined \\| string[] \\| number[], selectedItem: [SelectorItem](#selectoritem) \\| undefined \\| [SelectorItem](#selectoritem)[], event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -      |\n| #if ALIPAY onSelectMax    | Maximum Trigger Limit                                            | (value: string \\| number, item: [SelectorItem](#selectoritem), event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                                                          | -      |\n| #if ALIPAY onSelectMin    | Trigger Minimum Limit                                            | (value: string \\| number, item: [SelectorItem](#selectoritem), event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                                                          | -      |\n| #if WECHAT bindchange    | The selected value changes, triggering a callback                                | (v: string \\| number \\| undefined \\| string[] \\| number[], selectedItem: [SelectorItem](#selectoritem) \\| undefined \\| [SelectorItem](#selectoritem)[], event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -      |\n| #if WECHAT bindselectmax | Maximum Trigger Limit                                            | (value: string \\| number, item: [SelectorItem](#selectoritem), event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                                                          | -      |\n| #if WECHAT bindselectmin | Trigger Minimum Limit                                            | (value: string \\| number, item: [SelectorItem](#selectoritem), event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                                                          | -      |\n\n### SelectorItem\n\n| Property     | Description         | Type             | Default Value |\n| -------- | ------------ | ---------------- | ------ |\n| disabled | Disable     | boolean          | -      |\n| subText  | Deputy Copywriter       | string           | -      |\n| text     | Copywriting         | string           | -      |\n| value    | Current item value | string \\| number | -      |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                            | Default Value                                                                                            | Dark Mode Default                                                                                    | Remarks                 |\n| --------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | -------------------- |\n| --selector-background-color       | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | Selector Background Color       |\n| --selector-item-background        | <div style=\"width: 150px; height: 30px; background-color: #f5f5f5; color: #333333;\">#f5f5f5</div> | <div style=\"width: 150px; height: 30px; background-color: #121212; color: #ffffff;\">#121212</div> | Selector item background color     |\n| --selector-item-active-background | <div style=\"width: 150px; height: 30px; background-color: #e7f1ff; color: #333333;\">#e7f1ff</div> | <div style=\"width: 150px; height: 30px; background-color: #0d2543; color: #ffffff;\">#0d2543</div> | Selector Activate Item Background Color |\n| --selector-item-color             | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | Selector item color         |\n| --selector-item-sub-color         | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | Selector item sub-color       |\n"
  },
  {
    "path": "src/Selector/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {}\n}\n"
  },
  {
    "path": "src/Selector/index.less",
    "content": "@import (reference) './variable.less';\n\n@selectorPrefix: ant-selector;\n\n.@{selectorPrefix} {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  // padding: calc(@selector-collapse / 2);\n  background-color: @selector-background-color;\n  line-height: @selector-line-height;\n\n  &-disabled .ant-selector-content {\n    opacity: 0.6;\n\n    .@{selectorPrefix}-item-disabled {\n      opacity: 1;\n    }\n  }\n\n  &-content {\n    display: flex;\n    flex: 0 33.3333%;\n    padding: calc(@selector-collapse / 2);\n    box-sizing: border-box;\n\n    &-item2 {\n      flex: 1;\n    }\n\n    &-container {\n      display: flex;\n      flex-wrap: wrap;\n      justify-content: flex-start;\n    }\n\n    .ant-tap-modal-mask {\n      width: calc(100% - 24 * @rpx);\n      height: calc(100% - 24 * @rpx);\n      margin: 12 * @rpx 0 0 12 * @rpx;\n    }\n  }\n\n  &-item {\n    position: relative;\n    display: flex;\n    flex: 1;\n    flex-direction: column;\n    justify-content: flex-start;\n    overflow: hidden;\n    padding: calc(@selector-collapse / 2) calc(@selector-collapse / 4);\n    text-align: center;\n    background-color: @selector-item-background;\n    border-radius: @corner-radius-md;\n\n    &-active {\n      background-color: @selector-item-active-background;\n\n      .@{selectorPrefix}-item-text {\n        color: @selector-item-color;\n      }\n    }\n\n    &-disabled {\n      opacity: 0.6;\n    }\n\n    &-text {\n      font-size: @selector-item-size;\n      color: @selector-item-color;\n    }\n\n    &-subtext {\n      font-size: @selector-item-sub-size;\n      color: @selector-item-sub-color;\n    }\n\n    &-badge-active {\n      position: absolute;\n      top: 0;\n      left: 0;\n      right: 0;\n      bottom: 0;\n      background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAfCAYAAAH8T49dAAAAAXNSR0IArs4c6QAAA7JJREFUWAnNV1tIlEEU/lYrzRClaHdd14jMlEwKBEGolwKhnqIICiKE6ikKhMRdk1ikwCx86KECoYKgsIuVUBT4FBQEUm9dpB4iKrSLouWau+7pnP2d/S/+e/fSPOxczne++ebM+WdngFSKs4XIhJMBKdFBl4/61MAspHJzqIbUjBrlqig2aHTLmUHQUIe0tBJDqgFr7fZRY4RwLS7QOIU4m4BrA+SeCOKbYpWpXT6tFwVavRVw7muZyaTNOoWSYgtyn6K6SBgvlVM0mKojNW/WWwWoLdMsJpDQ88ZWiUkA1w9poNh0av4aD3DnCBCaBmrOzoCqA7TsexB/ta79b4zJ3pzaaGmAvKEgPmdF5vTRUxAa1JRpk3He5HPeBBWBsU6ZjFV0sopmo7O1nZSMdyXMTrlWR9nCx8eA4XF9l5ZYQdLnxDjA+35T2eQTGJkAqtq1PFAk6rNQOJMyVwv95ENhpTIaa8mX/hNmJUa7tB2lrbSFE+q11bCofQ6N37TMTNUw0QDHuDZrMo7zJMc5T4RkTMbJW8zJO2JcjekoMBoStd1+2mUlEnzaZByfG5EIHtlNltYy+Wv4wiSccfYlJbJAgHIuBcHHW+KSdJneNqqIR/QhAPQe1SdISMbxaZoKYVCH6y0hKswHfA/1sbjLZKIXnIj1OlRvKaJtXcDgsD5uq4wTcUIRbS4F5NSoLtGc4hGJ1aSs8hwVjvzCmD6X1np/GiguAMYntaVZFSl8TJmrlXbYEQmwsh0Y5fNMYhSPSHBRZRyfbl4W/7tlVxwcn0/8oa7JjkbzNsVsLgiz4fB20fLQEK7y4vb/F8KcfqpHBL28KLda2KIJ23ebcp+9wnnOoSYlxlgvuDCPn6rCEfSxiAqjEGt7wYTxfb05AnTwxSf2+VrFGPvzKqwsQJ6pIO5zMtcZJ02lPS/C+P/roMMBOYP4uMqszJmwdS1U9Bu4xTJ2pirFUwRs3wA8eQP8+GP2ylqYx0cNYUIP0xabqeP35B7cc1g7/gX1/COwp9uMz0jY+ouUN/YVVziRG810iXtWQXJB38uCjH+5iiEtYSU+qp0mPGBnryJQtZ+fOuWrgQv9wLshNarV6QhSnkmFyR3q8iTOcCL7lZO1LlgKDPiAVSs0i7w6JBL5/E4xblmiCFk54wora6PyqTD6WNBGq1O8vrxc7vJdQO4ixpKOIOU3SxjfEI7zg7+L88f2XaYcE9WbWGDnboBPeJzkf0C7HErkL7aoMFeAnBTEPe5vTeawUPZ/WGpTpu45f4MAAAAASUVORK5CYII=')\n        right bottom no-repeat;\n      background-size: 19px 15px;\n    }\n  }\n}\n"
  },
  {
    "path": "src/Selector/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 数据录入\n  order: 10\ntoc: 'content'\n---\n\n# Selector 选择器组件\n\n在一组选项中选择一个或多个。提供多个选项供用户选择，一般在筛选和表单中使用。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-selector\": \"antd-mini/es/Selector/index\"\n#endif\n#if WECHAT\n  \"ant-selector\": \"antd-mini/Selector/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n> [options](#selectoritem) 属性是一个对象，包含 `text`（主文案）、 `subText`（副文案） 、 `value`（选项值）、 `disabled`（是否禁用）。\n\n```xml\n  <ant-selector defaultValue=\"2\" options=\"{{options}}\" />\n```\n\n### 多选\n\n> 传入 `multiple` 属性可以支持多选。\n\n```xml\n  <ant-selector defaultValue=\"{{['1', '2']}}\" options=\"{{options}}\" multiple />\n```\n\n### 限制选择个数\n\n> `maxSelectedCount`、`minSelectedCount` 属性可以限制选择个数，`selectMax`、`selectMin` 事件在超出限制的时候触发。\n\n```xml\n<ant-selector\n  options=\"{{options}}\"\n  multiple\n  maxSelectedCount=\"{{4}}\"\n  minSelectedCount=\"{{2}}\"\n#if ALIPAY\n  onSelectMax=\"onSelectMax\"\n  onSelectMin=\"onSelectMin\"\n#endif\n#if WECHAT\n  bindselectmax=\"onSelectMax\"\n  bindselectmin=\"onSelectMin\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    items: [\n      { text: '选项一', value: '1' },\n      { text: '选项二', value: '2' },\n      { text: '选项三', value: '3' },\n    ],\n  },\n  onSelectMin(value, item) {\n    console.log(value, item);\n#if WECHAT\n    wx.showModal({ content: '不允许清空' });\n#endif\n#if ALIPAY\n    my.alert({ content: '不允许清空' });\n#endif\n  },\n  onSelectMax() {\n    console.log(value, item);\n#if WECHAT\n    wx.showModal({ content: '选择已达上限' });\n#endif\n#if ALIPAY\n    my.alert({ content: '选择已达上限' });\n#endif\n  },\n});\n```\n\n### 不允许清空\n\n> 想要实现不允许清空，使用 `minSelectedCount` 属性设置最小限制个数位 `1` ，即可。\n\n```xml\n<ant-selector defaultValue=\"1\" options=\"{{options}}\" minSelectedCount=\"{{1}}\" />\n```\n\n### 受控模式\n\n```xml\n<ant-selector\n  value=\"{{value}}\"\n  options=\"{{items}}\"\n#if ALIPAY\n  onChange=\"handleChange\"\n#endif\n#if WECHAT\n  bindchange=\"handleChange\"\n#endif\n/>\n<ant-button\n  size=\"large\"\n#if ALIPAY\n  onTap=\"handleChangeValue\"\n#endif\n#if WECHAT\n  bindtap=\"handleChangeValue\"\n#endif\n>\n  改变选中值为选项三\n</ant-button>\n```\n\n```js\nPage({\n  data: {\n    items: [\n      { text: '选项一', value: '1' },\n      { text: '选项二', value: '2' },\n      { text: '选项三', value: '3' },\n    ],\n    value: '1',\n  },\n  handleChangeValue() {\n    this.setData({\n      value: '3',\n    });\n  },\n  handleChange(value, items, e) {\n#if WECHAT\n    this.setData({\n      value: value.detail[0],\n    });\n#endif\n#if ALIPAY\n    this.setData({\n      value,\n    });\n#endif\n    console.log(value, items, e);\n  },\n});\n```\n\n### 使用 Selector 自定义 Filter\n\n> 参考下面 [Demo 代码](#demo-代码) 中的实现。\n\n### Demo 代码\n\n<code src=\"../../demo/pages/Selector/index\"></code>\n\n## API\n\n| 属性                      | 说明                                                    | 类型                                                                                                                                                                                                                                     | 默认值 |\n| ------------------------- | ------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ |\n| activeItemClassName       | 选中选项的类名                                          | string                                                                                                                                                                                                                                   | -      |\n| activeItemStyle           | 选中选项的样式                                          | string                                                                                                                                                                                                                                   | -      |\n| className                 | 类名                                                    | string                                                                                                                                                                                                                                   | -      |\n| defaultValue              | 默认选择项，多选时类型为数组                            | string \\| number \\| string[] \\| number[]                                                                                                                                                                                                 | -      |\n| disabled                  | 是否整体禁用                                            | boolean                                                                                                                                                                                                                                  | false  |\n| maxSelectedCount          | 最大可选中项的数量                                      | number                                                                                                                                                                                                                                   | -      |\n| minSelectedCount          | 最小可选中项的数量                                      | number                                                                                                                                                                                                                                   | -      |\n| multiple                  | 是否允许多选，标签栏显示的时候会显示当前单选/多选的状态 | boolean                                                                                                                                                                                                                                  | false  |\n| options                   | 选项数据源                                              | [SelectorItem](#selectoritem)[]                                                                                                                                                                                                          | []     |\n| style                     | 样式                                                    | string                                                                                                                                                                                                                                   | -      |\n| value                     | 当前选择项，多选时类型为数组                            | string \\| number \\| string[] \\| number[]                                                                                                                                                                                                 | -      |\n| #if ALIPAY onChange       | 选中值发生变化，触发回调                                | (v: string \\| number \\| undefined \\| string[] \\| number[], selectedItem: [SelectorItem](#selectoritem) \\| undefined \\| [SelectorItem](#selectoritem)[], event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -      |\n| #if ALIPAY onSelectMax    | 触发最大限制                                            | (value: string \\| number, item: [SelectorItem](#selectoritem), event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                                                          | -      |\n| #if ALIPAY onSelectMin    | 触发最小限制                                            | (value: string \\| number, item: [SelectorItem](#selectoritem), event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                                                          | -      |\n| #if WECHAT bindchange    | 选中值发生变化，触发回调                                | (v: string \\| number \\| undefined \\| string[] \\| number[], selectedItem: [SelectorItem](#selectoritem) \\| undefined \\| [SelectorItem](#selectoritem)[], event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -      |\n| #if WECHAT bindselectmax | 触发最大限制                                            | (value: string \\| number, item: [SelectorItem](#selectoritem), event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                                                          | -      |\n| #if WECHAT bindselectmin | 触发最小限制                                            | (value: string \\| number, item: [SelectorItem](#selectoritem), event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void                                                                                          | -      |\n\n### SelectorItem\n\n| 属性     | 说明         | 类型             | 默认值 |\n| -------- | ------------ | ---------------- | ------ |\n| disabled | 是否禁用     | boolean          | -      |\n| subText  | 副文案       | string           | -      |\n| text     | 文案         | string           | -      |\n| value    | 当前项 value | string \\| number | -      |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                            | 默认值                                                                                            | 深色模式默认值                                                                                    | 备注                 |\n| --------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | -------------------- |\n| --selector-background-color       | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | 选择器背景颜色       |\n| --selector-item-background        | <div style=\"width: 150px; height: 30px; background-color: #f5f5f5; color: #333333;\">#f5f5f5</div> | <div style=\"width: 150px; height: 30px; background-color: #121212; color: #ffffff;\">#121212</div> | 选择器项背景颜色     |\n| --selector-item-active-background | <div style=\"width: 150px; height: 30px; background-color: #e7f1ff; color: #333333;\">#e7f1ff</div> | <div style=\"width: 150px; height: 30px; background-color: #0d2543; color: #ffffff;\">#0d2543</div> | 选择器激活项背景颜色 |\n| --selector-item-color             | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | 选择器项颜色         |\n| --selector-item-sub-color         | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | 选择器项子颜色       |\n"
  },
  {
    "path": "src/Selector/index.sjs.ts",
    "content": "function getChecked(value, values, multiple) {\n  if (!multiple) {\n    return value === values;\n  }\n  return (values || []).indexOf(value) > -1;\n}\n\n\nexport default {\n  getChecked,\n};\n"
  },
  {
    "path": "src/Selector/index.ts",
    "content": "import mixinValue from '../mixins/value';\nimport {\n  Component,\n  getValueFromProps,\n  triggerEventValues,\n} from '../_util/simply';\nimport { ISelectorItem, SelectorDefaultProps } from './props';\n\nComponent({\n  props: SelectorDefaultProps,\n  methods: {\n    onChange(e) {\n      const { disabled, value } = e.currentTarget.dataset;\n      const [\n        multiple,\n        options,\n        maxSelectedCount,\n        minSelectedCount,\n        disabledFromProps,\n      ] = getValueFromProps(this, [\n        'multiple',\n        'options',\n        'maxSelectedCount',\n        'minSelectedCount',\n        'disabled',\n      ]);\n      if (disabled || disabledFromProps) {\n        return;\n      }\n      if (multiple) {\n        let currentValue = this.getValue() || [];\n        if (currentValue.indexOf(value) > -1) {\n          if (\n            typeof minSelectedCount === 'number' &&\n            currentValue.length <= minSelectedCount\n          ) {\n            triggerEventValues(\n              this,\n              'selectMin',\n              [value, options.find((v) => v.value === value) as ISelectorItem],\n              e\n            );\n            return;\n          }\n          currentValue = currentValue.filter((v) => v !== value);\n        } else {\n          if (\n            typeof maxSelectedCount === 'number' &&\n            currentValue.length >= maxSelectedCount\n          ) {\n            triggerEventValues(\n              this,\n              'selectMax',\n              [value, options.find((v) => v.value === value) as ISelectorItem],\n              e\n            );\n            return;\n          }\n          currentValue = [...currentValue, value];\n        }\n        if (!this.isControlled()) {\n          this.update(currentValue);\n        }\n        triggerEventValues(\n          this,\n          'change',\n          [\n            currentValue,\n            options.filter((v) => currentValue.indexOf(v.value) > -1),\n          ],\n          e\n        );\n      } else {\n        if (value === this.getValue()) {\n          if (minSelectedCount === 1) {\n            triggerEventValues(\n              this,\n              'selectMin',\n              [value, options.find((v) => v.value === value)],\n              e\n            );\n            return;\n          }\n          if (!this.isControlled()) {\n            this.update(undefined);\n          }\n          triggerEventValues(this, 'change', [undefined, undefined], e);\n        } else {\n          if (!this.isControlled()) {\n            this.update(value);\n          }\n          triggerEventValues(\n            this,\n            'change',\n            [value, options.find((v) => v.value === value)],\n            e\n          );\n        }\n      }\n    },\n  },\n  mixins: [mixinValue()],\n});\n"
  },
  {
    "path": "src/Selector/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\nexport type Value = string | number;\nexport interface ISelectorItem {\n  /**\n   * @description 主文案\n   */\n  text: string;\n  /**\n   * @description 选项值，在同一个 Selector 中唯一\n   */\n\n  value: Value;\n  /**\n   * @description 辅助文案\n   */\n\n  subText?: string;\n  /**\n   * @description 单个禁用\n   */\n\n  disabled?: boolean;\n}\n/**\n * @description 筛选器，可供用户进行单选或者多选。\n */\n\nexport interface ISelectorProps extends IBaseProps {\n  /**\n   * @description 已选择项, 取 items 每一项的 value\n   */\n  value: Value | Value[];\n  /**\n   * @description 默认选择项, 取 items 每一项的 value\n   */\n  defaultValue: Value | Value[];\n  /**\n   * @description 可选项\n   */\n\n  options: ISelectorItem[];\n  /**\n   * @description 每一项激活时新加类名\n   */\n\n  activeItemClassName: string;\n  /**\n   * @description 每一项激活时样式\n   */\n\n  activeItemStyle: string;\n  /**\n   * @description 是否允许多选\n   * @default false\n   */\n\n  multiple: boolean;\n\n  /**\n   * @description 最小选择数量\n   */\n  minSelectedCount: number;\n  /**\n   * @description 最大选择数量\n   */\n  maxSelectedCount: number;\n\n  disabled?: boolean;\n\n  onChange?(\n    value: Value | Value[] | undefined,\n    item: ISelectorItem | ISelectorItem[] | undefined,\n    e: Record<string, any>\n  ): void;\n  /**\n   * @description 触发最大限制\n   */\n  onSelectMax?(value: Value, item: ISelectorItem, e: Record<string, any>): void;\n  /**\n   * @description 触发最小限制\n   */\n  onSelectMin?(value: Value, item: ISelectorItem, e: Record<string, any>): void;\n}\n\nexport const SelectorDefaultProps: Partial<ISelectorProps> = {\n  value: null,\n  defaultValue: null,\n  options: null,\n  activeItemClassName: '',\n  activeItemStyle: '',\n  multiple: false,\n  minSelectedCount: null,\n  maxSelectedCount: null,\n  disabled: false,\n};\n"
  },
  {
    "path": "src/Selector/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n// 间隔\n@selector-collapse: @h-spacing-large;\n// 背景\n@selector-background-color: var(--selector-background-color, @COLOR_CARD);\n// 选项背景\n@selector-item-background: var(--selector-item-background, @COLOR_GREY_CARD);\n// 选项激活背景\n@selector-item-active-background: var(\n  --selector-item-active-background,\n  @COLOR_WATHET\n);\n// 未选中选项字体颜色\n@selector-item-color: var(--selector-item-color, @COLOR_TEXT_PRIMARY);\n@selector-line-height: 1.4;\n// 选项字体大小\n@selector-item-size: @font-size-subtitle;\n// 副文案颜色\n@selector-item-sub-color: var(--selector-item-sub-color, @COLOR_TEXT_ASSIST);\n// 副文案大小\n@selector-item-sub-size: @font-size-content;\n\n@selector-item-color: var(--selector-item-color, @COLOR_BRAND1);\n"
  },
  {
    "path": "src/Skeleton/Avatar/index.axml",
    "content": "<import-sjs\n  from=\"./index.sjs\"\n  name=\"utils\" />\n\n<view\n  a:if=\"{{ loading }}\"\n  style=\"{{ style }}\"\n  class=\"ant-skeleton-avatar ant-skeleton-avatar-{{ shape }} {{ animate ? 'ant-skeleton-avatar-animate' : '' }} {{ utils.getClass(size) }} {{ className || '' }}\" />\n<slot a:else />\n"
  },
  {
    "path": "src/Skeleton/Avatar/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {}\n}\n"
  },
  {
    "path": "src/Skeleton/Avatar/index.less",
    "content": "@import (reference) '../variable.less';\n@import (reference) '../../Avatar/variable.less';\n\n.@{skeletonPrefix}-avatar {\n  &-animate {\n    .skeleton-animation();\n  }\n  width: @avatar-size;\n  height: @avatar-size;\n  border-radius: @default-radius;\n  background: @skeleton-fill;\n  display: inline-block;\n  &-circle {\n    border-radius: 50%;\n  }\n\n  &-x-small {\n    width: @avatar-size-x-small;\n    height: @avatar-size-x-small;\n  }\n  &-small {\n    width: @avatar-size-small;\n    height: @avatar-size-small;\n  }\n  &-medium {\n    width: @avatar-size-medium;\n    height: @avatar-size-medium;\n  }\n  &-large {\n    width: @avatar-size-large;\n    height: @avatar-size-large;\n  }\n}\n"
  },
  {
    "path": "src/Skeleton/Avatar/index.sjs.ts",
    "content": "function getClass(size) {\n  const list = ['x-small', 'small', 'medium', 'large'];\n  if (list.indexOf(size) >=0) {\n    return `ant-skeleton-avatar-${size}`;\n  }\n  return 'ant-skeleton-avatar-medium';\n}\n\nexport default { getClass };\n"
  },
  {
    "path": "src/Skeleton/Avatar/index.ts",
    "content": "import { Component } from '../../_util/simply';\nimport { SkeletonAvatarDefaultProps } from './props';\n\nComponent({ props: SkeletonAvatarDefaultProps });\n"
  },
  {
    "path": "src/Skeleton/Avatar/props.ts",
    "content": "import { ISkeletonBaseProps, SkeletonDefaultBaseProps } from '../props';\n\nexport interface SkeletonAvatarProps extends ISkeletonBaseProps {\n  shape: 'circle' | 'square';\n  size: 'x-small' | 'small' | 'medium' | 'large';\n}\n\nexport const SkeletonAvatarDefaultProps: Partial<SkeletonAvatarProps> = {\n  ...SkeletonDefaultBaseProps,\n  shape: 'square',\n  size: 'medium',\n};\n"
  },
  {
    "path": "src/Skeleton/Button/index.axml",
    "content": "<import-sjs\n  from=\"./index.sjs\"\n  name=\"utils\" />\n\n<view\n  a:if=\"{{ loading }}\"\n  class=\"ant-skeleton-button {{ animate ? 'ant-skeleton-button-animate' : '' }} {{ utils.getClass(size) }} {{ className || '' }}\"\n  style=\"{{ style }}\" />\n<slot a:else />\n"
  },
  {
    "path": "src/Skeleton/Button/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {}\n}\n"
  },
  {
    "path": "src/Skeleton/Button/index.less",
    "content": "@import (reference) '../variable.less';\n\n.@{skeletonPrefix}-button {\n  &-animate {\n    .skeleton-animation();\n  }\n\n  &-large {\n    font-size: 36 * @rpx;\n    padding: 24 * @rpx 24 * @rpx 24 * @rpx 24 * @rpx;\n  }\n\n  &-medium {\n    font-size: 34 * @rpx;\n    padding: 16 * @rpx 24 * @rpx 16 * @rpx 24 * @rpx;\n  }\n\n  &-small {\n    font-size: 30 * @rpx;\n    padding: 8 * @rpx 24 * @rpx 8 * @rpx 24 * @rpx;\n  }\n\n  width: @button-width;\n  height: @button-height;\n  border-radius: @default-radius;\n  background: @skeleton-fill;\n  display: inline-block;\n}\n"
  },
  {
    "path": "src/Skeleton/Button/index.sjs.ts",
    "content": "function getClass(size) {\n  const list = ['small', 'medium', 'large'];\n  if (list.indexOf(size) >=0) {\n    return `ant-skeleton-button-${size}`;\n  }\n  return 'ant-skeleton-button-medium';\n}\n\nexport default { getClass };\n"
  },
  {
    "path": "src/Skeleton/Button/index.ts",
    "content": "import { Component } from '../../_util/simply';\nimport { SkeletonButtonDefaultProps } from './props';\n\nComponent({ props: SkeletonButtonDefaultProps });\n"
  },
  {
    "path": "src/Skeleton/Button/props.ts",
    "content": "import { ISkeletonBaseProps, SkeletonDefaultBaseProps } from '../props';\n\nexport interface SkeletonButtonProps extends ISkeletonBaseProps {\n  size?: 'small' | 'medium' | 'large';\n}\n\nexport const SkeletonButtonDefaultProps: Partial<SkeletonButtonProps> = {\n  ...SkeletonDefaultBaseProps,\n  size: 'medium',\n};\n"
  },
  {
    "path": "src/Skeleton/Input/index.axml",
    "content": "<view\n  a:if=\"{{ loading }}\"\n  class=\"ant-skeleton-input {{ animate ? 'ant-skeleton-input-animate' : '' }} {{ className || '' }}\"\n  style=\"{{ style }}\" />\n<slot a:else />\n"
  },
  {
    "path": "src/Skeleton/Input/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {}\n}\n"
  },
  {
    "path": "src/Skeleton/Input/index.less",
    "content": "@import (reference) '../variable.less';\n\n.@{skeletonPrefix}-input {\n  &-animate {\n    .skeleton-animation();\n  }\n  width: @input-width;\n  height: @input-height;\n  border-radius: @default-radius;\n  background: @skeleton-fill;\n  display: inline-block;\n}\n"
  },
  {
    "path": "src/Skeleton/Input/index.ts",
    "content": "import { Component } from '../../_util/simply';\nimport { SkeletonInputDefaultProps } from './props';\n\nComponent({ props: SkeletonInputDefaultProps });\n"
  },
  {
    "path": "src/Skeleton/Input/props.ts",
    "content": "import { ISkeletonBaseProps, SkeletonDefaultBaseProps } from '../props';\n\nexport interface SkeletonInputProps extends ISkeletonBaseProps {}\n\nexport const SkeletonInputDefaultProps: Partial<SkeletonInputProps> = {\n  ...SkeletonDefaultBaseProps,\n};\n"
  },
  {
    "path": "src/Skeleton/Paragraph/index.axml",
    "content": "<view\n  a:if=\"{{ loading && rows > 0 }}\"\n  class=\"ant-skeleton-paragraph {{ animate ? 'ant-skeleton-paragraph-animate' : '' }} {{ className || '' }}\"\n  style=\"{{ style }}\">\n  <block\n    a:for=\"{{ rows }}\"\n    a:for-index=\"index\"\n    a:for-item=\"item\"\n    a:key=\"*this\">\n    <view class=\"ant-skeleton-paragraph-row\" />\n  </block>\n</view>\n<slot a:else />\n"
  },
  {
    "path": "src/Skeleton/Paragraph/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {}\n}\n"
  },
  {
    "path": "src/Skeleton/Paragraph/index.less",
    "content": "@import '../variable.less';\n\n.@{skeletonPrefix}-paragraph {\n  &-animate {\n    .@{skeletonPrefix}-paragraph-row {\n      .skeleton-animation();\n    }\n  }\n  &-row {\n    width: 100%;\n    height: 30 * @rpx;\n    margin-bottom: 24 * @rpx;\n    border-radius: @default-radius;\n    background: @skeleton-fill;\n    &:nth-last-of-type(1) {\n      margin-bottom: 0;\n      &:not(:nth-of-type(1)) {\n        width: 60%;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/Skeleton/Paragraph/index.ts",
    "content": "import { Component } from '../../_util/simply';\nimport { SkeletonParagraphDefaultProps } from './props';\n\nComponent({ props: SkeletonParagraphDefaultProps });\n"
  },
  {
    "path": "src/Skeleton/Paragraph/props.ts",
    "content": "import { ISkeletonBaseProps, SkeletonDefaultBaseProps } from '../props';\n\nexport interface SkeletonParagraphProps extends ISkeletonBaseProps {\n  rows: number;\n}\n\nexport const SkeletonParagraphDefaultProps: Partial<SkeletonParagraphProps> = {\n  ...SkeletonDefaultBaseProps,\n  rows: 3,\n};\n"
  },
  {
    "path": "src/Skeleton/Title/index.axml",
    "content": "<view\n  a:if=\"{{ loading }}\"\n  class=\"ant-skeleton-title {{ animate ? 'ant-skeleton-title-animate' : '' }} {{ className || '' }}\"\n  style=\"{{ style }}\" />\n<slot a:else />\n"
  },
  {
    "path": "src/Skeleton/Title/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {}\n}\n"
  },
  {
    "path": "src/Skeleton/Title/index.less",
    "content": "@import '../variable.less';\n\n.@{skeletonPrefix}-title {\n  &-animate {\n    .skeleton-animation();\n  }\n  height: 40 * @rpx;\n  width: 45%;\n  margin-bottom: 40 * @rpx;\n  border-radius: @default-radius;\n  background: @skeleton-fill;\n}\n"
  },
  {
    "path": "src/Skeleton/Title/index.ts",
    "content": "import { Component } from '../../_util/simply';\nimport { SkeletonTitleDefaultProps } from './props';\n\nComponent({ props: SkeletonTitleDefaultProps });\n"
  },
  {
    "path": "src/Skeleton/Title/props.ts",
    "content": "import { ISkeletonBaseProps, SkeletonDefaultBaseProps } from '../props';\n\nexport interface SkeletonTitleProps extends ISkeletonBaseProps {}\n\nexport const SkeletonTitleDefaultProps: Partial<SkeletonTitleProps> = {\n  ...SkeletonDefaultBaseProps,\n};\n"
  },
  {
    "path": "src/Skeleton/index.axml",
    "content": "<view\n  a:if=\"{{ loading }}\"\n  class=\"ant-skeleton {{ className || '' }}\">\n  <view\n    a:if=\"{{ avatar }}\"\n    class=\"ant-skeleton-avatar-wrapper\">\n    <avatar\n      animate=\"{{ animate }}\"\n      loading\n      size=\"{{ avatar === true ? 'medium' : avatar.size }}\" />\n  </view>\n  <view class=\"ant-skeleton-content-wrapper\">\n    <title\n      a:if=\"{{ title }}\"\n      animate=\"{{ animate }}\"\n      loading />\n    <paragraph\n      a:if=\"{{ paragraph }}\"\n      animate=\"{{ animate }}\"\n      rows=\"{{ paragraph === true ? 3 : paragraph.rows }}\"\n      loading />\n  </view>\n</view>\n<slot a:else />\n"
  },
  {
    "path": "src/Skeleton/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Feedback\n  order: 12\ntoc: 'content'\n---\n\n# Skeleton\n\nProvide a placeholder graphic combination where you need to wait for content to load.\n\n- The network is slow, requires a long wait to load, and is only used when loading for the first time.\n- On the premise of ensuring the performance of the mobile phone, try to use preloading, preferably without skeleton screen.\n- It is suitable for home pages, lists and cards with more graphic information and important information. Do not use small module class components (such as pop-up windows).\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-skeleton\": \"antd-mini/es/Skeleton/index\",\n  \"ant-skeleton-avatar\": \"antd-mini/es/Skeleton/Avatar/index\",\n  \"ant-skeleton-title\": \"antd-mini/es/Skeleton/Title/index\",\n  \"ant-skeleton-button\": \"antd-mini/es/Skeleton/Button/index\",\n  \"ant-skeleton-paragraph\": \"antd-mini/es/Skeleton/Paragraph/index\",\n  \"ant-skeleton-input\": \"antd-mini/es/Skeleton/Input/index\",\n#endif\n#if WECHAT\n  \"ant-skeleton\": \"antd-mini/Skeleton/index\",\n  \"ant-skeleton-avatar\": \"antd-mini/Skeleton/Avatar/index\",\n  \"ant-skeleton-title\": \"antd-mini/Skeleton/Title/index\",\n  \"ant-skeleton-button\": \"antd-mini/Skeleton/Button/index\",\n  \"ant-skeleton-paragraph\": \"antd-mini/Skeleton/Paragraph/index\",\n  \"ant-skeleton-input\": \"antd-mini/Skeleton/Input/index\",\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<ant-skeleton animate=\"{{true}}\" />\n```\n\n### With avatar\n\n```xml\n<ant-skeleton avatar=\"{{true}}\" />\n```\n\n### Custom Combinations\n\n```xml\n<ant-skeleton-avatar />\n<ant-skeleton-paragraph rows=\"{{1}}\" />\n<ant-skeleton-input />\n<ant-skeleton-input />\n<ant-skeleton-input />\n<ant-skeleton-button size=\"small\" />\n```\n\n### complex combination\n\n```xml\n<ant-skeleton\n  loading=\"{{showLoading}}\"\n  title=\"{{false}}\"\n  avatar=\"{{true}}\"\n  paragraph=\"{{paragraph}}\">\n  <view class=\"container\">\n    <ant-avatar\n      src=\"https://images.unsplash.com/photo-1546967191-fdfb13ed6b1e?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&fit=crop&h=200&w=200&ixid=eyJhcHBfaWQiOjE3Nzg0fQ\" />\n    <view class=\"content\">\n        We supply a series of design principles, practical patterns and high\n        quality design resources, to help people create their product prototypes\n        beautifully and efficiently.\n    </view>\n  </view>\n</ant-skeleton>\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Skeleton/index'></code>\n\n## API\n\n### Skeleton\n\n| Property      | Description                                         | Type                  | Default Value |\n| --------- | -------------------------------------------- | --------------------- | ------ |\n| animate   | Show animation effect                             | boolean               | false  |\n| avatar    | Whether to display avatar bitmap                           | `boolean \\| Avatar`   | false  |\n| className | Class Name                                         | string                | -      |\n| loading   | When true, displays the accounting bitmap. On the other hand, it shows the subassembly directly. | boolean               | true   |\n| paragraph | Paragraph                                         | `number \\| Paragraph` | true   |\n| style     | Style                                         | CSSProperties         | -      |\n| title     | Whether to display title bitmap                           | boolean               | true   |\n\n### Avatar\n\n| Property      | Description                                             | Type          | Default Value   |\n| --------- | ------------------------------------------------ | ------------- | -------- |\n| animate   | Show animation effect                                 | boolean       | false    |\n| className | Class Name                                             | string        | -        |\n| loading   | When true, displays the accounting bitmap. On the other hand, it shows the subassembly directly.     | boolean       | true     |\n| shape     | Avatar Shape `circle` or `square`                    | string        | `square` |\n| size      | Avatar size `x-small`、`small`、`medium` or `large` | string        | `medium` |\n| style     | Style                                             | CSSProperties | -        |\n\n#### Paragraph paragraph\n\n| Property      | Description                                         | Type          | Default Value |\n| --------- | -------------------------------------------- | ------------- | ------ |\n| animate   | Show animation effect                             | boolean       | false  |\n| className | Class Name                                         | string        | -      |\n| loading   | When true, displays the accounting bitmap. On the other hand, it shows the subassembly directly. | boolean       | true   |\n| rows      | Number of paragraph lines, greater than 0                        | number        | 3      |\n| style     | Style                                         | CSSProperties | -      |\n\n#### Title Title\n\n| Property      | Description                                         | Type          | Default Value |\n| --------- | -------------------------------------------- | ------------- | ------ |\n| animate   | Show animation effect                             | boolean       | false  |\n| className | Class Name                                         | string        | -      |\n| loading   | When true, displays the accounting bitmap. On the other hand, it shows the subassembly directly. | boolean       | true   |\n| style     | Style                                         | CSSProperties | -      |\n\n#### Button Button\n\n| Property      | Description                                         | Type          | Default Value   |\n| --------- | -------------------------------------------- | ------------- | -------- |\n| animate   | Show animation effect                             | boolean       | false    |\n| className | Class Name                                         | string        | -        |\n| loading   | When true, displays the accounting bitmap. On the other hand, it shows the subassembly directly. | boolean       | true     |\n| size      | size,`small`、`medium` or `large`           | string        | `medium` |\n| style     | Style                                         | CSSProperties | -        |\n\n#### Input input box\n\n| Property      | Description                                         | Type          | Default Value |\n| --------- | -------------------------------------------- | ------------- | ------ |\n| animate   | Show animation effect                             | boolean       | false  |\n| className | Class Name                                         | string        | -      |\n| loading   | When true, displays the accounting bitmap. On the other hand, it shows the subassembly directly. | boolean       | true   |\n| style     | Style                                         | CSSProperties | -      |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                            | Default Value                                                                                            | Dark Mode Default                                                                                    | Remarks                 |\n| --------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | -------------------- |\n| --selector-background-color       | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | Selector Background Color       |\n| --selector-item-background        | <div style=\"width: 150px; height: 30px; background-color: #f5f5f5; color: #333333;\">#f5f5f5</div> | <div style=\"width: 150px; height: 30px; background-color: #121212; color: #ffffff;\">#121212</div> | Selector item background color     |\n| --selector-item-active-background | <div style=\"width: 150px; height: 30px; background-color: #e7f1ff; color: #333333;\">#e7f1ff</div> | <div style=\"width: 150px; height: 30px; background-color: #0d2543; color: #ffffff;\">#0d2543</div> | Selector Activate Item Background Color |\n| --selector-item-color             | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | Selector item color         |\n| --selector-item-sub-color         | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | Selector item sub-color       |\n"
  },
  {
    "path": "src/Skeleton/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"avatar\": \"./Avatar/index\",\n    \"paragraph\": \"./Paragraph/index\",\n    \"title\": \"./Title/index\"\n  }\n}\n"
  },
  {
    "path": "src/Skeleton/index.less",
    "content": "@import (reference) './variable.less';\n\n.@{skeletonPrefix} {\n  display: flex;\n  align-items: flex-start;\n  width: 100%;\n  flex: 1;\n  flex-wrap: nowrap;\n  &-avatar-wrapper {\n    flex-shrink: 0;\n    padding-right: 32 * @rpx;\n    & + .@{skeletonPrefix}-content-wrapper {\n      padding-top: 24 * @rpx;\n    }\n  }\n  &-content-wrapper {\n    flex: 1;\n    width: 100%;\n  }\n}\n"
  },
  {
    "path": "src/Skeleton/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 反馈引导\n  order: 12\ntoc: 'content'\n---\n\n# Skeleton 骨架屏\n\n在需要等待加载内容的位置提供一个占位图形组合。\n\n- 网络较慢，需要长时间等待加载，并且只在第一次加载的时候使用。\n- 在确保手机性能的前提下，尽量使用预加载，最好不用骨架屏。\n- 适用于图文信息较多且重要的首页、列表、卡片中。小的模块类组件（例如弹窗）不要使用。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-skeleton\": \"antd-mini/es/Skeleton/index\",\n  \"ant-skeleton-avatar\": \"antd-mini/es/Skeleton/Avatar/index\",\n  \"ant-skeleton-title\": \"antd-mini/es/Skeleton/Title/index\",\n  \"ant-skeleton-button\": \"antd-mini/es/Skeleton/Button/index\",\n  \"ant-skeleton-paragraph\": \"antd-mini/es/Skeleton/Paragraph/index\",\n  \"ant-skeleton-input\": \"antd-mini/es/Skeleton/Input/index\",\n#endif\n#if WECHAT\n  \"ant-skeleton\": \"antd-mini/Skeleton/index\",\n  \"ant-skeleton-avatar\": \"antd-mini/Skeleton/Avatar/index\",\n  \"ant-skeleton-title\": \"antd-mini/Skeleton/Title/index\",\n  \"ant-skeleton-button\": \"antd-mini/Skeleton/Button/index\",\n  \"ant-skeleton-paragraph\": \"antd-mini/Skeleton/Paragraph/index\",\n  \"ant-skeleton-input\": \"antd-mini/Skeleton/Input/index\",\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-skeleton animate=\"{{true}}\" />\n```\n\n### 带头像\n\n```xml\n<ant-skeleton avatar=\"{{true}}\" />\n```\n\n### 自定义组合\n\n```xml\n<ant-skeleton-avatar />\n<ant-skeleton-paragraph rows=\"{{1}}\" />\n<ant-skeleton-input />\n<ant-skeleton-input />\n<ant-skeleton-input />\n<ant-skeleton-button size=\"small\" />\n```\n\n### 复杂组合\n\n```xml\n<ant-skeleton\n  loading=\"{{showLoading}}\"\n  title=\"{{false}}\"\n  avatar=\"{{true}}\"\n  paragraph=\"{{paragraph}}\">\n  <view class=\"container\">\n    <ant-avatar\n      src=\"https://images.unsplash.com/photo-1546967191-fdfb13ed6b1e?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&fit=crop&h=200&w=200&ixid=eyJhcHBfaWQiOjE3Nzg0fQ\" />\n    <view class=\"content\">\n        We supply a series of design principles, practical patterns and high\n        quality design resources, to help people create their product prototypes\n        beautifully and efficiently.\n    </view>\n  </view>\n</ant-skeleton>\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Skeleton/index'></code>\n\n## API\n\n### Skeleton\n\n| 属性      | 说明                                         | 类型                  | 默认值 |\n| --------- | -------------------------------------------- | --------------------- | ------ |\n| animate   | 是否展示动画效果                             | boolean               | false  |\n| avatar    | 是否显示头像占位图                           | `boolean \\| Avatar`   | false  |\n| className | 类名                                         | string                | -      |\n| loading   | 为 true 时，显示占位图。反之则直接展示子组件 | boolean               | true   |\n| paragraph | 段落                                         | `number \\| Paragraph` | true   |\n| style     | 样式                                         | CSSProperties         | -      |\n| title     | 是否显示标题占位图                           | boolean               | true   |\n\n### Avatar\n\n| 属性      | 说明                                             | 类型          | 默认值   |\n| --------- | ------------------------------------------------ | ------------- | -------- |\n| animate   | 是否展示动画效果                                 | boolean       | false    |\n| className | 类名                                             | string        | -        |\n| loading   | 为 true 时，显示占位图。反之则直接展示子组件     | boolean       | true     |\n| shape     | 头像形状 `circle` 或 `square`                    | string        | `square` |\n| size      | 头像大小 `x-small`、`small`、`medium` 或 `large` | string        | `medium` |\n| style     | 样式                                             | CSSProperties | -        |\n\n#### Paragraph 段落\n\n| 属性      | 说明                                         | 类型          | 默认值 |\n| --------- | -------------------------------------------- | ------------- | ------ |\n| animate   | 是否展示动画效果                             | boolean       | false  |\n| className | 类名                                         | string        | -      |\n| loading   | 为 true 时，显示占位图。反之则直接展示子组件 | boolean       | true   |\n| rows      | 段落行数，大于 0 展示                        | number        | 3      |\n| style     | 样式                                         | CSSProperties | -      |\n\n#### Title 标题\n\n| 属性      | 说明                                         | 类型          | 默认值 |\n| --------- | -------------------------------------------- | ------------- | ------ |\n| animate   | 是否展示动画效果                             | boolean       | false  |\n| className | 类名                                         | string        | -      |\n| loading   | 为 true 时，显示占位图。反之则直接展示子组件 | boolean       | true   |\n| style     | 样式                                         | CSSProperties | -      |\n\n#### Button 按钮\n\n| 属性      | 说明                                         | 类型          | 默认值   |\n| --------- | -------------------------------------------- | ------------- | -------- |\n| animate   | 是否展示动画效果                             | boolean       | false    |\n| className | 类名                                         | string        | -        |\n| loading   | 为 true 时，显示占位图。反之则直接展示子组件 | boolean       | true     |\n| size      | 大小，`small`、`medium` 或 `large`           | string        | `medium` |\n| style     | 样式                                         | CSSProperties | -        |\n\n#### Input 输入框\n\n| 属性      | 说明                                         | 类型          | 默认值 |\n| --------- | -------------------------------------------- | ------------- | ------ |\n| animate   | 是否展示动画效果                             | boolean       | false  |\n| className | 类名                                         | string        | -      |\n| loading   | 为 true 时，显示占位图。反之则直接展示子组件 | boolean       | true   |\n| style     | 样式                                         | CSSProperties | -      |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                            | 默认值                                                                                            | 深色模式默认值                                                                                    | 备注                 |\n| --------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | -------------------- |\n| --selector-background-color       | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | 选择器背景颜色       |\n| --selector-item-background        | <div style=\"width: 150px; height: 30px; background-color: #f5f5f5; color: #333333;\">#f5f5f5</div> | <div style=\"width: 150px; height: 30px; background-color: #121212; color: #ffffff;\">#121212</div> | 选择器项背景颜色     |\n| --selector-item-active-background | <div style=\"width: 150px; height: 30px; background-color: #e7f1ff; color: #333333;\">#e7f1ff</div> | <div style=\"width: 150px; height: 30px; background-color: #0d2543; color: #ffffff;\">#0d2543</div> | 选择器激活项背景颜色 |\n| --selector-item-color             | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | 选择器项颜色         |\n| --selector-item-sub-color         | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | 选择器项子颜色       |\n"
  },
  {
    "path": "src/Skeleton/index.ts",
    "content": "import { Component } from '../_util/simply';\nimport { SkeletonDefaultProps } from './props';\n\nComponent({ props: SkeletonDefaultProps });\n"
  },
  {
    "path": "src/Skeleton/props.ts",
    "content": "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { IBaseProps } from '../_util/base';\n\nexport interface ISkeletonBaseProps extends IBaseProps {\n  /**\n   * @description 为 true 时，显示占位图。反之则直接展示子组件\n   * @default true\n   */\n  loading?: boolean;\n  /**\n   * @description 是否展示动画效果\n   * @default false\n   */\n  animate?: boolean;\n}\n/**\n * @description 骨架屏\n */\nexport interface ISkeletonProps extends ISkeletonBaseProps {\n  /**\n   * @description 是否显示头像占位图\n   * @default false\n   */\n  avatar?:\n    | boolean\n    | {\n        shape?: 'circle' | 'square';\n        size?: 'x-small' | 'small' | 'medium' | 'large';\n      };\n  /**\n   * @description 是否显示标题占位图\n   * @default true\n   */\n  title?: boolean;\n  /**\n   * @description 段落\n   * @default true\n   */\n  paragraph?:\n    | boolean\n    | {\n        rows?: number;\n      };\n}\n\nexport const SkeletonDefaultBaseProps: ISkeletonBaseProps = {\n  loading: true,\n  animate: false,\n};\n\nexport const SkeletonDefaultProps: Partial<ISkeletonProps> = {\n  loading: true,\n  animate: false,\n  avatar: false,\n  title: true,\n  paragraph: true,\n};\n"
  },
  {
    "path": "src/Skeleton/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n@skeletonPrefix: ant-skeleton;\n\n@skeleton-fill: var(--color-border, @COLOR_BORDER);\n\n@avatar-size: 88 * @rpx;\n\n@default-radius: 8 * @rpx;\n\n@button-width: 120 * @rpx;\n@button-height: 48 * @rpx;\n\n@input-width: 400 * @rpx;\n@input-height: 40 * @rpx;\n\n.skeleton-animation() {\n  background: linear-gradient(\n    90deg,\n    var(--skeleton-animation-25, @COLOR_BORDER) 25%,\n    var(--skeleton-animation-37, @COLOR_TEXT_WEAK_FADED) 37%,\n    var(--skeleton-animation-63, @COLOR_BORDER) 63%\n  );\n  background-size: 400% 100%;\n  animation: ant-skeleton-loading 1.4s ease infinite;\n}\n\n@keyframes ant-skeleton-loading {\n  0% {\n    background-position: 100% 50%;\n  }\n  100% {\n    background-position: 0 50%;\n  }\n}\n"
  },
  {
    "path": "src/Slider/index.axml",
    "content": "<import-sjs\n  from=\"./index.sjs\"\n  name=\"sliderSjs\" />\n\n<template name=\"slider-handler\">\n  <view\n    class=\"ant-slider-handler\"\n    style=\"left: {{ position }}%\">\n    <popover\n      placement=\"top\"\n      visible=\"{{ showTooltip }}\"\n      showMask=\"{{ false }}\">\n      <!-- #if ALIPAY -->\n      <slot name=\"slider\">\n      <!-- #endif -->\n        <view class=\"ant-slider-handler-block\">\n          <view class=\"ant-slider-handler-icon-default\">\n            <view class=\"ant-slider-handler-icon-default-line1\" />\n            <view class=\"ant-slider-handler-icon-default-line2\" />\n            <view class=\"ant-slider-handler-icon-default-line3\" />\n          </view>\n        </view>\n      <!-- #if ALIPAY -->\n      </slot>\n      <!-- #endif -->\n      <view\n        slot=\"content\"\n        class=\"ant-slider-tooltip-content\">\n        <!-- #if ALIPAY -->\n        <slot\n          name=\"tooltip\"\n          value=\"{{ value }}\">\n        <!-- #endif -->\n          {{ value }}\n        <!-- #if ALIPAY -->\n        </slot>\n        <!-- #endif -->\n      </view>\n    </popover>\n  </view>\n</template>\n\n<view\n  class=\"ant-slider {{ className ? className : '' }}\"\n  style=\"opacity: {{ disabled ? '0.4' : '1' }};{{style}}\">\n  <view\n    class=\"ant-slider-track {{ showNumber ? 'ant-slider-track-number' : '' }}\">\n    <view\n      class=\"ant-slider-track-touch-area\"\n      id=\"ant-slider-id-{{ $id || '' }}\"\n      onTouchStart=\"handleTrackTouchStart\"\n      onTouchEnd=\"handleTrackTouchEnd\"\n      onTouchMove=\"handleTrackTouchMove\">\n      <view class=\"ant-slider-track-fill\">\n        <view class=\"ant-slider-track-fill-background\" />\n        <view\n          class=\"ant-slider-track-fill-front {{ activeLineClassName || '' }}\"\n          style=\"width: {{ sliderWidth }}%; left: {{ sliderLeft }}%; {{ activeLineStyle || '' }}\" />\n        <view class=\"ant-slider-showTicks\">\n          <block\n            a:for=\"{{ tickList }}\"\n            a:for-index=\"index\"\n            a:for-item=\"item\">\n            <view\n              class=\"ant-slider-tick ant-slider-tick-{{ sliderSjs.isFrontTick(item, sliderLeft, sliderWidth) ? 'front' : 'back' }} {{ sliderSjs.isFrontTick(item, sliderLeft, sliderWidth) && activeDotClassName ? activeDotClassName : '' }}\"\n              style=\"left: {{ item.left }}%;{{ sliderSjs.isFrontTick(item, sliderLeft, sliderWidth) && activeDotStyle ? activeDotStyle : '' }}\">\n              <view\n                a:if=\"{{ showNumber }}\"\n                class=\"ant-slider-tick-number\">\n                <!-- #if ALIPAY -->\n                <slot\n                  name=\"tick\"\n                  value=\"{{ item.value }}\">\n                <!-- #endif -->\n                  {{ item.value }}\n                <!-- #if ALIPAY -->\n                </slot>\n                <!-- #endif -->\n              </view>\n            </view>\n          </block>\n        </view>\n        <block a:if=\"{{ range }}\">\n          <template\n            is=\"slider-handler\"\n            data=\"{{ position: sliderLeft, icon: icon, value: mixin.value[0], showTooltip: changingStart && showTooltip }}\" />\n        </block>\n        <template\n          is=\"slider-handler\"\n          data=\"{{ position: sliderLeft + sliderWidth, icon: icon, value: range ? mixin.value[1] : mixin.value, showTooltip: changingEnd && showTooltip }}\" />\n      </view>\n    </view>\n  </view>\n  <view />\n</view>\n"
  },
  {
    "path": "src/Slider/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Information Entry\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Slider\n\nYou can take values within a range by moving the slider. Used to move the slider within a certain range to obtain a single or interval value.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-slider\": \"antd-mini/es/Slider/index\"\n#endif\n#if WECHAT\n  \"ant-slider\": \"antd-mini/Slider/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n> By default a slider,`change` event fires when the slider value changes, `afterChange` Events and `touchend` The trigger timing is consistent.\n\n```xml\n<ant-slider\n  defaultValue=\"{{80}}\"\n#if ALIPAY\n  onChange=\"onChange\"\n  onAfterChange=\"onAfterChange\"\n#endif\n#if WECHAT\n  bindchange=\"onChange\"\n  bindafterchange=\"onAfterChange\"\n#endif\n/>\n```\n\n```js\nPage({\n  onChange(value, e) {\n    console.log('slider changed:', value, e);\n  },\n  onAfterChange(value, e) {\n    console.log('Current Value:', value, e);\n#if ALIPAY\n    my.showToast({ content: 'value: ' + value });\n#endif\n#if WECHAT\n    wx.showToast({ title: `value: ${value.detail}` });\n#endif\n  },\n});\n```\n\n### Disable state\n\n```xml\n  <ant-slider defaultValue=\"{{80}}\" disabled />\n```\n\n### Dual Slider Mode\n\n> Incoming `range` property, the dual slider mode is supported,`value` The status value type will also become an array.\n\n```xml\n<ant-slider defaultValue=\"{{[20, 60]}}\" range />\n```\n\n### Nodes and scales\n\n> Incoming `showTicks` property display scale, passing in `showNumber` Shows the data on the scale.\n\n```xml\n<ant-slider defaultValue=\"{{80}}\" step=\"{{20}}\" showTicks showNumber />\n```\n\n### Hover Tip\n\n> Incoming `showTooltip` Property, you can display a hovering prompt when dragging.\n\n```xml\n<ant-slider defaultValue=\"{{80}}\" showTooltip />\n#if ALIPAY\n<!-- 支持使用作用域插槽自定义 -->\n<ant-slider defaultValue=\"{{80}}\" showTooltip>\n  <view slot=\"tooltip\" slot-scope=\"prop\">Slot Customization:{{prop.value}}</view>\n</ant-slider>\n#endif\n```\n\n### Controlled Mode\n\n> `value` property and `change` Events, cooperation can achieve a controlled mode. Here's the example through `ant-stepper` Component change `value` Status,`ant-slider` Components `value` States can also change together.\n\n```xml\n<ant-slider\n  min=\"{{0}}\"\n  max=\"{{100}}\"\n  value=\"{{value}}\"\n#if ALIPAY\n  onChange=\"handleChange\"\n#endif\n#if WECHAT\n  bindchange=\"handleChange\"\n#endif\n/>\n<ant-stepper\n  min=\"{{0}}\"\n  max=\"{{100}}\"\n  value=\"{{value}}\"\n#if ALIPAY\n  onChange=\"handleChange\"\n#endif\n#if WECHAT\n  bindchange=\"handleChange\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    value: 80,\n  },\n  handleChange(value, e) {\n    console.log('slider changed:', value, e);\n#if ALIPAY\n    this.setData({\n      value,\n    });\n#endif\n#if WECHAT\n    this.setData({\n      value: value.detail,\n    });\n#endif\n  },\n});\n```\n\n### Custom Style\n\n> `activeLineStyle`、`activeDotStyle` Property to customize the style.\n\n```xml\n<ant-slider\n  defaultValue=\"{{80}}\"\n  step=\"{{20}}\"\n  showTooltip\n  showTicks\n  showNumber\n  activeLineStyle=\"background-color: #ff8f1f\"\n  activeDotStyle=\"background-color: red\"\n>\n#if WECHAT\n  <!-- 微信暂时不支持 slot -->\n#endif\n#if ALIPAY\n  <text\n    slot=\"tick\"\n    slot-scope=\"props\"\n    >{{props.value}}°C</text\n  >\n  <text\n    slot=\"tooltip\"\n    slot-scope=\"props\"\n    >{{props.value}}°C</text\n  >\n\n  <view slot=\"slider\">\n    <view class=\"custom-slider-handler\">\n      <ant-icon\n        type=\"SmileOutline\"\n        style=\"color: #ff8f1f\" />\n    </view>\n  </view>\n#endif\n</ant-slider>\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Slider/index'></code>\n\n## API\n\n| Property                        | Description                                               | Type                                              | Default Value |\n| --------------------------- | -------------------------------------------------- | ------------------------------------------------- | ------ |\n| activeDotClassName          | Class name of selected dot                                   | string                                            | -      |\n| activeLineClassName         | The style of the selected line                                     | string                                            | -      |\n| activeDotStyle              | Select the type of dot                                   | string                                            | -      |\n| activeLineStyle             | The style of the selected line                                     | string                                            | -      |\n| className                   | Class Name                                               | string                                            | -      |\n| defaultValue                | Initial value                                             | number \\| [number, number]                        | -      |\n| disabled                    | Disable                                           | boolean                                           | false  |\n| max                         | Maximum                                             | number                                            | 100    |\n| min                         | Minimum                                             | number                                            | 0      |\n| range                       | Whether it is a double slider                                       | boolean                                           | false  |\n| showNumber                  | Show data on scale                               | boolean                                           | false  |\n| step                        | Step, the value must be greater than 0 and divisible by (max-min)    | number                                            | 1      |\n| style                       | Style                                               | string                                            | -      |\n| showTicks                   | Show scale                                       | boolean                                           | false  |\n| showTooltip                 | Whether to display the floating prompt when dragging, support the use of scope slot customization | boolean                                           | false  |\n| slider                      | Custom Slider                                         | slot                                              | -      |\n| tick                        | Custom Scale                                         | slot                                              | -      |\n| tooltip                     | Show hover prompt when custom drag                           | slot                                              | -      |\n| value                       | Current Value                                             | number \\| [number, number]                        | -      |\n| #if ALIPAY onChange         | Triggers when the slider value changes                                | (value: number &verbar; [number, number]) => void | -      |\n| #if ALIPAY onAfterChange    | Consistent with the touchend trigger timing, the current value is passed in as a parameter.     | (value: number &verbar; [number, number]) => void | -      |\n| #if WECHAT bindchange      | Triggers when the slider value changes                                | (value: number &verbar; [number, number]) => void | -      |\n| #if WECHAT bindafterchange | Consistent with the touchend trigger timing, the current value is passed in as a parameter.     | (value: number &verbar; [number, number]) => void | -      |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                         | Default Value                                                                                                                    | Dark Mode Default                                                                                                            | Remarks             |\n| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ---------------- |\n| --slide-block-shadow           | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.12); color: #ffffff;\">rgba(0, 0, 0, 0.12)</div> | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.12); color: #ffffff;\">rgba(0, 0, 0, 0.12)</div> | Slider Block Shadow       |\n| --slider-default-primary-color | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div>                         | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div>                         | Slider default main color     |\n| --slider-track-bg              | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div>                         | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div>                         | Slider track background color |\n| --slider-fill-bg               | <div style=\"width: 150px; height: 30px; background-color: #f5f5f5; color: #333333;\">#f5f5f5</div>                         | <div style=\"width: 150px; height: 30px; background-color: #121212; color: #ffffff;\">#121212</div>                         | Slider Fill Background Color |\n| --slider-number-color          | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div>                         | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div>                         | Slider number color     |\n| --slide-block-bg               | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div>                         | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div>                         | Slider block background color   |\n| --slide-back-bg                | <div style=\"width: 150px; height: 30px; background-color: #f5f5f5; color: #333333;\">#f5f5f5</div>                         | <div style=\"width: 150px; height: 30px; background-color: #121212; color: #ffffff;\">#121212</div>                         | Slider Background Color     |\n"
  },
  {
    "path": "src/Slider/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"popover\": \"../Popover/index\"\n  }\n}\n"
  },
  {
    "path": "src/Slider/index.less",
    "content": "@import (reference) './variable.less';\n\n@collapsePrefix: ant-slider;\n\n.@{collapsePrefix} {\n  user-select: none;\n  width: 100%;\n\n  &-track {\n    position: relative;\n    width: 100%;\n    height: 56 * @rpx;\n    background-color: @slider-track-bg;\n\n    &-number {\n      height: 97 * @rpx;\n    }\n\n    &-touch-area {\n      position: absolute;\n      left: 28 * @rpx;\n      top: 0 * @rpx;\n      right: 25 * @rpx;\n      height: 100%;\n    }\n\n    &-fill {\n      position: absolute;\n      left: 0 * @rpx;\n      top: 25 * @rpx;\n      right: 0 * @rpx;\n      height: 6 * @rpx;\n\n      &-background {\n        position: absolute;\n        background-color: @slider-fill-bg;\n        width: 100%;\n        height: 100%;\n        border-radius: 3 * @rpx;\n      }\n\n      &-front {\n        position: absolute;\n        height: 100%;\n        border-radius: 3 * @rpx;\n        background-color: @slider-default-primary-color;\n      }\n    }\n  }\n\n  &-handler {\n    position: absolute;\n    touch-action: none;\n    left: 0;\n    transform: translate(-50%, -50%);\n    top: 3 * @rpx;\n\n    &-block {\n      width: 56 * @rpx;\n      height: 56 * @rpx;\n      background: @slide-block-bg;\n      box-shadow: 0 4 * @rpx 10 * @rpx 0 @slide-block-shadow;\n      border-radius: 56 * @rpx;\n      text-align: center;\n      line-height: 56 * @rpx;\n      color: @slider-default-primary-color;\n    }\n\n    &-icon-default {\n      position: absolute;\n      top: 0;\n      left: 0;\n      right: 0;\n      bottom: 0;\n\n      &-line1 {\n        position: absolute;\n        width: 4 * @rpx;\n        height: 16 * @rpx;\n        background-color: @slider-default-primary-color;\n        border-radius: 2 * @rpx;\n        top: 20 * @rpx;\n        left: 16 * @rpx;\n      }\n\n      &-line2 {\n        position: absolute;\n        width: 4 * @rpx;\n        height: 24 * @rpx;\n        background-color: @slider-default-primary-color;\n        border-radius: 2 * @rpx;\n        top: 16 * @rpx;\n        right: 26 * @rpx;\n      }\n\n      &-line3 {\n        position: absolute;\n        width: 4 * @rpx;\n        height: 16 * @rpx;\n        background-color: @slider-default-primary-color;\n        border-radius: 2 * @rpx;\n        top: 20 * @rpx;\n        right: 16 * @rpx;\n      }\n    }\n\n    &-icon-from-props {\n      position: absolute;\n      top: 0;\n      left: 0;\n      right: 0;\n      bottom: 0;\n      text-align: center;\n      line-height: 100%;\n\n      &-icon {\n        position: absolute;\n        left: 50%;\n        top: 50%;\n        transform: translate(-50%, -50%);\n      }\n    }\n  }\n\n  &-tick {\n    position: absolute;\n    width: 16 * @rpx;\n    height: 16 * @rpx;\n    border-radius: 16 * @rpx;\n    top: 3 * @rpx;\n    transform: translate(-50%, -50%);\n\n    &-front {\n      background-color: @slider-default-primary-color;\n    }\n\n    &-back {\n      background-color: @slide-back-bg;\n    }\n\n    &-number {\n      position: absolute;\n      color: @slider-number-color;\n      font-size: 24 * @rpx;\n      transform: translateX(-50%);\n      top: 44 * @rpx;\n      left: 8 * @rpx;\n      text-align: center;\n      line-height: 33 * @rpx;\n      height: 33 * @rpx;\n    }\n  }\n}\n"
  },
  {
    "path": "src/Slider/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 数据录入\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Slider 滑块\n\n可以通过移动滑块在某一范围内取值。用于在一定范围内移动滑块获取单个或者区间数值。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-slider\": \"antd-mini/es/Slider/index\"\n#endif\n#if WECHAT\n  \"ant-slider\": \"antd-mini/Slider/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n> 默认情况下一个滑块，`change` 事件在 slider 值改变时触发， `afterChange` 事件与 `touchend` 触发时机一致。\n\n```xml\n<ant-slider\n  defaultValue=\"{{80}}\"\n#if ALIPAY\n  onChange=\"onChange\"\n  onAfterChange=\"onAfterChange\"\n#endif\n#if WECHAT\n  bindchange=\"onChange\"\n  bindafterchange=\"onAfterChange\"\n#endif\n/>\n```\n\n```js\nPage({\n  onChange(value, e) {\n    console.log('slider changed:', value, e);\n  },\n  onAfterChange(value, e) {\n    console.log('当前值:', value, e);\n#if ALIPAY\n    my.showToast({ content: 'value: ' + value });\n#endif\n#if WECHAT\n    wx.showToast({ title: `value: ${value.detail}` });\n#endif\n  },\n});\n```\n\n### 禁用状态\n\n```xml\n  <ant-slider defaultValue=\"{{80}}\" disabled />\n```\n\n### 双滑块模式\n\n> 传入 `range` 属性之后，将支持双滑块模式，`value` 状态值类型也将变成数组。\n\n```xml\n<ant-slider defaultValue=\"{{[20, 60]}}\" range />\n```\n\n### 节点和刻度\n\n> 传入 `showTicks` 属性显示刻度，传入 `showNumber` 展示刻度上的数据。\n\n```xml\n<ant-slider defaultValue=\"{{80}}\" step=\"{{20}}\" showTicks showNumber />\n```\n\n### 悬浮提示\n\n> 传入 `showTooltip` 属性，可以在拖动时显示悬浮提示。\n\n```xml\n<ant-slider defaultValue=\"{{80}}\" showTooltip />\n#if ALIPAY\n<!-- 支持使用作用域插槽自定义 -->\n<ant-slider defaultValue=\"{{80}}\" showTooltip>\n  <view slot=\"tooltip\" slot-scope=\"prop\">插槽自定义:{{prop.value}}</view>\n</ant-slider>\n#endif\n```\n\n### 受控模式\n\n> `value` 属性和 `change` 事件，配合可以实现受控模式。这里的例子中通过 `ant-stepper` 组件改变 `value` 状态，`ant-slider` 组件 `value` 状态也能一起变化。\n\n```xml\n<ant-slider\n  min=\"{{0}}\"\n  max=\"{{100}}\"\n  value=\"{{value}}\"\n#if ALIPAY\n  onChange=\"handleChange\"\n#endif\n#if WECHAT\n  bindchange=\"handleChange\"\n#endif\n/>\n<ant-stepper\n  min=\"{{0}}\"\n  max=\"{{100}}\"\n  value=\"{{value}}\"\n#if ALIPAY\n  onChange=\"handleChange\"\n#endif\n#if WECHAT\n  bindchange=\"handleChange\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    value: 80,\n  },\n  handleChange(value, e) {\n    console.log('slider changed:', value, e);\n#if ALIPAY\n    this.setData({\n      value,\n    });\n#endif\n#if WECHAT\n    this.setData({\n      value: value.detail,\n    });\n#endif\n  },\n});\n```\n\n### 自定义样式\n\n> `activeLineStyle`、`activeDotStyle` 属性来自定义样式。\n\n```xml\n<ant-slider\n  defaultValue=\"{{80}}\"\n  step=\"{{20}}\"\n  showTooltip\n  showTicks\n  showNumber\n  activeLineStyle=\"background-color: #ff8f1f\"\n  activeDotStyle=\"background-color: red\"\n>\n#if WECHAT\n  <!-- 微信暂时不支持 slot -->\n#endif\n#if ALIPAY\n  <text\n    slot=\"tick\"\n    slot-scope=\"props\"\n    >{{props.value}}°C</text\n  >\n  <text\n    slot=\"tooltip\"\n    slot-scope=\"props\"\n    >{{props.value}}°C</text\n  >\n\n  <view slot=\"slider\">\n    <view class=\"custom-slider-handler\">\n      <ant-icon\n        type=\"SmileOutline\"\n        style=\"color: #ff8f1f\" />\n    </view>\n  </view>\n#endif\n</ant-slider>\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Slider/index'></code>\n\n## API\n\n| 属性                        | 说明                                               | 类型                                              | 默认值 |\n| --------------------------- | -------------------------------------------------- | ------------------------------------------------- | ------ |\n| activeDotClassName          | 选中小圆点的类名                                   | string                                            | -      |\n| activeLineClassName         | 选中线条的样式                                     | string                                            | -      |\n| activeDotStyle              | 选中小圆点的类型                                   | string                                            | -      |\n| activeLineStyle             | 选中线条的样式                                     | string                                            | -      |\n| className                   | 类名                                               | string                                            | -      |\n| defaultValue                | 初始值                                             | number \\| [number, number]                        | -      |\n| disabled                    | 是否禁用                                           | boolean                                           | false  |\n| max                         | 最大值                                             | number                                            | 100    |\n| min                         | 最小值                                             | number                                            | 0      |\n| range                       | 是否是双滑块                                       | boolean                                           | false  |\n| showNumber                  | 是否展示刻度上的数据                               | boolean                                           | false  |\n| step                        | 步距，取值必须大于 0，并且可被 (max - min) 整除    | number                                            | 1      |\n| style                       | 样式                                               | string                                            | -      |\n| showTicks                   | 是否显示刻度                                       | boolean                                           | false  |\n| showTooltip                 | 是否在拖动时显示悬浮提示，支持使用作用域插槽自定义 | boolean                                           | false  |\n| slider                      | 自定义滑块                                         | slot                                              | -      |\n| tick                        | 自定义刻度                                         | slot                                              | -      |\n| tooltip                     | 自定义拖动时显示悬浮提示                           | slot                                              | -      |\n| value                       | 当前值                                             | number \\| [number, number]                        | -      |\n| #if ALIPAY onChange         | slider 值改变时触发                                | (value: number &verbar; [number, number]) => void | -      |\n| #if ALIPAY onAfterChange    | 与 touchend 触发时机一致，把当前值作为参数传入     | (value: number &verbar; [number, number]) => void | -      |\n| #if WECHAT bindchange      | slider 值改变时触发                                | (value: number &verbar; [number, number]) => void | -      |\n| #if WECHAT bindafterchange | 与 touchend 触发时机一致，把当前值作为参数传入     | (value: number &verbar; [number, number]) => void | -      |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                         | 默认值                                                                                                                    | 深色模式默认值                                                                                                            | 备注             |\n| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ---------------- |\n| --slide-block-shadow           | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.12); color: #ffffff;\">rgba(0, 0, 0, 0.12)</div> | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.12); color: #ffffff;\">rgba(0, 0, 0, 0.12)</div> | 滑块块阴影       |\n| --slider-default-primary-color | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div>                         | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div>                         | 滑块默认主色     |\n| --slider-track-bg              | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div>                         | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div>                         | 滑块轨道背景颜色 |\n| --slider-fill-bg               | <div style=\"width: 150px; height: 30px; background-color: #f5f5f5; color: #333333;\">#f5f5f5</div>                         | <div style=\"width: 150px; height: 30px; background-color: #121212; color: #ffffff;\">#121212</div>                         | 滑块填充背景颜色 |\n| --slider-number-color          | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div>                         | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div>                         | 滑块数字颜色     |\n| --slide-block-bg               | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div>                         | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div>                         | 滑块块背景颜色   |\n| --slide-back-bg                | <div style=\"width: 150px; height: 30px; background-color: #f5f5f5; color: #333333;\">#f5f5f5</div>                         | <div style=\"width: 150px; height: 30px; background-color: #121212; color: #ffffff;\">#121212</div>                         | 滑块背景颜色     |\n"
  },
  {
    "path": "src/Slider/index.sjs.ts",
    "content": "const isFrontTick = (item, sliderLeft, sliderWidth) => {\n  return item.left >= sliderLeft && item.left <= sliderLeft + sliderWidth;\n}\n\nexport default {\n  isFrontTick\n}"
  },
  {
    "path": "src/Slider/index.ts",
    "content": "import equal from 'fast-deep-equal';\nimport createValue from '../mixins/value';\nimport { getInstanceBoundingClientRect } from '../_util/jsapi/get-instance-bounding-client-rect';\nimport { Component, getValueFromProps, triggerEvent } from '../_util/simply';\nimport { assertAilpayNativeNotSupport } from '../_util/support';\nimport { sliderDefaultProps, SliderValue } from './props';\n\nassertAilpayNativeNotSupport('Slider');\n\nComponent({\n  props: sliderDefaultProps,\n  data: {\n    sliderLeft: 0,\n    sliderWidth: 0,\n    tickList: [],\n    changingStart: false,\n    changingEnd: false,\n  },\n  onChangeValue: undefined,\n  methods: {\n    getInstance() {\n      if (this.$id) {\n        return my;\n      }\n      return this;\n    },\n    formatValue(val) {\n      const [min, max, step, range] = getValueFromProps(this, [\n        'min',\n        'max',\n        'step',\n        'range',\n      ]);\n      let value = this.fitSliderValue(val, min, max, step, range);\n      value = this.getRoundedValue(value, step);\n      return value;\n    },\n    getRoundedValue(value: SliderValue, step = 1) {\n      if (value === undefined) {\n        return 0;\n      }\n\n      if (typeof value === 'number') {\n        return Math.round(value / step) * step;\n      }\n\n      return [\n        Math.round(value[0] / step) * step,\n        Math.round(value[1] / step) * step,\n      ] as SliderValue;\n    },\n\n    setSliderStyleByValue(roundedValue: SliderValue) {\n      let leftValue = 0;\n      let rightValue = 0;\n      const [minFromProps, maxFromProps] = getValueFromProps(this, [\n        'min',\n        'max',\n      ]);\n      const max = maxFromProps ?? sliderDefaultProps.max;\n      const min = minFromProps ?? sliderDefaultProps.min;\n\n      if (roundedValue !== undefined) {\n        if (typeof roundedValue === 'number') {\n          leftValue = min;\n          rightValue = roundedValue;\n        } else {\n          leftValue = roundedValue[0];\n          rightValue = roundedValue[1];\n        }\n      }\n\n      // FIX_ME when min and max is equal\n      const width = ((rightValue - leftValue) / (max - min)) * 100;\n      const left = ((leftValue - min) / (max - min)) * 100;\n\n      this.setData({\n        sliderLeft: left,\n        sliderWidth: width,\n      });\n    },\n\n    setTickList() {\n      const [step, min, max, showTicks] = getValueFromProps(this, [\n        'step',\n        'min',\n        'max',\n        'showTicks',\n      ]);\n      if (!showTicks) {\n        return;\n      }\n      const tickList = [];\n      const stepCount = (max - min) / step;\n\n      for (let i = 0; i <= stepCount; i += 1) {\n        tickList.push({\n          left: i * (100 / stepCount),\n          value: i * step + min,\n        });\n      }\n\n      this.setData({\n        tickList,\n      });\n    },\n\n    async onTouchChanged(e, type) {\n      if (getValueFromProps(this, 'disabled')) {\n        return;\n      }\n      const changeMoving = (params) => {\n        const newParams = {};\n        for (const key in params) {\n          if (params[key] !== this.data[key]) {\n            newParams[key] = params[key];\n          }\n        }\n        if (Object.keys(newParams).length > 0) {\n          this.setData(newParams);\n        }\n      };\n\n      const rect = await this.getRect(e);\n      if (!rect) return;\n      const [min, max, range] = getValueFromProps(this, [\n        'min',\n        'max',\n        'range',\n      ]);\n      const touchPosition =\n        (rect.touch.pageX - rect.element.left) / rect.element.width;\n      const value = min + touchPosition * (max - min);\n      if (!range) {\n        this.update(value, {}, !this.isControlled(), true);\n        changeMoving({ changingEnd: true });\n      } else {\n        const currentValue = this.getValue();\n\n        const leftValue = currentValue[0];\n        const rightValue = currentValue[1];\n        const leftDistance = Math.abs(leftValue - value);\n        const rightDistance = Math.abs(rightValue - value);\n        const isFarFromLeft = leftDistance > rightDistance;\n        const farValue = isFarFromLeft ? leftValue : rightValue;\n\n        this.update([value, farValue], {}, !this.isControlled(), 'onChange');\n        if (isFarFromLeft) {\n          changeMoving({ changingEnd: true });\n        } else {\n          changeMoving({ changingStart: true });\n        }\n      }\n\n      if (type === 'end') {\n        changeMoving({ changingEnd: false, changingStart: false });\n        triggerEvent(this, 'afterChange', this.getValue(), e);\n      }\n    },\n\n    async getRect(e: any): Promise<any> {\n      const element = await getInstanceBoundingClientRect(\n        this.getInstance(),\n        `#ant-slider-id-${this.$id || ''}`\n      );\n      const touch = e.changedTouches[0];\n      if (element) {\n        return {\n          touch: {\n            pageX: touch.pageX,\n          },\n          element: {\n            left: element.left,\n            width: element.width,\n          },\n        };\n      }\n    },\n\n    cloneSliderValue(value?: SliderValue) {\n      if (typeof value === 'object') {\n        return [value[0], value[1]];\n      }\n\n      return value;\n    },\n\n    isSliderValueEqual(value1?: SliderValue, value2?: SliderValue) {\n      if (value1 === value2) {\n        return true;\n      }\n\n      if (value1 === undefined || value2 === undefined) {\n        return false;\n      }\n\n      if (typeof value1 === 'number' || typeof value2 == 'number') {\n        return value1 === value2;\n      }\n\n      if (value1[0] === value2[0] && value1[1] === value2[1]) {\n        return true;\n      }\n\n      return false;\n    },\n\n    fitSliderValue(\n      value: SliderValue | undefined,\n      min: number,\n      max: number,\n      step: number,\n      isRange: boolean\n    ) {\n      if (value === undefined || value === null) {\n        if (isRange) {\n          return [min, min] as SliderValue;\n        } else {\n          return min ?? 0;\n        }\n      }\n\n      if (typeof value === 'number') {\n        if (value > max) {\n          return max;\n        }\n\n        if (value < min) {\n          return min;\n        }\n\n        return value;\n      }\n\n      const leftValue = Math.min(value[0], value[1]);\n      const rightValue = Math.max(value[0], value[1]);\n\n      return [\n        Math.max(min, leftValue),\n        Math.min(max, rightValue),\n      ] as SliderValue;\n    },\n\n    handleTrackTouchStart(e) {\n      this.onTouchChanged(e, 'start');\n    },\n\n    handleTrackTouchMove(e) {\n      this.onTouchChanged(e, 'move');\n    },\n\n    handleTrackTouchEnd(e) {\n      this.onTouchChanged(e, 'end');\n    },\n  },\n  mixins: [\n    createValue({\n      transformValue(val, extra, needUpdate = true, emit) {\n        const value = this.formatValue(val);\n        if (needUpdate) {\n          this.setSliderStyleByValue(value);\n          this.setTickList();\n        }\n        this.onChangeValue =\n          typeof this.onChangeValue === 'undefined'\n            ? this.getValue()\n            : this.onChangeValue;\n        if (emit && !this.isSliderValueEqual(this.onChangeValue, value)) {\n          this.onChangeValue = value;\n          triggerEvent(this, 'change', value);\n        }\n        return {\n          value,\n          needUpdate,\n        };\n      },\n    }),\n  ],\n  /// #if ALIPAY\n  didUpdate(prevProps) {\n    const [min, max, step, range, showTicks, value] = getValueFromProps(this, [\n      'min',\n      'max',\n      'step',\n      'range',\n      'showTicks',\n      'value',\n    ]);\n    if (\n      !equal(min, prevProps.min) ||\n      !equal(max, prevProps.max) ||\n      !equal(step, prevProps.step) ||\n      !equal(range, prevProps.range) ||\n      !equal(showTicks, prevProps.showTicks)\n    ) {\n      this.update(value);\n    }\n  },\n  /// #endif\n  /// #if WECHAT\n  observers: {\n    'min, max, step, range, showTicks': function () {\n      const value = getValueFromProps(this, 'value');\n\n      this.update(value);\n    },\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/Slider/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\n/**\n * @description 滑块\n */\n\nexport type SliderValue = number | [number, number];\n\nexport interface ISliderProps extends IBaseProps {\n  /**\n   * @description 当前值\n   */\n  value: SliderValue;\n\n  defaultValue: SliderValue;\n\n  /**\n   * @description 是否禁用\n   * @default false\n   */\n  disabled?: boolean;\n\n  /**\n   * @description 最大值\n   * @default 100\n   */\n  max: number;\n\n  /**\n   * @description 最小值\n   * @default 0\n   */\n  min: number;\n\n  /**\n   * @description 是否是双滑块\n   * @default false\n   */\n  range: boolean;\n\n  /**\n   * @description 是否展示刻度上的数据\n   * @default false\n   */\n  showNumber: boolean;\n\n  /**\n   * @description 步距，取值必须大于 0，并且可被 (max - min) 整除。当 marks 不为空对象时，step 的配置失效\n   * @default 1\n   */\n  step: number;\n\n  /**\n   * @description 是否显示刻度\n   * @default false\n   */\n  showTicks: boolean;\n\n  /**\n   * @description 是否在拖动时显示悬浮提示\n   * @default false\n   */\n  showTooltip: boolean;\n  /**\n   * @deprecated 选中线条的样式\n   */\n  activeLineStyle?: string;\n  /**\n   * @description 选中线条的样式\n   */\n  activeDotStyle?: string;\n  /**\n   * @description 选中线条的样式\n   * @default '''\n   */\n  activeLineClassName?: string;\n\n  /**\n   * @description 选中小圆点的类名\n   */\n  activeDotClassName?: string;\n\n  /**\n   * @description 输入变化的时候触发， 参数为滑动组件的当前值\n   */\n  onChange: (value: SliderValue, event) => void;\n\n  /**\n   * @description 与 touchend 触发时机一致，把当前值作为参数传入\n   */\n  onAfterChange: (value: SliderValue, event) => void;\n}\n\nexport const sliderDefaultProps: Partial<ISliderProps> = {\n  value: null,\n  defaultValue: null,\n  disabled: false,\n  max: 100,\n  min: 0,\n  range: false,\n  showNumber: false,\n  step: 1,\n  showTicks: false,\n  showTooltip: false,\n  activeLineStyle: '',\n  activeDotStyle: '',\n  activeLineClassName: '',\n  activeDotClassName: '',\n};\n"
  },
  {
    "path": "src/Slider/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n@slider-default-primary-color: var(\n  --slider-default-primary-color,\n  @COLOR_BRAND1\n);\n@slider-track-bg: var(--slider-track-bg, @COLOR_CARD);\n@slider-fill-bg: var(--slider-fill-bg, @COLOR_GREY_CARD);\n@slider-number-color: var(--slider-number-color, @COLOR_TEXT_PRIMARY);\n@slide-block-bg: var(--slide-block-bg, @COLOR_WHITE);\n@slide-block-shadow: var(--slide-block-shadow, rgba(0, 0, 0, 0.12));\n@slide-back-bg: var(--slide-back-bg, @COLOR_GREY_CARD);\n"
  },
  {
    "path": "src/Space/index.axml",
    "content": "<!-- Space组件模板 -->\n<import-sjs\n  from=\"./index.sjs\"\n  name=\"spaceSjs\" />\n\n<view\n  class=\"ant-space {{ spaceSjs.getSpaceClass(direction, wrap, align, justify) }} {{ className || '' }}\"\n  style=\"{{ spaceSjs.getSpaceStyle(size) }}{{ style ? ';' + style : '' }}\">\n  <slot />\n</view>\n"
  },
  {
    "path": "src/Space/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Layout\n  order: 1\ntoc: 'content'\n---\n\n# Space\n\nSet the spacing between components.\n\n## When to use\n\nAvoid components sticking together and create uniform spacing.\n\n- Suitable for horizontal spacing of inline elements.\n- Various horizontal alignment methods can be set.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-space\": \"antd-mini/es/Space/index\"\n#endif\n#if WECHAT\n  \"ant-space\": \"antd-mini/Space/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<ant-space>\n  <ant-button type=\"primary\">Button 1</ant-button>\n  <ant-button>Button 2</ant-button>\n  <ant-button>Button 3</ant-button>\n</ant-space>\n```\n\n### Vertical Space\n\n```xml\n<ant-space direction=\"vertical\">\n  <ant-button type=\"primary\">Button 1</ant-button>\n  <ant-button>Button 2</ant-button>\n  <ant-button>Button 3</ant-button>\n</ant-space>\n```\n\n### Space Size\n\n```xml\n<ant-space size=\"small\">\n  <ant-button type=\"primary\">Button 1</ant-button>\n  <ant-button>Button 2</ant-button>\n  <ant-button>Button 3</ant-button>\n</ant-space>\n```\n\n### Alignment\n\n```xml\n<ant-space align=\"start\">\n  <ant-button type=\"primary\">Button 1</ant-button>\n  <view class=\"custom-box\">Content with different height</view>\n  <ant-button>Button 3</ant-button>\n</ant-space>\n```\n\n### Auto Wrap\n\n```xml\n<ant-space wrap>\n  <ant-button type=\"primary\">Button 1</ant-button>\n  <ant-button>Button 2</ant-button>\n  <ant-button>Button 3</ant-button>\n  <ant-button>Button 4</ant-button>\n  <ant-button>Button 5</ant-button>\n</ant-space>\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Space/index'></code>\n\n## API\n\n| Property | Description | Type | Default Value |\n| --- | --- | --- | --- |\n| direction | Space direction | `'horizontal'` \\| `'vertical'` | `'horizontal'` |\n| size | Space size | `'small'` \\| `'middle'` \\| `'large'` \\| `number` | `'middle'` |\n| align | Alignment | `'start'` \\| `'end'` \\| `'center'` \\| `'baseline'` | `'center'` |\n| justify | Main axis alignment | `'start'` \\| `'end'` \\| `'center'` \\| `'space-around'` \\| `'space-between'` | `'start'` |\n| wrap | Whether to automatically wrap | `boolean` | `false` |\n| className | Custom class name | `string` | - |\n| style | Custom style | `string` | - |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name | Default Value | Dark Mode Default | Remarks |\n| --- | --- | --- | --- |\n| --space-gap | 8px | 8px | Space size |\n"
  },
  {
    "path": "src/Space/index.json",
    "content": "{\n  \"component\": true\n}"
  },
  {
    "path": "src/Space/index.less",
    "content": "@spacePrefix: ant-space;\n\n.@{spacePrefix} {\n  display: inline-flex;\n\n  // 排列方向\n  &-horizontal {\n    flex-direction: row;\n  }\n\n  &-vertical {\n    flex-direction: column;\n  }\n\n  // 自动换行\n  &-wrap {\n    flex-wrap: wrap;\n  }\n\n  // 交叉轴对齐方式\n  &-align {\n    &-start {\n      align-items: flex-start;\n    }\n\n    &-end {\n      align-items: flex-end;\n    }\n\n    &-center {\n      align-items: center;\n    }\n\n    &-baseline {\n      align-items: baseline;\n    }\n  }\n\n  // 主轴对齐方式\n  &-justify {\n    &-start {\n      justify-content: flex-start;\n    }\n\n    &-end {\n      justify-content: flex-end;\n    }\n\n    &-center {\n      justify-content: center;\n    }\n\n    &-space-around {\n      justify-content: space-around;\n    }\n\n    &-space-between {\n      justify-content: space-between;\n    }\n  }\n}\n"
  },
  {
    "path": "src/Space/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 布局\n  order: 1\ntoc: 'content'\n---\n\n# Space 间距\n\n设置组件之间的间距。\n\n## 何时使用\n\n避免组件紧贴在一起，拉开统一的空间。\n\n- 适合行内元素的水平间距。\n- 可以设置各种水平对齐方式。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-space\": \"antd-mini/es/Space/index\"\n#endif\n#if WECHAT\n  \"ant-space\": \"antd-mini/Space/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-space>\n  <ant-button type=\"primary\">按钮1</ant-button>\n  <ant-button>按钮2</ant-button>\n  <ant-button>按钮3</ant-button>\n</ant-space>\n```\n\n### 垂直间距\n\n```xml\n<ant-space direction=\"vertical\">\n  <ant-button type=\"primary\">按钮1</ant-button>\n  <ant-button>按钮2</ant-button>\n  <ant-button>按钮3</ant-button>\n</ant-space>\n```\n\n### 间距大小\n\n```xml\n<ant-space size=\"small\">\n  <ant-button type=\"primary\">按钮1</ant-button>\n  <ant-button>按钮2</ant-button>\n  <ant-button>按钮3</ant-button>\n</ant-space>\n```\n\n### 对齐方式\n\n```xml\n<ant-space align=\"start\">\n  <ant-button type=\"primary\">按钮1</ant-button>\n  <view class=\"custom-box\">高度不同的内容</view>\n  <ant-button>按钮3</ant-button>\n</ant-space>\n```\n\n### 自动换行\n\n```xml\n<ant-space wrap>\n  <ant-button type=\"primary\">按钮1</ant-button>\n  <ant-button>按钮2</ant-button>\n  <ant-button>按钮3</ant-button>\n  <ant-button>按钮4</ant-button>\n  <ant-button>按钮5</ant-button>\n</ant-space>\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Space/index'></code>\n\n## API\n\n| 属性      | 说明         | 类型                                                                        | 默认值         |\n| --------- | ------------ | --------------------------------------------------------------------------- | -------------- |\n| direction | 间距方向     | `'horizontal'` \\| `'vertical'`                                              | `'horizontal'` |\n| size      | 间距大小     | `'small'` \\| `'middle'` \\| `'large'` \\| `number`                            | `'middle'`     |\n| align     | 对齐方式     | `'start'` \\| `'end'` \\| `'center'` \\| `'baseline'`                          | `'center'`     |\n| justify   | 主轴对齐方式 | `'start'` \\| `'end'` \\| `'center'` \\| `'space-around'` \\| `'space-between'` | `'start'`      |\n| wrap      | 是否自动换行 | `boolean`                                                                   | `false`        |\n| className | 自定义类名   | `string`                                                                    | -              |\n| style     | 自定义样式   | `string`                                                                    | -              |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名      | 默认值  | 深色模式默认值 | 备注     |\n| ----------- | ------- | -------------- | -------- |\n| --space-gap | 0.08rem | 0.08rem        | 间距大小 |\n"
  },
  {
    "path": "src/Space/index.sjs.ts",
    "content": "function getSpaceClass(direction, wrap, align, justify) {\n  const classes = ['ant-space'];\n\n  // 方向类名\n  classes.push(`ant-space-${direction}`);\n\n  // 是否换行\n  if (wrap && direction === 'horizontal') {\n    classes.push('ant-space-wrap');\n  }\n\n  // 对齐方式\n  if (align) {\n    classes.push(`ant-space-align-${align}`);\n  }\n\n  // 主轴对齐方式\n  if (justify) {\n    classes.push(`ant-space-justify-${justify}`);\n  }\n\n  return classes.join(' ');\n}\n\nfunction getSpaceStyle(size) {\n  let gap;\n\n  // 处理间距大小\n  switch (size) {\n    case 'small':\n      gap = '0.16rem';\n      break;\n    case 'large':\n      gap = '0.48rem';\n      break;\n    case 'middle':\n    default:\n      gap = '0.32rem';\n  }\n\n  // 如果size是数字，直接使用\n  if (!isNaN(size)) {\n    gap = size / 100 + 'rem';\n  }\n\n  return `gap: ${gap}`;\n}\n\nexport default {\n  getSpaceClass,\n  getSpaceStyle,\n};\n"
  },
  {
    "path": "src/Space/index.ts",
    "content": "import { Component } from '../_util/simply';\nimport { assertAilpayNativeNotSupport } from '../_util/support';\nimport { SpaceDefaultProps } from './props';\n\nassertAilpayNativeNotSupport('Space');\n\nComponent({ props: SpaceDefaultProps });\n"
  },
  {
    "path": "src/Space/props.ts",
    "content": "export interface SpaceProps {\n  /**\n   * @description 间距方向\n   * @default \"horizontal\"\n   */\n  direction?: 'horizontal' | 'vertical';\n\n  /**\n   * @description 间距大小\n   * @default \"middle\"\n   */\n  size?: 'small' | 'middle' | 'large' | number;\n\n  /**\n   * @description 是否自动换行，仅在 horizontal 时有效\n   * @default false\n   */\n  wrap?: boolean;\n\n  /**\n   * @description 对齐方式\n   * @default \"center\"\n   */\n  align?: 'start' | 'end' | 'center' | 'baseline';\n\n  /**\n   * @description 主轴对齐方式\n   * @default \"start\"\n   */\n  justify?: 'start' | 'end' | 'center' | 'space-around' | 'space-between';\n\n  /**\n   * @description 自定义类名\n   */\n  className?: string;\n\n  /**\n   * @description 自定义样式\n   */\n  style?: string;\n}\n\nexport const SpaceDefaultProps = {\n  direction: 'horizontal',\n  size: 'middle',\n  wrap: false,\n  align: 'center',\n  justify: 'start',\n  className: '',\n  style: '',\n};\n"
  },
  {
    "path": "src/Stepper/index.axml",
    "content": "<view\n  class=\"ant-stepper {{ className ? className : '' }}\"\n  style=\"{{ style }}\">\n  <ant-button\n    className=\"ant-stepper-button ant-stepper-button-down {{ disabled || mixin.value !== '' && mixin.value !== undefined && mixin.value <= min ? 'ant-stepper-button-disabled' : '' }}\"\n    activeClassName=\"ant-stepper-button-hover\"\n    icon=\"MinusOutline\"\n    type=\"text\"\n    data-mode=\"minus\"\n    disabled=\"{{ disabled || mixin.value !== '' && mixin.value !== undefined && mixin.value <= min }}\"\n    onTap=\"onTap\"\n    onDisabledTap=\"onDisabledTap\"\n  />\n  <view class=\"ant-stepper-input-wrap\">\n    <view\n      a:if=\"{{ inputReadOnly }}\"\n      class=\"ant-stepper-input ant-stepper-input-readonly\">\n      {{ mixin.value }}\n    </view>\n    <ant-input\n      a:else\n      className=\"ant-stepper-input {{ disabled ? 'ant-stepper-input-disabled' : '' }} {{ inputClassName ? inputClassName : '' }}\"\n      style=\"{{ inputStyle }}\"\n      type=\"{{ type }}\"\n      enableNative=\"{{ enableNative }}\"\n      alwaysSystem=\"{{ alwaysSystem }}\"\n      confirm-type=\"{{ confirmType }}\"\n      confirm-hold=\"{{ confirmHold }}\"\n      disabled=\"{{ disabled }}\"\n      focus=\"{{ focus }}\"\n      onChange=\"onChange\"\n      onFocus=\"onFocus\"\n      onBlur=\"onBlur\"\n      onConfirm=\"onConfirm\"\n      value=\"{{ mixin.value }}\"\n    />\n  </view>\n  <ant-button\n    className=\"ant-stepper-button ant-stepper-button-up {{ disabled || mixin.value !== '' && mixin.value !== undefined && mixin.value >= max ? 'ant-stepper-button-disabled' : '' }}\"\n    activeClassName=\"ant-stepper-button-hover\"\n    icon=\"AddOutline\"\n    type=\"text\"\n    data-mode=\"add\"\n    disabled=\"{{ disabled || mixin.value !== '' && mixin.value !== undefined && mixin.value >= max }}\"\n    onTap=\"onTap\"\n    onDisabledTap=\"onDisabledTap\"\n  />\n</view>\n"
  },
  {
    "path": "src/Stepper/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Information Entry\n  order: 10\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Stepper\n\nA two-stage control used to increase, decrease, or modify values.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-stepper\": \"antd-mini/es/Stepper/index\"\n#endif\n#if WECHAT\n  \"ant-stepper\": \"antd-mini/Stepper/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<ant-stepper\n  className=\"ant-stepper\"\n  value=\"{{0}}\"\n  min=\"{{0}}\"\n  max=\"{{10}}\"\n  step=\"{{1}}\"\n  disabled=\"{{false}}\"\n#if ALIPAY\n  onChange=\"handleChange\"\n#endif\n#if WECHAT\n  bindchange=\"handleChange\"\n#endif\n/>\n```\n\n```js\nPage({\n  handleChange(value) {\n    console.log(value);\n  },\n});\n```\n\n### Custom Styles\n\n```xml\n<ant-stepper\n  style=\"\"\n  className=\"ant-stepper\"\n  inputStyle=\"\"\n  inputClassName=\"ant-stepper-input\"\n/>\n```\n\n### Input box read-only\n\n```xml\n<ant-stepper\n  className=\"ant-stepper\"\n  defaultValue=\"{{0}}\"\n  inputReadOnly=\"{{true}}\"\n/>\n```\n\n### Input box auto focus\n\n```xml\n<ant-stepper\n  className=\"ant-stepper\"\n  defaultValue=\"{{0}}\"\n  focus=\"{{true}}\"\n/>\n```\n\n### Event Binding\n\n```xml\n<ant-stepper\n  value=\"{{value}}\"\n#if ALIPAY\n  onChange=\"handleChange\"\n  onBlur=\"handleBlur\"\n  onFocus=\"handleFocus\"\n  onConfirm=\"handleConfirm\"\n  onDisabledTap=\"handleDisabledTap\"\n#endif\n#if WECHAT\n  bindchange=\"handleChange\"\n  bindblur=\"handleBlur\"\n  bindfocus=\"handleFocus\"\n  bindconfirm=\"handleConfirm\"\n  binddisabledtap=\"handleDisabledTap\"\n#endif\n/>\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Stepper/index'></code>\n\n## API\n\n| Property                        | Description                                                                                | Type                                                                              | Default Value                                                                                 |\n| --------------------------- | ----------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |\n| className                   | Class Name                                                                                | string                                                                            | -                                                                                      |\n| disabled                    | Disable                                                                            | boolean                                                                           | false                                                                                  |\n| inputReadOnly               | Whether the input box is read-only                                                                  | boolean                                                                           | false                                                                                  |\n| defaultValue                | Initial value                                                                              | number                                                                            | -                                                                                      |\n| focus                       | Input box check status                                                                      | boolean                                                                           | false                                                                                  |\n| inputClassName              | Input box type                                                                          | string                                                                            | -                                                                                      |\n| inputStyle                  | Input box style                                                                          | string                                                                            | -                                                                                      |\n| max                         | Maximum                                                                              | number                                                                            | -                                                                                      |\n| min                         | Minimum                                                                              | number                                                                            | -                                                                                      |\n| precision                   | Calculation accuracy, keep a few decimal places [See details in](https://github.com/ant-design/ant-design/issues/5998) | number                                                                            | -                                                                                      |\n| style                       | Style                                                                                | string                                                                            | -                                                                                      |\n| step                        | Step distance, that is, the value of each addition and subtraction                                                                | number                                                                            | 1                                                                                      |\n| type                        | Input box evokes keyboard type, optional `number` `digit`                                           | string                                                                            | `digit`                                                                                |\n| value                       | The value of the input box is valid when the form is submitted.                                                      | number                                                                            | -                                                                                      |\n| #if ALIPAY onBlur           | Trigger this callback when the input box loses focus                                                        | (value: number                                                                    | null, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void |\n| #if ALIPAY onChange         | Trigger this callback after data changes                                                              | ( value: number                                                                   | null, [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void        |\n| #if ALIPAY onConfirm        | This callback is triggered when the keyboard is clicked to complete                                                            | (value: number                                                                    | null, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void |\n| #if ALIPAY onFocus          | This callback is triggered when the input box is focused                                                            | (value: number                                                                    | null, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void |\n| #if ALIPAY onDisabledTap    | Click departure callback when disabled                                                                  | (event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void |\n| #if WECHAT bindblur        | Trigger this callback when the input box loses focus                                                        | (value: number                                                                    | null, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void |\n| #if WECHAT bindchange      | Trigger this callback after data changes                                                              | ( value: number                                                                   | null, [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void        |\n| #if WECHAT bindconfirm     | This callback is triggered when the keyboard is clicked to complete                                                            | (value: number                                                                    | null, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void |\n| #if WECHAT bindfocus       | This callback is triggered when the input box is focused                                                            | (value: number                                                                    | null, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void |\n| #if WECHAT binddisabledtap | Click departure callback when disabled                                                                  | (event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                         | Default Value                                                                                                                    | Dark Mode Default                                                                                                            | Remarks                     |\n| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------ |\n| --stepper-handler-tap-bg       | <div style=\"width: 150px; height: 30px; background-color: #ddd; color: #333333;\">#ddd</div>                               | <div style=\"width: 150px; height: 30px; background-color: #ddd; color: #333333;\">#ddd</div>                               | stepper processor click background color |\n| --stepper-handler-border-color | <div style=\"width: 150px; height: 30px; background-color: #e5e5e5; color: #333333;\">#e5e5e5</div>                         | <div style=\"width: 150px; height: 30px; background-color: #444444; color: #ffffff;\">#444444</div>                         | Step Processor Border Color     |\n| --stepper-border-color         | <div style=\"width: 150px; height: 30px; background-color: #e5e5e5; color: #333333;\">#e5e5e5</div>                         | <div style=\"width: 150px; height: 30px; background-color: #444444; color: #ffffff;\">#444444</div>                         | Step Border Color           |\n| --stepper-background-color     | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div>                         | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div>                         | stepper background color           |\n| --stepper-hover-bg             | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.92); color: #ffffff;\">rgba(0, 0, 0, 0.92)</div> | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.92); color: #ffffff;\">rgba(0, 0, 0, 0.92)</div> | stepper hover background color       |\n"
  },
  {
    "path": "src/Stepper/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-button\": \"../Button/index\",\n    \"ant-input\": \"../Input/InputBlur/index\"\n  }\n}\n"
  },
  {
    "path": "src/Stepper/index.less",
    "content": "@import (reference) './variable.less';\n\n@stepperPrefix: ant-stepper;\n\n.@{stepperPrefix} {\n  position: relative;\n  display: inline-flex;\n  flex-wrap: nowrap;\n  height: @stepper-content-height;\n  border-radius: @stepper-border-radius;\n  border: @stepper-handler-border-width solid @stepper-border-color;\n  overflow: hidden;\n  box-sizing: border-box;\n\n  & &-button {\n    width: @stepper-content-height;\n    height: @stepper-content-height;\n    line-height: @stepper-content-height;\n    padding: 0;\n    color: @COLOR_BRAND1;\n    background-color: @stepper-background-color;\n    .ant-icon {\n      font-size: @stepper-icon-size;\n    }\n  }\n\n  & &-button-hover {\n    background-color: @stepper-hover-bg;\n  }\n\n  & &-button-up {\n    border-top-left-radius: 0;\n    border-top-right-radius: 4 * @rpx;\n    border-bottom-left-radius: 0;\n    border-bottom-right-radius: 4 * @rpx;\n  }\n\n  & &-button-down {\n    border-top-right-radius: 0;\n    border-top-left-radius: 4 * @rpx;\n    border-bottom-right-radius: 0;\n    border-bottom-left-radius: 4 * @rpx;\n  }\n\n  & &-button-disabled {\n    color: @COLOR_TEXT_ASSIST;\n  }\n\n  &-input {\n    width: @stepper-content-width;\n    height: @stepper-content-height;\n    margin: 0 2 * @rpx;\n    text-align: center;\n    line-height: normal;\n    font-size: @stepper-font-size;\n    color: @stepper-input-font-color;\n    box-sizing: border-box;\n    background-color: @stepper-background-color;\n\n    /// #if ALIPAY\n    // 在微信会导致 input 显示不居中\n    padding: 7 * @rpx 14 * @rpx;\n    /// #endif\n    caret-color: @COLOR_BRAND1;\n\n    &-wrap {\n      background-color: @stepper-border-color;\n    }\n  }\n\n  &-input-readonly {\n    padding: 0;\n    color: rgba(51, 51, 51, 0.4);\n  }\n}\n"
  },
  {
    "path": "src/Stepper/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 数据录入\n  order: 10\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Stepper 步进器\n\n一种两段式控制，用于增加、减少或修改数值。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-stepper\": \"antd-mini/es/Stepper/index\"\n#endif\n#if WECHAT\n  \"ant-stepper\": \"antd-mini/Stepper/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-stepper\n  className=\"ant-stepper\"\n  value=\"{{0}}\"\n  min=\"{{0}}\"\n  max=\"{{10}}\"\n  step=\"{{1}}\"\n  disabled=\"{{false}}\"\n#if ALIPAY\n  onChange=\"handleChange\"\n#endif\n#if WECHAT\n  bindchange=\"handleChange\"\n#endif\n/>\n```\n\n```js\nPage({\n  handleChange(value) {\n    console.log(value);\n  },\n});\n```\n\n### 定制样式\n\n```xml\n<ant-stepper\n  style=\"\"\n  className=\"ant-stepper\"\n  inputStyle=\"\"\n  inputClassName=\"ant-stepper-input\"\n/>\n```\n\n### 输入框只读\n\n```xml\n<ant-stepper\n  className=\"ant-stepper\"\n  defaultValue=\"{{0}}\"\n  inputReadOnly=\"{{true}}\"\n/>\n```\n\n### 输入框自动聚焦\n\n```xml\n<ant-stepper\n  className=\"ant-stepper\"\n  defaultValue=\"{{0}}\"\n  focus=\"{{true}}\"\n/>\n```\n\n### 事件绑定\n\n```xml\n<ant-stepper\n  value=\"{{value}}\"\n#if ALIPAY\n  onChange=\"handleChange\"\n  onBlur=\"handleBlur\"\n  onFocus=\"handleFocus\"\n  onConfirm=\"handleConfirm\"\n  onDisabledTap=\"handleDisabledTap\"\n#endif\n#if WECHAT\n  bindchange=\"handleChange\"\n  bindblur=\"handleBlur\"\n  bindfocus=\"handleFocus\"\n  bindconfirm=\"handleConfirm\"\n  binddisabledtap=\"handleDisabledTap\"\n#endif\n/>\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Stepper/index'></code>\n\n## API\n\n| 属性                        | 说明                                                                                | 类型                                                                              | 默认值                                                                                 |\n| --------------------------- | ----------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |\n| className                   | 类名                                                                                | string                                                                            | -                                                                                      |\n| disabled                    | 是否禁用                                                                            | boolean                                                                           | false                                                                                  |\n| inputReadOnly               | 输入框是否只读状态                                                                  | boolean                                                                           | false                                                                                  |\n| defaultValue                | 初始值                                                                              | number                                                                            | -                                                                                      |\n| focus                       | 输入框选中状态                                                                      | boolean                                                                           | false                                                                                  |\n| inputClassName              | 输入框类型                                                                          | string                                                                            | -                                                                                      |\n| inputStyle                  | 输入框样式                                                                          | string                                                                            | -                                                                                      |\n| max                         | 最大值                                                                              | number                                                                            | -                                                                                      |\n| min                         | 最小值                                                                              | number                                                                            | -                                                                                      |\n| precision                   | 计算精度，保留几位小数 [详见](https://github.com/ant-design/ant-design/issues/5998) | number                                                                            | -                                                                                      |\n| style                       | 样式                                                                                | string                                                                            | -                                                                                      |\n| step                        | 步距，即每次加减的值                                                                | number                                                                            | 1                                                                                      |\n| type                        | 输入框唤起键盘类型，可选 `number` `digit`                                           | string                                                                            | `digit`                                                                                |\n| value                       | 输入框的值, 表单提交的时候有效                                                      | number                                                                            | -                                                                                      |\n| #if ALIPAY onBlur           | 输入框失去焦点时，触发此回调                                                        | (value: number                                                                    | null, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void |\n| #if ALIPAY onChange         | 数据变化后，触发此回调                                                              | ( value: number                                                                   | null, [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void        |\n| #if ALIPAY onConfirm        | 点击键盘完成时触发此回调                                                            | (value: number                                                                    | null, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void |\n| #if ALIPAY onFocus          | 输入框聚焦时，触发此回调                                                            | (value: number                                                                    | null, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void |\n| #if ALIPAY onDisabledTap    | 禁用时点击出发回调                                                                  | (event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void |\n| #if WECHAT bindblur        | 输入框失去焦点时，触发此回调                                                        | (value: number                                                                    | null, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void |\n| #if WECHAT bindchange      | 数据变化后，触发此回调                                                              | ( value: number                                                                   | null, [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void        |\n| #if WECHAT bindconfirm     | 点击键盘完成时触发此回调                                                            | (value: number                                                                    | null, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void |\n| #if WECHAT bindfocus       | 输入框聚焦时，触发此回调                                                            | (value: number                                                                    | null, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void |\n| #if WECHAT binddisabledtap | 禁用时点击出发回调                                                                  | (event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                         | 默认值                                                                                                                    | 深色模式默认值                                                                                                            | 备注                     |\n| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------ |\n| --stepper-handler-tap-bg       | <div style=\"width: 150px; height: 30px; background-color: #ddd; color: #333333;\">#ddd</div>                               | <div style=\"width: 150px; height: 30px; background-color: #ddd; color: #333333;\">#ddd</div>                               | 步进器处理器点击背景颜色 |\n| --stepper-handler-border-color | <div style=\"width: 150px; height: 30px; background-color: #e5e5e5; color: #333333;\">#e5e5e5</div>                         | <div style=\"width: 150px; height: 30px; background-color: #444444; color: #ffffff;\">#444444</div>                         | 步进器处理器边框颜色     |\n| --stepper-border-color         | <div style=\"width: 150px; height: 30px; background-color: #e5e5e5; color: #333333;\">#e5e5e5</div>                         | <div style=\"width: 150px; height: 30px; background-color: #444444; color: #ffffff;\">#444444</div>                         | 步进器边框颜色           |\n| --stepper-background-color     | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div>                         | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div>                         | 步进器背景颜色           |\n| --stepper-hover-bg             | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.92); color: #ffffff;\">rgba(0, 0, 0, 0.92)</div> | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.92); color: #ffffff;\">rgba(0, 0, 0, 0.92)</div> | 步进器悬停背景颜色       |\n"
  },
  {
    "path": "src/Stepper/index.ts",
    "content": "import mixinValue from '../mixins/value';\nimport { Component, getValueFromProps, triggerEvent } from '../_util/simply';\nimport { assertAilpayNativeNotSupport } from '../_util/support';\nimport { StepperDefaultProps } from './props';\nimport { getPrecision, getValidNumber } from './utils';\n\nassertAilpayNativeNotSupport('Stepper');\n\nComponent({\n  props: StepperDefaultProps,\n  methods: {\n    onFocus(e) {\n      const value = this.getValue();\n      triggerEvent(this, 'focus', value === '' ? null : Number(value), e);\n    },\n    onChange(val, e) {\n      let curVal = val;\n      /// #if WECHAT\n      curVal = val.detail;\n      /// #endif\n      const { needUpdate, value } = this.update(curVal);\n      if (getValueFromProps(this, 'onChange') && needUpdate) {\n        triggerEvent(this, 'change', value === '' ? null : Number(value), e);\n      }\n    },\n    onConfirm(val, e) {\n      const value = this.getValue();\n      triggerEvent(this, 'confirm', value === '' ? null : Number(value), e);\n    },\n    onBlur(e) {\n      if (this.isControlled()) {\n        this.update(getValueFromProps(this, 'value'));\n      }\n\n      const value = this.getValue();\n      triggerEvent(this, 'blur', value === '' ? null : Number(value), e);\n    },\n    onDisabledTap(e) {\n      const onDisabledTap = getValueFromProps(this, 'onDisabledTap');\n      onDisabledTap && onDisabledTap(e);\n    },\n    onTap(e) {\n      const [\n        step,\n        disabled,\n        min = -Infinity,\n        max = Infinity,\n        precisionFormProps,\n      ] = getValueFromProps(this, [\n        'step',\n        'disabled',\n        'min',\n        'max',\n        'precision',\n      ]);\n      const value = Number(this.getValue() || 0);\n      if (!disabled) {\n        const { mode } = e.currentTarget.dataset;\n        let result = value;\n        const precision =\n          precisionFormProps >= 0\n            ? precisionFormProps\n            : Math.max(getPrecision(value), getPrecision(step));\n        if (mode === 'minus') {\n          // 【减】按钮的操作\n          result = value - step;\n          if (result < min) {\n            result = min;\n          }\n        } else if (mode === 'add') {\n          // 【加】按钮的操作\n          result = value + step;\n          if (result > max) {\n            result = max;\n          }\n        }\n        if (!this.isControlled()) {\n          const { needUpdate } = this.update(result, {}, precision);\n          if (!needUpdate) {\n            return;\n          }\n        }\n\n        {\n          const { value } = getValidNumber(result, min, max, step, precision);\n          triggerEvent(this, 'change', Number(value), e);\n        }\n      }\n    },\n  },\n  mixins: [\n    mixinValue({\n      transformValue(num, extra, precision) {\n        const [min, max, step, precisionFormProps] = getValueFromProps(this, [\n          'min',\n          'max',\n          'step',\n          'precision',\n        ]);\n        const { valid, value } = getValidNumber(\n          num,\n          min,\n          max,\n          step,\n          precision >= 0 ? precision : precisionFormProps\n        );\n        if (valid && this.getValue() !== value) {\n          return {\n            needUpdate: true,\n            value,\n          };\n        }\n        return {\n          needUpdate: false,\n        };\n      },\n    }),\n  ],\n});\n"
  },
  {
    "path": "src/Stepper/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n/**\n * @description 步进器，用作增加或者减少当前数值。\n */\n\nexport interface IStepperProps extends IBaseProps {\n  /**\n   * @description 输入框的值\n   */\n  value: number;\n\n  /**\n   * @description 最小值\n   */\n  min: number;\n\n  /**\n   * @description 最大值\n   */\n  max: number;\n\n  /**\n   * @description 每次加减的值\n   * @default 1\n   */\n  step: number;\n\n  /**\n   *  @description 输入框唤起键盘类型\n   */\n  type: 'number' | 'digit';\n\n  /**\n   * @description 计算精度，保留几位小数\n   * https://github.com/ant-design/ant-design/issues/5998\n   */\n  precision: number;\n\n  /**\n   * @description 输入框类名\n   */\n  inputClassName: string;\n\n  /**\n   * @description 输入框样式\n   */\n  inputStyle: string;\n\n  /**\n   * @description 是否禁用\n   * @default false\n   */\n  disabled?: boolean;\n\n  /**\n   * @description 输入框是否只读\n   * @default false\n   */\n  inputReadOnly?: boolean;\n\n  /**\n   * @description 输入框初始值\n   */\n  defaultValue: number;\n\n  focus?: boolean;\n\n  /**\n   *\n   * @description onChange\n   */\n  onChange?: (value: number, e: any) => void;\n\n  /**\n   *\n   * @description onConfirm\n   */\n  onConfirm?: (value: number, e: any) => void;\n\n  /**\n   * @description onFocus\n   */\n  onFocus?: (value: number, e: any) => void;\n  /**\n   * @description onBlur\n   */\n  onBlur?: (value: number, e: any) => void;\n  /**\n   * @description onDisabledTap\n   */\n  onDisabledTap?: (e: any) => void;\n}\n\nexport const StepperDefaultProps: Partial<IStepperProps> = {\n  value: null,\n  defaultValue: null,\n  precision: -1,\n  min: Number.MIN_SAFE_INTEGER,\n  max: Number.MAX_SAFE_INTEGER,\n  step: 1,\n  type: 'digit',\n  inputClassName: '',\n  inputStyle: '',\n  disabled: false,\n  inputReadOnly: false,\n  onChange: null,\n  onConfirm: null,\n  onFocus: null,\n  onBlur: null,\n  onDisabledTap: null,\n};\n"
  },
  {
    "path": "src/Stepper/utils.ts",
    "content": "export function getPrecision(value: number): number {\n  const valueString = String(value);\n  if (valueString.indexOf('e-') >= 0) {\n    return parseInt(valueString.slice(valueString.indexOf('e-') + 2), 10);\n  }\n  let p = 0;\n  if (valueString.indexOf('.') >= 0) {\n    p = valueString.length - valueString.indexOf('.') - 1;\n  }\n  return p;\n}\n\nexport function getValidNumber(\n  value: any,\n  min = -Infinity,\n  max = Infinity,\n  step: number,\n  precision?: number\n) {\n  if (typeof value === 'undefined' || value === null) {\n    return {\n      valid: true,\n      value: '',\n    };\n  }\n  let num: number;\n  if (typeof value === 'string') {\n    if (/^\\s*$/.test(value)) {\n      return {\n        valid: true,\n        value: '',\n      };\n    }\n    if (!isNaN(Number(value))) {\n      num = Number(value);\n    }\n  } else {\n    num = value;\n  }\n  if (num > max) {\n    num = max;\n  } else if (num < min) {\n    num = min;\n  }\n  if (typeof num === 'number' && !isNaN(num)) {\n    if (typeof precision === 'number' && precision >= 0) {\n      return {\n        valid: true,\n        value: num.toFixed(precision),\n      };\n    }\n    precision = Math.max(getPrecision(num), getPrecision(step));\n    return {\n      valid: true,\n      value: num.toFixed(precision),\n    };\n  }\n  return {\n    valid: false,\n  };\n}\n"
  },
  {
    "path": "src/Stepper/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n// 字体大小\n@stepper-font-size: @sizeFont5;\n// 加减边框\n@stepper-handler-border-width: 2 * @rpx;\n@stepper-handler-border-radius: 4.4 * @rpx;\n@stepper-handler-border-color: var(\n  --stepper-handler-border-color,\n  @COLOR_GREY_2\n);\n// 加减点击背景\n@stepper-handler-tap-background-color: var(--stepper-handler-tap-bg, #ddd);\n@stepper-handler-size: 40 * @rpx;\n\n@stepper-border-color: var(--stepper-border-color, @COLOR_BORDER_GREYCARD);\n@stepper-border-radius: 50vh;\n@stepper-background-color: var(--stepper-background-color, @COLOR_WHITE);\n\n@stepper-hover-bg: var(--stepper-hover-bg, @COLOR_BLACK_FADED_8);\n\n@stepper-input-font-color: var(--stepper-input-font-color, @COLOR_TEXT_PRIMARY);\n\n@stepper-content-width: 64 * @rpx;\n@stepper-content-height: 44 * @rpx;\n\n@stepper-icon-size: @size-3;\n"
  },
  {
    "path": "src/Steps/index.axml",
    "content": "<import-sjs\n  from=\"./index.sjs\"\n  name=\"utils\" />\n\n<view\n  class=\"ant-steps ant-steps-{{ direction }} {{ className || '' }}\"\n  style=\"{{ style }}\">\n  <block\n    a:for=\"{{ items }}\"\n    a:for-index=\"index\"\n    a:for-item=\"item\"\n    a:key=\"title\">\n    <view\n      class=\"ant-steps-item ant-steps-item-{{ direction }} {{ index < current ? 'ant-steps-item-finish' : '' }} {{ index === current ? 'ant-steps-item-active' : '' }} {{ index > current || (status === 'error' &&  index === current) ? 'ant-steps-item-non-active' : '' }}\">\n      <view\n        class=\"ant-steps-item-indicator ant-steps-item-indicator-{{ direction }}\">\n        <view\n          class=\"ant-steps-item-indicator-icon ant-steps-item-{{ utils.getClassName(current, index, status) }}-icon\">\n          <!-- #if ALIPAY -->\n          <slot\n            name=\"icon\"\n            value=\"{{ item }}\"\n            index=\"{{ index }}\"\n            current=\"{{ current }}\"\n            status=\"{{ status }}\">\n          <!-- #endif -->\n            <view\n              class=\"ant-steps-item-{{ utils.getClassName(current, index, status) }}-icon-default\" />\n          <!-- #if ALIPAY -->\n          </slot>\n          <!-- #endif -->\n        </view>\n      </view>\n      <view class=\"ant-steps-item-text\">\n        <view\n          class=\"ant-steps-item-title ant-steps-item-title-{{ utils.getClassName(current, index, status) }}\">\n          <!-- #if ALIPAY -->\n          <slot\n            name=\"title\"\n            value=\"{{ item }}\"\n            index=\"{{ index }}\">\n          <!-- #endif -->\n            {{ item.title }}\n          <!-- #if ALIPAY -->\n          </slot>\n          <!-- #endif -->\n        </view>\n        <view class=\"ant-steps-item-desc\">\n          <!-- #if ALIPAY -->\n          <slot\n            name=\"description\"\n            value=\"{{ item }}\"\n            index=\"{{ index }}\">\n          <!-- #endif -->\n            {{ item.description }}\n          <!-- #if ALIPAY -->\n          </slot>\n          <!-- #endif -->\n        </view>\n      </view>\n    </view>\n  </block>\n</view>\n"
  },
  {
    "path": "src/Steps/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Navigation\n  order: 6\ntoc: 'content'\n---\n\n# Steps\n\nA navigation bar that guides the user through the process. When the task is complex or there is a sequential relationship, it is broken down into a series of steps to simplify the task.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-steps\": \"antd-mini/es/Steps/index\"\n#endif\n#if WECHAT\n  \"ant-steps\": \"antd-mini/Steps/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n> [items](#item) Data-driven step bar rendering.`current` Specifies the current step,`status` Specifies the status of the current step, optional `finish` or `error`。\n\n```xml\n<ant-steps\n  items=\"{{items}}\"\n  current=\"{{1}}\"\n  status=\"error\"\n/>\n```\n\n```js\nPage({\n  data: {\n    items: [\n      {\n        title: 'Step1',\n        description: 'description',\n      },\n      {\n        title: 'Step2',\n        description: 'description',\n      },\n      {\n        title: 'Step3',\n        description: 'description',\n      },\n    ],\n  },\n});\n```\n\n### Vertical step bar\n\n```xml\n<ant-steps\n  items=\"{{items}}\"\n  direction=\"vertical\"\n/>\n```\n\n### Controlled Mode\n\n```xml\n<ant-steps\n  items=\"{{items}}\"\n  current=\"{{current}}\"\n/>\n<ant-button\n  type=\"primary\"\n#if ALIPAY\n  onTap=\"onNextTap\"\n#endif\n#if WECHAT\n  bindtap=\"onNextTap\"\n#endif\n>\n  <view a:if=\"{{current < items.length - 1}}\">Next step</view>\n  <view a:else>Complete</view>\n</ant-button>\n<ant-button\n  a:if=\"{{current > 0}}\"\n#if ALIPAY\n  onTap=\"onPrevTap\"\n#endif\n#if WECHAT\n  bindtap=\"onPrevTap\"\n#endif\n  >\n  Previous Step\n</ant-button>\n```\n\n```js\nPage({\n  data: {\n    current: 0,\n    items: [\n      {\n        title: 'Step1',\n        description: 'description',\n      },\n      {\n        title: 'Step2',\n        description: 'description',\n      },\n      {\n        title: 'Step3',\n        description: 'description',\n      },\n    ],\n  },\n  onNextTap() {\n    if (this.data.current === this.data.items.length - 1) {\n#if ALIPAY\n      my.showToast({ content: 'Finish' })\n#endif\n#if WECHAT\n      wx.showToast({ title: 'Finish' })\n#endif\n      return;\n    }\n    this.setData({\n      current: this.data.current + 1,\n    });\n  },\n  onPrevTap() {\n    if (this.data.current === 0) {\n      return;\n    }\n    this.setData({\n      current: this.data.current - 1,\n    });\n  },\n});\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Steps/index'></code>\n\n## API\n\n| Property        | Description                                         | Type            | Default Value       |\n| ----------- | -------------------------------------------- | --------------- | ------------ |\n| className   | Class Name                                         | string          | -            |\n| current     | Current step                                     | number          | -            |\n| description | Custom description content rendering, receiving index and value      | slot            | -            |\n| direction   | direction, optional `horizontal` or `vertical`        | string          | `horizontal` |\n| icon        | Custom icon rendering, receiving index and value          | slot            | -            |\n| items       | Show Item                                       | [Item](#item)[] | -            |\n| status      | Specifies the status of the current step, optional `finish` or `error` | string          | `finish`     |\n| style       | Style                                         | string          | -            |\n| title       | Custom title rendering, receiving index and value          | slot            | -            |\n\n### Item\n\n| Property        | Description | Type   | Default Value |\n| ----------- | ---- | ------ | ------ |\n| description | Content | string | -      |\n| title       | Title | string | -      |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For more information, see ConfigProvider Components.\n\n| Variable name                | Default Value                                                                                            | Dark Mode Default                                                                                    | Remarks               |\n| --------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------ |\n| --steps-non-active-bg | <div style=\"width: 150px; height: 30px; background-color: #e5e5e5; color: #333333;\">#e5e5e5</div> | <div style=\"width: 150px; height: 30px; background-color: #444444; color: #ffffff;\">#444444</div> | Inactive Step Background Color |\n| --steps-title-color   | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | Step Title Color       |\n| --steps-desc-color    | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | Step Description Color       |\n| --steps-default-bg    | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | Default Step Background Color   |\n| --steps-finish-bg     | <div style=\"width: 150px; height: 30px; background-color: #ff3141; color: #ffffff;\">#ff3141</div> | <div style=\"width: 150px; height: 30px; background-color: #ff4a58; color: #ffffff;\">#ff4a58</div> | Complete Steps Background Color   |\n"
  },
  {
    "path": "src/Steps/index.json",
    "content": "{  \n  \"styleIsolation\": \"shared\",\n  \"component\": true\n}\n"
  },
  {
    "path": "src/Steps/index.less",
    "content": "@import (reference) './variable.less';\n\n@stepsPrefix: ant-steps;\n\n.@{stepsPrefix} {\n  display: flex;\n  overflow: hidden;\n  line-height: 1.4;\n\n  &-horizontal {\n    flex-direction: row;\n    justify-content: space-around;\n  }\n\n  &-vertical {\n    display: block;\n    padding: 64 * @rpx;\n    .ant-steps-item-active {\n      &::after {\n        background: linear-gradient(\n          to top,\n          @steps-non-active-bg 0%,\n          @steps-non-active-bg 50%,\n          @steps-default-bg 50%,\n          @steps-default-bg 100%\n        );\n      }\n    }\n    .ant-steps-item-non-active {\n      &::after {\n        background: @steps-non-active-bg;\n      }\n    }\n  }\n\n  &-item:last-child &-item-indicator-vertical::after {\n    display: none;\n  }\n}\n\n.ant-steps-item-vertical:last-child {\n  padding-bottom: 0;\n}\n\n@stepItemPrefix: ant-steps-item;\n\n.@{stepItemPrefix} {\n  position: relative;\n  z-index: 5;\n  display: flex;\n  margin: 16 * @rpx 0 16 * @rpx 0;\n\n  &-vertical {\n    padding-bottom: 24 * @rpx;\n    margin: 0;\n    .ant-steps-item-title {\n      font-size: 34 * @rpx;\n      color: @steps-title-color;\n    }\n\n    .ant-steps-item-desc {\n      font-size: 30 * @rpx;\n      color: @steps-desc-color;\n      padding-top: 4 * @rpx;\n    }\n\n    &::after {\n      // line\n      position: absolute;\n      height: 100%;\n      width: 2 * @rpx;\n      content: '';\n      top: 27 * @rpx;\n      z-index: -1;\n      transform: translateX(-50%);\n    }\n\n    .ant-steps-item-text {\n      display: flex;\n      flex-direction: column;\n      flex: 1;\n    }\n  }\n\n  &-horizontal {\n    flex-direction: column;\n    margin-top: 16 * @rpx;\n    padding: 0 16 * @rpx;\n\n    &::after {\n      position: absolute;\n      width: 100%;\n      height: 2 * @rpx;\n      content: '';\n      top: 34 * @rpx;\n      left: 0;\n      transform: translate(50%, -50%);\n      z-index: -1;\n    }\n\n    .@{stepItemPrefix}-title,\n    .@{stepItemPrefix}-desc {\n      text-align: center;\n    }\n\n    .@{stepItemPrefix}-desc {\n      margin-bottom: 0;\n    }\n  }\n\n  &:last-child {\n    &::after {\n      display: none;\n    }\n  }\n\n  &-indicator {\n    &-vertical {\n      transform: translateX(-50%);\n    }\n\n    &-horizontal {\n      display: flex;\n      justify-content: center;\n      margin: 16 * @rpx 0 16 * @rpx 0;\n    }\n\n    &-icon {\n      width: 18 * @rpx;\n      height: 18 * @rpx;\n      border-radius: 50%;\n    }\n  }\n\n  .ant-steps-item-active-icon-image {\n    transform: translateX(0);\n  }\n\n  &-horizontal {\n    flex: 1;\n    display: flex;\n\n    .ant-steps-item-title {\n      font-size: 24 * @rpx;\n\n      &:empty {\n        display: none;\n      }\n    }\n\n    .ant-steps-item-desc {\n      padding-top: 4 * @rpx;\n      color: @steps-desc-color;\n      font-size: 24 * @rpx;\n\n      &:empty {\n        display: none;\n      }\n    }\n  }\n\n  &-active {\n    &::after {\n      background-color: @steps-non-active-bg;\n    }\n\n    &-icon {\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      background: transparent;\n\n      &,\n      & .a-image {\n        height: 36 * @rpx;\n        width: 36 * @rpx;\n      }\n\n      color: @steps-default-bg;\n\n      &-default {\n        height: 20 * @rpx;\n        width: 20 * @rpx;\n        border-radius: 50%;\n        background-color: @steps-default-bg;\n      }\n    }\n\n    & .@{stepItemPrefix}-title {\n      color: @steps-default-bg;\n    }\n  }\n\n  &-non-active {\n    &::after {\n      background-color: @steps-non-active-bg;\n    }\n\n    &-icon {\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      background: transparent;\n\n      &,\n      & .a-image {\n        height: 36 * @rpx;\n        width: 36 * @rpx;\n      }\n\n      color: @steps-non-active-bg;\n\n      &-default {\n        height: 16 * @rpx;\n        width: 16 * @rpx;\n        border-radius: 50%;\n        background-color: @steps-non-active-bg;\n      }\n    }\n  }\n\n  &-finish {\n    &::after {\n      background-color: @steps-default-bg;\n    }\n\n    &-icon {\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      background: transparent;\n\n      &,\n      & .a-image {\n        height: 36 * @rpx;\n        width: 36 * @rpx;\n      }\n\n      color: @steps-default-bg;\n\n      &-default {\n        height: 16 * @rpx;\n        width: 16 * @rpx;\n        border-radius: 50%;\n        background-color: @steps-default-bg;\n      }\n    }\n\n    & .@{stepItemPrefix}-title {\n      color: @steps-title-color;\n    }\n  }\n\n  &-error-icon {\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    background: transparent;\n\n    &,\n    & .a-image {\n      height: 36 * @rpx;\n      width: 36 * @rpx;\n    }\n\n    color: @steps-finish-bg;\n\n    &-default {\n      height: 20 * @rpx;\n      width: 20 * @rpx;\n      border-radius: 50%;\n      background-color: @steps-finish-bg;\n    }\n  }\n\n  .ant-steps-item-title-error {\n    color: @steps-finish-bg;\n  }\n}\n"
  },
  {
    "path": "src/Steps/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 导航\n  order: 6\ntoc: 'content'\n---\n\n# Steps 步骤条\n\n引导用户按照流程完成任务的导航条。当任务复杂或者存在先后关系时，将其分解成一系列步骤，从而简化任务。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-steps\": \"antd-mini/es/Steps/index\"\n#endif\n#if WECHAT\n  \"ant-steps\": \"antd-mini/Steps/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n> [items](#item) 数据驱动步骤条渲染。`current` 指定当前步骤，`status` 指定当前步骤的状态，可选 `finish` 或 `error`。\n\n```xml\n<ant-steps\n  items=\"{{items}}\"\n  current=\"{{1}}\"\n  status=\"error\"\n/>\n```\n\n```js\nPage({\n  data: {\n    items: [\n      {\n        title: 'Step1',\n        description: 'description',\n      },\n      {\n        title: 'Step2',\n        description: 'description',\n      },\n      {\n        title: 'Step3',\n        description: 'description',\n      },\n    ],\n  },\n});\n```\n\n### 纵向步骤条\n\n```xml\n<ant-steps\n  items=\"{{items}}\"\n  direction=\"vertical\"\n/>\n```\n\n### 受控模式\n\n```xml\n<ant-steps\n  items=\"{{items}}\"\n  current=\"{{current}}\"\n/>\n<ant-button\n  type=\"primary\"\n#if ALIPAY\n  onTap=\"onNextTap\"\n#endif\n#if WECHAT\n  bindtap=\"onNextTap\"\n#endif\n>\n  <view a:if=\"{{current < items.length - 1}}\">下一步</view>\n  <view a:else>完成</view>\n</ant-button>\n<ant-button\n  a:if=\"{{current > 0}}\"\n#if ALIPAY\n  onTap=\"onPrevTap\"\n#endif\n#if WECHAT\n  bindtap=\"onPrevTap\"\n#endif\n  >\n  上一步\n</ant-button>\n```\n\n```js\nPage({\n  data: {\n    current: 0,\n    items: [\n      {\n        title: 'Step1',\n        description: 'description',\n      },\n      {\n        title: 'Step2',\n        description: 'description',\n      },\n      {\n        title: 'Step3',\n        description: 'description',\n      },\n    ],\n  },\n  onNextTap() {\n    if (this.data.current === this.data.items.length - 1) {\n#if ALIPAY\n      my.showToast({ content: 'Finish' })\n#endif\n#if WECHAT\n      wx.showToast({ title: 'Finish' })\n#endif\n      return;\n    }\n    this.setData({\n      current: this.data.current + 1,\n    });\n  },\n  onPrevTap() {\n    if (this.data.current === 0) {\n      return;\n    }\n    this.setData({\n      current: this.data.current - 1,\n    });\n  },\n});\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Steps/index'></code>\n\n## API\n\n| 属性        | 说明                                         | 类型            | 默认值       |\n| ----------- | -------------------------------------------- | --------------- | ------------ |\n| className   | 类名                                         | string          | -            |\n| current     | 当前步骤                                     | number          | -            |\n| description | 自定义描述内容渲染，接收 index 和 value      | slot            | -            |\n| direction   | 方向，可选 `horizontal` 或 `vertical`        | string          | `horizontal` |\n| icon        | 自定义图标渲染，接收 index 和 value          | slot            | -            |\n| items       | 展示项                                       | [Item](#item)[] | -            |\n| status      | 指定当前步骤的状态，可选 `finish` 或 `error` | string          | `finish`     |\n| style       | 样式                                         | string          | -            |\n| title       | 自定义标题渲染，接收 index 和 value          | slot            | -            |\n\n### Item\n\n| 属性        | 说明 | 类型   | 默认值 |\n| ----------- | ---- | ------ | ------ |\n| description | 内容 | string | -      |\n| title       | 标题 | string | -      |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                | 默认值                                                                                            | 深色模式默认值                                                                                    | 备注               |\n| --------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------ |\n| --steps-non-active-bg | <div style=\"width: 150px; height: 30px; background-color: #e5e5e5; color: #333333;\">#e5e5e5</div> | <div style=\"width: 150px; height: 30px; background-color: #444444; color: #ffffff;\">#444444</div> | 未激活步骤背景颜色 |\n| --steps-title-color   | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | 步骤标题颜色       |\n| --steps-desc-color    | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | 步骤描述颜色       |\n| --steps-default-bg    | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | 默认步骤背景颜色   |\n| --steps-finish-bg     | <div style=\"width: 150px; height: 30px; background-color: #ff3141; color: #ffffff;\">#ff3141</div> | <div style=\"width: 150px; height: 30px; background-color: #ff4a58; color: #ffffff;\">#ff4a58</div> | 完成步骤背景颜色   |\n"
  },
  {
    "path": "src/Steps/index.sjs.ts",
    "content": "function getClassName(current, index, status) {\n  current = current || 0;\n  if (index < current) {\n    return 'finish';\n  }\n  if (index === current) {\n    if (status === 'error') {\n      return 'error';\n    }\n    return 'active';\n  }\n  return 'non-active';\n}\n\nexport default { getClassName };\n"
  },
  {
    "path": "src/Steps/index.ts",
    "content": "import { Component } from '../_util/simply';\nimport { StepsFunctionalProps } from './props';\n\nComponent({ props: StepsFunctionalProps });\n"
  },
  {
    "path": "src/Steps/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\n/**\n * @description 步骤条，分步展示当前进展\n */\nexport interface IStepsProps extends IBaseProps {\n  /**\n   * @description 当前步骤\n   */\n  current: number;\n\n  /**\n   * @description 方向\n   */\n  direction: 'horizontal' | 'vertical';\n\n  /**\n   *  @description 状态\n   */\n  status: 'finish' | 'error';\n\n  items?: { title: string; description: string }[];\n}\n\nexport const StepsDefaultProps: Partial<IStepsProps> = {\n  current: 0,\n  direction: 'horizontal',\n  status: 'finish',\n};\n\nexport const StepsFunctionalProps: Partial<IStepsProps> = {\n  current: 0,\n  direction: 'horizontal',\n  status: 'finish',\n  items: [],\n};\n"
  },
  {
    "path": "src/Steps/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n@steps-non-active-bg: var(--steps-non-active-bg, @COLOR_GREY_2);\n@steps-title-color: var(--steps-title-color, @COLOR_TEXT_PRIMARY);\n\n@steps-desc-color: var(--steps-desc-color, @COLOR_TEXT_ASSIST);\n\n@steps-default-bg: var(--steps-default-bg, @COLOR_BRAND1);\n\n@steps-finish-bg: var(--steps-finish-bg, @COLOR_RED);\n"
  },
  {
    "path": "src/Sticky/index.axml",
    "content": "<block a:if=\"{{ sticky }}\">\n  <view\n    class=\"ant-sticky-check\"\n    style=\"{{ transparentTitle ? `top: ${headerHeight}px;` : '' }} {{ top ? `top: ${top};` : '' }}\"\n  />\n\n  <view\n    class=\"ant-sticky\"\n    style=\"{{ transparentTitle ? `top: ${headerHeight}px;` : '' }} {{ top ? `top: ${top};` : '' }}\"\n  >\n    <slot></slot>\n  </view>\n</block>\n<block a:else>\n  <slot></slot>\n</block>\n"
  },
  {
    "path": "src/Sticky/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: General\n  order: 2\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Sticky\nUsed in the case of the need for adsorption in some places in the rolling.\n\n## Precautions\n\nThe Sticky component implementation relies on `position: sticky` attribute, which may become invalid due to the influence of the parent element. [This document](https://developer.mozilla.org/en-US/docs/Web/CSS/position) Check the element layout of the page.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-sticky\": \"antd-mini/es/Sticky/index\"\n#endif\n#if WECHAT\n  \"ant-sticky\": \"antd-mini/Sticky/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic Usage\n\n```xml\n<ant-sticky>\n  <view>\n    I will ceiling\n  </view>\n</ant-sticky>\n```\n\n### Specified ceiling height\n\n```xml\n<ant-sticky top=\"100px\">\n  <view>\n    I will be at the top 100px from the top of the place\n  </view>\n</ant-sticky>\n```\n\n### Perceive whether the ceiling is absorbed\n\n```xml\n<ant-sticky\n  top=\"180px\"\n  check=\"{{true}}\"\n#if ALIPAY\n  onStickyChange=\"handleStickyChange\"\n#endif\n#if WECHAT\n  bindstickychange=\"handleStickyChange\"\n#endif\n>\n  <view>\n    <view>I will ceiling at 180px from the top</view>\n    <view>Whether it has sucked {{stickyStatus}}</view>\n  </view>\n</ant-sticky>\n```\n\n```js\nPage({\n  data: {\n    stickyStatus: false,\n  },\n  handleStickyChange(status) {\n    this.setData({ stickyStatus: status });\n  },\n});\n```\n\n### Transparent head mode\n\n```xml\n<ant-sticky transparentTitle=\"{{true}}\">\n  <view>\n    I will ceiling\n  </view>\n</ant-sticky>\n```\n\n### Demo Code\n\n<code src=\"../../demo/pages/Sticky/index\"></code>\n\n## Property\n\n| Property                            | Type     | Default Value         | Description                                                                 |\n| ------------------------------- | -------- | -------------- | -------------------------------------------------------------------- |\n| className                       | string   | \"\"             | Container className                                                       |\n| top                             | string   | \"\"             | Cesting height, need to write units, such as 10px,24rpx                                |\n| check                           | bool     | false          | Whether it is necessary to sense whether the ceiling has been absorbed, because the ceiling inspection still has a certain cost.                 |\n| sticky                          | bool     | true           | Whether to ceiling, some scenes do not necessarily need                                       |\n| transparentTitle                | bool     | false          | Whether it is a transparent head, the transparent head will automatically calculate the titleBar height, and the default adsorption is under the titlebar |\n| #if ALIPAY onStickyChange       | Function | (status) => {} | Whether it is in the ceiling state, note that the check function needs to be turned on to have this callback.                  |\n| #if ALIPAY onGetHeaderHeight    | Function | (height) => {} | Calculate the height of the head to complete                                                     |\n| #if WECHAT bindstickychange    | Function | (status) => {} | Whether it is in the ceiling state, note that the check function needs to be turned on to have this callback.                  |\n| #if WECHAT bindgetheaderheight | Function | (height) => {} | Calculate the height of the head to complete                                                     |\n\n## Slot\n\nThere is only one default slot for wrapping elements and components that want to be capped.\n\n## Other\n\nIt should be noted that the automatic calculation of head height in the transparent page scene is only convenient to suck on the top. If there is an offset, it still needs to be calculated by itself.\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name            | Default Value                                                                                                                      | Dark Mode Default                                                                                                               | Remarks           |\n| ----------------- | --------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | -------------- |\n| --sticky-check-bg | <div style=\"width: 150px; height: 40px; background-color:rgba(238, 238, 238, 0); color: #fff;\">rgba(238, 238, 238, 0)</div> | <div style=\"width: 150px; height: 40px; background-color: rgba(238, 238, 238, 0); color: #fff;\">rgba(238, 238, 238, 0)</div> | Selector Background Color |\n"
  },
  {
    "path": "src/Sticky/index.json",
    "content": "{  \n  \"styleIsolation\": \"shared\",\n  \"component\": true\n}\n"
  },
  {
    "path": "src/Sticky/index.less",
    "content": "@import (reference) './variable.less';\n\n@stickyPrefix: ant-sticky;\n\n.@{stickyPrefix} {\n  position: sticky;\n  top: 0;\n\n  &-check {\n    position: fixed;\n    height: 2px;\n    background: @sticky-check-bg;\n    top: 0;\n    width: 100%;\n    pointer-events: none;\n  }\n}\n"
  },
  {
    "path": "src/Sticky/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 通用\n  order: 2\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Sticky 粘性吸附\n用在需要在滚动中吸附在某些地方的情况。\n\n## 注意事项\n\nSticky 组件实现依赖了 `position: sticky` 特性，该特性受父元素的影响可能会失效，若遇到 Sticky 组件不生效的情况可根据 [这篇文档](https://developer.mozilla.org/en-US/docs/Web/CSS/position) 检查页面的元素布局。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-sticky\": \"antd-mini/es/Sticky/index\"\n#endif\n#if WECHAT\n  \"ant-sticky\": \"antd-mini/Sticky/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基础用法\n\n```xml\n<ant-sticky>\n  <view>\n    我会吸顶\n  </view>\n</ant-sticky>\n```\n\n### 指定吸顶高度\n\n```xml\n<ant-sticky top=\"100px\">\n  <view>\n    我会吸顶在距离顶部 100px 的地方\n  </view>\n</ant-sticky>\n```\n\n### 感知是否吸顶\n\n```xml\n<ant-sticky\n  top=\"180px\"\n  check=\"{{true}}\"\n#if ALIPAY\n  onStickyChange=\"handleStickyChange\"\n#endif\n#if WECHAT\n  bindstickychange=\"handleStickyChange\"\n#endif\n>\n  <view>\n    <view>我会吸顶在距离顶部 180px 的地方</view>\n    <view>是否吸上了 {{stickyStatus}}</view>\n  </view>\n</ant-sticky>\n```\n\n```js\nPage({\n  data: {\n    stickyStatus: false,\n  },\n  handleStickyChange(status) {\n    this.setData({ stickyStatus: status });\n  },\n});\n```\n\n### 透明头模式\n\n```xml\n<ant-sticky transparentTitle=\"{{true}}\">\n  <view>\n    我会吸顶\n  </view>\n</ant-sticky>\n```\n\n### Demo 代码\n\n<code src=\"../../demo/pages/Sticky/index\"></code>\n\n## 属性\n\n| 属性                            | 类型     | 默认值         | 说明                                                                 |\n| ------------------------------- | -------- | -------------- | -------------------------------------------------------------------- |\n| className                       | string   | \"\"             | 容器 className                                                       |\n| top                             | string   | \"\"             | 吸顶高度，需要写单位，比如 10px,24rpx                                |\n| check                           | bool     | false          | 是否需要感知是否吸顶了，因为吸顶检查还是有一定成本的                 |\n| sticky                          | bool     | true           | 是否要吸顶，某些场景不一定需要                                       |\n| transparentTitle                | bool     | false          | 是否是透明头，透明头会自动计算 titleBar 高度，默认吸附在 titlebar 下 |\n| #if ALIPAY onStickyChange       | Function | (status) => {} | 是否在吸顶状态，注意需要打开 check 功能才有这个回调                  |\n| #if ALIPAY onGetHeaderHeight    | Function | (height) => {} | 计算头的高度完成                                                     |\n| #if WECHAT bindstickychange    | Function | (status) => {} | 是否在吸顶状态，注意需要打开 check 功能才有这个回调                  |\n| #if WECHAT bindgetheaderheight | Function | (height) => {} | 计算头的高度完成                                                     |\n\n## 插槽\n\n仅有一个默认插槽，用于包裹想吸顶的元素、组件。\n\n## 其他\n\n需要注意的是，透明页面场景下自动计算头高度仅方便吸在顶上的情况，如果有偏移，还是需要自行计算的。\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名            | 默认值                                                                                                                      | 深色模式默认值                                                                                                               | 备注           |\n| ----------------- | --------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | -------------- |\n| --sticky-check-bg | <div style=\"width: 150px; height: 40px; background-color:rgba(238, 238, 238, 0); color: #fff;\">rgba(238, 238, 238, 0)</div> | <div style=\"width: 150px; height: 40px; background-color: rgba(238, 238, 238, 0); color: #fff;\">rgba(238, 238, 238, 0)</div> | 选择器背景颜色 |\n"
  },
  {
    "path": "src/Sticky/index.ts",
    "content": "import equal from 'fast-deep-equal';\nimport { Component, getValueFromProps, triggerEvent } from '../_util/simply';\nimport { assertAilpayNativeNotSupport } from '../_util/support';\nimport { StickyProps } from './props';\n\nassertAilpayNativeNotSupport('Sticky');\n\nComponent({\n  props: StickyProps,\n  data: {\n    headerHeight: 91, // 透明头时的头部高度，单位是px\n  },\n  methods: {\n    initTabsObserver() {\n      this.stickyIO\n        .relativeTo('.ant-sticky-check')\n        .observe('.ant-sticky', (res) => {\n          // console.log(res, 'intersectionObserver');\n          // console.log(\n          //   '相交区域占目标节点的布局区域的比例',\n          //   res.intersectionRatio,\n          // );\n          // console.log('相交区域', res.intersectionRect);\n          // console.log('相交区域', res.intersectionRect.height);\n          // console.log('参照区域的边界', res.relativeRect);\n          // console.log('目标边界', res.boundingClientRect);\n          // console.log('时间戳', res.time);\n          triggerEvent(this, 'stickyChange', res.intersectionRatio > 0);\n        });\n    },\n\n    initHeaderHeight(propsHeaderHeight) {\n      // 如果外部有传入默认的高度，优先使用外部的高度，则不根据 getSystemInfo 获取\n      if (propsHeaderHeight !== undefined) {\n        this.setData({ headerHeight: propsHeaderHeight });\n        // 拿都拿到了，顺便抛出去\n        triggerEvent(this, 'getHeaderHeight', propsHeaderHeight);\n      } else {\n        my.getSystemInfo().then((res) => {\n          const headerHeight =\n            (res.statusBarHeight || 47) + (res.titleBarHeight || 44);\n          this.setData({ headerHeight });\n          // 拿都拿到了，顺便抛出去\n          triggerEvent(this, 'getHeaderHeight', propsHeaderHeight);\n        });\n      }\n    },\n  },\n  /// #if ALIPAY\n  onInit() {\n    const [transparentTitle, propsHeaderHeight, check] = getValueFromProps(\n      this,\n      ['transparentTitle', 'headerHeight', 'check']\n    );\n    // 如果是透明头，高度默认设为一个iPhoneX的默认高度，并通过JSAPI获取实际的高度进行替换\n    if (transparentTitle) {\n      this.initHeaderHeight(propsHeaderHeight);\n    }\n    // 考虑到这个还是有点性能开销，用个属性控制\n    if (check) {\n      this.stickyIO = this.createIntersectionObserver();\n      this.initTabsObserver();\n    }\n  },\n  deriveDataFromProps(nextProps) {\n    const [sticky, headerHeight] = getValueFromProps(this, [\n      'sticky',\n      'headerHeight',\n    ]);\n    if (sticky !== nextProps.sticky) {\n      // 考虑到这个还是有点性能开销，用个属性控制\n      if (nextProps.check && !this.stickyIO) {\n        this.stickyIO = this.createIntersectionObserver();\n        this.initTabsObserver();\n      }\n    }\n\n    if (headerHeight !== nextProps.headerHeight) {\n      this.initHeaderHeight(nextProps.headerHeight);\n    }\n  },\n\n  didUnmount() {\n    this.stickyIO && this.stickyIO.disconnect();\n  },\n  /// #endif\n  /// #if WECHAT\n  attached() {\n    const [transparentTitle, propsHeaderHeight, check] = getValueFromProps(\n      this,\n      ['transparentTitle', 'headerHeight', 'check']\n    );\n    // 如果是透明头，高度默认设为一个iPhoneX的默认高度，并通过JSAPI获取实际的高度进行替换\n    if (transparentTitle) {\n      this.initHeaderHeight(propsHeaderHeight);\n    }\n    // 考虑到这个还是有点性能开销，用个属性控制\n    if (check) {\n      this.stickyIO = this.createIntersectionObserver();\n      this.initTabsObserver();\n    }\n  },\n  detached() {\n    this.stickyIO && this.stickyIO.disconnect();\n  },\n\n  observers: {\n    '**': function (data) {\n      const prevData = this._prevData || this.data;\n      this._prevData = { ...data };\n      if (!equal(prevData, data)) {\n        const [sticky, headerHeight] = getValueFromProps(this, [\n          'sticky',\n          'headerHeight',\n        ]);\n        if (sticky !== data.sticky) {\n          // 考虑到这个还是有点性能开销，用个属性控制\n          if (data.check && !this.stickyIO) {\n            this.stickyIO = this.createIntersectionObserver();\n            this.initTabsObserver();\n          }\n        }\n\n        if (headerHeight !== data.headerHeight) {\n          this.initHeaderHeight(data.headerHeight);\n        }\n      }\n    },\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/Sticky/props.ts",
    "content": "export interface IStickyProps {\n  className: string;\n  headerHeight: number;\n  sticky: boolean;\n  top: string;\n  check: boolean;\n  transparentTitle: boolean;\n  onStickyChange: (status: boolean) => void;\n  onGetHeaderHeight: (height: number) => void;\n}\n\nexport const StickyProps: IStickyProps = {\n  className: '',\n  headerHeight: undefined, // 从外部传入的 tab header 高度，默认为 undefined\n  sticky: true, // 是否需要粘性，某些场景可能需要一会儿吸顶一会儿不吸\n  top: '',\n  check: false, // 是否需要检查是否吸顶\n  transparentTitle: false, // 是否是透明头\n  onStickyChange: (status: boolean) => status, // 是否吸附变化时的回调\n  onGetHeaderHeight: (height: number) => height, // 获取到header高度时顺便抛出去一份\n};\n"
  },
  {
    "path": "src/Sticky/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n@sticky-check-bg: var(--sticky-check-bg, rgba(238, 238, 238, 0));\n"
  },
  {
    "path": "src/SwipeAction/index.axml",
    "content": "<import-sjs\n  from=\"./index.sjs\"\n  name=\"util\" />\n\n<view class=\"ant-swipe\">\n  <view\n    class=\"ant-swipe-action\"\n    style=\"width: {{ util.getWidth(rightWidth, leftWidth, inertiaWidth) }};\">\n    <movable-area\n      a:if=\"{{ ready }}\"\n      class=\"ant-swipe-action-movable\"\n      style=\"margin-left: {{ util.getMarginLeft(rightWidth, leftWidth, inertiaWidth) }}\">\n      <movable-view\n        class=\"ant-swipe-action-movable-content\"\n        style=\"width:{{ util.getWidth2(rightWidth, leftWidth, inertiaWidth) }}; margin-left: {{ util.getMarginLeft2(rightWidth, leftWidth, inertiaWidth) }};\"\n        x=\"{{ swipeX }}\"\n        data-type=\"content\"\n        animation=\"{{ animation }}\"\n        damping=\"{{ damping }}\"\n        direction=\"horizontal\"\n        out-of-bounds=\"{{ false }}\"\n        disabled=\"{{ disabled }}\"\n        onTap=\"onSwipeTap\"\n        onChange=\"onChange\"\n        onChangeEnd=\"onChangeEnd\"\n        catchTouchEnd=\"onTouchEnd\"\n        onTouchCancel=\"onTouchCancel\"\n        catchTouchStart=\"onTouchStart\">\n        <view\n          class=\"ant-swipe-action-movable-content-view\"\n          style=\"{{ util.getSlotWidthStyle(rightWidth, leftWidth, _leftButtons, _rightButtons, inertiaWidth) }}\"\n          onTap=\"onClick\">\n          <view\n            a:if=\"{{ swipedR || swipedL }}\"\n            class=\"ant-swipe-action-movable-content-view-modal\" />\n          <slot />\n        </view>\n      </movable-view>\n      <movable-view\n        class=\"ant-swipe-action-movable-content ant-swipe-action-movable-right{{ $id ? '-' + $id : '' }}\"\n        a:for=\"{{ _rightButtons }}\"\n        a:for-item=\"item\"\n        a:for-index=\"idx\"\n        damping=\"{{ damping }}\"\n        key=\"{{ idx }}\"\n        style=\"{{ util.getRightMovableContentStyle(tapTypeR, idx, rightWidth, leftWidth, inertiaWidth) }}\"\n        data-type=\"content\"\n        animation=\"{{ false }}\"\n        disabled=\"{{ true }}\"\n        direction=\"horizontal\"\n        x=\"{{ moveX * (util.getMoveX(_rightButtons, idx) / rightWidth) }}\">\n        <view\n          class=\"ant-swipe-action-movable-content-right\"\n          style=\"background: {{ item.bgColor }};width: {{ (item.width + inertiaWidth + 1) / 2 }}px;\">\n          <view\n            class=\"ant-swipe-action-movable-content-right-text\"\n            onTap=\"onItemTap\"\n            data-item=\"{{ util.axmlObj({ item, idx }) }}\"\n            aria-hidden=\"{{ !swipedR }}\"\n            style=\"{{ util.getMovableContentRightStyle(item, tapTypeR, idx, rightWidth, inTouch, inertiaWidth, myStyle) }}\">\n            <!-- #if ALIPAY -->\n            <slot name=\"{{ util.getRightSlotName(tapTypeR, idx, item) }}\">\n              <!-- display: inline -->\n              <text\n                class=\"right-text {{ util.getLeft(tapTypeR, idx, _rightButtons, true) }}\"\n                >{{ util.getRightText(tapTypeR, idx, item) }}</text\n              >\n            </slot>\n            <!-- #endif -->\n            <!-- #if WECHAT -->\n            <slot\n              wx:if=\"{{ util.getRightSlotName(tapTypeR, idx, item) }}\"\n              name=\"{{ util.getRightSlotName(tapTypeR, idx, item) }}\" />\n            <!-- display: inline -->\n            <text\n              wx:else\n              class=\"right-text {{ util.getLeft(tapTypeR, idx, _rightButtons, true) }}\"\n              >{{ util.getRightText(tapTypeR, idx, item) }}</text>\n            <!-- #endif -->\n          </view>\n        </view>\n      </movable-view>\n      <movable-view\n        class=\"ant-swipe-action-movable-content ant-swipe-action-is-right-swipe ant-swipe-action-movable-left{{ $id ? '-' + $id : '' }}\"\n        a:for=\"{{ _leftButtons }}\"\n        a:for-item=\"itemL\"\n        a:for-index=\"idx\"\n        key=\"left-{{ idx }}\"\n        damping=\"{{ damping }}\"\n        style=\"{{ util.getLeftMovableContentStyle(tapTypeL, idx, leftWidth, inertiaWidth) }}\"\n        data-type=\"content\"\n        animation=\"{{ false }}\"\n        disabled=\"{{ true }}\"\n        direction=\"horizontal\"\n        x=\"{{ moveX * (util.getMoveX(_leftButtons, idx) / leftWidth) }}\">\n        <view\n          class=\"ant-swipe-action-movable-content-left\"\n          style=\"background: {{ tapTypeL && tapTypeL === 'L-' + idx && _leftButtons.length === 3 && idx === 1 ? 'none' : itemL.bgColor }};width: {{ (leftWidth + inertiaWidth) / 2 }}px\">\n          <view\n            class=\"ant-swipe-action-movable-content-left-text1 ant-swipe-action-left\"\n            onTap=\"onItemTap\"\n            data-item=\"{{ util.axmlObj({ itemL, idx }) }}\"\n            aria-hidden=\"{{ !swipedL }}\"\n            style=\"{{ util.getMovableContentLeftStyle(itemL, tapTypeL, idx, leftWidth, inTouch, inertiaWidth, myStyle) }}\">\n            <!-- #if ALIPAY -->\n            <slot name=\"{{ util.getLeftSlotName(tapTypeL, idx, itemL) }}\">\n              <!-- display: inline -->\n              <text\n                class=\"right-text\"\n                style=\"width: 100%\"\n              >\n                <!-- display: inline -->\n                <text\n                  class=\"right-text {{ util.getLeft(tapTypeL, idx, _leftButtons, false) }}\"\n                >\n                  {{ util.getLeftText(tapTypeL, idx, itemL) }}\n                </text>\n              </text>\n            </slot>\n            <!-- #endif -->\n            <!-- #if WECHAT -->\n            <slot\n              wx:if=\"{{ util.getLeftSlotName(tapTypeL, idx, itemL) }}\"\n              name=\"{{ util.getLeftSlotName(tapTypeL, idx, itemL) }}\" />\n            <!-- display: inline -->\n            <text\n              wx:else\n              class=\"right-text\"\n              style=\"width: 100%\"\n            >\n              <!-- display: inline -->\n              <text\n                class=\"right-text {{ util.getLeft(tapTypeL, idx, _leftButtons, false) }}\"\n              >\n                {{ util.getLeftText(tapTypeL, idx, itemL) }}\n              </text>\n            </text>\n            <!-- #endif -->\n          </view>\n        </view>\n      </movable-view>\n    </movable-area>\n  </view>\n</view>\n"
  },
  {
    "path": "src/SwipeAction/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Information Display\n  order: 8\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# SwipeAction\n\nList of functional extensions. Show hidden function menus by sliding.\n\n## Precautions\n\n1. The component's parent container must have width and height set.\n2. The sum of the widths of the sliding buttons on both sides must be the same.\n3. When elasticity is set to false, a smaller damping value provides a better experience.\n4. The second confirmation of the sliding on each side will only trigger the first one, the others will not trigger.\n5. It is recommended to use it in applets of the basic library 2.0.1.0 versions (such as DingTalk applets) have defects in sliding experience (lack of sliding transition effect after touchend).\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-swipe-action\": \"antd-mini/es/SwipeAction/index\"\n#endif\n\n#if WECHAT\n  \"ant-swipe-action\": \"antd-mini/SwipeAction/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic Usage\n\n```xml\n<ant-swipe-action\n  rightButtons=\"{{[[\n      {\n        text: 'favor',\n        bgColor: '#CCCCCC',\n        color: '#fff',\n        width: 200,\n      },\n      {\n        text: 'rest',\n        bgColor: '#1677FF',\n        color: '#fff',\n        width: 170,\n      },\n      {\n        text: 'delete',\n        bgColor: '#FF2B00',\n        color: '#fff',\n        width: 140,\n      },\n    ]]}}\"\n    elasticity=\"{{true}}\"\n    swiped=\"{{swipeIndex === index}}\"\n    onSwipeEnd=\"onSwipeEnd\"\n    onSwipeStart=\"onSwipeStart\"\n    onButtonTap=\"onButtonTap\">\n  <view>Right-three buttons</view>\n</ant-swipe-action>\n```\n\n### Button on the left\n\nSetup`leftButtons`Property\n<code src='../../demo/pages/SwipeActionLeft/index'></code>\n\n### Change the number of buttons\n\n<code src='../../demo/pages/SwipeActionNumber/index'></code>\n\n### Disable sliding rebound\n\nSetup`elasticity`property is`false`\n<code src='../../demo/pages/SwipeActionAnimation/index'></code>\n\n### Set button width\n\nSet the buttons`width`Property\n<code src='../../demo/pages/SwipeActionWidth/index'></code>\n\n### Set sliding speed\n\nSetup`damping`Property\n<code src='../../demo/pages/SwipeActionSpeed/index'></code>\n\n### Button click twice to confirm\n\nSet buttons Properties`confirmType`For`tap`\n\n<code src='../../demo/pages/SwipeActionTap/index'></code>\n\n### Second confirmation of maximum sliding distance of button\n\nSet buttons Properties`confirmType`For`move`\n<code src='../../demo/pages/SwipeActionMove/index'></code>\n\n### There are buttons on the left and right sides\n\nCan be set simultaneously`leftButtons`and`rightButtons`\n<code src='../../demo/pages/SwipeActionLeftRight/index'></code>\n\n### Custom Button\n\n<code src='../../demo/pages/SwipeActionSlot/index'></code>\n\n### Demo Code\n\n<code src='../../demo/pages/SwipeAction/index'></code>\n\n## API\n\n| Property          | Type                          | Default Value                            | Description                                                                                                         |\n| ------------- | ----------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------ |\n| leftButtons   | [SwipeButton](#SwipeButton)   | []                                | Left button                                                                                                     |\n| rightButtons  | [SwipeButton](#SwipeButton)   | []                                | Right button                                                                                                     |\n| damping       | number                        | 70                                | Sliding speed                                                                                                     |\n| elasticity    | boolean                       | `true`                            | sliding elasticity                                                                                                     |\n| swiped        | `''` \\| `'left'` \\| `'right'` | `false`                           | Whether sliding open                                                                                                     |\n| defaultSwiped | `''` \\| `'left'` \\| `'right'` | `false`                           | Default slide open                                                                                                 |\n| disabled      | boolean                       | `false`                           | No Sliding                                                                                                     |\n| onSwipeStart  | Slide start callback function            | (data: object, e: string) => void | E: data in the data-xxx on the component; Data: direction (whether the sliding button is left or right),swiped (whether to slide open)                     |\n| onSwipeEnd    | Slide End Callback Function            | (data: object, e: string) => void | E: data in the data-xxx on the component; Data: direction (whether the sliding button is left or right),swiped (whether to slide open)                     |\n| onButtonTap   | Callback function triggered by the button            | (data: object, e: string) => void | E: data in the data-xxx on the component; data: direction (whether the sliding button is left or right),btnIdx (the index of the button, the part near the main body is 0) |\n\n### SwipeButton\n\n| Property        | Type                        | Default Value | Description                                                                                |\n| ----------- | --------------------------- | ------ | ----------------------------------------------------------------------------------- |\n| text        | string                      | -      | Button Text                                                                            |\n| slotName    | string                      | -      | The name of the slot. You can customize the content of the corresponding button.`${slotName}-confirm`You can customize the content of the button at the time of confirmation |\n| bgColor     | string                      | -      | Button background color                                                                        |\n| color       | string                      | `#fff` | Button Font Color                                                                        |\n| width       | number                      | 150    | Button width                                                                            |\n| confirmType | `''` \\| `'move'` \\| `'tap'` | -      | Secondary confirmation type: do not trigger secondary confirmation | slide beyond the maximum distance to trigger secondary confirmation | click to trigger secondary confirmation    |\n| confirmText | string                      | -      | Copy description of the second confirmation; if empty, text is displayed                                             |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name               | Light Mode Default                                                                                    | Dark Mode Default                                                                                    | Remarks         |\n| -------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------ |\n| --swipe-action-color | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | Slide operation color |\n"
  },
  {
    "path": "src/SwipeAction/index.json",
    "content": "{  \n  \"styleIsolation\": \"shared\",\n  \"component\": true\n}"
  },
  {
    "path": "src/SwipeAction/index.less",
    "content": "@import (reference) './variable.less';\n\n@keyframes text-animate-right {\n  33% {\n    margin-left: -10 * @rpx;\n  }\n  66% {\n    margin-left: 10 * @rpx;\n  }\n  100% {\n    margin-left: 0 * @rpx;\n  }\n}\n@keyframes text-animate-midd {\n  0% {\n    margin-left: 44 * @rpx;\n  }\n  100% {\n    margin-left: 0 * @rpx;\n  }\n}\n@keyframes text-animate-left {\n  33% {\n    margin-left: 10 * @rpx;\n  }\n  66% {\n    margin-left: -10 * @rpx;\n  }\n  100% {\n    margin-left: 0 * @rpx;\n  }\n}\n.text-move-right {\n  animation-name: text-animate-right;\n  animation-duration: 500ms;\n}\n.text-move-left {\n  animation-name: text-animate-left;\n  animation-duration: 500ms;\n}\n.text-move-midd {\n  animation-name: text-animate-midd;\n  animation-duration: 500ms;\n}\n.ant-swipe {\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  &-action {\n    height: 100%;\n    position: relative;\n    &-movable {\n      width: 100%;\n      height: 100%;\n      &-content {\n        height: 100%;\n        position: relative;\n        &-view {\n          height: 100%;\n          &-modal {\n            width: 100%;\n            height: 100%;\n            background: transparent;\n            position: absolute;\n            left: 0;\n            top: 0;\n            z-index: 9;\n          }\n        }\n        &-right {\n          height: 100%;\n          color: @swipe-action-color;\n          &-text {\n            height: 100%;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            transition: all 120ms cubic-bezier(0.2, 0.2, 0.8, 1);\n            .right-text {\n              text-align: center;\n              white-space: nowrap;\n            }\n          }\n        }\n        &-left {\n          position: absolute;\n          right: 0;\n          top: 0;\n          color: @swipe-action-color;\n          display: flex;\n          flex-direction: row;\n          justify-content: flex-end;\n          &-text1 {\n            height: 100%;\n            display: flex;\n            align-items: center;\n            justify-content: flex-end;\n            transition: all 120ms cubic-bezier(0.2, 0.2, 0.8, 1);\n            .right-text {\n              text-align: center;\n              white-space: nowrap;\n            }\n          }\n        }\n      }\n    }\n  }\n}\n.ant-swipe-action-is-right-swipe {\n  display: flex;\n  flex-direction: row;\n  justify-content: flex-end;\n}\n"
  },
  {
    "path": "src/SwipeAction/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 数据展示\n  order: 8\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# SwipeAction 滑动组件\n\n列表的功能扩展。通过滑动操作来展示隐藏的功能菜单。\n\n## 注意事项\n\n1. 该组件的父级容器必须设置 width 和 height。\n2. 两侧滑动按钮的宽度总和需一致。\n3. 若 elasticity 设置为 false 时，较小的 damping 值可提供更佳的体验。\n4. 每一侧的滑动二次确认只会触发第一个，其他不会触发。\n5. 建议在基础库 2.0 的小程序中使用，1.0 版本（如钉钉小程序）中存在滑动体验缺陷（缺少 touchend 之后的滑动过渡效果）。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-swipe-action\": \"antd-mini/es/SwipeAction/index\"\n#endif\n\n#if WECHAT\n  \"ant-swipe-action\": \"antd-mini/SwipeAction/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基础用法\n\n```xml\n<ant-swipe-action\n  rightButtons=\"{{[[\n      {\n        text: 'favor',\n        bgColor: '#CCCCCC',\n        color: '#fff',\n        width: 200,\n      },\n      {\n        text: 'rest',\n        bgColor: '#1677FF',\n        color: '#fff',\n        width: 170,\n      },\n      {\n        text: 'delete',\n        bgColor: '#FF2B00',\n        color: '#fff',\n        width: 140,\n      },\n    ]]}}\"\n    elasticity=\"{{true}}\"\n    swiped=\"{{swipeIndex === index}}\"\n    onSwipeEnd=\"onSwipeEnd\"\n    onSwipeStart=\"onSwipeStart\"\n    onButtonTap=\"onButtonTap\">\n  <view>右侧-三个按钮</view>\n</ant-swipe-action>\n```\n\n### 按钮在左侧\n\n设置`leftButtons`属性\n<code src='../../demo/pages/SwipeActionLeft/index'></code>\n\n### 改变按钮数量\n\n<code src='../../demo/pages/SwipeActionNumber/index'></code>\n\n### 禁用滑动回弹\n\n设置`elasticity`属性为`false`\n<code src='../../demo/pages/SwipeActionAnimation/index'></code>\n\n### 设置按钮宽度\n\n设置 buttons 的`width`属性\n<code src='../../demo/pages/SwipeActionWidth/index'></code>\n\n### 设置滑动速度\n\n设置`damping`属性\n<code src='../../demo/pages/SwipeActionSpeed/index'></code>\n\n### 按钮点击二次确认\n\n设置 buttons 属性`confirmType`为`tap`\n\n<code src='../../demo/pages/SwipeActionTap/index'></code>\n\n### 按钮滑出最大距离二次确认\n\n设置 buttons 属性`confirmType`为`move`\n<code src='../../demo/pages/SwipeActionMove/index'></code>\n\n### 左右两侧都有按钮\n\n可同时设置`leftButtons`和`rightButtons`\n<code src='../../demo/pages/SwipeActionLeftRight/index'></code>\n\n### 自定义按钮\n\n<code src='../../demo/pages/SwipeActionSlot/index'></code>\n\n### Demo 代码\n\n<code src='../../demo/pages/SwipeAction/index'></code>\n\n## API\n\n| 属性          | 类型                          | 默认值                            | 说明                                                                                                         |\n| ------------- | ----------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------ |\n| leftButtons   | [SwipeButton](#SwipeButton)   | []                                | 左侧按钮                                                                                                     |\n| rightButtons  | [SwipeButton](#SwipeButton)   | []                                | 右侧按钮                                                                                                     |\n| damping       | number                        | 70                                | 滑动速度                                                                                                     |\n| elasticity    | boolean                       | `true`                            | 滑动弹性                                                                                                     |\n| swiped        | `''` \\| `'left'` \\| `'right'` | `false`                           | 是否滑开                                                                                                     |\n| defaultSwiped | `''` \\| `'left'` \\| `'right'` | `false`                           | 是否默认滑开                                                                                                 |\n| disabled      | boolean                       | `false`                           | 禁止滑动                                                                                                     |\n| onSwipeStart  | 滑动开始的回调函数            | (data: object, e: string) => void | e: 组件上 data-xxx 中的数据；data: direction(滑动的按钮是左边还是右边)，swiped(是否滑开)                     |\n| onSwipeEnd    | 滑动结束的回调函数            | (data: object, e: string) => void | e: 组件上 data-xxx 中的数据；data: direction(滑动的按钮是左边还是右边)，swiped(是否滑开)                     |\n| onButtonTap   | 按钮触发的回调函数            | (data: object, e: string) => void | e: 组件上 data-xxx 中的数据；data: direction(滑动的按钮是左边还是右边)，btnIdx(按钮的索引，靠近主体部分为 0) |\n\n### SwipeButton\n\n| 属性        | 类型                        | 默认值 | 说明                                                                                |\n| ----------- | --------------------------- | ------ | ----------------------------------------------------------------------------------- |\n| text        | string                      | -      | 按钮文字                                                                            |\n| slotName    | string                      | -      | slot 名称,可以自定义对应按钮的内容。`${slotName}-confirm`可以自定义确认时的按钮内容 |\n| bgColor     | string                      | -      | 按钮背景颜色                                                                        |\n| color       | string                      | `#fff` | 按钮字体颜色                                                                        |\n| width       | number                      | 150    | 按钮宽度                                                                            |\n| confirmType | `''` \\| `'move'` \\| `'tap'` | -      | 二次确认类型：不触发二次确认 \\| 滑动超出最大距离触发二次确认 \\| 点击触发二次确认    |\n| confirmText | string                      | -      | 二次确认的文案描述；若为空，则展示 text                                             |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名               | 浅色模式默认值                                                                                    | 深色模式默认值                                                                                    | 备注         |\n| -------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------ |\n| --swipe-action-color | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | 滑动操作颜色 |\n"
  },
  {
    "path": "src/SwipeAction/index.sjs.ts",
    "content": "const getWidth = (rightWidth, leftWidth, inertiaWidth) => {\n  const num = (rightWidth || leftWidth) * 2 + inertiaWidth;\n  const width = rightWidth > leftWidth ? rightWidth : leftWidth;\n  return rightWidth && leftWidth\n    ? `calc(100% + ${width + inertiaWidth}px)`\n    : `calc(100% + ${num / 2}px)`;\n};\n\nconst getMarginLeft = (rightWidth, leftWidth, inertiaWidth) => {\n  const width = rightWidth > leftWidth ? rightWidth : leftWidth;\n  return `calc(-${(width + inertiaWidth) / 2}px)`;\n};\n\nconst getSlotWidthStyle = (\n  rightWidth,\n  leftWidth,\n  left = [],\n  right = [],\n  inertiaWidth\n) => {\n  // 右\n  if (right.length > 0 && left.length === 0) {\n    return `calc(100% - ${(1 + inertiaWidth) / 2}px)`;\n  }\n  // 左\n  if (left.length > 0 && right.length === 0) {\n    return `width: calc(100% - ${leftWidth / 2}px); margin-left: ${\n      (leftWidth + inertiaWidth) / 2\n    }px;`;\n  }\n  if (left.length > 0 && right.length > 0) {\n    return `width: 100%;margin-left: 0;`;\n  }\n};\nconst getLeft = (tapType, idx, right, isLeft) => {\n  const tip = !isLeft ? 'L-' : 'R-';\n  if (right.length === 1) {\n    return tapType && tapType === `${tip}${idx}` ? 'text-move-midd' : '';\n  }\n  if (right.length === 3 && idx === 1) {\n    return tapType && tapType === `${tip}${idx}` ? 'text-move-midd' : '';\n  }\n  let cls = '';\n  if (idx === 0) {\n    cls = isLeft ? 'text-move-left' : 'text-move-right';\n  } else {\n    cls = isLeft ? 'text-move-right' : 'text-move-left';\n  }\n  return tapType && tapType === `${tip}${idx}` ? cls : '';\n};\n\nconst getWidth2 = (rightWidth, leftWidth, inertiaWidth) => {\n  const width = rightWidth > leftWidth ? rightWidth : leftWidth;\n  return rightWidth && leftWidth\n    ? `calc(100% - ${width + inertiaWidth}px)`\n    : `calc(100% - ${(width + inertiaWidth) / 2}px)`;\n};\nconst getMarginLeft2 = (rightWidth, leftWidth, inertiaWidth) => {\n  const num = rightWidth > 0 ? inertiaWidth : 0;\n  const width = rightWidth > leftWidth ? rightWidth : leftWidth;\n  return leftWidth && rightWidth\n    ? `${(width + num) / 2}px`\n    : leftWidth > 0\n    ? 0\n    : `${(width + inertiaWidth) / 2}px`;\n};\nconst getMarginLeft3 = (rightWidth, leftWidth, inertiaWidth) => {\n  const width = rightWidth > leftWidth ? rightWidth : leftWidth;\n  return leftWidth && rightWidth\n    ? `calc(100% - ${(width + inertiaWidth) / 2}px)`\n    : `calc(100% - ${rightWidth / 2 - 1}px)`;\n};\nconst getMoveX = (rightButtons, idx) => {\n  const arr = rightButtons.slice(idx, rightButtons.length);\n  return arr.reduce((tolal, cur) => {\n    return parseFloat(tolal) + cur.width;\n  }, 0);\n};\n\nconst getMovableContentRightStyle = (\n  item,\n  tapTypeR,\n  idx,\n  rightWidth,\n  inTouch,\n  inertiaWidth,\n  myStyle\n) => {\n  const isTapTypeR = tapTypeR && tapTypeR === `R-${idx}`;\n  const myStyleString = isTapTypeR ? styleObjectToString(myStyle) : '';\n\n  return `\n  font-size: ${(item.fontSize || 28) / 2}px;\n  color: ${item.color};\n  background: ${item.bgColor};\n  height: calc(100% + 2px);\n  ${\n    isTapTypeR\n      ? `width: ${\n          (rightWidth +\n            1 +\n            (item.confirmType === 'move' && inTouch ? inertiaWidth : 0)) /\n          2\n        }px;`\n      : `width: ${item.width / 2}px;`\n  }\n  ${myStyleString}`;\n};\n\nconst styleKeyMap = {\n  'marginRight': 'margin-right',\n  'marginLeft': 'margin-left',\n  'fontSize': 'font-size',\n  zIndex: 'z-index',\n};\n\nfunction styleObjectToString(myStyle) {\n  const styleKeys = keys(myStyle);\n  let res = '';\n  for (let i = 0; i < styleKeys.length; i++) {\n    const key = styleKeys[i];\n    res = res + `${styleKeyMap[key] || key}: ${myStyle[key]}; `;\n  }\n  return res;\n}\n\nconst getMovableContentLeftStyle = (\n  itemL,\n  tapTypeL,\n  idx,\n  leftWidth,\n  inTouch,\n  inertiaWidth,\n  myStyle\n) => {\n  const isTapTypeL = tapTypeL && tapTypeL === `L-${idx}`;\n  const myStyleString = isTapTypeL ? styleObjectToString(myStyle) : '';\n  return `\n  background: ${itemL.bgColor};\n  height: calc(100% + 2px);\n  font-size: ${(itemL.fontSize || 28) / 2}px;\n  color: ${itemL.color};\n  ${\n    isTapTypeL\n      ? `width: ${\n          (leftWidth +\n            1 +\n            (itemL.confirmType === 'move' && inTouch ? inertiaWidth : 0)) /\n          2\n        }px;`\n      : `width: ${itemL.width / 2}px;`\n  }\n  ${myStyleString}`;\n};\n\nconst getLeftSlotName = (tapTypeL, idx, itemL) => {\n  if (!itemL.slotName) {\n    return '';\n  }\n  return tapTypeL && tapTypeL === `L-${idx}`\n    ? `${itemL.slotName}-confirm`\n    : itemL.slotName;\n};\n\nconst getRightSlotName = (tapTypeR, idx, item) => {\n  if (!item.slotName) {\n    return '';\n  }\n  return tapTypeR && tapTypeR === `R-${idx}`\n    ? `${item.slotName}-confirm`\n    : item.slotName;\n};\n\nconst getLeftText = (tapTypeL, idx, itemL) => {\n  return tapTypeL && tapTypeL === `L-${idx}`\n    ? itemL.confirmText || itemL.text\n    : itemL.text;\n};\nconst getRightText = (tapTypeR, idx, item) => {\n  return tapTypeR && tapTypeR === `R-${idx}`\n    ? item.confirmText || item.text\n    : item.text;\n};\n\nconst getRightMovableContentStyle = (\n  tapTypeR,\n  idx,\n  rightWidth,\n  leftWidth,\n  inertiaWidth\n) => {\n  return styleObjectToString({\n    zIndex: tapTypeR === `R-${idx}` ? 1 : 0,\n    marginLeft: getMarginLeft3(rightWidth, leftWidth, inertiaWidth),\n    width: (rightWidth - 0.1) / 2 + 'px',\n  });\n};\n\nconst getLeftMovableContentStyle = (tapTypeL, idx, leftWidth, inertiaWidth) => {\n  return styleObjectToString({\n    zIndex: tapTypeL === `L-${idx}` ? 1 : 0,\n    marginLeft: `${inertiaWidth / 2}px`,\n    width: (leftWidth - 1) / 2 + 'px',\n  });\n};\n\nconst axmlObj = (obj) => {\n  return obj;\n};\n\nexport default {\n  axmlObj,\n  getWidth2,\n  getMarginLeft2,\n  getMarginLeft3,\n  getRightMovableContentStyle,\n  getLeftMovableContentStyle,\n  getLeft,\n  getWidth,\n  getSlotWidthStyle,\n  getMarginLeft,\n  getMoveX,\n  getMovableContentRightStyle,\n  getMovableContentLeftStyle,\n  getRightText,\n  getLeftText,\n  getLeftSlotName,\n  getRightSlotName,\n};\n\ndeclare function getRegExp(reg: string, mode: string): any;\nfunction keys(obj) {\n  /// #if ALIPAY\n\n  if (typeof Object.keys === 'function') {\n    return Object.keys(obj);\n  }\n  /// #endif\n\n  /// #if WECHAT\n  return JSON.stringify(obj)\n    .replace(getRegExp('{|}|\"', 'g'), '')\n    .split(',')\n    .map(function (item) {\n      return item.split(':')[0];\n    });\n  /// #endif\n}\n"
  },
  {
    "path": "src/SwipeAction/index.ts",
    "content": "import '../_util/assert-component2';\nimport { compareVersion } from '../_util/compareVersion';\nimport fmtEvent from '../_util/fmtEvent';\nimport { getInstanceBoundingClientRect } from '../_util/jsapi/get-instance-bounding-client-rect';\nimport { platform } from '../_util/platform';\nimport { assertAilpayNativeNotSupport } from '../_util/support';\nimport { SwipeActionDefaultProps } from './props';\nimport { transformOptions } from './wechat';\n\nassertAilpayNativeNotSupport('SwipeAction');\n\nconst setStyleObj1 = (buttons: any[], inertiaWidth?: number) => {\n  const widthPos = buttons.length === 2 ? 0.5 : 0.3333;\n  return [\n    { marginLeft: 0 },\n    {\n      marginLeft: `${\n        -(buttons[0]?.width + 1 + (inertiaWidth || 0) * widthPos) / 2\n      }px`,\n    },\n    {\n      marginLeft: `${\n        -(\n          buttons[0]?.width +\n          buttons[1]?.width +\n          1 +\n          (inertiaWidth || 0) * 0.6666\n        ) / 2\n      }px`,\n    },\n  ];\n};\nconst setStyleObj2 = (buttons: any[], inertiaWidth?: number) => {\n  const length = buttons.length;\n  if (length === 2) {\n    return [\n      { marginRight: 0 },\n      {\n        marginRight: `-${\n          (buttons[0]?.width + (inertiaWidth || 0) * 0.5) / 2\n        }px`,\n      },\n    ];\n  }\n  if (length === 3) {\n    return [\n      { marginRight: 0 },\n      {\n        marginRight: `-${\n          (buttons[0]?.width + (inertiaWidth || 0) * 0.3333) / 2\n        }px`,\n      },\n      {\n        marginRight: `-${\n          (buttons[0]?.width +\n            buttons[1]?.width +\n            (inertiaWidth || 0) * 0.6666) /\n          2\n        }px`,\n      },\n    ];\n  }\n  return [{ marginRight: 0 }];\n};\n\nlet myTimeOut = null;\n\nconst getDirectionLeft = (arr: number[]): boolean => {\n  if (arr.length < 2) {\n    arr = [0, arr[0]];\n  }\n  return arr[0] + arr[1] <= 0;\n};\n\nconst isOldVersion = getIsOldVersion();\nfunction getIsOldVersion() {\n  if (typeof my === 'undefined') {\n    return false;\n  }\n  const SDKVersion = my.SDKVersion;\n  return compareVersion(SDKVersion, '2.0.0') < 0;\n}\n\nfunction getInitReady() {\n  if (platform() === 'wechat') {\n    return false;\n  }\n  if (isOldVersion) {\n    return false;\n  }\n  return true;\n}\n\nComponent(\n  transformOptions({\n    props: SwipeActionDefaultProps,\n    didMount() {\n      const { defaultSwiped, elasticity } = this.getProps();\n      this.setButtonItemWidth();\n      this.setData({ inertiaWidth: !isOldVersion && elasticity ? 20 : 0 });\n      if (defaultSwiped) {\n        this.initWidth((maxSwipe: any) => {\n          maxSwipe &&\n            this.setData({\n              swipeX: (maxSwipe + 0.01) * (defaultSwiped === 'right' ? -1 : 1),\n              swipedR: defaultSwiped === 'right',\n              swipedL: defaultSwiped === 'left',\n            });\n        });\n      }\n    },\n    didUpdate(prevProp) {\n      const { swiped, damping, elasticity } = this.getProps();\n      // 设置不同的滑动位置时需要重置\n      const rs = prevProp.swiped !== swiped && !swiped;\n      const is = prevProp.elasticity !== elasticity;\n      const ds = prevProp.damping !== damping;\n      if (rs || is || ds) {\n        this.setData({\n          swipeX: 0,\n          swipedR: false,\n          swipedL: false,\n          tapTypeL: '',\n          tapTypeR: '',\n        });\n      }\n      if (is) {\n        this.setData({ inertiaWidth: elasticity ? 20 : 0 });\n      }\n    },\n    data: {\n      // 在微信小程序与支付宝小程序基础库 1.0\n      // 组件初始化时的 margin-left 决定了后续可移动的距离，所以需要等组件初始化以后再加载\n      ready: getInitReady(),\n      swipeLeft: true, // 是否是进行左滑\n      swipeX: 0, // 主体部分左滑的位置\n      moveX: 0, // 按钮滑动的位置\n      tapTypeL: '', // 左侧点击中的type\n      tapTypeR: '', // 右侧的点击中的type\n      leftWidth: 20, // 计算的右侧的宽度\n      rightWidth: 20, // 计算的右侧的宽度\n      maxSwipeL: 0, // 左侧事件滑动最大距离\n      maxSwipeR: 0, // 右侧事件滑动最大距离\n      inTouch: false, // 在触摸中的状态\n      swipedR: false, // 右侧已经滑开了\n      swipedL: false, // 左侧已经滑开了\n      changeArr: [0, 0], // 用来判断最后一次滑动的方向\n      myStyle: {},\n      inertiaWidth: 20,\n      animation: !isOldVersion,\n      _leftButtons: [],\n      _rightButtons: [],\n    },\n    methods: {\n      setWidth() {\n        const { _leftButtons, _rightButtons } = this.data;\n        const _rightArr = _rightButtons || [];\n        const _leftArr = _leftButtons || [];\n        this.setData({\n          ready: true,\n          rightWidth: _rightArr.reduce((tolal, cur) => {\n            return tolal + cur.width;\n          }, 0),\n          leftWidth: _leftArr.length\n            ? _leftArr.reduce((tolal, cur) => {\n                return tolal + cur.width;\n              }, 0)\n            : 0,\n        });\n      },\n      setButtonItemWidth() {\n        const { leftButtons, rightButtons } = this.getProps();\n        leftButtons.forEach((i) => {\n          i.width = i.width || 150;\n        });\n        rightButtons.forEach((i) => {\n          i.width = i.width || 150;\n        });\n        this.setData(\n          { _leftButtons: leftButtons, _rightButtons: rightButtons },\n          () => {\n            this.setWidth();\n          }\n        );\n      },\n      getProps() {\n        if (platform() === 'wechat') {\n          return {\n            ...this.data,\n            onSwipeStart: (v) => {\n              this.triggerEvent('swipestart', v);\n            },\n            onSwipeEnd: (v) => {\n              this.triggerEvent('swipeend', v);\n            },\n            onButtonTap: (v) => {\n              this.triggerEvent('buttontap', v);\n            },\n          };\n        }\n        return this.props;\n      },\n      initWidth(func?) {\n        const { leftButtons, rightButtons } = this.getProps();\n        // 获取宽度信息，设置滑轨的宽度、初始化滑动位置\n        // 如果没有获取到该信息则把左滑禁用掉\n        rightButtons.length > 0 &&\n          this.boundingClientRect(\n            `.ant-swipe-action-movable-right${this.$id ? '-' + this.$id : ''}`\n          ).then((ret: any) => {\n            if (ret && ret.width) {\n              this.setData({ maxSwipeR: ret.width });\n              func && func(ret.width);\n            }\n          });\n        leftButtons.length > 0 &&\n          this.boundingClientRect(\n            `.ant-swipe-action-movable-left${this.$id ? '-' + this.$id : ''}`\n          ).then((ret: any) => {\n            if (ret && ret.width) {\n              this.setData({ maxSwipeL: ret.width });\n              func && func(ret.width);\n            }\n          });\n      },\n      boundingClientRect(id) {\n        if (typeof my === 'undefined') {\n          return getInstanceBoundingClientRect(this, id);\n        }\n        return getInstanceBoundingClientRect(my, id);\n      },\n      // 向外透出事件\n      onTouchStart() {\n        const { onSwipeStart } = this.getProps();\n        const { swipedR, swipedL } = this.data;\n        this.initWidth();\n        this.setData({ tapTypeL: '', tapTypeR: '', inTouch: true }); // 清空confirmType = auto 的表现\n        onSwipeStart(\n          {\n            swiped: !!(swipedR || swipedL),\n            direction: swipedL ? 'left' : swipedR ? 'right' : '',\n          },\n          fmtEvent(this.getProps())\n        );\n      },\n      onTouchEnd(e) {\n        // 因为微信小程序没有 onChangeEnd 事件\n        // 所以用 onTouchEnd 模拟 onChangeEnd\n        if (platform() === 'wechat') {\n          this.onChangeEnd(e);\n        }\n        this.setData({ inTouch: false, swipedL: false, swipedR: false });\n      },\n      // 滑动过程中的事件，是内部事件不向外透出，用于控制右侧按钮的位置信息\n      onChange(e: any) {\n        const {\n          changeArr,\n          maxSwipeR,\n          maxSwipeL,\n          inTouch,\n          swipedR,\n          swipedL,\n          inertiaWidth,\n        } = this.data;\n        const { x } = e.detail;\n        const L = x;\n        // changeArr用于精准的控制滑动的方向\n        const newArr = changeArr[1] === L ? [changeArr] : [changeArr[1], L];\n        this.setData({ moveX: L, changeArr: newArr });\n\n        const ridx = this.getProps().rightButtons.findIndex(\n          (u) => u.confirmType === 'move'\n        );\n        const lidx = this.getProps().leftButtons.findIndex(\n          (u) => u.confirmType === 'move'\n        );\n        if (ridx === -1 && lidx === -1) return;\n        const isRight = getDirectionLeft(changeArr);\n        // 左滑时的滑动确认、收起处理\n        if (isRight) {\n          if (L < 0 && Math.abs(L) >= maxSwipeR && inTouch && !swipedR) {\n            clearTimeout(myTimeOut);\n            myTimeOut = setTimeout(() => {\n              const { changeArr, maxSwipeR, inTouch, swipedR, moveX } =\n                this.data;\n              const _left =\n                getDirectionLeft(changeArr) && changeArr[0] >= changeArr[1];\n              if (\n                inTouch &&\n                maxSwipeR + inertiaWidth + 2 >= Math.abs(moveX) &&\n                _left &&\n                !swipedR\n              ) {\n                this.onSetCheck(true);\n              }\n            }, 100);\n          }\n          if (changeArr[0] < changeArr[1] && maxSwipeR > L + 4 && inTouch) {\n            this.setData({ tapTypeR: '', myStyle: {} });\n          }\n        } else {\n          if (L > 0 && L + 1 >= maxSwipeL && inTouch && !swipedL) {\n            clearTimeout(myTimeOut);\n            myTimeOut = setTimeout(() => {\n              const { changeArr, maxSwipeL, inTouch, swipedL, moveX } =\n                this.data;\n              const _right =\n                !getDirectionLeft(changeArr) && changeArr[1] >= changeArr[0];\n              if (inTouch && maxSwipeL <= moveX + 1 && _right && !swipedL) {\n                this.onSetCheck(false);\n              }\n            }, 100);\n          }\n          if (changeArr[0] > changeArr[1] && maxSwipeL > L + 2 && inTouch) {\n            this.setData({ tapTypeL: '', myStyle: {} });\n          }\n        }\n      },\n      onSetCheck(isRight: boolean) {\n        const { rightButtons, leftButtons } = this.getProps();\n        const { inertiaWidth, _leftButtons, _rightButtons } = this.data;\n        const arr = isRight ? rightButtons : leftButtons;\n        const idx = arr.findIndex((u) => u.confirmType === 'move');\n        if (idx === -1) return;\n\n        typeof my !== 'undefined' && my.vibrateShort({ success() {} });\n        const styArr = isRight\n          ? setStyleObj1(_rightButtons, inertiaWidth)\n          : setStyleObj2(_leftButtons, inertiaWidth);\n        const sty = styArr[idx];\n        this.setData({ myStyle: sty });\n        isRight\n          ? this.setData({ tapTypeR: 'R-' + idx })\n          : this.setData({ tapTypeL: 'L-' + idx });\n      },\n      // 意外中断了滑动，则立即开始结算滑动动作\n      onTouchCancel(e: any) {\n        this.onChangeEnd(e);\n      },\n      onChangeEnd(e: any) {\n        const { x } = e.detail;\n        const { changeArr } = this.data;\n        // 如果是停留在初始态返回\n        if (x === 0) return;\n        // 判断是否是左滑\n        const isRight = getDirectionLeft(changeArr);\n        this.setData({ swipeLeft: isRight });\n        isRight ? this.onSetSwipeRight(x) : this.onSetSwipeLeft(x);\n      },\n      onSetSwipeRight(x: number, needBack?: boolean) {\n        const { swipedR, inTouch, tapTypeR, changeArr } = this.data;\n        const { onButtonTap } = this.getProps();\n        let isRight = Math.abs(changeArr[1]) > Math.abs(changeArr[0]);\n        if (!swipedR && Math.abs(x) < 10) {\n          isRight = false;\n        }\n\n        needBack && (isRight = false);\n        !isRight && this.setData({ tapTypeR: '', myStyle: {} });\n        if (inTouch && !!tapTypeR) {\n          this.setData({ tapTypeR: '', myStyle: {} });\n          onButtonTap(\n            {\n              direction: 'right',\n              btnIdx: parseInt(tapTypeR.replace('R-', '')),\n            },\n            fmtEvent(this.getProps())\n          );\n          this.onSwipeRight(false);\n          return;\n        }\n        this.setData({ changeArr: [0, 0] });\n        this.onSwipeRight(isRight);\n      },\n      onSetSwipeLeft(x: number, needBack?: boolean) {\n        const { swipedL, inTouch, tapTypeL, changeArr } = this.data;\n        const { onButtonTap } = this.getProps();\n        // true：初始是往右滑，false: 右滑收起\n        let isRight = changeArr[1] >= changeArr[0];\n        if (!swipedL && Math.abs(x) < 10) {\n          isRight = false;\n        }\n        needBack && (isRight = false);\n        // 清空二次确认的状态\n        !isRight && this.setData({ tapTypeL: '', myStyle: {} });\n        // 处理滑动-触发事件\n        if (inTouch && !!tapTypeL) {\n          this.setData({ tapTypeL: '', myStyle: {} });\n          onButtonTap(\n            { direction: 'left', btnIdx: parseInt(tapTypeL.replace('L-', '')) },\n            fmtEvent(this.getProps())\n          );\n          this.onSwipeLeft(false);\n          return;\n        }\n        // 清空滑动方向\n        this.setData({ changeArr: [0, 0] });\n        this.onSwipeLeft(isRight);\n      },\n      // 结算\n      onSwipeLeft(isRight: boolean) {\n        const { onSwipeEnd } = this.getProps();\n        const { maxSwipeL, inertiaWidth } = this.data;\n        // 为了处理到重置状态的效果\n        const maxX = maxSwipeL + 0.01 + inertiaWidth;\n        this.setData(\n          {\n            swipeX: isRight ? maxX : -0.01,\n          },\n          () => {\n            const flag = this.data.swipeX === -0.01;\n            setTimeout(\n              () => {\n                this.setData(\n                  {\n                    swipeX: flag ? 0 : maxSwipeL + 0.01,\n                    swipedL: !flag,\n                  },\n                  () => {\n                    onSwipeEnd(\n                      { direction: 'left', swiped: !!isRight },\n                      fmtEvent(this.getProps())\n                    );\n                  }\n                );\n              },\n              inertiaWidth > 0 ? 180 : 0\n            );\n          }\n        );\n      },\n      onSwipeRight(isRight: boolean) {\n        const { maxSwipeR, inertiaWidth } = this.data;\n        const { onSwipeEnd } = this.getProps();\n        // 处理x的位置，两次setData X是因为x如果相同位置不会变，刚好也把弹性在这里处理了\n        // 为了处理到重置状态的效果\n        const maxX = -(maxSwipeR + 0.01 + inertiaWidth);\n        this.setData(\n          {\n            swipeX: isRight ? maxX : -0.01,\n          },\n          () => {\n            const flag = this.data.swipeX === -0.01;\n            setTimeout(\n              () => {\n                this.setData(\n                  {\n                    swipeX: flag ? 0 : -(maxSwipeR + 0.01),\n                    swipedR: !flag,\n                  },\n                  () => {\n                    onSwipeEnd(\n                      { direction: 'right', swiped: !!isRight },\n                      fmtEvent(this.getProps())\n                    );\n                  }\n                );\n              },\n              inertiaWidth > 0 ? 180 : 0\n            );\n          }\n        );\n      },\n      // 处理右侧点击事件\n      onItemTap(e: any) {\n        const { swipeLeft, tapTypeL, tapTypeR, _leftButtons, _rightButtons } =\n          this.data;\n        const { onButtonTap } = this.getProps();\n        if (!onButtonTap) return;\n        const { itemL, idx, item } = e.currentTarget.dataset.item;\n        const { confirmType } = swipeLeft ? item : itemL;\n        if (tapTypeL === 'L-' + idx) {\n          this.onSetSwipeLeft(0, true);\n          this.setData({ tapTypeL: '', myStyle: {} });\n          onButtonTap(\n            { direction: 'left', btnIdx: idx },\n            fmtEvent(this.getProps())\n          );\n          return;\n        }\n        if (tapTypeR === 'R-' + idx) {\n          this.onSetSwipeRight(0, true);\n          this.setData({ tapTypeR: '', myStyle: {} });\n          onButtonTap(\n            { direction: 'right', btnIdx: idx },\n            fmtEvent(this.getProps())\n          );\n          return;\n        }\n        // auto 是展开按钮二次确认的效果\n        if (confirmType === 'tap' || confirmType === 'move') {\n          const styArr = swipeLeft\n            ? setStyleObj1(_rightButtons)\n            : setStyleObj2(_leftButtons);\n          const sty = styArr[idx];\n          this.setData({ myStyle: sty });\n          !swipeLeft\n            ? this.setData({ tapTypeL: 'L-' + idx })\n            : this.setData({ tapTypeR: 'R-' + idx });\n        } else {\n          !swipeLeft\n            ? this.onSetSwipeLeft(0, true)\n            : this.onSetSwipeRight(0, true);\n          onButtonTap(\n            { direction: !swipeLeft ? 'left' : 'right', btnIdx: idx },\n            fmtEvent(this.getProps())\n          );\n        }\n      },\n    },\n  })\n);\n"
  },
  {
    "path": "src/SwipeAction/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\ninterface SwipeButton {\n  text: string;\n  width?: number;\n  bgColor?: string;\n  color?: string;\n  slotName?: string;\n  confirmType?: '' | 'move' | 'tap';\n  confirmText?: string;\n}\ninterface SwipeData {\n  direction: 'right' | 'left' | '';\n  btnIdx?: number;\n  swiped?: boolean;\n}\n\nexport interface ISwipeActionProps extends IBaseProps {\n  /**\n   * @description 左侧滑出事件\n   * @default []\n   */\n  leftButtons: SwipeButton[];\n  /**\n   * @description 右侧滑出事件\n   * @default []\n   */\n  rightButtons: SwipeButton[];\n  /**\n   * @description 滑动速度\n   * @default 70\n   */\n  damping: number | string;\n  /**\n   * @description 禁止滑动\n   * @default false\n   */\n  disabled: boolean;\n  /**\n   * @description 禁止滑动\n   * @default ''\n   */\n  swiped: '' | 'left' | 'right' | boolean;\n  /**\n   * @description 禁止滑动\n   * @default ''\n   */\n  defaultSwiped: '' | 'left' | 'right';\n  /**\n   * @description 弹性超出最大滑动距离自动弹回\n   * @default true\n   */\n  elasticity: boolean;\n  /**\n   * @description 滑动结束\n   */\n  onSwipeEnd: (data: SwipeData, e: Record<string, any>) => void;\n  /**\n   * @description 滑动、触摸开始\n   */\n  onSwipeStart: (data: SwipeData, e: Record<string, any>) => void;\n  /**\n   * @description 右侧滑动按钮的点击事件回调\n   */\n  onButtonTap: (data: SwipeData, e: Record<string, any>) => void;\n}\n\nexport const SwipeActionDefaultProps: Partial<ISwipeActionProps> = {\n  leftButtons: [],\n  rightButtons: [],\n  elasticity: true,\n  swiped: '',\n  defaultSwiped: '',\n  damping: 70,\n  disabled: false,\n  onSwipeEnd() {},\n  onSwipeStart() {},\n  onButtonTap() {},\n};\n"
  },
  {
    "path": "src/SwipeAction/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n@swipe-action-color: var(--swipe-action-color, @COLOR_WHITE);\n"
  },
  {
    "path": "src/SwipeAction/wechat.ts",
    "content": "import { platform } from '../_util/platform';\n\nexport function transformOptions(original) {\n  if (platform() === 'wechat') {\n    const { props, didMount, didUpdate, ...rest } = original;\n    return {\n      ...rest,\n      properties: transformProperties(props),\n      lifetimes: {\n        attached: function () {\n          return didMount.call(this);\n        },\n      },\n      options: {\n        multipleSlots: true,\n        styleIsolation: 'shared',\n      },\n      observers: {\n        'damping, swiped': function () {\n          this.setData({\n            swipeX: 0,\n            swipedR: false,\n            swipedL: false,\n            tapTypeL: '',\n            tapTypeR: '',\n          });\n        },\n        'elasticity': function (elasticity) {\n          this.setData({\n            swipeX: 0,\n            swipedR: false,\n            swipedL: false,\n            tapTypeL: '',\n            tapTypeR: '',\n          });\n          this.setData({ inertiaWidth: elasticity ? 20 : 0 });\n        },\n      },\n    };\n  }\n  return {\n    ...original,\n  };\n}\n\nexport function transformProperties(props) {\n  const properties: any = {};\n  Object.keys(props).forEach((key) => {\n    properties[key] = {\n      type: null,\n      value: props[key],\n    };\n  });\n  return properties;\n}\n"
  },
  {
    "path": "src/Switch/index.axml",
    "content": "<view\n  class=\"ant-switch {{ className ? className : '' }} ant-switch-{{ size }} {{ mixin.value ? 'ant-switch-checked' : '' }} {{ disabled ? 'ant-switch-disabled' : '' }} {{ readonly ? 'ant-switch-readonly' : '' }} {{ loading ? 'ant-switch-loading' : '' }}\"\n  style=\"{{ mixin.value && color ? 'background:' + color + '; border-color:' + color : '' }};{{ style || '' }}\"\n  onTap=\"onChange\">\n  <view class=\"ant-switch-handle\">\n    <ant-icon\n      a:if=\"{{ loading }}\"\n      type=\"UndoOutline\"\n      className=\"ant-switch-loading-icon\" />\n  </view>\n  <view class=\"ant-switch-inner\">\n    <block a:if=\"{{ mixin.value }}\">\n      <!-- #if ALIPAY -->\n      <slot name=\"checkedText\">{{ checkedText }}</slot>\n      <!-- #endif -->\n      <!-- #if WECHAT -->\n      {{ checkedText }}\n      <!-- #endif -->\n    </block>\n    <block a:else>\n      <!-- #if ALIPAY -->\n      <slot name=\"uncheckedText\">{{ uncheckedText }}</slot>\n      <!-- #endif -->\n      <!-- #if WECHAT -->\n      {{ uncheckedText }}\n      <!-- #endif -->\n    </block>\n  </view>\n</view>\n"
  },
  {
    "path": "src/Switch/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Information Entry\n  order: 10\ntoc: 'content'\n---\n\n# Switch\n\nSwitch selector, compared to the native Switch, it achieves a consistent experience on iOS and Android.\n\n- Used when it is necessary to indicate the state of a switch or to switch between two states.\n- The difference with Checkbox is that switching Switch will directly trigger a state change, while Checkbox is usually used for state markers and needs to be used in conjunction with commit operations.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-switch\": \"antd-mini/es/Switch/index\"\n#endif\n#if WECHAT\n  \"ant-switch\": \"antd-mini/Switch/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<ant-switch\n  defaultChecked=\"{{true}}\"\n#if ALIPAY\n  onChange=\"onChange\"\n#endif\n#if WECHAT\n  bindchange=\"onChange\"\n#endif\n/>\n```\n\n```js\nPage({\n  onChange(checked, e) {\n    console.log(checked);\n  },\n});\n```\n\n### Disable mode\n\n> Incoming `disabled` property, disable the collocated gray switch button.\n\n```xml\n<ant-switch defaultChecked=\"{{true}}\" disabled=\"{{true}}\" />\n```\n\n### Custom Style\n\n> - `checkedText`、`uncheckedText` Property, you can modify the contents when checked/unchecked.\n> - `color` property, you can color the overall button atmosphere.\n> - ` size` property, the switch can be resized, support `medium`、`small`、`x-small` Three options.\n> - `loading` Property to set the loading state.\n\n```xml\n<ant-switch checkedText=\"开\" uncheckedText=\"关\" />\n#if ALIPAY\n<!-- 支付宝模式下，支持插槽定制选中/未Content when selected -->\n<ant-switch>\n  <ant-icon type=\"CheckOutline\" slot=\"checkedText\" />\n  <ant-icon type=\"CloseOutline\" slot=\"uncheckedText\" />\n</ant-switch>\n#endif\n\n<ant-switch defaultChecked=\"{{true}}\" color=\"#00b578\" />\n\n<ant-switch size=\"medium\" />\n\n<ant-switch size=\"small\" />\n\n<ant-switch size=\"x-small\" />\n\n<ant-switch loading />\n```\n\n### Controlled Mode\n\n> `checked` property and `change` Events, used in conjunction with the implementation of controlled mode.\n\n```xml\n<ant-switch\n  checked=\"{{checked}}\"\n  defaultChecked=\"{{true}}\"\n#if ALIPAY\n  onChange=\"handleChange\"\n#endif\n#if WECHAT\n  bindchange=\"handleChange\"\n#endif\n/>\n<ant-button\n#if ALIPAY\n  onTap=\"handleChangeByButton\"\n#endif\n#if WECHAT\n  bindtap=\"handleChangeByButton\"\n#endif\n>\n  Switch\n</ant-button>\n```\n\n```js\nPage({\n  data: {\n    checked: true,\n  },\n  handleChange(checked, e) {\n#if ALIPAY\n    this.setData({\n      checked,\n    });\n#endif\n#if WECHAT\n    this.setData({\n      checked: checked.detail,\n    });\n#endif\n  },\n  handleChangeByButton() {\n    console.log(this.data.checked);\n    this.setData({\n      checked: !this.data.checked,\n    });\n  },\n});\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Switch/index'></code>\n\n## API\n\n| Property                  | Description                                            | Type                                                                                                | Default Value   |\n| --------------------- | ----------------------------------------------- | --------------------------------------------------------------------------------------------------- | -------- |\n| className             | Class Name                                            | string                                                                                              | -        |\n| checkedText           | Content when selected                                    | string \\| slot                                                                                      | -        |\n| checked               | Check                                        | boolean                                                                                             | -        |\n| color                 | Selected background color                                      | string                                                                                              | -        |\n| defaultChecked        | Checked by default                                    | boolean                                                                                             | `false`  |\n| disabled              | Disable                                        | boolean                                                                                             | `false`  |\n| readonly              | Read-only                                        | boolean                                                                                             | `false`  |\n| loading               | Load status                                    | boolean                                                                                             | `false`  |\n| uncheckedText         | Content when not selected                                  | string \\| slot                                                                                      | -        |\n| size                  | Component size, optional value is `medium`、`small`、`x-small` | string                                                                                              | `medium` |\n| style                 | Style                                            | string                                                                                              | -        |\n| #if ALIPAY onChange   | Callback triggered when Switch is clicked                        | (checked: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -        |\n| #if WECHAT bindchange | Callback triggered when Switch is clicked                        | (checked: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -        |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For more information, see ConfigProvider Components.\n\n| Variable name                 | Light Mode Default                                                                                    | Dark Mode Default                                                                                    | Remarks             |\n| ---------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------- |\n| --switch-fill          | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | Switch Fill Color     |\n| --switch-border-color  | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #333333;\">#eeeeee</div> | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #ffffff;\">#2b2b2b</div> | Switch border color     |\n| --switch-loading-color | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | Switch loading color     |\n| --switch-handle-bg     | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | Switch handle background color |\n| --switch-inner-color   | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | Switch internal color     |\n"
  },
  {
    "path": "src/Switch/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-icon\": \"../Icon/index\"\n  }\n}\n"
  },
  {
    "path": "src/Switch/index.less",
    "content": "@import (reference) './variable.less';\n\n@switchPrefix: ant-switch;\n\n@keyframes loading-rotate {\n  100% {\n    transform: rotate(1turn);\n  }\n}\n\n.@{switchPrefix} {\n  display: inline-block;\n  vertical-align: middle;\n  box-sizing: border-box;\n  position: relative;\n  align-self: center;\n  min-width: @switch-width;\n  height: @switch-height;\n  border: @switch-border solid @switch-border-color;\n  /// #if ALIPAY\n  border-color: @switch-border-color;\n  /// #endif\n\n  border-radius: @switch-height * 0.5;\n  background: @COLOR_WHITE;\n  overflow: hidden;\n  line-height: @switch-height;\n  &-checked {\n    background: @switch-fill;\n    border-color: @switch-fill;\n    .@{switchPrefix}-handle {\n      left: calc(100% - (@switch-height - 2 * @switch-border));\n    }\n    .@{switchPrefix}-inner {\n      color: @COLOR_WHITE;\n      justify-content: flex-start;\n    }\n  }\n  &-disabled {\n    opacity: 0.4;\n    pointer-events: none;\n  }\n  &-readonly {\n    pointer-events: none;\n  }\n  &-loading {\n    pointer-events: none;\n\n    /// #if WECHAT\n    ant-icon {\n      animation: loading-rotate 1s linear infinite;\n      font-size: 10px;\n      line-height: 1;\n    }\n    /// #endif\n  }\n  &-loading-icon {\n    font-size: 20 * @rpx;\n    /// #if ALIPAY\n    animation: loading-rotate 1s linear infinite;\n    /// #endif\n    color: @switch-loading-color;\n  }\n  &-handle {\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    width: @switch-height - 2 * @switch-border;\n    height: @switch-height - 2 * @switch-border;\n    border-radius: 50%;\n    background: @switch-handle-bg;\n    position: absolute;\n    top: 0;\n    left: 0;\n    transition: all 200ms;\n    box-shadow: @switch-handle-shadow;\n  }\n  &-inner {\n    position: relative;\n    display: flex;\n    justify-content: flex-end;\n    align-items: center;\n    height: 100%;\n    color: @switch-inner-color;\n    transition: margin 200ms;\n    font-size: 30 * @rpx;\n    padding: 0 14 * @rpx;\n    min-width: 108 * @rpx;\n    box-sizing: border-box;\n    &:empty {\n      display: none;\n    }\n  }\n\n  &-small {\n    min-width: @switch-width-small;\n    height: @switch-height-small;\n    border-radius: @switch-height-small * 0.5;\n    .@{switchPrefix}-handle {\n      width: @switch-height-small - 2 * @switch-border;\n      height: @switch-height-small - 2 * @switch-border;\n    }\n    .@{switchPrefix}-inner {\n      font-size: 16 * @rpx;\n      padding: 0 10 * @rpx;\n      min-width: 72 * @rpx;\n    }\n  }\n  &-small&-checked {\n    .@{switchPrefix}-handle {\n      left: calc(100% - (@switch-height-small - 2 * @switch-border));\n    }\n  }\n\n  &-x-small {\n    min-width: @switch-width-x-small;\n    height: @switch-height-x-small;\n    border-radius: @switch-height-x-small * 0.5;\n    .@{switchPrefix}-handle {\n      width: @switch-height-x-small - 2 * @switch-border;\n      height: @switch-height-x-small - 2 * @switch-border;\n    }\n    .@{switchPrefix}-inner {\n      font-size: 10 * @rpx;\n      padding: 0 6 * @rpx;\n      min-width: 56 * @rpx;\n    }\n  }\n  &-x-small&-checked {\n    .@{switchPrefix}-handle {\n      left: calc(100% - (@switch-height-x-small - 2 * @switch-border));\n    }\n  }\n}\n"
  },
  {
    "path": "src/Switch/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 数据录入\n  order: 10\ntoc: 'content'\n---\n\n# Switch 开关\n\nSwitch 开关选择器，比起原生 Switch，它实现了在 iOS 和 Android 端一致的体验。\n\n- 当需要表示开关状态或两种状态之间切换时使用。\n- 与 Checkbox 的区别在于，切换 Switch 会直接触发状态改变，而 Checkbox 通常用于状态标记，需要与提交操作配合使用。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-switch\": \"antd-mini/es/Switch/index\"\n#endif\n#if WECHAT\n  \"ant-switch\": \"antd-mini/Switch/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-switch\n  defaultChecked=\"{{true}}\"\n#if ALIPAY\n  onChange=\"onChange\"\n#endif\n#if WECHAT\n  bindchange=\"onChange\"\n#endif\n/>\n```\n\n```js\nPage({\n  onChange(checked, e) {\n    console.log(checked);\n  },\n});\n```\n\n### 禁用模式\n\n> 传入 `disabled` 属性，禁用并置灰开关按钮。\n\n```xml\n<ant-switch defaultChecked=\"{{true}}\" disabled=\"{{true}}\" />\n```\n\n### 自定义样式\n\n> - `checkedText`、`uncheckedText` 属性，可以修改选中/未选中时的内容。\n> - `color` 属性，可以整体按钮的颜色氛围。\n> - ` size` 属性，可以调整开关大小，支持 `medium`、`small`、`x-small` 三种选项。\n> - `loading` 属性，设置加载态。\n\n```xml\n<ant-switch checkedText=\"开\" uncheckedText=\"关\" />\n#if ALIPAY\n<!-- 支付宝模式下，支持插槽定制选中/未选中时的内容 -->\n<ant-switch>\n  <ant-icon type=\"CheckOutline\" slot=\"checkedText\" />\n  <ant-icon type=\"CloseOutline\" slot=\"uncheckedText\" />\n</ant-switch>\n#endif\n\n<ant-switch defaultChecked=\"{{true}}\" color=\"#00b578\" />\n\n<ant-switch size=\"medium\" />\n\n<ant-switch size=\"small\" />\n\n<ant-switch size=\"x-small\" />\n\n<ant-switch loading />\n```\n\n### 受控模式\n\n> `checked` 属性和 `change` 事件，配合使用实现受控模式。\n\n```xml\n<ant-switch\n  checked=\"{{checked}}\"\n  defaultChecked=\"{{true}}\"\n#if ALIPAY\n  onChange=\"handleChange\"\n#endif\n#if WECHAT\n  bindchange=\"handleChange\"\n#endif\n/>\n<ant-button\n#if ALIPAY\n  onTap=\"handleChangeByButton\"\n#endif\n#if WECHAT\n  bindtap=\"handleChangeByButton\"\n#endif\n>\n  切换\n</ant-button>\n```\n\n```js\nPage({\n  data: {\n    checked: true,\n  },\n  handleChange(checked, e) {\n#if ALIPAY\n    this.setData({\n      checked,\n    });\n#endif\n#if WECHAT\n    this.setData({\n      checked: checked.detail,\n    });\n#endif\n  },\n  handleChangeByButton() {\n    console.log(this.data.checked);\n    this.setData({\n      checked: !this.data.checked,\n    });\n  },\n});\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Switch/index'></code>\n\n## API\n\n| 属性                  | 说明                                            | 类型                                                                                                | 默认值   |\n| --------------------- | ----------------------------------------------- | --------------------------------------------------------------------------------------------------- | -------- |\n| className             | 类名                                            | string                                                                                              | -        |\n| checkedText           | 选中时的内容                                    | string \\| slot                                                                                      | -        |\n| checked               | 是否勾选                                        | boolean                                                                                             | -        |\n| color                 | 选中背景色                                      | string                                                                                              | -        |\n| defaultChecked        | 默认是否勾选                                    | boolean                                                                                             | `false`  |\n| disabled              | 是否禁用                                        | boolean                                                                                             | `false`  |\n| readonly              | 是否只读                                        | boolean                                                                                             | `false`  |\n| loading               | 是否加载状态                                    | boolean                                                                                             | `false`  |\n| uncheckedText         | 非选中时的内容                                  | string \\| slot                                                                                      | -        |\n| size                  | 组件尺寸，可选值为 `medium`、`small`、`x-small` | string                                                                                              | `medium` |\n| style                 | 样式                                            | string                                                                                              | -        |\n| #if ALIPAY onChange   | 点击 Switch 时触发的回调                        | (checked: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -        |\n| #if WECHAT bindchange | 点击 Switch 时触发的回调                        | (checked: boolean, event: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -        |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                 | 浅色模式默认值                                                                                    | 深色模式默认值                                                                                    | 备注             |\n| ---------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------- |\n| --switch-fill          | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | 开关填充颜色     |\n| --switch-border-color  | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #333333;\">#eeeeee</div> | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #ffffff;\">#2b2b2b</div> | 开关边框颜色     |\n| --switch-loading-color | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div> | 开关加载颜色     |\n| --switch-handle-bg     | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | 开关手柄背景颜色 |\n| --switch-inner-color   | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #ffffff;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #ffffff;\">#616161</div> | 开关内部颜色     |\n"
  },
  {
    "path": "src/Switch/index.ts",
    "content": "import mixinValue from '../mixins/value';\nimport { Component, triggerEvent } from '../_util/simply';\nimport { SwitchDefaultProps } from './props';\n\nComponent({\n  props: SwitchDefaultProps,\n  data: null,\n  methods: {\n    onChange(e) {\n      const value = !this.getValue();\n      if (!this.isControlled()) {\n        this.update(value);\n      }\n      triggerEvent(this, 'change', value, e);\n    },\n  },\n  mixins: [\n    mixinValue({\n      valueKey: 'checked',\n      defaultValueKey: 'defaultChecked',\n    }),\n  ],\n});\n"
  },
  {
    "path": "src/Switch/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n/**\n * @description 开关。\n */\n\nexport interface ISwitchProps extends IBaseProps {\n  /**\n   * @description 是否勾选\n   */\n  checked?: boolean;\n  /**\n   * @description 是否加载状态\n   */\n  loading?: boolean;\n\n  /**\n   * @description 选中时的颜色\n   */\n  color?: string;\n  /**\n   * @description 选中时的内容\n   */\n  checkedText?: string;\n  /**\n   * @description 非选中时的内容\n   */\n  uncheckedText?: string;\n  /**\n   * @default medium\n   * @description 尺寸\n   */\n  size?: 'medium' | 'small' | 'x-small';\n\n  /**\n   * 是否禁用\n   */\n  disabled?: boolean;\n\n  /**\n   * 是否只读\n   */\n  readonly?: boolean;\n\n  /**\n   * 初始值\n   */\n  defaultChecked?: boolean;\n\n  /**\n   * @description 修改回调方法\n   */\n  onChange?: (checked: boolean, e: Record<string, any>) => void;\n}\n\nexport const SwitchDefaultProps: Partial<ISwitchProps> = {\n  checked: null,\n  loading: false,\n  color: '',\n  checkedText: '',\n  uncheckedText: '',\n  size: 'medium',\n  disabled: false,\n  readonly: false,\n  defaultChecked: false,\n};\n"
  },
  {
    "path": "src/Switch/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n// 激活时颜色\n@switch-fill: var(--switch-fill, @COLOR_BRAND1);\n// 开关宽度\n@switch-width: 102 * @rpx;\n// 开关高度\n@switch-height: 62 * @rpx;\n// 开关边框\n@switch-border: 4 * @rpx;\n\n// 开关宽度\n@switch-width-small: 72 * @rpx;\n// 开关高度\n@switch-height-small: 42 * @rpx;\n// 开关边框\n@switch-border-small: 3 * @rpx;\n\n// 开关宽度\n@switch-width-x-small: 52 * @rpx;\n// 开关高度\n@switch-height-x-small: 32 * @rpx;\n// 开关边框\n@switch-border-x-small: 2 * @rpx;\n\n@switch-border-color: var(--switch-border-color, @COLOR_BORDER);\n@switch-loading-color: var(--switch-loading-color, @COLOR_BRAND1);\n@switch-handle-bg: var(--switch-handle-bg, @COLOR_WHITE);\n@switch-handle-shadow: 0 0 2px 0\n    var(--color-black-fade-20, @COLOR_BLACK_FADED_20),\n  0 2px 11.5px 0 var(--color-black-fade-8, @COLOR_BLACK_FADED_8),\n  -1px 2px 2px 0 var(--color-black-fade-10, @COLOR_BLACK_FADED_10);\n\n@switch-inner-color: var(--switch-inner-color, @COLOR_TEXT_ASSIST);\n"
  },
  {
    "path": "src/TabBar/index.axml",
    "content": "<view\n  class=\"ant-tab-bar {{ className || '' }}\"\n  style=\"{{ style || '' }}\">\n  <view class=\"ant-tab-bar-wrap\">\n    <block\n      a:for=\"{{ items }}\"\n      a:for-index=\"index\"\n      a:for-item=\"item\"\n      a:key=\"text\">\n      <view\n        class=\"ant-tab-bar-item {{ index === mixin.value ? 'ant-tab-bar-item-active ' + (activeClassName || '') : '' }}\"\n        style=\"{{ index === mixin.value ? activeStyle || '' : '' }}\"\n        onTap=\"onChange\"\n        data-index=\"{{ index }}\">\n        <ant-badge\n          a:if=\"{{ item.badge }}\"\n          type=\"{{ item.badge.type || 'dot' }}\"\n          text=\"{{ item.badge.text }}\"\n          stroke=\"{{ item.badge.stroke }}\"\n          bgColor=\"{{ item.badge.bgColor }}\"\n          position=\"{{ item.badge.position || 'top-right' }}\"\n          offsetX=\"{{ item.badge.offsetX || '-9px' }}\"\n          offsetY=\"{{ item.badge.offsetY || '0px' }}\">\n          <!-- #if ALIPAY -->\n          <slot\n            name=\"icon\"\n            active=\"{{ mixin.value == index }}\"\n            item=\"{{ item }}\"\n            index=\"{{ index }}\">\n          <!-- #endif -->\n            <image-icon\n              className=\"ant-tab-bar\"\n              image=\"{{ mixin.value === index ? item.activeIcon : item.icon }}\"/>\n          <!-- #if ALIPAY -->\n          </slot>\n          <!-- #endif -->\n        </ant-badge>\n        <block a:else>\n          <!-- #if ALIPAY -->\n          <slot\n            name=\"icon\"\n            active=\"{{ mixin.value == index }}\"\n            item=\"{{ item }}\"\n            index=\"{{ index }}\">\n          <!-- #endif -->\n            <image-icon\n              className=\"{{ !item.text ? 'ant-tab-bar  ant-tab-bar-large-icon' : 'ant-tab-bar' }}\"\n              image=\"{{ mixin.value === index ? item.activeIcon : item.icon }}\"/>\n          <!-- #if ALIPAY -->\n          </slot>\n          <!-- #endif -->\n        </block>\n        <view class=\"ant-tab-bar-text-wrap\">\n          <!-- #if ALIPAY -->\n          <slot\n            name=\"text\"\n            active=\"{{ mixin.value === index }}\"\n            item=\"{{ item }}\"\n            index=\"{{ index }}\">\n          <!-- #endif -->\n            <!-- display: inline -->\n            <text class=\"ant-tab-bar-text\">{{ item.text }}</text>\n          <!-- #if ALIPAY -->\n          </slot>\n          <!-- #endif -->\n        </view>\n      </view>\n    </block>\n  </view>\n</view>\n"
  },
  {
    "path": "src/TabBar/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Navigation\n  order: 6\ntoc: 'content'\n---\n\n# TabBar\n\nUsed to switch between different pages.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-tab-bar\": \"antd-mini/es/TabBar/index\"\n#endif\n#if WECHAT\n  \"ant-tab-bar\": \"antd-mini/TabBar/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n```xml\n<ant-tab-bar items=\"{{tabs}}\" />\n<ant-tab-bar items=\"{{tabs}}\" activeStyle=\"color:red;\" />\n#if ALIPAY\n<ant-tab-bar items=\"{{tabs}}\" current=\"{{current}}\" onChange=\"handleChange\" />\n#endif\n#if WECHAT\n<ant-tab-bar items=\"{{tabs}}\" current=\"{{current}}\" bindchange=\"handleChange\" />\n#endif\n```\n\n```js\nPage({\n  data: {\n    tabs: [\n      {\n        icon: 'AlipayCircleFill',\n        activeIcon: 'AlipayCircleFill',\n        text: 'homr',\n      },\n      {\n        icon: 'StarOutline',\n        activeIcon: 'StarFill',\n        text: 'favor',\n      },\n      {\n        icon: 'HeartOutline',\n        activeIcon: 'HeartFill',\n        text: 'like',\n      },\n    ],\n    current: 0,\n  },\n  handleChange(index) {\n    console.log(index);\n  },\n});\n```\n\n### Demo Code\n\n<code src='../../demo/pages/TabBar/index'></code>\n\n## API\n\n| Property            | Description                                                    | Type                    | Default Value |\n| --------------- | ------------------------------------------------------- | ----------------------- | ------ |\n| activeClassName | Tab activation class name                                          | string                  | -      |\n| activeStyle     | Tab Activation Style                                          | string                  | -      |\n| className       | Class Name                                                    | string                  | -      |\n| current         | Selected Items                                                  | number                  | -      |\n| defaultCurrent  | Initial Checked                                              | number                  | 0      |\n| icon            | Tab icon scope slot, receiving item, index, active parameters     | slot                    | -      |\n| items           | Bottom Icon Configuration                                            | [TabItem](#tabitem)[] | []     |\n| style           | Style                                                    | string                  | -      |\n| text            | Tab bottom text scope slot, receiving item, index, active parameters | slot                    | -      |\n| #if ALIPAY onChange    | Trigger callback on Tab switch | `(index: number) => void` | -      |\n| #if WECHAT bindchange  | Trigger callback on Tab switch | `(index: number) => void` | -     |\n\n### TabItem\n\n| Parameters       | Description                                               | Type   | Default Value |\n| ---------- | -------------------------------------------------- | ------ | ------ |\n| icon       | bottom icon, support [Icon](./Icon) or picture address           | string | -      |\n| activeIcon | bottom icon for active state, support [Icon](./Icon) or picture address | string | -      |\n| text       | Bottom Text                                           | string | -      |\n| badge      | Logo type, see [Badge](./Badge) Components               | object | -      |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                | Light Mode Default                                                                                           | Dark Mode Default                                                                                           | Remarks            |\n| --------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | --------------- |\n| --tabbar-bg           | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div>       | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div>       | TabBar Background Color |\n| --tabbar-item-color   | <div style=\"width: 150px; height: 30px; background-color: #666666; color: #ffffff;\">#666666</div>       | <div style=\"width: 150px; height: 30px; background-color: #808080; color: #ffffff;\">#808080</div>       | TabBar Entry Color |\n| --tabbar-active-color | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div>       | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div>       | TabBar Activate Color |\n"
  },
  {
    "path": "src/TabBar/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-badge\": \"../Badge/index\",\n    \"image-icon\": \"../ImageIcon/index\"\n  }\n}\n"
  },
  {
    "path": "src/TabBar/index.less",
    "content": "@import (reference) './variable.less';\n\n@tabsPrefix: ant-tab-bar;\n@tabSize: 44 * @rpx;\n@tabLargeSize: 72 * @rpx;\n@textSize: 20 * @rpx;\n\n.@{tabsPrefix} {\n  &-wrap {\n    display: flex;\n    align-items: center;\n    background-color: @tabbar-bg;\n  }\n  &-item {\n    flex: 1;\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    padding: 8 * @rpx 0;\n    color: @tabbar-item-color;\n    &-active {\n      color: @tabbar-active-color;\n    }\n  }\n\n  &-icon {\n    font-size: @tabSize;\n    flex-shrink: 0;\n  }\n  &-large-icon {\n    font-size: @tabLargeSize;\n  }\n\n  &-image {\n    font-size: @tabSize;\n    max-width: @tabSize;\n    max-height: @tabSize;\n  }\n\n  &-text {\n    font-size: @textSize;\n  }\n}\n"
  },
  {
    "path": "src/TabBar/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 导航\n  order: 6\ntoc: 'content'\n---\n\n# TabBar 底部导航栏\n\n用于在不同页面之间进行切换。\n\n## 引入\n\n在 `index.json` 中引入组件\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-tab-bar\": \"antd-mini/es/TabBar/index\"\n#endif\n#if WECHAT\n  \"ant-tab-bar\": \"antd-mini/TabBar/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n```xml\n<ant-tab-bar items=\"{{tabs}}\" />\n<ant-tab-bar items=\"{{tabs}}\" activeStyle=\"color:red;\" />\n#if ALIPAY\n<ant-tab-bar items=\"{{tabs}}\" current=\"{{current}}\" onChange=\"handleChange\" />\n#endif\n#if WECHAT\n<ant-tab-bar items=\"{{tabs}}\" current=\"{{current}}\" bindchange=\"handleChange\" />\n#endif\n```\n\n```js\nPage({\n  data: {\n    tabs: [\n      {\n        icon: 'AlipayCircleFill',\n        activeIcon: 'AlipayCircleFill',\n        text: 'homr',\n      },\n      {\n        icon: 'StarOutline',\n        activeIcon: 'StarFill',\n        text: 'favor',\n      },\n      {\n        icon: 'HeartOutline',\n        activeIcon: 'HeartFill',\n        text: 'like',\n      },\n    ],\n    current: 0,\n  },\n  handleChange(index) {\n    console.log(index);\n  },\n});\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/TabBar/index'></code>\n\n## API\n\n| 属性            | 说明                                                    | 类型                    | 默认值 |\n| --------------- | ------------------------------------------------------- | ----------------------- | ------ |\n| activeClassName | 选项卡激活类名                                          | string                  | -      |\n| activeStyle     | 选项卡激活样式                                          | string                  | -      |\n| className       | 类名                                                    | string                  | -      |\n| current         | 选中项                                                  | number                  | -      |\n| defaultCurrent  | 初始选中项                                              | number                  | 0      |\n| icon            | 选项卡图标作用域插槽，接收 item、index、active 参数     | slot                    | -      |\n| items           | 底部图标配置                                            | [TabItem](#tabitem)[] | []     |\n| style           | 样式                                                    | string                  | -      |\n| text            | 选项卡底部文字作用域插槽，接收 item、index、active 参数 | slot                    | -      |\n| #if ALIPAY onChange    | Tab 切换时触发回调 | `(index: number) => void` | -      |\n| #if WECHAT bindchange  | Tab 切换时触发回调 | `(index: number) => void` | -     |\n\n### TabItem\n\n| 参数       | 说明                                               | 类型   | 默认值 |\n| ---------- | -------------------------------------------------- | ------ | ------ |\n| icon       | 底部图标，支持 [Icon](./Icon) 或图片地址           | string | -      |\n| activeIcon | 激活状态的底部图标，支持 [Icon](./Icon) 或图片地址 | string | -      |\n| text       | 底部文字                                           | string | -      |\n| badge      | 徽标类型，参见 [Badge](./Badge) 组件               | object | -      |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                | 浅色模式默认值                                                                                           | 深色模式默认值                                                                                           | 备注            |\n| --------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | --------------- |\n| --tabbar-bg           | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div>       | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div>       | TabBar 背景颜色 |\n| --tabbar-item-color   | <div style=\"width: 150px; height: 30px; background-color: #666666; color: #ffffff;\">#666666</div>       | <div style=\"width: 150px; height: 30px; background-color: #808080; color: #ffffff;\">#808080</div>       | TabBar 条目颜色 |\n| --tabbar-active-color | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #ffffff;\">#1677ff</div>       | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #ffffff;\">#3086ff</div>       | TabBar 激活颜色 |\n"
  },
  {
    "path": "src/TabBar/index.ts",
    "content": "import mixinValue from '../mixins/value';\nimport { Component, triggerEvent } from '../_util/simply';\nimport { TabBarDefaultProps } from './props';\n\nComponent({\n  props: TabBarDefaultProps,\n  methods: {\n    onChange(e) {\n      const { index } = e.currentTarget.dataset;\n      if (index === this.getValue()) {\n        return;\n      }\n      if (!this.isControlled()) {\n        this.update(index);\n      }\n      triggerEvent(this, 'change', index, e);\n    },\n  },\n  mixins: [\n    mixinValue({\n      valueKey: 'current',\n      defaultValueKey: 'defaultCurrent',\n    }),\n  ],\n});\n"
  },
  {
    "path": "src/TabBar/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\nimport { IBadgeProps } from '../Badge/props';\n\nexport interface ITabItem {\n  /**\n   * @description 底部图标，支持 Icon 或图片\n   * @default ''\n   */\n  icon?: string;\n\n  /**\n   * @description 高亮状态的底部图标，支持 Icon 或图片\n   * @default ''\n   */\n  activeIcon?: string;\n\n  /**\n   * @description 底部的文本信息\n   * @default ''\n   */\n  text: string;\n  /**\n   * @description 徽标，参见 <Badge/> 组件\n   * @default undefined\n   */\n  badge?: IBadgeProps;\n}\n\n/**\n * @description 标签栏，内部配合 TabItem 使用。\n */\nexport interface ITabBarProps extends IBaseProps {\n  /**\n   * @description tabbar 配置，为一个数组\n   * @default []\n   */\n  items: ITabItem[];\n\n  /**\n   * @description 选中\n   */\n  current: number;\n  /**\n   * @description 初始值\n   */\n  defaultCurrent: number;\n\n  /**\n   * @description 高亮状态图标和文本的 className\n   */\n  activeClassName?: string;\n\n  /**\n   * @description 高亮状态图标和文本的 style\n   */\n  activeStyle?: string;\n  /**\n   * @description tabbar 切换时的回调\n   */\n  onChange: (index: number, e: Record<string, any>) => void;\n}\n\nexport const TabBarDefaultProps: Partial<ITabBarProps> = {\n  items: [],\n  current: null,\n  defaultCurrent: 0,\n  activeClassName: '',\n  activeStyle: '',\n};\n"
  },
  {
    "path": "src/TabBar/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n@tabbar-bg: var(--tabbar-bg, @COLOR_CARD);\n@tabbar-item-color: var(--tabbar-item-color, @COLOR_TEXT_SECONDARY);\n@tabbar-active-color: var(--tabbar-active-color, @COLOR_BRAND1);\n"
  },
  {
    "path": "src/Table/index.axml",
    "content": "<view\n  class=\"ant-table {{ scrollHeight ? 'ant-table-scroll-height' : '' }} {{className}}\"\n  onTouchMove=\"handleTouchMove\"\n  onScrollToUpper=\"handleScrollToUpper\"\n>\n  <view class=\"ant-table-content\" style=\"{{widthPx?`width: ${widthPx}px;`:''}} {{ scrollHeight ? `height: ${scrollHeight};` : '' }}\">\n    <view class=\"ant-table-list\">\n      <block a:for=\"{{list}}\" a:key=\"key\">\n        <!-- displayType-full 设置一行铺满展示 ant-table-list-item-{{item.type}} -->\n        <view\n          class=\"ant-table-list-item {{displayType==='FULL'?'ant-table-list-item-full':''}}\"\n          style=\"{{ item.type === 'columns' && scrollHeight ? 'position: sticky; top: 0; z-index: 10;' : '' }}\"\n        >\n          <block\n            a:for=\"{{item.value}}\"\n            a:for-index=\"itemIndex\"\n            a:for-item=\"val\"\n            a:key=\"key\"\n          >\n            <view\n              class=\"ant-table-list-item-columns-item {{val.fixed ? `ant-table-list-item-value-fixed ${showFixedShadow ? 'ant-table-list-item-value-shadow' : ''}` : ''}}\"\n              style=\"width:{{displayType==='FULL'?`${100/item.value.length}%;`:`${val.widthPx}px;`}} \"\n            >\n              <view a:if=\"{{item.type === 'columns'}}\" class=\"ant-table-list-item-columns ant-table-list-item-value {{ val.textAlignRight ? 'ant-table-list-item-value-align-right' : '' }}\">\n                <view\n                  class=\"{{val.ellipsisRow ? 'ant-table-list-item-ellipsis' : ''}}\"\n                  style=\"{{val.ellipsisRow ? `-webkit-line-clamp:${val.ellipsisRow}`: ''}};display: {{val.ellipsisRow ? '-webkit-box': 'flex'}}\"\n                >\n                  {{val.title}}\n                  <view\n                    a:if=\"{{val.sorter}}\"\n                    data-item=\"{{val}}\"\n                    onTap=\"handleSort\"\n                    class=\"ant-table-list-item-sorter\"\n                  >\n                    <image\n                      class=\"ant-table-list-item-sorter-icon\"\n                      src=\"{{val.sorterStatus === 'forward' ? 'https://mdn.alipayobjects.com/huamei_mvxdgg/afts/img/A*q71qTY02S-AAAAAAAAAAAAAADv57AQ/original' : 'https://mdn.alipayobjects.com/huamei_mvxdgg/afts/img/A*42gLQbKpi30AAAAAAAAAAAAADv57AQ/original'}}\"\n                    />\n                    <image\n                      class=\"ant-table-list-item-sorter-icon\"\n                      src=\"{{val.sorterStatus === 'reverse' ? 'https://mdn.alipayobjects.com/huamei_mvxdgg/afts/img/A*Co9CQ61uhPAAAAAAAAAAAAAADv57AQ/original' : 'https://mdn.alipayobjects.com/huamei_mvxdgg/afts/img/A*h9ZcSLzVBjgAAAAAAAAAAAAADv57AQ/original'}}\"\n                    />\n                  </view>\n                </view>\n              </view>\n              <view a:else class=\"ant-table-list-item-rows ant-table-list-item-value  {{itemIndex==0?'ant-table-list-item-value-first':''}} {{ val.textAlignRight ? 'ant-table-list-item-value-align-right' : '' }}\">\n                <!-- #if ALIPAY -->\n                <slot\n                  item=\"{{val}}\"\n                  index=\"{{itemIndex}}\"\n                  row=\"{{item}}\"\n                  rowIndex=\"{{index}}\"\n                  name=\"item\"\n                >\n                  <!-- #endif -->\n                  <view\n                    class=\"{{val.ellipsisRow ? 'ant-table-list-item-ellipsis' : ''}}\"\n                    style=\"{{val.ellipsisRow ? `-webkit-line-clamp:${val.ellipsisRow}`: ''}}\"\n                  >\n                    {{val.value}}\n                  </view>\n                  <!-- #if ALIPAY -->\n                </slot>\n                <!-- #endif -->\n              </view>\n            </view>\n          </block>\n        </view>\n      </block>\n    </view>\n\n    <view>\n      <view a:if=\"{{list.length <= 1}}\" class=\"ant-table-empty\">\n        <!-- #if ALIPAY -->\n        <slot item=\"{{val}}\" name=\"empty\">\n          <!-- #endif -->\n          <image class=\"ant-table-empty-image\" src=\"https://mdn.alipayobjects.com/huamei_9iifqq/afts/img/A*AWeXQYuIODwAAAAAAAAAAAAADjWYAQ/original\" />\n          <!-- #if ALIPAY -->\n        </slot>\n        <!-- #endif -->\n      </view>\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "src/Table/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Information Display\n  order: 8\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Table\n\nDisplays row and column data.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-table\": \"antd-mini/es/Table/index\"\n#endif\n#if WECHAT\n  \"ant-table\": \"antd-mini/Table/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic Usage\n\n```xml\n<ant-table\n  className='ant-table'\n  dataSource=\"{{dataSource}}\"\n  columns=\"{{columns}}\"\n/>\n```\n\n```js\nconst nameArr = [\n  '小明',\n  '小何',\n  '小花',\n  '小美',\n  '小白',\n  '小黑',\n  '小帅',\n  '阿伟',\n];\nconst sexArr = ['男', '女'];\nconst ageArr = ['40', '18', '32', '20', '33', '48', '28', '38'];\nconst favoriteArr = ['羽毛球', '乒乓球', '篮球', '桌球'];\nconst addressArr = ['北京', '上海', '浙江', '广州'];\n\nfunction getRandomNumber(n) {\n  return Math.floor(Math.random() * n);\n}\n\nPage({\n  data: {\n    dataSource: Array.from({ length: 7 }).map((v, i) => ({\n      key: i,\n      name: nameArr[i],\n      sex: sexArr[getRandomNumber(sexArr.length)],\n      age: ageArr[i],\n      extra: '测试',\n      favorite: favoriteArr[getRandomNumber(favoriteArr.length)],\n      address: addressArr[getRandomNumber(addressArr.length)],\n    })),\n    columns: [\n      {\n        title: '姓名',\n        dataIndex: 'name',\n        key: 'name',\n        width: 150,\n        fixed: true,\n      },\n      {\n        title: '年龄',\n        dataIndex: 'age',\n        key: 'age',\n        textAlignRight: true,\n        width: 150,\n        sorter: true,\n      },\n      {\n        title: '性别',\n        dataIndex: 'sex',\n        key: 'sex',\n        width: 150,\n      },\n      {\n        title: '爱好',\n        dataIndex: 'favorite',\n        key: 'favorite',\n        width: 250,\n      },\n      {\n        title: '地址',\n        dataIndex: 'address',\n        key: 'address',\n        width: 250,\n      },\n    ],\n  },\n});\n```\n\n### Local Scroll\n\n```xml\n<ant-table\n  dataSource=\"{{dataSource}}\"\n  columns=\"{{columns}}\"\n  scrollHeight=\"300rpx\"\n/>\n```\n\n### Full display\n\n```xml\n<ant-table\n  dataSource=\"{{dataSource}}\"\n  columns=\"{{fullColumns}}\"\n  displayType=\"FULL\"\n/>\n```\n\n### Empty data slot\n\n```xml\n<ant-table\n  dataSource=\"{{[]}}\"\n  columns=\"{{columns}}\"\n>\n  <image src=\"https://mdn.alipayobjects.com/huamei_9iifqq/afts/img/A*AWeXQYuIODwAAAAAAAAAAAAADjWYAQ/original\" />\n</ant-table>\n```\n\n### Beyond line break display\nYou can use the column configuration parameters.```ellipsisRow```Controls whether to wrap lines and how many lines are eventually displayed, beyond the ellipsis\n\n```xml\n<ant-table \n  dataSource=\"{{[{key: '0', name: '这是一行很长的数据，需要换行展示blablablabla', age: 18, sex: '男', address: '成都'}]}}\" \n  columns=\"{{fullColumns}}\"\n/>\n```\n\n### Demo Code\n\n<code src=\"../../demo/pages/Table/index\"></code>\n\n## Property\n\n| Property         | Description                                                                   | Type                | Default Value  |\n| ------------ | ---------------------------------------------------------------------- | ------------------- | ------- |\n| className    | Container className                                                         | string              | -       |\n| dataSource   | Data Source                                                                 | any[]               | -       |\n| columns      | Configuration description of table columns                                                       | [Column](#column)[] | -       |\n| displayType  | Table style type. The default style is displayed based on the configured width. Optional `FULL`、`DEFAULT` | string              | DEFAULT |\n| scrollHeight | Specify scrollable area height                                                     | string              | -       |\n\n### Column\n\n| Property           | Description                         | Type    | Default Value |\n| -------------- | ---------------------------- | ------- | ------ |\n| title          | Column Header                       | string  | -      |\n| dataIndex      | Column Value Field                   | string  | -      |\n| key            | Column Unique Identifier                   | string  | -      |\n| width          | Column Width                       | number  | -      |\n| fixed          | Fixed column                   | boolean | -      |\n| textAlignRight | Whether column text is right-justified             | boolean | -      |\n| ellipsisRow    | The maximum number of rows displayed in a cell, which exceeds omission. | number  | -      |\n\n\n## Slot\n\n| Name     | Description                                                                                    |\n| -------- | --------------------------------------------------------------------------------------- |\n| Default Slot | Data source is empty slot                                                                          |\n| item     | Cell Slot (Scope Slot, Exposed Properties `item`、`index`、`row`、`rowIndex`. WeChat is not supported) |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For more information, see ConfigProvider Components.\n\n| Variable name               | Default Value                                                                                                                    | Dark Mode Default                                                                                                            | Remarks               |\n| -------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------ |\n| --table-item-color   | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div>                         | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div>                         | Table Item Color           |\n| --table-item-bg      | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div>                         | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div>                         | Table Item Background Color       |\n| --table-shadow-color | <div style=\"width: 150px; height: 30px; background-color: rgba(5, 5, 5, 0.06); color: #ffffff;\">rgba(5, 5, 5, 0.06)</div> | <div style=\"width: 150px; height: 30px; background-color: rgba(5, 5, 5, 0.06); color: #ffffff;\">rgba(5, 5, 5, 0.06)</div> | Table Shadow Color       |\n| --table-empty-bg     | <div style=\"width: 150px; height: 30px; background-color: #fff; color: #333333;\">#fff</div>                               | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div>                         | Table empty state background color |\n"
  },
  {
    "path": "src/Table/index.json",
    "content": "{  \n  \"styleIsolation\": \"shared\",\n  \"component\": true\n}\n"
  },
  {
    "path": "src/Table/index.less",
    "content": "@import (reference) './variable.less';\n@import (reference) '../style/mixins/hairline.less';\n\n@tablePrefix: ant-table;\n@valueSize: 26 * @rpx;\n\n.@{tablePrefix} {\n  overflow: auto hidden;\n  -webkit-overflow-scrolling: touch;\n\n  &-scroll-height {\n    overflow: auto;\n  }\n\n  &-list {\n    &-item-full {\n      display: flex;\n      justify-content: space-between;\n    }\n\n    &-item {\n      display: flex;\n      position: relative;\n      .hairline('bottom', @table-bottom-border-color);\n\n      &::after {\n        margin-left: 30 * @rpx;\n      }\n\n      &:last-child {\n        &::after {\n          border: 0;\n        }\n      }\n\n      &-columns {\n        justify-content: space-between;\n        &-item {\n          flex-shrink: 0;\n        }\n      }\n\n      &-sorter {\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        margin-left: 6 * @rpx;\n\n        &-icon {\n          width: 16 * @rpx;\n          height: 16 * @rpx;\n        }\n      }\n\n      &-value {\n        display: flex;\n        align-items: center;\n        font-size: @valueSize;\n        font-weight: 400;\n        color: @table-item-color;\n        background-color: @table-item-bg;\n        flex-grow: 1;\n        padding: 24 * @rpx;\n        min-height: 62 * @rpx;\n        height: 100%;\n        word-break: break-all;\n        text-align: left;\n        box-sizing: border-box;\n\n        &-align-right {\n          justify-content: flex-end;\n        }\n\n        &-fixed {\n          position: sticky;\n          left: 0;\n        }\n\n        &-shadow {\n          &::after {\n            content: '';\n            position: absolute;\n            top: 0;\n            right: 0;\n            bottom: -1px;\n            display: block;\n            width: 30 * @rpx;\n            box-shadow: inset 5 * @rpx 0 8 * @rpx 0 @table-shadow-color;\n            transform: translateX(100%);\n            transition: box-shadow 0.3s;\n            pointer-events: none;\n          }\n        }\n      }\n\n      &-ellipsis {\n        overflow: hidden;\n        text-overflow: ellipsis;\n        -webkit-box-orient: vertical;\n        display: -webkit-box;\n        white-space: wrap;\n      }\n    }\n  }\n\n  &-empty {\n    padding-top: 50 * @rpx;\n    height: 300 * @rpx;\n    box-sizing: border-box;\n    background-color: @table-empty-bg;\n\n    &-image {\n      position: sticky;\n      left: 50%;\n      transform: translate(-50%, 0);\n      width: 200 * @rpx;\n      height: 200 * @rpx;\n    }\n  }\n}\n"
  },
  {
    "path": "src/Table/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 数据展示\n  order: 8\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Table 表格\n\n展示行列数据。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-table\": \"antd-mini/es/Table/index\"\n#endif\n#if WECHAT\n  \"ant-table\": \"antd-mini/Table/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基础用法\n\n```xml\n<ant-table\n  className='ant-table'\n  dataSource=\"{{dataSource}}\"\n  columns=\"{{columns}}\"\n/>\n```\n\n```js\nconst nameArr = [\n  '小明',\n  '小何',\n  '小花',\n  '小美',\n  '小白',\n  '小黑',\n  '小帅',\n  '阿伟',\n];\nconst sexArr = ['男', '女'];\nconst ageArr = ['40', '18', '32', '20', '33', '48', '28', '38'];\nconst favoriteArr = ['羽毛球', '乒乓球', '篮球', '桌球'];\nconst addressArr = ['北京', '上海', '浙江', '广州'];\n\nfunction getRandomNumber(n) {\n  return Math.floor(Math.random() * n);\n}\n\nPage({\n  data: {\n    dataSource: Array.from({ length: 7 }).map((v, i) => ({\n      key: i,\n      name: nameArr[i],\n      sex: sexArr[getRandomNumber(sexArr.length)],\n      age: ageArr[i],\n      extra: '测试',\n      favorite: favoriteArr[getRandomNumber(favoriteArr.length)],\n      address: addressArr[getRandomNumber(addressArr.length)],\n    })),\n    columns: [\n      {\n        title: '姓名',\n        dataIndex: 'name',\n        key: 'name',\n        width: 150,\n        fixed: true,\n      },\n      {\n        title: '年龄',\n        dataIndex: 'age',\n        key: 'age',\n        textAlignRight: true,\n        width: 150,\n        sorter: true,\n      },\n      {\n        title: '性别',\n        dataIndex: 'sex',\n        key: 'sex',\n        width: 150,\n      },\n      {\n        title: '爱好',\n        dataIndex: 'favorite',\n        key: 'favorite',\n        width: 250,\n      },\n      {\n        title: '地址',\n        dataIndex: 'address',\n        key: 'address',\n        width: 250,\n      },\n    ],\n  },\n});\n```\n\n### 局部滚动\n\n```xml\n<ant-table\n  dataSource=\"{{dataSource}}\"\n  columns=\"{{columns}}\"\n  scrollHeight=\"300rpx\"\n/>\n```\n\n### 铺满展示\n\n```xml\n<ant-table\n  dataSource=\"{{dataSource}}\"\n  columns=\"{{fullColumns}}\"\n  displayType=\"FULL\"\n/>\n```\n\n### 空数据插槽\n\n```xml\n<ant-table\n  dataSource=\"{{[]}}\"\n  columns=\"{{columns}}\"\n>\n  <image src=\"https://mdn.alipayobjects.com/huamei_9iifqq/afts/img/A*AWeXQYuIODwAAAAAAAAAAAAADjWYAQ/original\" />\n</ant-table>\n```\n\n### 超出换行展示\n可以使用列配置参数里的```ellipsisRow```控制是否换行以及最终展示多少行，超出以省略号展示\n\n```xml\n<ant-table \n  dataSource=\"{{[{key: '0', name: '这是一行很长的数据，需要换行展示blablablabla', age: 18, sex: '男', address: '成都'}]}}\" \n  columns=\"{{fullColumns}}\"\n/>\n```\n\n### Demo 代码\n\n<code src=\"../../demo/pages/Table/index\"></code>\n\n## 属性\n\n| 属性         | 说明                                                                   | 类型                | 默认值  |\n| ------------ | ---------------------------------------------------------------------- | ------------------- | ------- |\n| className    | 容器 className                                                         | string              | -       |\n| dataSource   | 数据源                                                                 | any[]               | -       |\n| columns      | 表格列的配置描述                                                       | [Column](#column)[] | -       |\n| displayType  | 表格样式类型，默认样式会根据配置的宽度进行展示，可选 `FULL`、`DEFAULT` | string              | DEFAULT |\n| scrollHeight | 指定可滚动区域高度                                                     | string              | -       |\n\n### Column\n\n| 属性           | 说明                         | 类型    | 默认值 |\n| -------------- | ---------------------------- | ------- | ------ |\n| title          | 列标题                       | string  | -      |\n| dataIndex      | 列取值字段                   | string  | -      |\n| key            | 列唯一标识                   | string  | -      |\n| width          | 列宽度                       | number  | -      |\n| fixed          | 是否固定列                   | boolean | -      |\n| textAlignRight | 列文本是否右对齐             | boolean | -      |\n| ellipsisRow    | 单元格最大展示行数，超出省略 | number  | -      |\n\n\n## 插槽\n\n| 名称     | 说明                                                                                    |\n| -------- | --------------------------------------------------------------------------------------- |\n| 默认插槽 | 数据源为空插槽                                                                          |\n| item     | 单元格插槽（作用域插槽，对外暴露的属性 `item`、`index`、`row`、`rowIndex`。微信不支持） |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名               | 默认值                                                                                                                    | 深色模式默认值                                                                                                            | 备注               |\n| -------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------ |\n| --table-item-color   | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div>                         | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div>                         | 表项颜色           |\n| --table-item-bg      | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div>                         | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div>                         | 表项背景颜色       |\n| --table-shadow-color | <div style=\"width: 150px; height: 30px; background-color: rgba(5, 5, 5, 0.06); color: #ffffff;\">rgba(5, 5, 5, 0.06)</div> | <div style=\"width: 150px; height: 30px; background-color: rgba(5, 5, 5, 0.06); color: #ffffff;\">rgba(5, 5, 5, 0.06)</div> | 表格阴影颜色       |\n| --table-empty-bg     | <div style=\"width: 150px; height: 30px; background-color: #fff; color: #333333;\">#fff</div>                               | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div>                         | 表格空状态背景颜色 |\n"
  },
  {
    "path": "src/Table/index.ts",
    "content": "import equal from 'fast-deep-equal';\nimport filter from 'lodash.filter';\nimport get from 'lodash.get';\nimport reduce from 'lodash.reduce';\nimport { getSystemInfo } from '../_util/jsapi/get-system-info';\nimport { Component, getValueFromProps } from '../_util/simply';\nimport { assertAilpayNativeNotSupport } from '../_util/support';\nimport { RenderRuleProps, TableDefaultProps } from './props';\n\nassertAilpayNativeNotSupport('Table');\n\nconst rpx2px = (rpx, windowWidth = 375) => {\n  let numRpx = rpx;\n  if (typeof rpx === 'string' && rpx.slice(-3) === 'rpx') {\n    numRpx = parseFloat(rpx.slice(0, -3));\n  }\n  const px = (numRpx / 750) * windowWidth;\n  return px;\n};\n\nconst defaultWidth = 150;\n\nComponent({\n  props: TableDefaultProps,\n  data: {\n    widthPx: 0,\n    list: [],\n    showFixedShadow: false,\n  },\n  sysInfo: Promise.resolve({} as any),\n  methods: {\n    async init() {\n      const [columns, dataSource] = getValueFromProps(this, [\n        'columns',\n        'dataSource',\n      ]);\n      const { windowWidth } = await this.getSysInfo();\n      const width = reduce(\n        columns,\n        (sum, cur) => {\n          return sum + cur.width;\n        },\n        0\n      );\n      const columnsData = this.renderColumns(columns, windowWidth);\n      const rowsData = this.renderRows(dataSource, windowWidth);\n      this.setData({\n        widthPx: rpx2px(width, windowWidth),\n        list: [...columnsData, ...rowsData],\n      });\n    },\n    renderColumns(columns, windowWidth, renderRule: RenderRuleProps = {}) {\n      const { key, sorterStatus } = renderRule;\n      return [\n        {\n          type: 'columns',\n          key: 'columns_0',\n          value: columns.map((v) => ({\n            ...v,\n            sorterStatus: key === v.key ? sorterStatus : 'normal',\n            widthPx: rpx2px(v.width || defaultWidth, windowWidth),\n          })),\n        },\n      ];\n    },\n    renderRows(dataSource, windowWidth, renderRule: RenderRuleProps = {}) {\n      const columns = getValueFromProps(this, 'columns');\n      const rowsData = dataSource.map((v, i) => {\n        return {\n          type: 'rows',\n          key: `rows_${i}`,\n          index: i,\n          value: columns.map((val, idx) => ({\n            ...val,\n            key: val.key,\n            index: idx,\n            dataIndex: val.dataIndex,\n            value: v[val.dataIndex],\n            textAlignRight: v.textAlignRight || val.textAlignRight,\n            rowsData: v,\n            widthPx: rpx2px(val.width || defaultWidth, windowWidth),\n            fixed: val.fixed,\n            ellipsisRow: val.ellipsisRow,\n          })),\n        };\n      });\n\n      const { key, sorter, sorterStatus } = renderRule;\n      // 排序返回\n      if (sorter && sorterStatus !== 'normal') {\n        return rowsData.sort((a, b) => {\n          const aValue = filter(a.value, { key })[0].value;\n          const bValue = filter(b.value, { key })[0].value;\n          if (sorterStatus === 'forward') {\n            return aValue - bValue;\n          }\n          return bValue - aValue;\n        });\n      }\n\n      // 默认返回\n      return rowsData;\n    },\n    async handleSort(e) {\n      const [columns, dataSource] = getValueFromProps(this, [\n        'columns',\n        'dataSource',\n      ]);\n      const { key, sorter, sorterStatus } = get(\n        e,\n        'currentTarget.dataset.item'\n      );\n      const filterData = filter(columns, { key });\n      const onSort = filterData && filterData[0] && filterData[0].onSort;\n      const { windowWidth } = await this.getSysInfo();\n      const type2status = {\n        // 默认时点击就正序\n        normal: 'forward',\n        // 正序时点击就倒序\n        forward: 'reverse',\n        // 倒序时点击就默认\n        reverse: 'normal',\n      };\n      const renderRule = {\n        key,\n        sorter,\n        sorterStatus: type2status[sorterStatus],\n      };\n\n      const columnsData = this.renderColumns(columns, windowWidth, renderRule);\n      let rowsData = [];\n      if (onSort) {\n        const newDataSource = await onSort(renderRule.sorterStatus);\n        rowsData = this.renderRows(newDataSource, windowWidth);\n      } else {\n        rowsData = this.renderRows(dataSource, windowWidth, renderRule);\n      }\n      this.setData({\n        list: [...columnsData, ...rowsData],\n      });\n    },\n    handleTouchMove() {\n      this.setData({\n        showFixedShadow: true,\n      });\n    },\n    handleScrollToUpper() {\n      this.setData({\n        showFixedShadow: false,\n      });\n    },\n    async getSysInfo() {\n      if (this.sysInfo) return this.sysInfo;\n      this.sysInfo = getSystemInfo();\n      return this.sysInfo;\n    },\n  },\n  /// #if ALIPAY\n  onInit() {\n    this.init();\n  },\n  didUpdate(prevProps) {\n    const { dataSource: prevDataSource, columns: prevColumns } = prevProps;\n    const [columns, dataSource] = getValueFromProps(this, [\n      'columns',\n      'dataSource',\n    ]);\n\n    if (!equal(prevDataSource, dataSource) || !equal(prevColumns, columns)) {\n      this.init();\n    }\n  },\n  /// #endif\n  /// #if WECHAT\n  created() {\n    this.init();\n  },\n  observers: {\n    'dataSource': function () {\n      this.init();\n    },\n    'columns': function () {\n      this.init();\n    },\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/Table/props.ts",
    "content": "export interface ITableProps {\n  dataSource: []; // 数据源\n  columns: []; // 表格列的配置描述\n  scrollHeight?: string; // 可滚动高度\n  displayType?: 'FULL' | 'DEFAULT'; // 布局类型  FULL:内容撑满一屏展示; DEFAULT: 默认展示，可配置左侧固定和每列的宽度等\n}\n\nexport interface RenderRuleProps {\n  key?: string;\n  sorter?: (a: any, b: any) => number;\n  sorterStatus?: 'normal' | 'forward' | 'reverse';\n}\n\nexport const TableDefaultProps: ITableProps = {\n  dataSource: [],\n  columns: [],\n  displayType: 'DEFAULT',\n};\n"
  },
  {
    "path": "src/Table/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n@table-bottom-border-color: var(\n  --table-bottom-border-color,\n  @COLOR_BORDER_GREYCARD\n);\n\n@table-item-color: var(--table-item-color, @COLOR_TEXT_PRIMARY);\n@table-item-bg: var(--table-item-bg, @COLOR_CARD);\n@table-shadow-color: var(--table-shadow-color, rgba(28, 28, 28, 0.06));\n@table-empty-bg: var(--table-empty-bg, @COLOR_CARD);\n"
  },
  {
    "path": "src/Tabs/index.axml",
    "content": "<view\n  a:if=\"{{ direction !== 'vertical' }}\"\n  class=\"ant-tabs {{ className ? className : '' }}\"\n  style=\"{{ style }}\">\n  <view\n    class=\"ant-tabs-bar {{ type === 'basic' ? 'ant-tabs-bar-underline' : '' }} {{ tabsBarClassName ? tabsBarClassName : '' }}\">\n    <view class=\"ant-tabs-bar-plus\">\n      <slot name=\"plus\" />\n    </view>\n    <view\n      class=\"ant-tabs-bar-fade ant-tabs-bar-fade-left\"\n      style=\"opacity: {{ leftFade ? '1' : '0' }}\" />\n    <view\n      class=\"ant-tabs-bar-fade ant-tabs-bar-fade-right\"\n      style=\"opacity: {{ rightFade ? '1' : '0' }}\" />\n\n    <!-- #if ALIPAY  -->\n    <scroll-view\n      class=\"ant-tabs-bar-scroll-view\"\n      id=\"ant-tabs-bar-scroll-view{{ $id ? '-' + $id : '' }}\"\n      onScroll=\"onScroll\"\n      scroll-left=\"{{ scrollLeft }}\"\n      scroll-x=\"{{ true }}\"\n      scroll-with-animation=\"{{ true }}\"\n      scroll-animation-duration=\"{{ 300 }}\">\n    <!-- #endif -->\n    <!-- #if WECHAT -->\n    <scroll-view\n      class=\"ant-tabs-bar-scroll-view\"\n      id=\"ant-tabs-bar-scroll-view{{ $id ? '-' + $id : '' }}\"\n      bindscroll=\"onScroll\"\n      scroll-left=\"{{ scrollLeft }}\"\n      scroll-x=\"{{ true }}\"\n      scroll-with-animation=\"{{ true }}\"\n      scroll-animation-duration=\"{{ 300 }}\"\n      enable-flex=\"true\"\n      style=\"{{ scrollHeight > 0 ? 'height: ' + scrollHeight + 'px;' : '' }}\">\n    <!-- #endif -->\n      <view />\n      <block\n        a:for=\"{{ items }}\"\n        a:for-index=\"index\"\n        a:for-item=\"item\"\n        a:key=\"title\">\n        <view\n          id=\"ant-tabs-bar-item{{ $id ? '-' + $id : '' }}-{{ index }}\"\n          class=\"ant-tabs-bar-wrap ant-tabs-bar-wrap-{{ type }} {{ tabsBarClassName ? tabsBarClassName : '' }} {{tabsBarWrapClassName ? tabsBarWrapClassName : ''}}\">\n          <view\n            a:if=\"{{ type === 'basic' }}\"\n            class=\"ant-tabs-bar-item ant-tabs-bar-basic {{ tabClassName ? tabClassName : '' }} {{ mixin.value === index && !item.disabled ? 'ant-tabs-bar-active' : '' }} {{ item.disabled ? 'ant-tabs-bar-disabled' : '' }} {{ mixin.value === index && !item.disabled && tabActiveClassName ? tabActiveClassName : '' }}\"\n            onTap=\"onChange\"\n            data-index=\"{{ index }}\">\n            <view class=\"ant-tabs-bar-basic-title\">\n              <!-- #if ALIPAY  -->\n              <slot\n                name=\"title\"\n                value=\"{{ item }}\"\n                index=\"{{ index }}\">\n              <!-- #endif -->\n                {{ item.title }}\n              <!-- #if ALIPAY  -->\n              </slot>\n              <!-- #endif -->\n            </view>\n          </view>\n          <view\n            a:elif=\"{{ type === 'capsule' }}\"\n            class=\"ant-tabs-bar-item ant-tabs-bar-capsule {{ tabClassName ? tabClassName : '' }} {{ mixin.value === index && !item.disabled ? 'ant-tabs-bar-active' : '' }} {{ item.disabled ? 'ant-tabs-bar-disabled' : '' }} {{ mixin.value === index && !item.disabled && tabActiveClassName ? tabActiveClassName : '' }}\"\n            onTap=\"onChange\"\n            data-index=\"{{ index }}\">\n            <view class=\"ant-tabs-bar-capsule-title\">\n              <!-- #if ALIPAY  -->\n              <slot\n                name=\"title\"\n                value=\"{{ item }}\"\n                index=\"{{ index }}\">\n              <!-- #endif -->\n                {{ item.title }}\n              <!-- #if ALIPAY  -->\n              </slot>\n              <!-- #endif -->\n            </view>\n          </view>\n          <view\n            a:else\n            class=\"ant-tabs-bar-item ant-tabs-bar-mixin {{ tabClassName ? tabClassName : '' }} {{ mixin.value === index && !item.disabled ? 'ant-tabs-bar-active' : '' }} {{ item.disabled ? 'ant-tabs-bar-disabled' : '' }} {{ mixin.value === index && !item.disabled && tabActiveClassName ? tabActiveClassName : '' }}\"\n            onTap=\"onChange\"\n            data-index=\"{{ index }}\">\n            <view class=\"ant-tabs-bar-mixin-title\">\n              <!-- #if ALIPAY  -->\n              <slot\n                name=\"title\"\n                value=\"{{ item }}\"\n                index=\"{{ index }}\">\n              <!-- #endif -->\n                {{ item.title }}\n              <!-- #if ALIPAY  -->\n              </slot>\n              <!-- #endif -->\n            </view>\n            <view class=\"ant-tabs-bar-mixin-subtitle\">\n              <!-- #if ALIPAY  -->\n              <slot\n                name=\"subTitle\"\n                value=\"{{ item }}\"\n                index=\"{{ index }}\">\n              <!-- #endif -->\n                {{ item.subTitle }}\n              <!-- #if ALIPAY  -->\n              </slot>\n              <!-- #endif -->\n            </view>\n          </view>\n        </view>\n      </block>\n\n      <view />\n    </scroll-view>\n  </view>\n  <view class=\"ant-tabs-content\">\n    <slot\n      value=\"{{ items[mixin.value] }}\"\n      index=\"{{ mixin.value }}\" />\n  </view>\n</view>\n<view\n  a:else\n  class=\"ant-vtabs {{ className ? className : '' }}\"\n  style=\"{{ style }}\">\n  <view class=\"ant-vtabs-bar {{ tabsBarClassName ? tabsBarClassName : '' }}\">\n    <!-- #if ALIPAY -->\n    <scroll-view\n      class=\"ant-vtabs-bar-scroll-view\"\n      id=\"ant-tabs-bar-scroll-view{{ $id ? '-' + $id : '' }}\"\n      onScroll=\"onScroll\"\n      scroll-top=\"{{ scrollTop }}\"\n      scroll-y=\"{{ true }}\"\n      scroll-with-animation=\"{{ true }}\"\n      scroll-animation-duration=\"{{ 300 }}\">\n    <!-- #endif -->\n    <!-- #if WECHAT -->\n    <scroll-view\n      class=\"ant-vtabs-bar-scroll-view\"\n      id=\"ant-tabs-bar-scroll-view{{ $id ? '-' + $id : '' }}\"\n      bindscroll=\"onScroll\"\n      scroll-top=\"{{ scrollTop }}\"\n      scroll-y=\"{{ true }}\"\n      scroll-with-animation=\"{{ true }}\"\n      scroll-animation-duration=\"{{ 300 }}\"\n      enable-flex=\"true\">\n    <!-- #endif -->\n      <view class=\"ant-vtabs-bar-item-wrap\">\n        <block\n          a:for=\"{{ items }}\"\n          a:for-index=\"index\"\n          a:for-item=\"item\"\n          a:key=\"title\">\n          <view\n            id=\"ant-tabs-bar-item{{ $id ? '-' + $id : '' }}-{{ index }}\"\n            class=\"ant-vtabs-bar-item {{ tabClassName ? tabClassName : '' }} {{ mixin.value === index && !item.disabled ? 'ant-vtabs-bar-item-active' : '' }} {{ item.disabled ? 'ant-vtabs-bar-item-disabled' : '' }} {{ mixin.value === index && !item.disabled && tabActiveClassName ? tabActiveClassName : '' }}\"\n            style=\"{{ mixin.value + 1 === index ? 'border-radius: 0 16rpx 0 0' : '' }};{{ mixin.value - 1 === index ? 'border-radius: 0 0 16rpx 0' : '' }}\"\n            onTap=\"onChange\"\n            data-index=\"{{ index }}\">\n            <!-- display: inline -->\n            <text class=\"ant-vtabs-bar-item-title\">\n              <!-- #if ALIPAY  -->\n              <slot\n                name=\"title\"\n                value=\"{{ item }}\"\n                index=\"{{ index }}\">\n              <!-- #endif -->\n                {{ item.title }}\n              <!-- #if ALIPAY  -->\n              </slot>\n              <!-- #endif -->\n            </text>\n          </view>\n        </block>\n      </view>\n    </scroll-view>\n  </view>\n  <view class=\"ant-vtabs-content\">\n    <!-- #if ALIPAY  -->\n    <slot\n      value=\"{{ items[mixin.value] }}\"\n      index=\"{{ mixin.value }}\">\n    <!-- #endif -->\n      {{ items[mixin.value].content }}\n    <!-- #if ALIPAY  -->\n    </slot>\n    <!-- #endif -->\n  </view>\n</view>\n"
  },
  {
    "path": "src/Tabs/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Navigation\n  order: 6\ntoc: 'content'\n---\n\n# Tabs\n\nNavigate between content groups.\n\n- Navigate between content groups.\n- The current content needs to be divided into groups of the same hierarchical structure for content switching and display, which is used at the top of the form or standard list interface.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-tabs\": \"antd-mini/es/Tabs/index\"\n#endif\n#if WECHAT\n  \"ant-tabs\": \"antd-mini/Tabs/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<ant-tabs items=\"{{items}}\" />\n```\n\n```js\nPage({\n  data: {\n    current: 0,\n    items: [\n      {\n        title: 'fruits',\n        subTitle: 'desc',\n        content: 'watermelon',\n      },\n      {\n        title: 'vegetables',\n        subTitle: 'desc',\n        badge: true,\n        content: 'tomato',\n      },\n      {\n        title: 'animals',\n        subTitle: 'desc',\n        content: 'monkey',\n      },\n    ],\n  },\n});\n```\n\n### With content\n\n```xml\n<ant-tabs items=\"{{items}}\">\n  <view class=\"content\" slot-scope=\"item\">\n    {{item.value.content}}\n  </view>\n</ant-tabs>\n```\n\n### Capsule\n\n```xml\n<ant-tabs type=\"capsule\" items=\"{{items}}\" defaultCurrent=\"{{1}}\"></ant-tabs>\n```\n\n### With subtitle\n\n```xml\n<ant-tabs type=\"mixin\" items=\"{{items}}\"></ant-tabs>\n```\n\n### With logo\n\n```xml\n<ant-tabs items=\"{{items}}\">\n <view\n    slot=\"title\"\n    slot-scope=\"item\">\n    <view a:if=\"{{item.value.badge}}\">\n      <ant-badge>{{item.value.title}}</ant-badge>\n    </view>\n    <view a:else>{{item.value.title}}</view>\n  </view>\n</ant-tabs>\n```\n\n### Disable state\n\n```xml\n<ant-tabs items=\"{{items}}\" />\n```\n\n```js\nPage({\n  data: {\n    current: 0,\n    items: [\n      {\n        title: 'fruits',\n        subTitle: 'desc',\n        content: 'watermelon',\n      },\n      {\n        title: 'vegetables',\n        subTitle: 'desc',\n        disabled: true,\n        content: 'tomato',\n      },\n      {\n        title: 'animals',\n        subTitle: 'desc',\n        content: 'monkey',\n      },\n    ],\n  },\n});\n```\n\n### plus button\n\n```xml\n<ant-tabs items=\"{{items}}\">\n  <view slot=\"plus\">\n    <ant-icon type=\"AddOutline\" onTap=\"onPlus\" />\n  </view>\n</ant-tabs>\n```\n\n### Control mode\n\n```xml\n<ant-tabs\n  items=\"{{items}}\"\n  current=\"{{current}}\"\n#if ALIPAY\n  onChange=\"handleChange\"\n#endif\n#if WECHAT\n  bindchange=\"handleChange\"\n#endif\n/>\n```\n\n### Center scroll after selection\n\n```xml\n<ant-tabs items=\"{{items}}\" scrollMode=\"center\" />\n```\n\n### Swiper\n\n```xml\n<ant-tabs\n  items=\"{{items}}\"\n  current=\"{{current}}\"\n#if ALIPAY\n  onChange=\"onChange\"\n#endif\n#if WECHAT\n  bindchange=\"onChange\"\n#endif\n>\n    <swiper\n      current=\"{{current}}\"\n      autoplay=\"{{false}}\"\n      vertical=\"{{false}}\"\n      circular=\"{{false}}\"\n#if ALIPAY\n      onChange=\"onSwipeChange\"\n#endif\n#if WECHAT\n      bindchange=\"onSwipeChange\"\n#endif\n    >\n      <block a:for=\"{{items}}\" a:for-index=\"index\" a:for-item=\"item\" a:key=\"{{index}}\">\n        <swiper-item>\n          <view class=\"content\">{{item.content}}</view>\n        </swiper-item>\n      </block>\n    </swiper>\n</ant-tabs>\n```\n\n### Elevator mode\n\n- Scrolling will correspond to tab.\n- Click tab to scroll to the corresponding tab title.\n- The onChange will only be triggered in tab switching. In the example, the custom title onTap can scroll current tab.\n\n<code src='../../demo/pages/Tabs/TabsElevator/index'></code>\n\n### ceiling\n\n- Sliding to the very top will suck the ceiling.\n- Toggling the tab content scrolls to the very top.\n\n```xml\n <ant-tabs items=\"{{items}}\" current=\"{{current}}\" onChange=\"onChange\" className=\"sticky-tabs\" />\n```\n\n```css\n.sticky-tabs {\n  position: sticky;\n  top: -1px;\n  z-index: 999;\n}\n```\n\n### Portrait mode\n\n```xml\n <ant-tabs\n    items=\"{{items}}\"\n    current=\"{{current}}\"\n    onChange=\"onChange\"\n    className=\"tabs\"\n    direction=\"vertical\"\n  >\n    <scroll-view\n      scroll-top=\"{{scrollTop}}\"\n      scroll-y=\"{{true}}\"\n      onScroll=\"onScroll\"\n      scroll-with-animation=\"{{true}}\"\n      scroll-animation-duration=\"{{300}}\"\n      class=\"content\"\n    >\n      {{items[current].content}}\n    </scroll-view>\n  </ant-tabs>\n```\n\n### Longitudinal elevator mode\n\n<code src='../../demo/pages/Tabs/TabsVerticalElevator/index'></code>\n\n### Demo Code\n\n<code src='../../demo/pages/Tabs/index'></code>\n\n## API\n\n| Property                   | Description                                                                                           | Type                                                                                         | Default Value     |\n| ---------------------- | ---------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | ---------- |\n| className              | Class Name                                                                                           | string                                                                                       | -          |\n| current                | Selected Index                                                                                       | number                                                                                       | -          |\n| defaultCurrent         | Selected index initial value                                                                                 | number                                                                                       | 0          |\n| direction              | tabs direction,`horizontal`(Horizontal) `vertical`(Vertical)                                                 | string                                                                                       | horizontal |\n| items                  | option, quantity must be greater than 0                                                                           | `Item[]`                                                                                     | -          |\n| plus                   | Operation button slot in upper right corner;<br /> `slot-scope` Include `value`(corresponding `Item`) `index`(corresponding `Item` index of)  | slot                                                                                         | -          |\n| scrollMode             | Scrolling mode, optional 'edge', 'center'                                                                | string                                                                                       | edge       |\n| style                  | Style                                                                                           | string                                                                                       | -          |\n| tabsBarClassName       | tabs bar class name                                                                                  | string                                                                                       | -          |\n| tabClassName           | tab class name                                                                                       | string                                                                                       | -          |\n| tabsBarWrapClassName           | tab wrap class name                                                                                       | string                                                                                       | -          |\n| tabActiveClassName     | tab active class name                                                                                | string                                                                                       | -          |\n| title                  | Custom `Items` Title;<br /> `slot-scope` Include `value`(corresponding `Item`) `index`(corresponding `Item` index of) | slot                                                                                         | -          |\n| type                   | Type,`basic`(basis),`capsule`(capsule),`mixin`(Mixed)                                            | string                                                                                       | `basic`    |\n| #if ALIPAY onChange    | When the panel is switched, the callback is triggered.                                                                         | (index: number, e: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -          |\n| #if WECHAT bindchange | When the panel is switched, the callback is triggered.                                                                         | (index: number, e: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -          |\n\n### Item\n\n| Property  | Description | Type   | Default Value |\n| ----- | ---- | ------ | ------ |\n| title | Title | string | -      |\n\nIn addition to item can have `title`, you can also add custom attributes, such `content`, `badge` and so on, these properties can be used. `slot-scope` Visit:\n\n```js\nPage({\n  data: {\n    items: [\n      {\n        title: 'tab 1',\n        content: 'tab 1 content',\n      },\n      {\n        title: 'tab 2',\n        content: 'tab 2 content',\n      },\n      {\n        title: 'tab 3',\n        content: 'tab 3 content',\n      },\n    ],\n  },\n});\n```\n\n```html\n<tabs items=\"{{items}}\">\n  <view slot=\"title\" slot-scope=\"tab\">\n    {{tab.index}}：{{tab.value.title}}，{{tab.value.content}}\n  </view>\n</tabs>\n```\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                        | Light Mode Default                                                                                    | Dark Mode Default                                                                                    | Remarks                |\n| ----------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------- |\n| --tabs-basic-color            | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #FFFFFF;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #FFFFFF;\">#c5cad1</div> | Tabs Basic Colors       |\n| --tabs-weaken-color           | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #FFFFFF;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #FFFFFF;\">#616161</div> | Tabs Weaken Color       |\n| --tabs-inverse-color          | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | Tabs Invert Color         |\n| --tabs-active-color           | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #FFFFFF;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #FFFFFF;\">#3086ff</div> | Tabs Activate Colors       |\n| --tabs-active-decorate-color  | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #FFFFFF;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #FFFFFF;\">#3086ff</div> | Tabs Activate Decorative Colors   |\n| --tabs-underline-border-color | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #333333;\">#eeeeee</div> | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #ffffff;\">#2b2b2b</div> | Tabs Underline Border Color |\n| --tabs-plus-color             | <div style=\"width: 150px; height: 30px; background-color: #000000; color: #FFFFFF;\">#000000</div> | <div style=\"width: 150px; height: 30px; background-color: #000000; color: #FFFFFF;\">#000000</div> | Tabs Plus Color       |\n| --tabs-capsule-title-bg       | <div style=\"width: 150px; height: 30px; background-color: #f5f5f5; color: #333333;\">#f5f5f5</div> | <div style=\"width: 150px; height: 30px; background-color: #121212; color: #ffffff;\">#121212</div> | Tabs Capsule Title Background Color |\n| --tabs-subtitle-color         | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | Tabs Subtitle Color     |\n| --tabs-count-color            | <div style=\"width: 150px; height: 30px; background-color: #cccccc; color: #333333;\">#cccccc</div> | <div style=\"width: 150px; height: 30px; background-color: #474747; color: #fff;\">#474747</div> | Tabs Count Color       |\n\n## FAQ\n\n### onChange can only be triggered by modification. What do you need to do if you want to click on the trigger current label?\n\ncan be used `slot` From the definition.\n\n```xml\n<tabs\n  items=\"{{items}}\"\n#if ALIPAY\n  onChange=\"onChange\"\n#endif\n#if WECHAT\n  bindchange=\"onChange\"\n#endif\n>\n  <view\n    slot=\"title\"\n    slot-scope=\"tab\"\n    data-index=\"{{tab.index}}\"\n#if ALIPAY\n    onTap=\"onTap\"\n#endif\n#if WECHAT\n    bindtap=\"onTap\"\n#endif\n  >\n    {{tab.value.title}}\n  </view>\n</tabs>\n```\n\n```js\nPage({\n  onChange(index) {\n    console.log(index);\n  },\n  onTap(e) {\n    const { index } = e.currentTarget.dataset;\n  },\n});\n```\n"
  },
  {
    "path": "src/Tabs/index.json",
    "content": "{  \n  \"styleIsolation\": \"shared\",\n  \"component\": true\n}\n"
  },
  {
    "path": "src/Tabs/index.less",
    "content": "@import (reference) './variable.less';\n\n@tabsPrefix: ant-tabs;\n\n.@{tabsPrefix} {\n  width: 100%;\n  &-bar {\n    position: relative;\n    width: 100%;\n    display: flex;\n    align-content: stretch;\n    background-color: @tabs-inverse-color;\n    box-sizing: border-box;\n    &-underline {\n      border-bottom: @border-width-standard solid @tabs-underline-border-color;\n    }\n    &-fade {\n      /// #if WECHAT\n      display: none;\n      /// #endif\n      position: absolute;\n      top: 0;\n      bottom: 0;\n      z-index: 9;\n      width: 36 * @rpx;\n      background-color: @tabs-inverse-color;\n      pointer-events: none;\n      &-left {\n        left: 0;\n        background: linear-gradient(\n          90deg,\n          @tabs-subtitle-color,\n          hsla(0, 0%, 100%, 0)\n        );\n      }\n      &-right {\n        right: 84 * @rpx;\n        background: linear-gradient(\n          270deg,\n          @tabs-subtitle-color,\n          hsla(0, 0%, 100%, 0)\n        );\n      }\n      transition: all 0.2s;\n    }\n    &-plus {\n      display: flex;\n      width: 72 * @rpx;\n      height: 72 * @rpx;\n      color: @tabs-plus-color;\n      align-self: center;\n      align-items: center;\n      justify-content: center;\n      overflow: hidden;\n      margin-right: @h-spacing-large;\n      order: 1;\n      &:empty {\n        display: none;\n        /// #if ALIPAY\n        ~ .@{tabsPrefix}-bar-fade-right {\n          right: 0;\n        }\n        /// #endif\n      }\n    }\n    &-scroll-view {\n      width: 100%;\n      display: flex;\n      flex-direction: row;\n      justify-content: space-between;\n      flex-wrap: nowrap;\n      overflow: hidden;\n      will-change: auto;\n      &::-webkit-scrollbar {\n        display: none;\n      }\n    }\n\n    // 选项卡最后两项间距控制\n    &-wrap {\n      display: flex;\n      flex-shrink: 0;\n      /// #if WECHAT\n      align-items: flex-start;\n      /// #endif\n\n      &-capsule {\n        flex: 1;\n      }\n\n      &:nth-of-type(2) .@{tabsPrefix}-bar-capsule,\n      &:nth-of-type(2) .@{tabsPrefix}-bar-mixin {\n        margin-left: @h-spacing-large;\n      }\n      &:nth-last-of-type(2) .@{tabsPrefix}-bar-capsule,\n      &:nth-last-of-type(2) .@{tabsPrefix}-bar-mixin {\n        margin-right: @h-spacing-large;\n      }\n    }\n    // 选项卡的通用样式\n    &-item {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      flex: 1 0 auto;\n      font-size: @font-size-list;\n      white-space: nowrap;\n      color: @tabs-basic-color;\n      .ant-badge {\n        width: 100%;\n      }\n    }\n    // 基础类型 tab 选项卡样式\n    &-basic {\n      position: relative;\n      display: flex;\n      align-items: center;\n      padding: @v-spacing-standard @h-spacing-large;\n      box-sizing: border-box;\n    }\n\n    &-basic&-active {\n      color: @tabs-active-color;\n      position: relative;\n      &:after {\n        content: '';\n        position: absolute;\n        bottom: 0;\n        width: calc(100% - @h-spacing-large * 2);\n        height: 4 * @rpx;\n        overflow: hidden;\n        font-size: 0;\n        border-radius: @corner-radius-circle;\n        box-sizing: border-box;\n        background-color: @tabs-active-decorate-color;\n      }\n    }\n\n    // 胶囊类型选项卡样式\n    &-capsule {\n      padding: @v-spacing-large 0;\n      margin: 0 @h-spacing-large / 2;\n      box-sizing: border-box;\n      position: relative;\n      &-title {\n        flex: 1;\n        justify-content: center;\n        margin-right: 0;\n        padding: @v-spacing-standard 30 * @rpx;\n        font-size: 30 * @rpx;\n        text-align: center;\n        line-height: @line-height-base;\n        border-radius: 10vh;\n        background-color: @tabs-capsule-title-bg;\n        border-bottom: 0 none;\n      }\n    }\n    &-capsule&-active &-capsule-title {\n      color: @tabs-subtitle-color;\n      background-color: @tabs-active-decorate-color;\n    }\n\n    // 混合类型的选项卡样式\n    &-mixin {\n      flex-direction: column;\n      margin: 0 @h-spacing-standard;\n      padding: @v-spacing-large 0;\n      text-align: center;\n      &-title {\n        margin: 2 * @rpx 0;\n        position: relative;\n      }\n\n      &-subtitle {\n        padding: 0 @h-spacing-standard;\n        font-size: @font-size-content;\n        line-height: @line-height-paragraph;\n        color: @tabs-weaken-color;\n        border-radius: 50vh;\n        background-color: @tabs-capsule-title-bg;\n        margin: 2 * @rpx 0;\n      }\n    }\n    &-mixin&-active &-mixin-title {\n      color: @tabs-active-color;\n    }\n    &-mixin&-active &-mixin-subtitle {\n      color: @tabs-subtitle-color;\n      background-color: @tabs-active-decorate-color;\n    }\n    // 禁用态选项卡样式\n    &-disabled {\n      opacity: @opacity-disabled;\n      pointer-events: none;\n      cursor: not-allowed;\n    }\n  }\n  &-content {\n    overflow: hidden;\n    background-color: @tabs-subtitle-color;\n    color: @tabs-basic-color;\n  }\n}\n\n@vtabsPrefix: ant-vtabs;\n\n.@{vtabsPrefix} {\n  width: 100%;\n  display: flex;\n  flex-direction: row;\n  &-bar {\n    width: 210 * @rpx;\n    overflow: hidden;\n    &-scroll-view {\n      display: flex;\n      flex-direction: column;\n      width: 100%;\n      height: 100%;\n      background-color: @tabs-capsule-title-bg;\n      &::-webkit-scrollbar {\n        display: none;\n      }\n    }\n    &-item {\n      position: relative;\n      width: 100%;\n      padding: @size-4 @h-spacing-large;\n      overflow: hidden;\n      display: flex;\n      align-items: center;\n      font-size: @font-size-content;\n      line-height: 37 * @rpx;\n      color: @tabs-basic-color;\n      background-color: @tabs-capsule-title-bg;\n      box-sizing: border-box;\n      transition: background-color 100ms linear, color 300ms linear;\n      &-wrap {\n        background-color: @tabs-inverse-color;\n      }\n      &-active {\n        color: @tabs-active-color;\n        background-color: @tabs-inverse-color;\n        &::after {\n          position: absolute;\n          content: '';\n          top: @size-4;\n          bottom: @size-4;\n          left: 0;\n          width: @border-width-thick;\n          border-radius: @corner-radius-sm;\n          background-color: @tabs-active-color;\n        }\n      }\n      &-disabled {\n        pointer-events: none;\n        cursor: not-allowed;\n        .@{vtabsPrefix}-bar-item-title,\n        .@{vtabsPrefix}-bar-item-count {\n          opacity: @opacity-disabled;\n        }\n      }\n      &-count {\n        color: @tabs-count-color;\n        margin-left: @size-1;\n      }\n      &-icon {\n        padding-left: 8 * @rpx;\n        width: 28 * @rpx;\n        height: 28 * @rpx;\n        font-size: 26 * @rpx;\n        overflow: hidden;\n        position: relative;\n        top: -4 * @rpx;\n        display: flex;\n        justify-content: center;\n        align-items: center;\n        &:empty {\n          display: none;\n        }\n      }\n    }\n  }\n  &-content {\n    overflow: hidden;\n    flex: 1;\n    background-color: @tabs-inverse-color;\n    color: @tabs-basic-color;\n  }\n}\n"
  },
  {
    "path": "src/Tabs/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 导航\n  order: 6\ntoc: 'content'\n---\n\n# Tabs 标签页\n\n内容组之间进行导航切换。\n\n- 内容组之间进行导航切换。\n- 当前内容需要分成同层级结构的组，进行内容切换展示，用在表单或者标准列表界面的顶部。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-tabs\": \"antd-mini/es/Tabs/index\"\n#endif\n#if WECHAT\n  \"ant-tabs\": \"antd-mini/Tabs/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-tabs items=\"{{items}}\" />\n```\n\n```js\nPage({\n  data: {\n    current: 0,\n    items: [\n      {\n        title: 'fruits',\n        subTitle: 'desc',\n        content: 'watermelon',\n      },\n      {\n        title: 'vegetables',\n        subTitle: 'desc',\n        badge: true,\n        content: 'tomato',\n      },\n      {\n        title: 'animals',\n        subTitle: 'desc',\n        content: 'monkey',\n      },\n    ],\n  },\n});\n```\n\n### 带有 content\n\n```xml\n<ant-tabs items=\"{{items}}\">\n  <view class=\"content\" slot-scope=\"item\">\n    {{item.value.content}}\n  </view>\n</ant-tabs>\n```\n\n### 胶囊\n\n```xml\n<ant-tabs type=\"capsule\" items=\"{{items}}\" defaultCurrent=\"{{1}}\"></ant-tabs>\n```\n\n### 带副标题\n\n```xml\n<ant-tabs type=\"mixin\" items=\"{{items}}\"></ant-tabs>\n```\n\n### 带徽标\n\n```xml\n<ant-tabs items=\"{{items}}\">\n <view\n    slot=\"title\"\n    slot-scope=\"item\">\n    <view a:if=\"{{item.value.badge}}\">\n      <ant-badge>{{item.value.title}}</ant-badge>\n    </view>\n    <view a:else>{{item.value.title}}</view>\n  </view>\n</ant-tabs>\n```\n\n### 禁用状态\n\n```xml\n<ant-tabs items=\"{{items}}\" />\n```\n\n```js\nPage({\n  data: {\n    current: 0,\n    items: [\n      {\n        title: 'fruits',\n        subTitle: 'desc',\n        content: 'watermelon',\n      },\n      {\n        title: 'vegetables',\n        subTitle: 'desc',\n        disabled: true,\n        content: 'tomato',\n      },\n      {\n        title: 'animals',\n        subTitle: 'desc',\n        content: 'monkey',\n      },\n    ],\n  },\n});\n```\n\n### plus 按钮\n\n```xml\n<ant-tabs items=\"{{items}}\">\n  <view slot=\"plus\">\n    <ant-icon type=\"AddOutline\" onTap=\"onPlus\" />\n  </view>\n</ant-tabs>\n```\n\n### 控制模式\n\n```xml\n<ant-tabs\n  items=\"{{items}}\"\n  current=\"{{current}}\"\n#if ALIPAY\n  onChange=\"handleChange\"\n#endif\n#if WECHAT\n  bindchange=\"handleChange\"\n#endif\n/>\n```\n\n### 选择后居中滚动\n\n```xml\n<ant-tabs items=\"{{items}}\" scrollMode=\"center\" />\n```\n\n### Swiper\n\n```xml\n<ant-tabs\n  items=\"{{items}}\"\n  current=\"{{current}}\"\n#if ALIPAY\n  onChange=\"onChange\"\n#endif\n#if WECHAT\n  bindchange=\"onChange\"\n#endif\n>\n    <swiper\n      current=\"{{current}}\"\n      autoplay=\"{{false}}\"\n      vertical=\"{{false}}\"\n      circular=\"{{false}}\"\n#if ALIPAY\n      onChange=\"onSwipeChange\"\n#endif\n#if WECHAT\n      bindchange=\"onSwipeChange\"\n#endif\n    >\n      <block a:for=\"{{items}}\" a:for-index=\"index\" a:for-item=\"item\" a:key=\"{{index}}\">\n        <swiper-item>\n          <view class=\"content\">{{item.content}}</view>\n        </swiper-item>\n      </block>\n    </swiper>\n</ant-tabs>\n```\n\n### 电梯模式\n\n- 滚动会对应到 tab。\n- 点击 tab 可滚动到对应 tab title。\n- onChange 只会在 tab 切换触发，示例里自定义 title onTap 可滚动 current tab。\n\n<code src='../../demo/pages/Tabs/TabsElevator/index'></code>\n\n### 吸顶\n\n- 滑动到最顶部会吸顶。\n- 切换 tab content 会滚动到最顶部。\n\n```xml\n <ant-tabs items=\"{{items}}\" current=\"{{current}}\" onChange=\"onChange\" className=\"sticky-tabs\" />\n```\n\n```css\n.sticky-tabs {\n  position: sticky;\n  top: -1px;\n  z-index: 999;\n}\n```\n\n### 纵向模式\n\n```xml\n <ant-tabs\n    items=\"{{items}}\"\n    current=\"{{current}}\"\n    onChange=\"onChange\"\n    className=\"tabs\"\n    direction=\"vertical\"\n  >\n    <scroll-view\n      scroll-top=\"{{scrollTop}}\"\n      scroll-y=\"{{true}}\"\n      onScroll=\"onScroll\"\n      scroll-with-animation=\"{{true}}\"\n      scroll-animation-duration=\"{{300}}\"\n      class=\"content\"\n    >\n      {{items[current].content}}\n    </scroll-view>\n  </ant-tabs>\n```\n\n### 纵向电梯模式\n\n<code src='../../demo/pages/Tabs/TabsVerticalElevator/index'></code>\n\n### Demo 代码\n\n<code src='../../demo/pages/Tabs/index'></code>\n\n## API\n\n| 属性                   | 说明                                                                                           | 类型                                                                                         | 默认值     |\n| ---------------------- | ---------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | ---------- |\n| className              | 类名                                                                                           | string                                                                                       | -          |\n| current                | 选中索引                                                                                       | number                                                                                       | -          |\n| defaultCurrent         | 选中索引初始值                                                                                 | number                                                                                       | 0          |\n| direction              | tabs 方向，`horizontal`(水平) `vertical`(垂直)                                                 | string                                                                                       | horizontal |\n| items                  | 选项，数量必须大于 0                                                                           | `Item[]`                                                                                     | -          |\n| plus                   | 右上角操作按钮插槽；<br /> `slot-scope` 包括 `value`(对应 `Item`) `index`(对应 `Item` 的索引)  | slot                                                                                         | -          |\n| scrollMode             | 滚动方式，可选 'edge', 'center'                                                                | string                                                                                       | edge       |\n| style                  | 样式                                                                                           | string                                                                                       | -          |\n| tabsBarClassName       | tabs bar 类名                                                                                  | string                                                                                       | -          |\n| tabClassName           | tab 类名                                                                                       | string                                                                                       | -          |\n| tabsBarWrapClassName           | tab wrap 类名                                                                                       | string                                                                                       | -          |\n| tabActiveClassName     | tab active 类名                                                                                | string                                                                                       | -          |\n| title                  | 自定义 `Items` 标题；<br /> `slot-scope` 包括 `value`(对应 `Item`) `index`(对应 `Item` 的索引) | slot                                                                                         | -          |\n| type                   | 类型，`basic`(基础)，`capsule`(胶囊)，`mixin`(混合)                                            | string                                                                                       | `basic`    |\n| #if ALIPAY onChange    | 面板切换时候，触发回调                                                                         | (index: number, e: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -          |\n| #if WECHAT bindchange | 面板切换时候，触发回调                                                                         | (index: number, e: [Event](https://opendocs.alipay.com/mini/framework/event-object)) => void | -          |\n\n### Item\n\n| 属性  | 说明 | 类型   | 默认值 |\n| ----- | ---- | ------ | ------ |\n| title | 标题 | string | -      |\n\n在 Item 里除了可以有 `title`，还可以加上自定义的属性，比如 `content`, `badge` 等，这些属性可使用 `slot-scope` 访问：\n\n```js\nPage({\n  data: {\n    items: [\n      {\n        title: 'tab 1',\n        content: 'tab 1 content',\n      },\n      {\n        title: 'tab 2',\n        content: 'tab 2 content',\n      },\n      {\n        title: 'tab 3',\n        content: 'tab 3 content',\n      },\n    ],\n  },\n});\n```\n\n```html\n<tabs items=\"{{items}}\">\n  <view slot=\"title\" slot-scope=\"tab\">\n    {{tab.index}}：{{tab.value.title}}，{{tab.value.content}}\n  </view>\n</tabs>\n```\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                        | 浅色模式默认值                                                                                    | 深色模式默认值                                                                                    | 备注                |\n| ----------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------- |\n| --tabs-basic-color            | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #FFFFFF;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #FFFFFF;\">#c5cad1</div> | Tabs 基本颜色       |\n| --tabs-weaken-color           | <div style=\"width: 150px; height: 30px; background-color: #999999; color: #FFFFFF;\">#999999</div> | <div style=\"width: 150px; height: 30px; background-color: #616161; color: #FFFFFF;\">#616161</div> | Tabs 弱化颜色       |\n| --tabs-inverse-color          | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | Tabs 反转色         |\n| --tabs-active-color           | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #FFFFFF;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #FFFFFF;\">#3086ff</div> | Tabs 激活颜色       |\n| --tabs-active-decorate-color  | <div style=\"width: 150px; height: 30px; background-color: #1677ff; color: #FFFFFF;\">#1677ff</div> | <div style=\"width: 150px; height: 30px; background-color: #3086ff; color: #FFFFFF;\">#3086ff</div> | Tabs 激活装饰颜色   |\n| --tabs-underline-border-color | <div style=\"width: 150px; height: 30px; background-color: #eeeeee; color: #333333;\">#eeeeee</div> | <div style=\"width: 150px; height: 30px; background-color: #2b2b2b; color: #ffffff;\">#2b2b2b</div> | Tabs 下划线边框颜色 |\n| --tabs-plus-color             | <div style=\"width: 150px; height: 30px; background-color: #000000; color: #FFFFFF;\">#000000</div> | <div style=\"width: 150px; height: 30px; background-color: #000000; color: #FFFFFF;\">#000000</div> | Tabs 加号颜色       |\n| --tabs-capsule-title-bg       | <div style=\"width: 150px; height: 30px; background-color: #f5f5f5; color: #333333;\">#f5f5f5</div> | <div style=\"width: 150px; height: 30px; background-color: #121212; color: #ffffff;\">#121212</div> | Tabs 胶囊标题背景色 |\n| --tabs-subtitle-color         | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #333333;\">#ffffff</div> | <div style=\"width: 150px; height: 30px; background-color: #1a1a1a; color: #ffffff;\">#1a1a1a</div> | Tabs 副标题颜色     |\n| --tabs-count-color            | <div style=\"width: 150px; height: 30px; background-color: #cccccc; color: #333333;\">#cccccc</div> | <div style=\"width: 150px; height: 30px; background-color: #474747; color: #fff;\">#474747</div> | Tabs 计数颜色       |\n\n## FAQ\n\n### onChange 只有修改才能触发，想要在触发 current 标签的点击需要怎么做\n\n可以使用 `slot` 来自定义。\n\n```xml\n<tabs\n  items=\"{{items}}\"\n#if ALIPAY\n  onChange=\"onChange\"\n#endif\n#if WECHAT\n  bindchange=\"onChange\"\n#endif\n>\n  <view\n    slot=\"title\"\n    slot-scope=\"tab\"\n    data-index=\"{{tab.index}}\"\n#if ALIPAY\n    onTap=\"onTap\"\n#endif\n#if WECHAT\n    bindtap=\"onTap\"\n#endif\n  >\n    {{tab.value.title}}\n  </view>\n</tabs>\n```\n\n```js\nPage({\n  onChange(index) {\n    console.log(index);\n  },\n  onTap(e) {\n    const { index } = e.currentTarget.dataset;\n  },\n});\n```\n"
  },
  {
    "path": "src/Tabs/index.ts",
    "content": "import createValue from '../mixins/value';\nimport { getInstanceBoundingClientRect } from '../_util/jsapi/get-instance-bounding-client-rect';\nimport { Component, getValueFromProps, triggerEvent } from '../_util/simply';\nimport { TabsDefaultProps } from './props';\n\nComponent({\n  props: TabsDefaultProps,\n  data: {\n    /// #if WECHAT\n    scrollHeight: 0,\n    /// #endif\n    scrollLeft: 0,\n    scrollTop: 0,\n    leftFade: false,\n    rightFade: false,\n  },\n  scrollLeft: 0,\n  scrollTop: 0,\n  methods: {\n    getInstance() {\n      if (this.$id) {\n        return my;\n      }\n      return this;\n    },\n    get$Id() {\n      return this.$id ? `-${this.$id}` : '';\n    },\n    async getBoundingClientRect(query: string) {\n      return await getInstanceBoundingClientRect(this.getInstance(), query);\n    },\n    async updateFade() {\n      this.setData({\n        leftFade: !!this.scrollLeft,\n      });\n      const items = getValueFromProps(this, 'items');\n      const [view, item] = await Promise.all([\n        this.getBoundingClientRect(`#ant-tabs-bar-scroll-view${this.get$Id()}`),\n        this.getBoundingClientRect(\n          `#ant-tabs-bar-item${this.get$Id()}-${items.length - 1}`\n        ),\n      ]);\n      if (!item || !view) {\n        return;\n      }\n      this.setData({\n        rightFade: item.left + item.width / 2 > view.width,\n      });\n    },\n    async updateScroll() {\n      const current = this.getValue();\n      const [view, item] = await Promise.all([\n        this.getBoundingClientRect(`#ant-tabs-bar-scroll-view${this.get$Id()}`),\n        this.getBoundingClientRect(\n          `#ant-tabs-bar-item${this.get$Id()}-${current}`\n        ),\n      ]);\n\n      if (!view || !item) {\n        return;\n      }\n\n      const [direction, scrollMode] = getValueFromProps(this, [\n        'direction',\n        'scrollMode',\n      ]);\n      if (direction === 'vertical') {\n        let scrollTop = this.scrollTop || 0;\n        let needScroll = false;\n        if (scrollMode === 'center') {\n          needScroll = true;\n          scrollTop +=\n            item.top - view.top - Math.max((view.height - item.height) / 2, 0);\n        } else {\n          const distance = item.top - view.top;\n          if (distance < 0) {\n            scrollTop += distance;\n            needScroll = true;\n          } else if (distance + item.height > view.height) {\n            scrollTop += Math.min(\n              distance + item.height - view.height,\n              distance\n            );\n            needScroll = true;\n          }\n        }\n        if (needScroll) {\n          if (scrollTop === this.data.scrollTop) {\n            scrollTop += Math.random();\n          }\n          this.setData({\n            scrollTop,\n          });\n        }\n        return;\n      }\n      let scrollLeft = this.scrollLeft || 0;\n      let needScroll = false;\n      if (scrollMode === 'center') {\n        needScroll = true;\n        scrollLeft +=\n          item.left - view.left - Math.max((view.width - item.width) / 2, 0);\n      } else {\n        const distance = item.left - view.left;\n        if (distance < 0) {\n          scrollLeft += distance;\n          needScroll = true;\n        } else if (distance + item.width > view.width) {\n          scrollLeft += Math.min(distance + item.width - view.width, distance);\n          needScroll = true;\n        }\n      }\n      if (needScroll) {\n        if (scrollLeft === this.data.scrollLeft) {\n          scrollLeft += Math.random();\n        }\n        this.setData({\n          scrollLeft,\n        });\n        this.updateFade();\n      }\n    },\n    async onScroll(e) {\n      const direction = getValueFromProps(this, 'direction');\n      if (direction === 'vertical') {\n        this.scrollTop = e.detail.scrollTop;\n        return;\n      }\n      this.scrollLeft = e.detail.scrollLeft;\n      this.updateFade();\n    },\n    onChange(e) {\n      const index = parseInt(e.currentTarget.dataset.index, 10);\n      const items = getValueFromProps(this, 'items');\n      if (items[index].disabled) {\n        return;\n      }\n      if (this.getValue() === index) {\n        return;\n      }\n      if (!this.isControlled()) {\n        this.update(index);\n      }\n\n      triggerEvent(this, 'change', index, e);\n    },\n  },\n\n  mixins: [\n    createValue({\n      valueKey: 'current',\n      defaultValueKey: 'defaultCurrent',\n    }),\n  ],\n\n  /// #if ALIPAY\n  didMount() {\n    this.updateScroll();\n  },\n  didUpdate(prevProps, prevData) {\n    const items = getValueFromProps(this, 'items');\n    if (prevProps.items !== items || !this.isEqualValue(prevData)) {\n      this.updateScroll();\n    }\n  },\n  /// #endif\n  /// #if WECHAT\n  attached() {\n    this.updateScroll();\n    this.getBoundingClientRect('.ant-tabs-bar-item').then((res) => {\n      const direction = getValueFromProps(this, 'direction');\n      if (res && res.height > 0 && direction !== 'vertical') {\n        this.setData({\n          scrollHeight: res.height,\n        });\n      } else {\n        this.setData({\n          scrollHeight: direction === 'vertical' ? 0 : 40,\n        });\n      }\n    });\n  },\n  observers: {\n    'items': function () {\n      this.updateScroll();\n    },\n    'mixin.current': function () {\n      this.updateScroll();\n    },\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/Tabs/props.ts",
    "content": "import { IBaseProps } from '../_util/base';\n\nexport interface ITabsProps extends IBaseProps {\n  /**\n   * @description 类型，basic(基础)，capsule(胶囊)，mixin(混合)\n   * @default \"basic\"\n   */\n  type: 'basic' | 'capsule' | 'mixin';\n\n  /**\n   * @description tabs方向\n   */\n  direction: 'horizontal' | 'vertical';\n\n  /**\n   * @description tab 切换时的回调\n   */\n  onChange: (index: number, e: Record<string, any>) => void;\n\n  /**\n   * @description 选项\n   */\n  current: number;\n\n  /**\n   * @description 列表\n   */\n  items: {\n    title: string;\n    content: string;\n    disabled?: boolean;\n    subTitle?: string;\n  }[];\n\n  /**\n   * 选项初始值\n   */\n  defaultCurrent: number;\n\n  /**\n   * 滚动方式，direction为horizontal生效\n   */\n  scrollMode: 'edge' | 'center';\n\n  /**\n   * @description tabs bar类名\n   */\n  tabsBarClassName?: string;\n\n  /**\n   * @description tab bar wrap类名\n   */\n  tabsBarWrapClassName?: string;\n\n  /**\n   * @description tab 类名\n   */\n  /**\n   * @description tab类名\n   */\n  tabClassName?: string;\n\n  /**\n   *@description tab active类名\n   */\n  tabActiveClassName?: string;\n}\n\nexport const TabsDefaultProps: Partial<ITabsProps> = {\n  type: 'basic',\n  direction: 'horizontal',\n  current: null,\n  defaultCurrent: 0,\n  items: [],\n  scrollMode: 'edge',\n  tabsBarClassName: '',\n  tabsBarWrapClassName: '',\n  tabActiveClassName: '',\n  tabClassName: '',\n};\n"
  },
  {
    "path": "src/Tabs/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n@tabs-basic-color: var(--tabs-basic-color, @COLOR_TEXT_PRIMARY);\n@tabs-weaken-color: var(--tabs-weaken-color, @COLOR_TEXT_ASSIST);\n@tabs-inverse-color: var(--tabs-inverse-color, @COLOR_CARD);\n@tabs-active-color: var(--tabs-active-color, @COLOR_BRAND1);\n@tabs-active-decorate-color: var(--tabs-active-decorate-color, @COLOR_BRAND1);\n@tabs-underline-border-color: var(--tabs-underline-border-color, @COLOR_BORDER);\n@tabs-plus-color: var(--tabs-plus-color, @COLOR_BLACK_CHANGE);\n@tabs-capsule-title-bg: var(--tabs-capsule-title-bg, @COLOR_GREY_CARD);\n@tabs-subtitle-color: var(--tabs-subtitle-color, @COLOR_WHITE_CHANGE);\n@tabs-count-color: var(--tabs-count-color, @COLOR_TEXT_WEAK);\n\n@tabs-badge-size: var(--tabs-badge-size, @sizeFont4);\n"
  },
  {
    "path": "src/Tag/index.axml",
    "content": "<view\n  class=\"ant-tag ant-tag-{{ type }} ant-tag-{{ color }} {{ className || '' }}\"\n  style=\"{{ style || '' }}\">\n  <view\n    a:if=\"{{ icon }}\"\n    class=\"ant-tag-icon-container\">\n    <!-- #if ALIPAY -->\n    <slot name=\"icon\">\n    <!-- #endif -->\n      <ant-icon type=\"{{ icon }}\" />\n    <!-- #if ALIPAY -->\n    </slot>\n    <!-- #endif -->\n  </view>\n  <view class=\"ant-tag-content\">\n    <slot />\n  </view>\n</view>\n"
  },
  {
    "path": "src/Tag/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Information Display\n  order: 8\ntoc: 'content'\n---\n\n# Tag\n\nSmall labels for labeling and classification.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-tag\": \"antd-mini/es/Tag/index\"\n#endif\n#if WECHAT\n  \"ant-tag\": \"antd-mini/Tag/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<ant-tag>Label</ant-tag>\n```\n\n### semantic label\n\n```xml\n<ant-tag>primary</ant-tag>\n<ant-tag color=\"success\">success</ant-tag>\n<ant-tag color=\"warning\">warning</ant-tag>\n<ant-tag color=\"danger\">danger</ant-tag>\n```\n\n### Fill mode\n\n```xml\n<ant-tag type=\"fill\">fill</ant-tag>\n<ant-tag type=\"outline\">outline</ant-tag>\n<ant-tag type=\"fill-light\">fill-light</ant-tag>\n```\n\n### Custom icon\n\n```xml\n<ant-tag icon=\"AlipayCircleFill\">Label</ant-tag>\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Tag/index'></code>\n\n## API\n\n| Property      | Description                                                                                     | Type         | Default Value    |\n| --------- | ---------------------------------------------------------------------------------------- | ------------ | --------- |\n| className | Class Name                                                                                     | string       | -         |\n| color     | Label color, built-in `primary`(blue),`success`(Green),`warning`(yellow),`danger`(Red) | string       | `primary` |\n| icon      | Icon, support Icon type and slot                                                               | string\\|slot | -         |\n| style     | Style                                                                                     | string       | -         |\n| type      | type, optional `outline`、`fill`、`fill-light`                                               | string       | `fill`    |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For more information, see ConfigProvider Components.\n\n\n| Variable name                    | Light Mode Default                                                                                           | Dark Mode Default                                                                                           | Remarks                 |\n| ------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | -------------------- |\n| --tag-primary-color       | <div style=\"width: 150px; height: 40px; background-color: #1677ff; color: #ffffff;\">#1677ff</div>       | <div style=\"width: 150px; height: 40px; background-color: #3086ff; color: #ffffff;\">#3086ff</div>       | Primary Label Color         |\n| --tag-warning-color       | <div style=\"width: 150px; height: 40px; background-color: #ff6430; color: #ffffff;\">#ff6430</div>       | <div style=\"width: 150px; height: 40px; background-color: #e65a2b; color: #ffffff;\">#e65a2b</div>       | Warning Label Color         |\n| --tag-danger-color        | <div style=\"width: 150px; height: 40px; background-color: #ff3141; color: #ffffff;\">#ff3141</div>       | <div style=\"width: 150px; height: 40px; background-color: #ff4a58; color: #ffffff;\">#ff4a58</div>       | Hazard label color         |\n| --tag-success-color       | <div style=\"width: 150px; height: 40px; background-color: #22b35e; color: #ffffff;\">#22b35e</div>       | <div style=\"width: 150px; height: 40px; background-color: #34b368; color: #ffffff;\">#34b368</div>       | Success Label Color         |\n| --tag-primary-light-color | <div style=\"width: 150px; height: 40px; background-color: #e7f1ff; color: #333333;\">#e7f1ff</div>       | <div style=\"width: 150px; height: 40px; background-color: #0d2543; color: #ffffff;\">#0d2543</div>       | Main label light         |\n| --tag-warning-light-color | <div style=\"width: 150px; height: 40px; background-color: #ffefdf; color: #333333;\">#ffefdf</div>       | <div style=\"width: 150px; height: 40px; background-color: #ffefdf; color: #333333;\">#ffefdf</div>       | Warning label light color         |\n| --tag-danger-light-color  | <div style=\"width: 150px; height: 40px; background-color: #ffece3; color: #333333;\">#ffece3</div>       | <div style=\"width: 150px; height: 40px; background-color: #ffece3; color: #333333;\">#ffece3</div>       | Hazard label light         |\n| --tag-success-light-color | <div style=\"width: 150px; height: 40px; background-color: #d4fff1; color: #333333;\">#d4fff1</div>       | <div style=\"width: 150px; height: 40px; background-color: #d4fff1; color: #333333;\">#d4fff1</div>       | Success Label Light         |\n| --tag-base-color          | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #333333;\">#ffffff</div>       | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #333333;\">#ffffff</div>       | Base Label Color         |\n| --tag-primary-color-faded | <div style=\"width: 150px; height: 40px; background-color: rgba(22, 119, 255, 0.3); color: #ffffff;\">rgba(22, 119, 255, 0.3)</div> | <div style=\"width: 150px; height: 40px; background-color: rgba(22, 119, 255, 0.3); color: #ffffff;\">rgba(22, 119, 255, 0.3)</div> | Main label color (faded) |\n| --tag-warning-color-faded | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 100, 48, 0.7); color: #ffffff;\">rgba(255, 100, 48, 0.7)</div> | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 100, 48, 0.7); color: #ffffff;\">rgba(255, 100, 48, 0.7)</div> | Warning label color (faded) |\n| --tag-danger-color-faded  | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 49, 65, 0.7); color: #ffffff;\">rgba(255, 49, 65, 0.7)</div>   | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 49, 65, 0.7); color: #ffffff;\">rgba(255, 49, 65, 0.7)</div>   | Hazard label color (faded) |\n| --tag-success-color-faded | <div style=\"width: 150px; height: 40px; background-color: rgba(34, 179, 94, 0.7); color: #ffffff;\">rgba(34, 179, 94, 0.7)</div>   | <div style=\"width: 150px; height: 40px; background-color: rgba(34, 179, 94, 0.7); color: #ffffff;\">rgba(34, 179, 94, 0.7)</div>   | Success Label Color (Faded) |\n"
  },
  {
    "path": "src/Tag/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-icon\": \"../Icon/index\"\n  }\n}\n"
  },
  {
    "path": "src/Tag/index.less",
    "content": "@import '../style/mixins/hairline.less';\n@import (reference) './variable.less';\n\n@tagPrefix: ant-tag;\n\n.@{tagPrefix} {\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  padding: 2 * @rpx 8 * @rpx;\n  font-size: 22 * @rpx;\n  line-height: 30 * @rpx;\n  box-sizing: border-box;\n  border-radius: @corner-radius-sm;\n  color: @tag-base-color;\n  &-icon-container {\n    margin-right: 6 * @rpx;\n    display: flex;\n    justify-content: center;\n    align-self: center;\n    align-items: center;\n\n    .ant-icon {\n      font-size: 24 * @rpx;\n    }\n    /// #if WECHAT\n    ant-icon {\n      font-size: 24 * @rpx;\n    }\n    /// #endif\n  }\n  &-primary {\n    background-color: @tag-primary-color;\n    &.@{tagPrefix}-fill-light {\n      color: @tag-primary-color;\n      background-color: @tag-primary-light-color;\n    }\n    &.@{tagPrefix}-outline {\n      color: @tag-primary-color;\n      border-color: @tag-primary-color-faded;\n    }\n  }\n  &-warning {\n    background-color: @tag-warning-color;\n    &.@{tagPrefix}-fill-light {\n      color: @tag-warning-color;\n      background-color: @tag-warning-light-color;\n    }\n    &.@{tagPrefix}-outline {\n      color: @tag-warning-color;\n      border-color: @tag-warning-color-faded;\n    }\n  }\n  &-danger {\n    background-color: @tag-danger-color;\n    &.@{tagPrefix}-fill-light {\n      color: @tag-danger-color;\n      background-color: @tag-danger-light-color;\n    }\n    &.@{tagPrefix}-outline {\n      color: @tag-danger-color;\n      border-color: @tag-danger-color-faded;\n    }\n  }\n  &-success {\n    background-color: @tag-success-color;\n    &.@{tagPrefix}-fill-light {\n      color: @tag-success-color;\n      background-color: @tag-success-light-color;\n    }\n    &.@{tagPrefix}-outline {\n      color: @tag-success-color;\n      border-color: @tag-success-color-faded;\n    }\n  }\n  &-image {\n    background-color: rgb(0 0 0 / 50%);\n  }\n  &-outline {\n    border-width: 2rpx;\n    border-style: solid;\n    background-color: @tag-base-color;\n  }\n  &-content {\n    display: flex;\n    justify-content: center;\n    align-items: center;\n  }\n}\n"
  },
  {
    "path": "src/Tag/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 数据展示\n  order: 8\ntoc: 'content'\n---\n\n# Tag 标签\n\n用于标记和分类的小标签。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-tag\": \"antd-mini/es/Tag/index\"\n#endif\n#if WECHAT\n  \"ant-tag\": \"antd-mini/Tag/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-tag>标签</ant-tag>\n```\n\n### 语义标签\n\n```xml\n<ant-tag>primary</ant-tag>\n<ant-tag color=\"success\">success</ant-tag>\n<ant-tag color=\"warning\">warning</ant-tag>\n<ant-tag color=\"danger\">danger</ant-tag>\n```\n\n### 填充模式\n\n```xml\n<ant-tag type=\"fill\">fill</ant-tag>\n<ant-tag type=\"outline\">outline</ant-tag>\n<ant-tag type=\"fill-light\">fill-light</ant-tag>\n```\n\n### 自定义图标\n\n```xml\n<ant-tag icon=\"AlipayCircleFill\">标签</ant-tag>\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Tag/index'></code>\n\n## API\n\n| 属性      | 说明                                                                                     | 类型         | 默认值    |\n| --------- | ---------------------------------------------------------------------------------------- | ------------ | --------- |\n| className | 类名                                                                                     | string       | -         |\n| color     | 标签颜色，内建 `primary`（蓝色）、`success`（绿色）、`warning`（黄色）、`danger`（红色） | string       | `primary` |\n| icon      | 图标，支持 Icon 类型和插槽                                                               | string\\|slot | -         |\n| style     | 样式                                                                                     | string       | -         |\n| type      | 类型，可选 `outline`、`fill`、`fill-light`                                               | string       | `fill`    |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n\n| 变量名                    | 浅色模式默认值                                                                                           | 深色模式默认值                                                                                           | 备注                 |\n| ------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | -------------------- |\n| --tag-primary-color       | <div style=\"width: 150px; height: 40px; background-color: #1677ff; color: #ffffff;\">#1677ff</div>       | <div style=\"width: 150px; height: 40px; background-color: #3086ff; color: #ffffff;\">#3086ff</div>       | 主要标签颜色         |\n| --tag-warning-color       | <div style=\"width: 150px; height: 40px; background-color: #ff6430; color: #ffffff;\">#ff6430</div>       | <div style=\"width: 150px; height: 40px; background-color: #e65a2b; color: #ffffff;\">#e65a2b</div>       | 警告标签颜色         |\n| --tag-danger-color        | <div style=\"width: 150px; height: 40px; background-color: #ff3141; color: #ffffff;\">#ff3141</div>       | <div style=\"width: 150px; height: 40px; background-color: #ff4a58; color: #ffffff;\">#ff4a58</div>       | 危险标签颜色         |\n| --tag-success-color       | <div style=\"width: 150px; height: 40px; background-color: #22b35e; color: #ffffff;\">#22b35e</div>       | <div style=\"width: 150px; height: 40px; background-color: #34b368; color: #ffffff;\">#34b368</div>       | 成功标签颜色         |\n| --tag-primary-light-color | <div style=\"width: 150px; height: 40px; background-color: #e7f1ff; color: #333333;\">#e7f1ff</div>       | <div style=\"width: 150px; height: 40px; background-color: #0d2543; color: #ffffff;\">#0d2543</div>       | 主要标签浅色         |\n| --tag-warning-light-color | <div style=\"width: 150px; height: 40px; background-color: #ffefdf; color: #333333;\">#ffefdf</div>       | <div style=\"width: 150px; height: 40px; background-color: #ffefdf; color: #333333;\">#ffefdf</div>       | 警告标签浅色         |\n| --tag-danger-light-color  | <div style=\"width: 150px; height: 40px; background-color: #ffece3; color: #333333;\">#ffece3</div>       | <div style=\"width: 150px; height: 40px; background-color: #ffece3; color: #333333;\">#ffece3</div>       | 危险标签浅色         |\n| --tag-success-light-color | <div style=\"width: 150px; height: 40px; background-color: #d4fff1; color: #333333;\">#d4fff1</div>       | <div style=\"width: 150px; height: 40px; background-color: #d4fff1; color: #333333;\">#d4fff1</div>       | 成功标签浅色         |\n| --tag-base-color          | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #333333;\">#ffffff</div>       | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #333333;\">#ffffff</div>       | 基础标签颜色         |\n| --tag-primary-color-faded | <div style=\"width: 150px; height: 40px; background-color: rgba(22, 119, 255, 0.3); color: #ffffff;\">rgba(22, 119, 255, 0.3)</div> | <div style=\"width: 150px; height: 40px; background-color: rgba(22, 119, 255, 0.3); color: #ffffff;\">rgba(22, 119, 255, 0.3)</div> | 主要标签颜色（褪色） |\n| --tag-warning-color-faded | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 100, 48, 0.7); color: #ffffff;\">rgba(255, 100, 48, 0.7)</div> | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 100, 48, 0.7); color: #ffffff;\">rgba(255, 100, 48, 0.7)</div> | 警告标签颜色（褪色） |\n| --tag-danger-color-faded  | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 49, 65, 0.7); color: #ffffff;\">rgba(255, 49, 65, 0.7)</div>   | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 49, 65, 0.7); color: #ffffff;\">rgba(255, 49, 65, 0.7)</div>   | 危险标签颜色（褪色） |\n| --tag-success-color-faded | <div style=\"width: 150px; height: 40px; background-color: rgba(34, 179, 94, 0.7); color: #ffffff;\">rgba(34, 179, 94, 0.7)</div>   | <div style=\"width: 150px; height: 40px; background-color: rgba(34, 179, 94, 0.7); color: #ffffff;\">rgba(34, 179, 94, 0.7)</div>   | 成功标签颜色（褪色） |\n"
  },
  {
    "path": "src/Tag/index.ts",
    "content": "import { TagDefaultProps } from './props';\nimport '../_util/assert-component2';\n\nComponent({\n  /// #if WECHAT\n  properties: {\n    type: {\n      value: 'fill',\n      type: String,\n    },\n    color: {\n      value: 'primary',\n      type: String,\n    },\n    icon: {\n      type: String,\n    },\n    style: {\n      type: String,\n    },\n    className: {\n      type: String,\n    },\n  },\n  options: {\n    styleIsolation: 'shared',\n  } as unknown,\n  /// #endif\n  props: TagDefaultProps,\n});\n"
  },
  {
    "path": "src/Tag/props.ts",
    "content": "import { IBaseProps, IconType } from '../_util/base';\n/**\n * @description 标签，突出利益点、以及属性说明。\n */\n\nexport interface ITagProps extends IBaseProps {\n  /**\n   * @description 类型\n   * @default \"fill\"\n   */\n  type?: 'outline' | 'fill' | 'fill-light';\n  /**\n   * @description 标签颜色, 内建 primary(蓝), success(绿), warning(黄), danger(红)\n   * @default \"primary\"\n   */\n\n  color?: 'image' | 'primary' | 'success' | 'warning' | 'danger';\n  /**\n   * @description 图标\n   */\n\n  icon?: IconType;\n}\n\nexport const TagDefaultProps: Partial<ITagProps> = {\n  type: 'fill',\n  color: 'primary',\n};\n"
  },
  {
    "path": "src/Tag/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n// 四种颜色可根据实际情况结合去使用\n// 四种深色颜色\n@tag-primary-color: var(--tag-primary-color, @COLOR_BRAND1);\n@tag-warning-color: var(--tag-warning-color, @COLOR_ORANGE);\n@tag-danger-color: var(--tag-danger-color, @COLOR_RED);\n@tag-success-color: var(--tag-success-color, @COLOR_GREEN);\n\n// 四种浅色的颜色\n@tag-primary-light-color: var(--tag-primary-light-color, @COLOR_WATHET);\n@tag-warning-light-color: var(--tag-warning-light-color, @COLOR_ORANGE_2);\n@tag-danger-light-color: var(--tag-danger-light-color, @COLOR_TANGERINE_2);\n@tag-success-light-color: var(--tag-success-light-color, @COLOR_POMONAGREEN_2);\n\n// 白色\n@tag-base-color: var(--tag-base-color, @COLOR_WHITE);\n\n@tag-primary-color-faded: var(--tag-primary-color-faded, @COLOR_BRAND1_FADED_3);\n\n@tag-warning-color-faded: var(--tag-warning-color-faded, @COLOR_ORANG_FADED);\n\n@tag-danger-color-faded: var(--tag-danger-color-faded, @COLOR_RED_FADED);\n\n@tag-success-color-faded: var(--tag-success-color-faded, @COLOR_GREEN_FADED);\n"
  },
  {
    "path": "src/Terms/index.axml",
    "content": "\n<view\n  class=\"ant-terms {{buttonsFixed ? 'ant-terms-fixed' : ''}} {{className}}\"\n>\n  <slot name=\"button-top\"></slot>\n  <view>\n    <!-- #if ALIPAY -->\n    <slot name=\"button-group-top\">\n    <!-- #endif -->\n      <view\n        class=\"ant-terms-protocol\"\n        a:if=\"{{terms.length && type !== 'read'}}\"\n      >\n        <block a:if=\"{{type === 'check'}}\">\n          <ant-popover\n            className=\"ant-terms-checkbox-tips\"\n            placement=\"top-left\"\n            autoAdjustOverflow=\"{{false}}\"\n            visible=\"{{checkboxTipsVisible}}\"\n            content=\"{{checkboxTipsText}}\"\n            showMask=\"{{false}}\"\n            style=\"display: inline-block\"\n          >\n            <ant-checkbox\n              checked=\"{{checked}}\"\n              onChange=\"onCheckChange\"\n            />\n          </ant-popover>\n          <text\n            a:if=\"{{termPrefix}}\"\n            onTap=\"onTermPrefixTap\"\n            class=\"ant-terms-protocol-text\"\n          >\n            {{termPrefix}}\n          </text>\n        </block>\n\n        <text\n          a:if=\"{{type !== 'check' && termPrefix}}\"\n          class=\"ant-terms-protocol-text\"\n        >\n          {{termPrefix}}\n        </text>\n\n        <text\n          class=\"ant-terms-protocol-item\"\n          a:for=\"{{terms}}\"\n          a:key=\"key\"\n          onTap=\"onTermTap\"\n          data-item=\"{{item}}\"\n          data-index=\"{{index}}\"\n        >\n          {{item.name}}\n        </text>\n\n        <text\n          a:if=\"{{termSuffix}}\"\n          class=\"ant-terms-protocol-text\"\n        >\n          {{termSuffix}}\n        </text>\n      </view>\n\n      <block a:if=\"{{terms.length && type === 'read'}}\">\n        <slot name=\"read-content\"></slot>\n        <view class=\"ant-terms-read-shadow\">\n          <view class=\"ant-terms-read-shadow-total\">\n            <!-- #if ALIPAY -->\n            <slot name=\"read-total\">\n            <!-- #endif -->\n              共{{terms.length}}份\n            <!-- #if ALIPAY -->\n            </slot>\n            <!-- #endif -->\n          </view>\n        </view>\n        <swiper\n          className=\"ant-terms-read-protocol-swiper\"\n          current=\"{{mixin.value}}\"\n          autoplay=\"{{false}}\"\n          vertical=\"{{false}}\"\n          circular=\"{{false}}\"\n          previous-margin=\"35px\"\n          next-margin=\"35px\"\n          onChange=\"onReadChange\"\n        >\n          <block a:for=\"{{terms}}\" a:key=\"key\">\n            <swiper-item className=\"ant-terms-read-protocol-swiper-item\">\n              <view\n                class=\"ant-terms-read-protocol\"\n                onTap=\"onReadSwiperTap\"\n                data-item=\"{{item}}\"\n                data-index=\"{{index}}\"\n              >\n                <!-- #if ALIPAY -->\n                <slot name=\"read-term-item\" item=\"{{item}}\" index=\"{{index}}\">\n                <!-- #endif -->\n                  <text\n                    a:if=\"{{termPrefix}}\"\n                    class=\"ant-terms-read-protocol-text\"\n                  >\n                    {{termPrefix}}\n                  </text>\n                  <text\n                    class=\"ant-terms-read-protocol-item\"\n                    onTap=\"onTermTap\"\n                    data-item=\"{{item}}\"\n                    data-index=\"{{index}}\"\n                  >\n                    {{item.name}}\n                  </text>\n                  <text\n                    a:if=\"{{termSuffix}}\"\n                    class=\"ant-terms-read-protocol-text\"\n                  >\n                    {{termSuffix}}\n                  </text>\n                <!-- #if ALIPAY -->\n                </slot>\n                <!-- #endif -->\n              </view>\n            </swiper-item>\n          </block>\n        </swiper>\n      </block>\n    <!-- #if ALIPAY -->\n    </slot>\n    <!-- #endif -->\n\n    <view\n      class=\"ant-terms-btn {{buttonsDirection==='horizontal' ? 'ant-terms-btn-flex' : ''}}\"\n      a:if=\"{{buttons.length}}\"\n    >\n      <slot name=\"prefix\"></slot>\n      <view\n        a:for=\"{{buttons}}\"\n        a:key=\"key\"\n        class=\"ant-terms-btn-item {{buttonsDirection==='horizontal' ? 'ant-terms-btn-item-flex' : ''}}\"\n        data-item=\"{{item}}\"\n        data-index=\"{{index}}\"\n      >\n        <slot name=\"button-left\" index=\"{{index}}\" item=\"{{item}}\"></slot>\n        <ant-button\n          data-index=\"{{index}}\"\n          data-item=\"{{item}}\"\n          onTap=\"onButtonTap\"\n          type=\"{{item.type || 'primary'}}\"\n          style=\"{{item.style || ''}}\"\n          inline=\"{{item.inline}}\"\n          size=\"{{item.size}}\"\n          aide=\"{{item.aide}}\"\n          loading=\"{{item.loading}}\"\n          disabled=\"{{item.disabled}}\"\n          icon=\"{{item.icon}}\"\n          activeClassName=\"{{item.activeClassName}}\"\n          className=\"{{buttons.length === 1 ? 'ant-terms-btn-single' : ''}} {{item.className}}\"\n        >\n          <slot name=\"button-prefix\" slot=\"prefix\" index=\"{{index}}\" item=\"{{item}}\"></slot>\n          <!-- #if ALIPAY -->\n          <slot name=\"button-content\" index=\"{{index}}\" item=\"{{item}}\">\n          <!-- #endif -->\n            {{item.text}}\n          <!-- #if ALIPAY -->\n          </slot>\n          <!-- #endif -->\n          {{ countdownArr[index] ? '（' + countdownArr[index] + 's）' : '' }}\n          <slot name=\"button-suffix\" slot=\"suffix\" index=\"{{index}}\" item=\"{{item}}\"></slot>\n        </ant-button>\n        <slot name=\"button-right\" index=\"{{index}}\" item=\"{{item}}\"></slot>\n      </view>\n      <slot name=\"suffix\"></slot>\n    </view>\n    <slot name=\"button-group-bottom\"></slot>\n    <!--默认插槽，内容区域-->\n    <slot/>\n    <ant-safe-area position=\"bottom\" />\n  </view>\n</view>\n"
  },
  {
    "path": "src/Terms/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Bizness Components\n  order: 15\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Terms\n\nUsed in scenarios such as product activation and agreement signing\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-terms\": \"antd-mini/es/Terms/index\"\n#endif\n#if WECHAT\n  \"ant-terms\": \"antd-mini/Terms/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<ant-terms\n  termPrefix=\"请阅读并同意\"\n  terms=\"{{terms}}\"\n  buttons=\"{{buttons}}\"\n#if ALIPAY\n  onButtonTap=\"handleButtonTap\"\n  onTermTap=\"handleTermTap\"\n#endif\n#if WECHAT\n  bindbuttontap=\"handleButtonTap\"\n  bindtermtap=\"handleTermTap\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    buttons: [\n      { text: '同意协议 + 行动点描述', type: 'primary' }\n      { text: '取消', aide: true, type: 'default' }\n    ],\n    terms: [\n      { name: '《用户协议》', key: 'user' }\n    ],\n  },\n  handleButtonTap(item, index, checked, event) {\n#if ALIPAY\n    my.showToast({ content: `点击了第 ${index + 1} 个按钮` });\n#endif\n#if WECHAT\n    wx.showToast({ title: `点击了第 ${item.detail[1] + 1} 个按钮` });\n#endif\n  },\n  handleTermTap(item, index, event) {\n#if ALIPAY\n    my.showToast({ content: `点击了第 ${index + 1} 个协议` });\n#endif\n#if WECHAT\n    wx.showToast({ title: `点击了第 ${item.detail[1] + 1} 个协议` });\n#endif\n  },\n});\n```\n\n### Hook selection\n\n```xml\n<ant-terms\n  type=\"check\"\n  termPrefix=\"我已阅读并同意\"\n  terms=\"{{terms}}\"\n  buttons=\"{{buttons}}\"\n  checkboxTipsText=\"请阅读后勾选服务协议\"\n  checkboxTipsVisible=\"{{checkboxTipsVisible}}\"\n#if ALIPAY\n  onButtonTap=\"handleButtonTap\"\n  onTermTap=\"handleTermTap\"\n  onCheckChange=\"handleCheckChange\"\n  onTermPrefixTap=\"handleTermPrefixTap\"\n#endif\n#if WECHAT\n  bindbuttontap=\"handleButtonTap\"\n  bindtermtap=\"handleTermTap\"\n  bindcheckchange=\"handleCheckChange\"\n  bindtermprefixtap=\"handleTermPrefixTap\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    buttons: [\n      { text: '行动点描述', type: 'primary' }\n    ],\n    terms: [\n      { name: '《用户协议》', key: 'user' }\n    ],\n    checkboxTipsVisible: false,\n  },\n  handleButtonTap(item, checked) {\n#if ALIPAY\n    this.setData({ checkboxTipsVisible: !checked });\n#endif\n#if WECHAT\n    this.setData({ checkboxTipsVisible: !item.detail[2] });\n#endif\n  },\n  handleTermTap(item, index) {\n#if ALIPAY\n    my.showToast({ content: `点击了第 ${index + 1} 个协议` });\n#endif\n#if WECHAT\n    wx.showToast({ title: `点击了第 ${item.detail[1] + 1} 个协议` });\n#endif\n  },\n  handleCheckChange(checked) {\n#if ALIPAY\n    this.setData({ checkboxTipsVisible: !checked });\n    if (checked) {\n      this.setData({ checkboxTipsVisible: false });\n    }\n#endif\n#if WECHAT\n    this.setData({ checkboxTipsVisible: !checked.detail });\n    if (checked.detail) {\n      this.setData({ checkboxTipsVisible: false });\n    }\n#endif\n  },\n  handleTermPrefixTap(checked) {\n#if ALIPAY\n    this.setData({ checkboxTipsVisible: !checked });\n    if (checked) {\n      this.setData({ checkboxTipsVisible: false });\n    }\n#endif\n#if WECHAT\n    this.setData({ checkboxTipsVisible: !checked.detail });\n    if (checked.detail) {\n      this.setData({ checkboxTipsVisible: false });\n    }\n#endif\n  },\n});\n```\n\n### Mandatory Reading\n\n```xml\n<ant-terms\n  type=\"read\"\n  termPrefix=\"当前正In读\"\n  terms=\"{{terms}}\"\n  buttons=\"{{buttons}}\"\n  readCurrent=\"{{readCurrent}}\"\n#if ALIPAY\n  onButtonTap=\"handleButtonTap\"\n  onTermTap=\"handleTermTap\"\n  onCountdownFinish=\"handleCountdownFinish\"\n  onReadChange=\"handleReadChange\"\n#endif\n#if WECHAT\n  bindbuttontap=\"handleButtonTap\"\n  bindtermtap=\"handleTermTap\"\n  bindcountdownfinish=\"handleCountdownFinish\"\n  bindreadchange=\"handleReadChange\"\n#endif\n>\n  <scroll-view\n    enhanced\n    slot=\"read-content\"\n    style=\"height:300px;\"\n    id=\"scroll-view\"\n    scrollTop=\"{{scrollTop}}\"\n    scrollY=\"{{true}}\"\n    scrollWithAnimation=\"{{true}}\"\n    scrollAnimationDuration=\"{{300}}\"\n    lowerThreshold=\"{{100}}\"\n#if ALIPAY\n    onScroll=\"onScroll\"\n    onTouchStart=\"onTouchStart\"\n    onScrollToLower=\"onScrollToLower\"\n#endif\n#if WECHAT\n    bindscroll=\"onScroll\"\n    binddragstart=\"onTouchStart\"\n    bindscrolltolower=\"onScrollToLower\"\n#endif\n  >\n    <image\n      class=\"term-content\"\n      id=\"term-content-0\"\n      src=\"https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/966PR7FNh8cAAAAAAAAAAAAADoEQAQFr/original\"\n      mode=\"widthFix\"\n      onLoad=\"onImageLoad\"\n    />\n    <image\n      class=\"term-content\"\n      id=\"term-content-1\"\n      src=\"https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/966PR7FNh8cAAAAAAAAAAAAADoEQAQFr/original\"\n      mode=\"widthFix\"\n      onLoad=\"onImageLoad\"\n    />\n    <image\n      class=\"term-content\"\n      id=\"term-content-2\"\n      src=\"https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/966PR7FNh8cAAAAAAAAAAAAADoEQAQFr/original\"\n      mode=\"widthFix\"\n      onLoad=\"onImageLoad\"\n    />\n  </scroll-view>\n  <view slot=\"read-total\">\n    Total {{terms3.length}} agreements\n  </view>\n</ant-terms>\n\n```\n\n```js\nPage({\n  data: {\n    buttons: [\n      { text: '请阅读全部协议', disabled: true, type: 'primary', countdownTime: 30 }\n    ],\n    terms: [\n      { name: '《用户协议》', key: 'user' },\n      { name: '《隐私协议》', key: 'private' },\n      { name: '《网络协议》', key: 'internet' }\n    ],\n    readCurrent: 1,\n  },\n  handleButtonTap(item, index, checked, event) {\n#if ALIPAY\n    my.showToast({ content: `点击了第 ${index + 1} 个按钮` });\n#endif\n#if WECHAT\n    wx.showToast({ title: `点击了第 ${item.detail[1] + 1} 个按钮` });\n#endif\n  },\n  handleTermTap(item, index, event) {\n#if ALIPAY\n    my.showToast({ content: `点击了第 ${index + 1} 个协议` });\n#endif\n#if WECHAT\n    wx.showToast({ title: `点击了第 ${item.detail[1] + 1} 个协议` });\n#endif\n  },\n  handleCountdownFinish(item, index) {\n    this.setData({\n      buttons3: this.data.buttons3.map((button, idx) =>\n        idx === index\n          ? { ...button, text: '同意协议 + 行动点描述', disabled: false }\n          : button\n      ),\n    });\n  },\n  handleReadChange(current) {\n#if WECHAT\n    current = current.detail;\n#endif\n    this.tap = true;\n    this.setData({\n      scrollTop:\n        this.itemRectList[current].top -\n        this.scrollViewRect.top +\n        Math.random(),\n    });\n  },\n  async onReady() {\n    await this.updateRect();\n  },\n  async onImageLoad() {\n    await this.updateRect();\n  },\n  async updateRect() {\n    this.itemRectList = await Promise.all(\n      this.data.terms3.map((item, index) =>\n        this.getBoundingClientRect(`#term-content-${index}`)\n      )\n    );\n    this.scrollViewRect = await this.getBoundingClientRect('#scroll-view');\n  },\n  onTouchStart() {\n    this.tap = false;\n  },\n  onScroll(e) {\n    if (this.tap) {\n      return;\n    }\n    this.scrollTop = e.detail.scrollTop;\n    const scrollTop = this.scrollTop + this.itemRectList[0].top;\n    for (let i = 0; i < this.itemRectList.length; i++) {\n      const item = this.itemRectList[i];\n      if (\n        scrollTop > item.top &&\n        (!this.itemRectList[i + 1] ||\n          scrollTop < this.itemRectList[i + 1].top) &&\n        i !== this.data.readCurrent\n      ) {\n        this.setData({\n          readCurrent: i,\n        });\n        return;\n      }\n    }\n  },\n  onScrollToLower() {\n    console.log('触底');\n  },\n  getBoundingClientRect(id) {\n    if (typeof my === 'undefined') {\n      return this.getInstanceBoundingClientRect(this, id);\n    }\n    return this.getInstanceBoundingClientRect(my, id);\n  },\n  getInstanceBoundingClientRect(instance, selector) {\n    return new Promise((resolve) => {\n      instance\n        .createSelectorQuery()\n        .select(selector)\n        .boundingClientRect()\n        .exec((ret) => {\n          if (ret && ret[0]) {\n            resolve(ret[0]);\n          }\n        });\n    });\n  },\n});\n```\n\n### Fixed bottom\n\n<code src='../../demo/pages/Terms/Fixed/index'></code>\n\n### Demo Code\n\n<code src='../../demo/pages/Terms/index'></code>\n\n## API\n\n| Property                            | Description                 | Type                                                              | Default Value       |\n| ------------------------------- | -------------------- | ----------------------------------------------------------------- | ------------ |\n| type                            | Protocol Presentation Type         | `\"\"` \\| `\"check\"` \\| `\"read\"`                                     | `\"\"`         |\n| terms                           | Protocol List             | [Term](#term)`[]`                                                 | `-`          |\n| buttons                         | Button List             | [Button](#button)`[]`                                             | `-`          |\n| buttonsFixed                    | Whether the button area sucks the bottom       | `boolean`                                                         | `false`      |\n| buttonsDirection                | Split line direction, default portrait | `\"horizontal\"` \\| `\"vertical\"`                                    | `\"vertical\"` |\n| termPrefix                      | Protocol Prefix             | `string`                                                          | `\"\"`         |\n| termSuffix                      | Protocol Suffix             | `string`                                                          | `\"\"`         |\n| checkboxTipsText                | Check the box to guide the copy       | `string`                                                          | `\"\"`         |\n| checkboxTipsVisible             | Check box to guide display status   | `boolean`                                                         | `false`      |\n| readCurrent                     | Current sequence number read       | `number`                                                          | `-`          |\n| defaultReadCurrent              | Current sequence number of default reading   | `number`                                                          | `-`          |\n| #if ALIPAY onButtonTap          | Action point button click callback   | `(b?: Button, index?: number, checked?: boolean, event?) => void` | `-`          |\n| #if ALIPAY onTermTap            | Protocol Click Callback         | `(t?: Term, index?: number, event?) => void`                      | `-`          |\n| #if ALIPAY onCheckChange        | Check callback             | `(c?: boolean) => void`                                           | `-`          |\n| #if ALIPAY onTermPrefixTap      | Protocol Prefix Click Callback     | `(c?: boolean) => void`                                           | `-`          |\n| #if ALIPAY onCountdownFinish    | Countdown End Callback       | `(b?: Button, index?: number, event?) => void`                    | `-`          |\n| #if ALIPAY onReadChange         | Protocol reading switch         | `(index?: number) => void`                                        | `-`          |\n| #if WECHAT bindbuttontap       | Action point button click callback   | `(b?: Button, index?: number, checked?: boolean, event?) => void` | `-`          |\n| #if WECHAT bindtermtap         | Protocol Click Callback         | `(t?: Term, index?: number, event?) => void`                      | `-`          |\n| #if WECHAT bindcheckchange     | Check callback             | `(c?: boolean) => void`                                           | `-`          |\n| #if WECHAT bindtermprefixtap   | Protocol Prefix Click Callback     | `(c?: boolean) => void`                                           | `-`          |\n| #if WECHAT bindcountdownfinish | Countdown End Callback       | `(b?: Button, index?: number, event?) => void`                    | `-`          |\n| #if WECHAT bindreadchange      | Protocol reading switch         | `(index?: number) => void`                                        | `-`          |\n\n### Term\n\n| Property | Description     | Type     | Default Value |\n| ---- | -------- | -------- | ------ |\n| key  | Unique identification | `string` | `-`    |\n| name | Agreement Name | `string` | `-`    |\n\n### Button\n\n| Property                                                  | Description               | Type     | Default Value |\n| ----------------------------------------------------- | ------------------ | -------- | ------ |\n| key                                                   | Unique identification           | `string` | `-`    |\n| text                                                  | Button Copy           | `string` | `-`    |\n| countdownTime                                         | Timing seconds, in seconds | `number` | `-`    |\n| Transparent transmission [ant-button](/components/button#button) All Properties |\n"
  },
  {
    "path": "src/Terms/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-button\": \"../Button/index\",\n    \"ant-checkbox\": \"../Checkbox/index\",\n    \"ant-popover\": \"../Popover/index\",\n    \"ant-safe-area\": \"../SafeArea/index\"\n  }\n}\n"
  },
  {
    "path": "src/Terms/index.less",
    "content": "@import (reference) './variable.less';\n\n.ant-terms {\n  box-sizing: border-box;\n  padding-top: 20 * @rpx;\n\n  .ant-terms-btn-single {\n    height: 98 * @rpx;\n    padding: 0;\n    justify-content: center;\n  }\n\n  &-fixed {\n    left: 0;\n    right: 0;\n    bottom: 0;\n    background-color: @terms-fixed-background-color;\n    position: fixed;\n    border-top: 1 * @rpx solid @terms-fixed-border-color;\n    z-index: 999;\n  }\n\n  .ant-terms-protocol {\n    margin: 0 24 * @rpx;\n    text-align: left;\n    padding-bottom: 24 * @rpx;\n    line-height: 37 * @rpx;\n    &-item {\n      vertical-align: middle;\n      font-family: PingFangSC-Regular;\n      font-size: 26 * @rpx;\n      line-height: 37 * @rpx;\n      color: @terms-protocol-item-color;\n    }\n    &-text {\n      vertical-align: middle;\n      color: @terms-protocol-text-color;\n      font-size: 26 * @rpx;\n      line-height: 37 * @rpx;\n    }\n    .ant-terms-checkbox-tips {\n      .ant-popover-content {\n        left: -20 * @rpx !important;\n      }\n    }\n    .ant-checkbox-item {\n      margin-left: 4 * @rpx;\n      margin-right: 8 * @rpx;\n      vertical-align: middle;\n\n      /// #if WECHAT\n      height: unset;\n      /// #endif\n      .ant-checkbox-item-content {\n        padding-left: 0;\n        font-size: 0;\n      }\n      &-wrap {\n        width: 32 * @rpx;\n        height: 32 * @rpx;\n        flex: 0 0 32 * @rpx;\n      }\n    }\n  }\n  /// #if WECHAT\n  swiper {\n    height: 106 * @rpx;\n  }\n  /// #endif\n  .ant-terms-read {\n    &-shadow {\n      width: 100%;\n      height: 115 * @rpx;\n      margin-top: -115 * @rpx;\n      background-image: @terms-read-shadow-background;\n      position: relative;\n      &-total {\n        position: absolute;\n        right: 48 * @rpx;\n        bottom: 0;\n        font-size: 22 * @rpx;\n        line-height: 30 * @rpx;\n        font-weight: 500;\n        color: @terms-read-protocol-item-color;\n      }\n    }\n    &-protocol {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      height: 58 * @rpx;\n      border-radius: 8 * @rpx;\n      box-sizing: border-box;\n      margin: 24 * @rpx 8 * @rpx 24 * @rpx 8 * @rpx;\n      border: 1 * @rpx solid @terms-read-protocol-border;\n      box-shadow: 0 0 10 * @rpx 0 @terms-read-protocol-box-shadow-color;\n\n      &-item {\n        color: @terms-read-protocol-item-color;\n        font-size: 22 * @rpx;\n        line-height: 30 * @rpx;\n        font-weight: 500;\n      }\n      &-text {\n        color: @terms-read-protocol-text-color;\n        font-size: 22 * @rpx;\n        line-height: 30 * @rpx;\n      }\n    }\n  }\n\n  &-btn {\n    margin: 0 24 * @rpx;\n    &-item {\n      margin-bottom: 24 * @rpx;\n      &:last-of-type {\n        margin-bottom: 0;\n      }\n    }\n\n    &-flex {\n      display: flex;\n      .ant-terms-btn-item {\n        margin-bottom: 0;\n        flex: 1;\n        margin-right: 24 * @rpx;\n\n        &:last-of-type {\n          margin-right: 0;\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/Terms/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 业务组件\n  order: 15\ntoc: 'content'\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Terms 协议\n\n用于产品开通、签署协议等场景\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-terms\": \"antd-mini/es/Terms/index\"\n#endif\n#if WECHAT\n  \"ant-terms\": \"antd-mini/Terms/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-terms\n  termPrefix=\"请阅读并同意\"\n  terms=\"{{terms}}\"\n  buttons=\"{{buttons}}\"\n#if ALIPAY\n  onButtonTap=\"handleButtonTap\"\n  onTermTap=\"handleTermTap\"\n#endif\n#if WECHAT\n  bindbuttontap=\"handleButtonTap\"\n  bindtermtap=\"handleTermTap\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    buttons: [\n      { text: '同意协议 + 行动点描述', type: 'primary' }\n      { text: '取消', aide: true, type: 'default' }\n    ],\n    terms: [\n      { name: '《用户协议》', key: 'user' }\n    ],\n  },\n  handleButtonTap(item, index, checked, event) {\n#if ALIPAY\n    my.showToast({ content: `点击了第 ${index + 1} 个按钮` });\n#endif\n#if WECHAT\n    wx.showToast({ title: `点击了第 ${item.detail[1] + 1} 个按钮` });\n#endif\n  },\n  handleTermTap(item, index, event) {\n#if ALIPAY\n    my.showToast({ content: `点击了第 ${index + 1} 个协议` });\n#endif\n#if WECHAT\n    wx.showToast({ title: `点击了第 ${item.detail[1] + 1} 个协议` });\n#endif\n  },\n});\n```\n\n### 勾选型\n\n```xml\n<ant-terms\n  type=\"check\"\n  termPrefix=\"我已阅读并同意\"\n  terms=\"{{terms}}\"\n  buttons=\"{{buttons}}\"\n  checkboxTipsText=\"请阅读后勾选服务协议\"\n  checkboxTipsVisible=\"{{checkboxTipsVisible}}\"\n#if ALIPAY\n  onButtonTap=\"handleButtonTap\"\n  onTermTap=\"handleTermTap\"\n  onCheckChange=\"handleCheckChange\"\n  onTermPrefixTap=\"handleTermPrefixTap\"\n#endif\n#if WECHAT\n  bindbuttontap=\"handleButtonTap\"\n  bindtermtap=\"handleTermTap\"\n  bindcheckchange=\"handleCheckChange\"\n  bindtermprefixtap=\"handleTermPrefixTap\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    buttons: [\n      { text: '行动点描述', type: 'primary' }\n    ],\n    terms: [\n      { name: '《用户协议》', key: 'user' }\n    ],\n    checkboxTipsVisible: false,\n  },\n  handleButtonTap(item, checked) {\n#if ALIPAY\n    this.setData({ checkboxTipsVisible: !checked });\n#endif\n#if WECHAT\n    this.setData({ checkboxTipsVisible: !item.detail[2] });\n#endif\n  },\n  handleTermTap(item, index) {\n#if ALIPAY\n    my.showToast({ content: `点击了第 ${index + 1} 个协议` });\n#endif\n#if WECHAT\n    wx.showToast({ title: `点击了第 ${item.detail[1] + 1} 个协议` });\n#endif\n  },\n  handleCheckChange(checked) {\n#if ALIPAY\n    this.setData({ checkboxTipsVisible: !checked });\n    if (checked) {\n      this.setData({ checkboxTipsVisible: false });\n    }\n#endif\n#if WECHAT\n    this.setData({ checkboxTipsVisible: !checked.detail });\n    if (checked.detail) {\n      this.setData({ checkboxTipsVisible: false });\n    }\n#endif\n  },\n  handleTermPrefixTap(checked) {\n#if ALIPAY\n    this.setData({ checkboxTipsVisible: !checked });\n    if (checked) {\n      this.setData({ checkboxTipsVisible: false });\n    }\n#endif\n#if WECHAT\n    this.setData({ checkboxTipsVisible: !checked.detail });\n    if (checked.detail) {\n      this.setData({ checkboxTipsVisible: false });\n    }\n#endif\n  },\n});\n```\n\n### 强制阅读\n\n```xml\n<ant-terms\n  type=\"read\"\n  termPrefix=\"当前正在读\"\n  terms=\"{{terms}}\"\n  buttons=\"{{buttons}}\"\n  readCurrent=\"{{readCurrent}}\"\n#if ALIPAY\n  onButtonTap=\"handleButtonTap\"\n  onTermTap=\"handleTermTap\"\n  onCountdownFinish=\"handleCountdownFinish\"\n  onReadChange=\"handleReadChange\"\n#endif\n#if WECHAT\n  bindbuttontap=\"handleButtonTap\"\n  bindtermtap=\"handleTermTap\"\n  bindcountdownfinish=\"handleCountdownFinish\"\n  bindreadchange=\"handleReadChange\"\n#endif\n>\n  <scroll-view\n    enhanced\n    slot=\"read-content\"\n    style=\"height:300px;\"\n    id=\"scroll-view\"\n    scrollTop=\"{{scrollTop}}\"\n    scrollY=\"{{true}}\"\n    scrollWithAnimation=\"{{true}}\"\n    scrollAnimationDuration=\"{{300}}\"\n    lowerThreshold=\"{{100}}\"\n#if ALIPAY\n    onScroll=\"onScroll\"\n    onTouchStart=\"onTouchStart\"\n    onScrollToLower=\"onScrollToLower\"\n#endif\n#if WECHAT\n    bindscroll=\"onScroll\"\n    binddragstart=\"onTouchStart\"\n    bindscrolltolower=\"onScrollToLower\"\n#endif\n  >\n    <image\n      class=\"term-content\"\n      id=\"term-content-0\"\n      src=\"https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/966PR7FNh8cAAAAAAAAAAAAADoEQAQFr/original\"\n      mode=\"widthFix\"\n      onLoad=\"onImageLoad\"\n    />\n    <image\n      class=\"term-content\"\n      id=\"term-content-1\"\n      src=\"https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/966PR7FNh8cAAAAAAAAAAAAADoEQAQFr/original\"\n      mode=\"widthFix\"\n      onLoad=\"onImageLoad\"\n    />\n    <image\n      class=\"term-content\"\n      id=\"term-content-2\"\n      src=\"https://mdn.alipayobjects.com/huamei_bsws4g/afts/img/966PR7FNh8cAAAAAAAAAAAAADoEQAQFr/original\"\n      mode=\"widthFix\"\n      onLoad=\"onImageLoad\"\n    />\n  </scroll-view>\n  <view slot=\"read-total\">\n    共{{terms3.length}}份协议\n  </view>\n</ant-terms>\n\n```\n\n```js\nPage({\n  data: {\n    buttons: [\n      { text: '请阅读全部协议', disabled: true, type: 'primary', countdownTime: 30 }\n    ],\n    terms: [\n      { name: '《用户协议》', key: 'user' },\n      { name: '《隐私协议》', key: 'private' },\n      { name: '《网络协议》', key: 'internet' }\n    ],\n    readCurrent: 1,\n  },\n  handleButtonTap(item, index, checked, event) {\n#if ALIPAY\n    my.showToast({ content: `点击了第 ${index + 1} 个按钮` });\n#endif\n#if WECHAT\n    wx.showToast({ title: `点击了第 ${item.detail[1] + 1} 个按钮` });\n#endif\n  },\n  handleTermTap(item, index, event) {\n#if ALIPAY\n    my.showToast({ content: `点击了第 ${index + 1} 个协议` });\n#endif\n#if WECHAT\n    wx.showToast({ title: `点击了第 ${item.detail[1] + 1} 个协议` });\n#endif\n  },\n  handleCountdownFinish(item, index) {\n    this.setData({\n      buttons3: this.data.buttons3.map((button, idx) =>\n        idx === index\n          ? { ...button, text: '同意协议 + 行动点描述', disabled: false }\n          : button\n      ),\n    });\n  },\n  handleReadChange(current) {\n#if WECHAT\n    current = current.detail;\n#endif\n    this.tap = true;\n    this.setData({\n      scrollTop:\n        this.itemRectList[current].top -\n        this.scrollViewRect.top +\n        Math.random(),\n    });\n  },\n  async onReady() {\n    await this.updateRect();\n  },\n  async onImageLoad() {\n    await this.updateRect();\n  },\n  async updateRect() {\n    this.itemRectList = await Promise.all(\n      this.data.terms3.map((item, index) =>\n        this.getBoundingClientRect(`#term-content-${index}`)\n      )\n    );\n    this.scrollViewRect = await this.getBoundingClientRect('#scroll-view');\n  },\n  onTouchStart() {\n    this.tap = false;\n  },\n  onScroll(e) {\n    if (this.tap) {\n      return;\n    }\n    this.scrollTop = e.detail.scrollTop;\n    const scrollTop = this.scrollTop + this.itemRectList[0].top;\n    for (let i = 0; i < this.itemRectList.length; i++) {\n      const item = this.itemRectList[i];\n      if (\n        scrollTop > item.top &&\n        (!this.itemRectList[i + 1] ||\n          scrollTop < this.itemRectList[i + 1].top) &&\n        i !== this.data.readCurrent\n      ) {\n        this.setData({\n          readCurrent: i,\n        });\n        return;\n      }\n    }\n  },\n  onScrollToLower() {\n    console.log('触底');\n  },\n  getBoundingClientRect(id) {\n    if (typeof my === 'undefined') {\n      return this.getInstanceBoundingClientRect(this, id);\n    }\n    return this.getInstanceBoundingClientRect(my, id);\n  },\n  getInstanceBoundingClientRect(instance, selector) {\n    return new Promise((resolve) => {\n      instance\n        .createSelectorQuery()\n        .select(selector)\n        .boundingClientRect()\n        .exec((ret) => {\n          if (ret && ret[0]) {\n            resolve(ret[0]);\n          }\n        });\n    });\n  },\n});\n```\n\n### 固定底部\n\n<code src='../../demo/pages/Terms/Fixed/index'></code>\n\n### Demo 代码\n\n<code src='../../demo/pages/Terms/index'></code>\n\n## API\n\n| 属性                            | 说明                 | 类型                                                              | 默认值       |\n| ------------------------------- | -------------------- | ----------------------------------------------------------------- | ------------ |\n| type                            | 协议展示类型         | `\"\"` \\| `\"check\"` \\| `\"read\"`                                     | `\"\"`         |\n| terms                           | 协议列表             | [Term](#term)`[]`                                                 | `-`          |\n| buttons                         | 按钮列表             | [Button](#button)`[]`                                             | `-`          |\n| buttonsFixed                    | 按钮区是否吸底       | `boolean`                                                         | `false`      |\n| buttonsDirection                | 分割线方向，默认纵向 | `\"horizontal\"` \\| `\"vertical\"`                                    | `\"vertical\"` |\n| termPrefix                      | 协议前缀             | `string`                                                          | `\"\"`         |\n| termSuffix                      | 协议后缀             | `string`                                                          | `\"\"`         |\n| checkboxTipsText                | 勾选框引导文案       | `string`                                                          | `\"\"`         |\n| checkboxTipsVisible             | 勾选框引导显示状态   | `boolean`                                                         | `false`      |\n| readCurrent                     | 阅读的当前序号       | `number`                                                          | `-`          |\n| defaultReadCurrent              | 默认阅读的当前序号   | `number`                                                          | `-`          |\n| #if ALIPAY onButtonTap          | 行动点按钮点击回调   | `(b?: Button, index?: number, checked?: boolean, event?) => void` | `-`          |\n| #if ALIPAY onTermTap            | 协议点击回调         | `(t?: Term, index?: number, event?) => void`                      | `-`          |\n| #if ALIPAY onCheckChange        | 勾选回调             | `(c?: boolean) => void`                                           | `-`          |\n| #if ALIPAY onTermPrefixTap      | 协议前缀点击回调     | `(c?: boolean) => void`                                           | `-`          |\n| #if ALIPAY onCountdownFinish    | 倒计时结束回调       | `(b?: Button, index?: number, event?) => void`                    | `-`          |\n| #if ALIPAY onReadChange         | 协议阅读切换         | `(index?: number) => void`                                        | `-`          |\n| #if WECHAT bindbuttontap       | 行动点按钮点击回调   | `(b?: Button, index?: number, checked?: boolean, event?) => void` | `-`          |\n| #if WECHAT bindtermtap         | 协议点击回调         | `(t?: Term, index?: number, event?) => void`                      | `-`          |\n| #if WECHAT bindcheckchange     | 勾选回调             | `(c?: boolean) => void`                                           | `-`          |\n| #if WECHAT bindtermprefixtap   | 协议前缀点击回调     | `(c?: boolean) => void`                                           | `-`          |\n| #if WECHAT bindcountdownfinish | 倒计时结束回调       | `(b?: Button, index?: number, event?) => void`                    | `-`          |\n| #if WECHAT bindreadchange      | 协议阅读切换         | `(index?: number) => void`                                        | `-`          |\n\n### Term\n\n| 属性 | 说明     | 类型     | 默认值 |\n| ---- | -------- | -------- | ------ |\n| key  | 唯一标识 | `string` | `-`    |\n| name | 协议名称 | `string` | `-`    |\n\n### Button\n\n| 属性                                                  | 说明               | 类型     | 默认值 |\n| ----------------------------------------------------- | ------------------ | -------- | ------ |\n| key                                                   | 唯一标识           | `string` | `-`    |\n| text                                                  | 按钮文案           | `string` | `-`    |\n| countdownTime                                         | 计时秒数，单位为秒 | `number` | `-`    |\n| 透传 [ant-button](/components/button#button) 所有属性 |\n"
  },
  {
    "path": "src/Terms/index.ts",
    "content": "import equal from 'fast-deep-equal';\nimport createValue from '../mixins/value';\nimport {\n  Component,\n  getValueFromProps,\n  triggerEvent,\n  triggerEventValues,\n} from '../_util/simply';\nimport { assertAilpayNativeNotSupport } from '../_util/support';\nimport { DefaultProps } from './props';\n\nassertAilpayNativeNotSupport('Terms');\n\nComponent({\n  props: DefaultProps,\n  data: {\n    checked: false,\n    countdownArr: [],\n  },\n  methods: {\n    dealAllCountdown(val) {\n      // 如果时间表的没有变，直接返回\n      const newCountdownRecord = val.map((item) => item.countdownTime);\n      if (equal(this.countdownTimeRecord, newCountdownRecord)) return;\n      this.setData({\n        countdownArr: new Array(val.length),\n      });\n      newCountdownRecord.forEach((item, index) => {\n        if (item && item !== this.countdownTimeRecord[index]) {\n          this.dealCountdown(item, index);\n        }\n      });\n      this.countdownTimeRecord = newCountdownRecord; // 缓存每一项的倒计时时间，用来对比每一项的倒计时是否变化，决定要不要重置倒计时\n    },\n    dealCountdown(timeNum, index) {\n      if (this.countdownTimerArr[index]) {\n        clearTimeout(this.countdownTimerArr[index] as number);\n      }\n      const countdownArr = this.data.countdownArr;\n      countdownArr[index] = timeNum;\n      this.setData({\n        countdownArr,\n      });\n      const countdownTimer = (time) => {\n        countdownArr[index] = time;\n        this.setData({\n          countdownArr,\n        });\n        this.timer = setTimeout(() => {\n          if (time - 1 > 0) {\n            countdownTimer(time - 1);\n          } else {\n            countdownArr[index] = 0;\n            this.setData({\n              countdownArr,\n            });\n            const buttons = getValueFromProps(this, 'buttons');\n            const item = buttons[index];\n            triggerEventValues(this, 'countdownFinish', [item, index]);\n          }\n        }, 1000);\n      };\n\n      countdownTimer(timeNum);\n    },\n\n    onCheckChange(value) {\n      let checked;\n      /// #if ALIPAY\n      checked = value;\n      /// #endif\n      /// #if WECHAT\n      checked = value.detail;\n      /// #endif\n      this.setData({\n        checked,\n      });\n      triggerEvent(this, 'checkChange', checked);\n    },\n\n    onTermPrefixTap() {\n      const { checked } = this.data;\n      this.setData({\n        checked: !checked,\n      });\n      triggerEvent(this, 'termPrefixTap', !checked);\n    },\n\n    onTermTap(event) {\n      const { item, index } = event.currentTarget.dataset;\n      triggerEventValues(this, 'termTap', [item, index], event);\n    },\n\n    onButtonTap(event) {\n      const { item, index } = event.currentTarget.dataset;\n      const { checked } = this.data;\n      triggerEventValues(this, 'buttonTap', [item, index, checked], event);\n    },\n\n    onReadSwiperTap(event) {\n      const { index } = event.currentTarget.dataset;\n      this.onReadChange({ detail: { current: index } });\n    },\n\n    onReadChange(event) {\n      const { current } = event.detail;\n      this.update(current);\n      triggerEvent(this, 'readChange', current, event);\n    },\n  },\n  mixins: [\n    createValue({\n      valueKey: 'readCurrent',\n      defaultValueKey: 'defaultReadCurrent',\n    }),\n  ],\n  /// #if ALIPAY\n  onInit() {\n    this.countdownTimeRecord = []; // 缓存记录需要倒计时的项和时间，变化时用于判断要不要重置倒计时\n    this.countdownTimerArr = []; // 记录倒计时timerId，方便销毁组件时销毁\n    const buttons = getValueFromProps(this, 'buttons');\n    if (\n      Array.isArray(buttons) &&\n      buttons.length &&\n      buttons.some((item) => item.countdownTime)\n    ) {\n      // 数组形式\n      this.dealAllCountdown(buttons);\n    }\n  },\n  async deriveDataFromProps(nextProps) {\n    const { buttons } = nextProps;\n    if (!equal(getValueFromProps(this, 'buttons'), buttons)) {\n      if (\n        Array.isArray(buttons) &&\n        buttons.length &&\n        buttons.some((item) => item.countdownTime)\n      ) {\n        // 数组形式\n        this.dealAllCountdown(buttons);\n      }\n    }\n  },\n  /// #endif\n  /// #if WECHAT\n  attached() {\n    this.countdownTimeRecord = []; // 缓存记录需要倒计时的项和时间，变化时用于判断要不要重置倒计时\n    this.countdownTimerArr = []; // 记录倒计时timerId，方便销毁组件时销毁\n    const buttons = getValueFromProps(this, 'buttons');\n    if (\n      Array.isArray(buttons) &&\n      buttons.length &&\n      buttons.some((item) => item.countdownTime)\n    ) {\n      // 数组形式\n      this.dealAllCountdown(buttons);\n    }\n  },\n  observers: {\n    'buttons': function (data) {\n      if (\n        Array.isArray(data.buttons) &&\n        data.buttons.length &&\n        data.buttons.some((item) => item.countdownTime)\n      ) {\n        // 数组形式\n        this.dealAllCountdown(data.buttons);\n      }\n    },\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/Terms/props.ts",
    "content": "import { IButtonProps } from '../Button/props';\nimport { IBaseProps } from '../_util/base';\n\nexport interface Button extends IButtonProps {\n  key?: string; // 唯一标识\n  text: string; // 按钮文案\n  countdownTime?: number; // 计时秒数，单位为秒\n}\n\ninterface Term {\n  key?: string; // 唯一标识\n  name?: string; //协议名称\n  [propName: string]: unknown; // 允许其他任意属性\n}\n\ntype Type = '' | 'check' | 'read';\n\nexport interface IProps extends IBaseProps {\n  /**\n   * @description 协议展示类型\n   * @default \"\"\n   */\n  type?: Type;\n  /**\n   * @description 协议列表\n   * @default -\n   */\n  terms?: Term[];\n  /**\n   * @description 按钮列表\n   * @default -\n   */\n  buttons?: Button[];\n  /**\n   * @description 按钮区是否吸底\n   * @default false\n   */\n  buttonsFixed?: boolean;\n  /**\n   * @description 分割线方向，默认纵向\n   * @default \"vertical\"\n   */\n  buttonsDirection?: 'horizontal' | 'vertical';\n  /**\n   * @description 协议前缀\n   * @default \"\"\n   */\n  termPrefix?: string;\n  /**\n   * @description 协议后缀\n   * @default \"\"\n   */\n  termSuffix?: string;\n  /**\n   * @description 勾选框引导文案\n   * @default \"\"\n   */\n  checkboxTipsText?: string;\n  /**\n   * @description 勾选框引导显示状态\n   * @default false\n   */\n  checkboxTipsVisible?: boolean;\n  /**\n   * @description 阅读的当前序号\n   */\n  readCurrent?: number;\n  /**\n   * @description 默认阅读的当前序号\n   */\n  defaultReadCurrent?: number;\n  /**\n   * @description 行动点按钮点击回调\n   */\n  onButtonTap?: (b?: Button, index?: number, checked?: boolean, event?) => void;\n  /**\n   * @description 协议点击回调\n   */\n  onTermTap?: (t?: Term, index?: number, event?) => void;\n  /**\n   * @description 勾选回调\n   */\n  onCheckChange?: (c?: boolean) => void;\n  /**\n   * @description 协议前缀点击回调\n   */\n  onTermPrefixTap?: (c?: boolean) => void;\n  /**\n   * @description 倒计时结束回调\n   */\n  onCountdownFinish?: (b?: Button, index?: number, event?) => void;\n  /**\n   * @description 协议阅读切换\n   */\n  onReadChange?: (index?: number) => void;\n}\n\nexport const DefaultProps: IProps = {\n  className: '',\n  type: '',\n  terms: null,\n  buttons: null,\n  buttonsFixed: false,\n  buttonsDirection: 'vertical',\n  termPrefix: '',\n  termSuffix: '',\n  checkboxTipsText: '',\n  checkboxTipsVisible: false,\n  readCurrent: null,\n  defaultReadCurrent: 0,\n  onButtonTap: () => {},\n  onTermTap: () => {},\n  onCheckChange: () => {},\n  onTermPrefixTap: () => {},\n  onCountdownFinish: () => {},\n  onReadChange: () => {},\n};\n"
  },
  {
    "path": "src/Terms/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n@terms-fixed-background-color: var(--terms-fixed-background-color, #ffffff);\n@terms-fixed-border-color: var(--terms-fixed-border-color, #eeeeee);\n\n@terms-protocol-item-color: var(--terms-protocol-item-color, #1677ff);\n@terms-protocol-text-color: var(--terms-protocol-text-color, #999999);\n\n@terms-read-shadow-background: var(\n  --terms-read-shadow-background,\n  linear-gradient(180deg, rgba(255, 255, 255, 0) 12%, #ffffff 86%)\n);\n@terms-read-protocol-border: var(--terms-read-protocol-border, #eeeeee);\n@terms-read-protocol-box-shadow-color: var(\n  --terms-read-protocol-box-shadow-color,\n  rgba(0, 0, 0, 0.1)\n);\n\n@terms-read-protocol-item-color: var(--terms-read-protocol-item-color, #333333);\n@terms-read-protocol-text-color: var(--terms-read-protocol-text-color, #999999);\n"
  },
  {
    "path": "src/Toast/index.axml",
    "content": "<view a:if=\"{{ show || closing }}\">\n  <view\n    class=\"ant-toast {{ className || '' }} {{ icon || image || type ? 'ant-toast-icon-wrapper' : `ant-toast-text-${textType}` }} {{closing ? 'ant-toast-closing' : 'ant-toast-opening' }}\"\n    style=\"{{ style || '' }}\"\n    onAnimationEnd=\"onAnimationEnd\">\n    <view\n      a:if=\"{{ type }}\"\n      class=\"ant-toast-normal\">\n      <loading\n        a:if=\"{{ type === 'loading' }}\"\n        type=\"mini\" />\n      <am-icon\n        a:elif=\"{{ type === 'warning' }}\"\n        type=\"ExclamationOutline\"\n        className=\"ant-toast-icon\" />\n      <am-icon\n        a:elif=\"{{ type === 'error' }}\"\n        type=\"CloseOutline\"\n        className=\"ant-toast-icon\" />\n      <am-icon\n        a:elif=\"{{ type === 'success' }}\"\n        type=\"CheckOutline\"\n        className=\"ant-toast-icon\" />\n      <am-icon\n        a:elif=\"{{ type === 'alipay' }}\"\n        type=\"AlipayCircleFill\"\n        className=\"ant-toast-icon\" />\n    </view>\n    <am-icon\n      a:elif=\"{{ icon }}\"\n      type=\"{{ icon }}\"\n      className=\"ant-toast-icon\" />\n    <view\n      a:elif=\"{{ image }}\"\n      style=\"background-image: url({{ image }})\"\n      class=\"ant-toast-image\" />\n    <view class=\"ant-toast-text-body\">\n      <view class=\"ant-toast-text-box\">\n        <!-- #if ALIPAY -->\n        <view class=\"ant-toast-text-content\">{{ content.substring(0, 24) }}</view>\n        <!-- #endif -->\n        <!-- #if WECHAT -->\n        <view class=\"ant-toast-text-content\">{{displayContent}}</view>\n        <!-- #endif -->\n      </view>\n    </view>\n  </view>\n\n  <view\n    a:if=\"{{ showMask }}\"\n    class=\"ant-mask ant-toast-mask {{ closing ? 'ant-toast-mask-closing' : '' }}\"\n    onTap=\"handleClickMask\"\n    style=\"{{ maskStyle || '' }}\" />\n</view>\n"
  },
  {
    "path": "src/Toast/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Feedback\n  order: 14\ntoc: 'content'\n---\n\n# Toast\n\nLightweight feedback on the results of the operation, without user action can disappear. The longest copy can be no more than 2 lines and can display up to 24 characters. If the copy is too long, it will be truncated.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-toast\": \"antd-mini/es/Toast/index\"\n#endif\n#if WECHAT\n  \"ant-toast\": \"antd-mini/Toast/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic use\n\n```xml\n<ant-toast\n  content=\"toast content\"\n  visible=\"{{toastShow}}\"\n  duration=\"{{0}}\"\n  showMask=\"{{true}}\"\n  maskCloseable=\"{{true}}\"\n#if ALIPAY\n  onClose=\"handleCloseToast\"\n#endif\n#if WECHAT\n  bindclose=\"handleCloseToast\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    toastShow: true,\n  },\n  handleCloseToast(e) {\n    this.setData({\n      toastShow: false,\n    });\n  },\n});\n```\n\n### Icon type\n\n> Incoming `type` property, you can use the built-in icon, optional `success`、`error`、`warning`、`loading`. Support `icon` property specifies [ant-icon](/components/icon) type, also supports `image` Property to customize the image.\n\n```xml\n<ant-toast content=\"success\" type=\"success\" visible=\"{{true}}\" />\n<ant-toast content=\"error\" type=\"error\" visible=\"{{true}}\" />\n<ant-toast content=\"warning\" type=\"warning\" visible=\"{{true}}\" />\n<ant-toast content=\"loading\" type=\"loading\" visible=\"{{true}}\" />\n<ant-toast content=\"icon\" icon=\"LikeOutline\" visible=\"{{true}}\" />\n<ant-toast content=\"custom image\" image=\"https://gw.alipayobjects.com/mdn/rms_5118be/afts/img/A*4NPGQ66arP0AAAAAAAAAAAAAARQnAQ\" visible=\"{{true}}\" />\n```\n\n### Demo Code\n\n<code src='../../demo/pages/Toast/index'></code>\n\n## API\n\n| Property                  | Description                                                              | Type        | Default Value |\n| --------------------- | ----------------------------------------------------------------- | ----------- | ------ |\n| className             | Component root node class name                                                    | string      | -      |\n| content               | Text content                                                          | string      | -      |\n| duration              | Duration, does not automatically close when 0                                     | number      | 2000   |\n| maskCloseable         | Click whether the mask is closed                                                  | boolean     | false  |\n| icon                  | Icon, supports all types of Icon components                                     | string      | -      |\n| image                 | Picture Link                                                          | string      | -      |\n| maskStyle             | Masked Style                                                          | string      | -      |\n| showMask              | Whether to show the layer                                                      | boolean     | false  |\n| style                 | Style                                                              | string      | -      |\n| type                  | Built-in icon type, optional `success` `error` `warning` `loading` `alipay` | string      | -      |\n| textType              | Text type, optional `short` `long`the short type has a larger fillet               | string      | `long` |\n| visible               | Whether to hide                                                          | boolean     | false  |\n| #if ALIPAY onClose    | Callback after Toast is closed                                                | (e) => void | -      |\n| #if WECHAT bindclose | Callback after Toast is closed                                                | (e) => void | -      |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                | Light Mode Default                                                                                                    | Dark Mode Default                                                                                                    | Remarks               |\n| --------------------- | ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ------------------ |\n| --toast-default-bg    | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.75); color: #ffffff;\">rgba(0, 0, 0, 0.75)</div> | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.75); color: #ffffff;\">rgba(0, 0, 0, 0.75)</div> | Toast default background color |\n| --toast-default-color | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #000000;\">#ffffff</div>                  | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #000000;\">#ffffff</div>                  | Toast default text color |\n"
  },
  {
    "path": "src/Toast/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"am-icon\": \"../Icon/index\",\n    \"loading\": \"../Loading/index\"\n  }\n}\n"
  },
  {
    "path": "src/Toast/index.less",
    "content": "@import (reference) './variable.less';\n\n@toastPrefix: ant-toast;\n\n.@{toastPrefix} {\n  color: @toast-default-color;\n  position: fixed;\n  top: 50%;\n  left: 50%;\n  transform: translate3d(-50%, -50%, 0);\n  z-index: 999;\n  padding: 24 * @rpx 32 * @rpx;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  background: @toast-default-bg;\n  border-radius: 24 * @rpx;\n\n  &-icon,\n  &-image,\n  &-normal {\n    margin-bottom: 24 * @rpx;\n  }\n\n  &-normal {\n    height: 80 * @rpx;\n  }\n\n  &-text-long {\n    border-radius: 24 * @rpx;\n  }\n\n  &-text-short {\n    border-radius: 50vh;\n  }\n\n  &-icon {\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    font-size: 100 * @rpx;\n    &.ant-icon {\n      color: @toast-default-color;\n    }\n  }\n\n  &-image,\n  &-icon {\n    width: 80 * @rpx;\n    height: 80 * @rpx;\n    background-size: contain;\n    background-repeat: no-repeat;\n  }\n\n  &-text {\n    &-body {\n      display: flex;\n      max-width: 380 * @rpx;\n      max-height: 84 * @rpx;\n      justify-content: center;\n    }\n\n    &-box {\n      min-width: 0;\n      max-height: 84 * @rpx;\n    }\n\n    &-content {\n      font-size: 28 * @rpx;\n      line-height: 40 * @rpx;\n      max-width: 100%;\n      overflow: hidden;\n      text-overflow: ellipsis;\n    }\n  }\n\n  &-icon-wrapper {\n    width: 240 * @rpx;\n    height: 240 * @rpx;\n    border-radius: 32 * @rpx;\n    padding: 0;\n\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    flex-direction: column;\n  }\n\n  &-mask {\n    position: fixed;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    z-index: 998;\n    background-color: @color-product-mask;\n    width: 300vw;\n    height: 300vh;\n    transform: translate3d(-100vw, -100vh, 0);\n\n    .mask-appear();\n\n    &-closing {\n      .mask-close();\n    }\n  }\n\n  &-opening {\n    transform: translate3d(-50%, -50%, 0) scale(0.6);\n    opacity: 0;\n    .toast-animation-opening();\n  }\n\n  &-closing {\n    transform: translate3d(-50%, -50%, 0) scale(1);\n    opacity: 1;\n    .toast-animation-closing();\n  }\n}\n\n@keyframes ant-toast-scale {\n  0% {\n    transform: translate3d(-50%, -50%, 0) scale(0.6);\n  }\n  100% {\n    transform: translate3d(-50%, -50%, 0) scale(1);\n  }\n}\n\n@keyframes ant-toast-opacity {\n  0% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n\n@keyframes ant-toast-scale-close {\n  0% {\n    transform: translate3d(-50%, -50%, 0) scale(1);\n  }\n  100% {\n    transform: translate3d(-50%, -50%, 0) scale(0.6);\n  }\n}\n\n@keyframes ant-toast-opacity-close {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n\n@keyframes ant-toast-mask-appear {\n  0% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 0.6;\n  }\n}\n\n@keyframes ant-toast-mask-close {\n  0% {\n    opacity: 0.6;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n"
  },
  {
    "path": "src/Toast/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 反馈引导\n  order: 14\ntoc: 'content'\n---\n\n# Toast 轻提示\n\n对操作结果的轻量级反馈，无需用户操作即可自行消失。最长文案不超过 2 行，最多可以显示 24 个字符，文案过长会被截断。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-toast\": \"antd-mini/es/Toast/index\"\n#endif\n#if WECHAT\n  \"ant-toast\": \"antd-mini/Toast/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基本使用\n\n```xml\n<ant-toast\n  content=\"toast content\"\n  visible=\"{{toastShow}}\"\n  duration=\"{{0}}\"\n  showMask=\"{{true}}\"\n  maskCloseable=\"{{true}}\"\n#if ALIPAY\n  onClose=\"handleCloseToast\"\n#endif\n#if WECHAT\n  bindclose=\"handleCloseToast\"\n#endif\n/>\n```\n\n```js\nPage({\n  data: {\n    toastShow: true,\n  },\n  handleCloseToast(e) {\n    this.setData({\n      toastShow: false,\n    });\n  },\n});\n```\n\n### 图标类型\n\n> 传入 `type` 属性，可以使用内置图标，可选 `success`、`error`、`warning`、`loading`。支持 `icon` 属性指定 [ant-icon](/components/icon) 类型，还支持 `image` 属性自定义图片。\n\n```xml\n<ant-toast content=\"success\" type=\"success\" visible=\"{{true}}\" />\n<ant-toast content=\"error\" type=\"error\" visible=\"{{true}}\" />\n<ant-toast content=\"warning\" type=\"warning\" visible=\"{{true}}\" />\n<ant-toast content=\"loading\" type=\"loading\" visible=\"{{true}}\" />\n<ant-toast content=\"icon\" icon=\"LikeOutline\" visible=\"{{true}}\" />\n<ant-toast content=\"custom image\" image=\"https://gw.alipayobjects.com/mdn/rms_5118be/afts/img/A*4NPGQ66arP0AAAAAAAAAAAAAARQnAQ\" visible=\"{{true}}\" />\n```\n\n### Demo 代码\n\n<code src='../../demo/pages/Toast/index'></code>\n\n## API\n\n| 属性                  | 说明                                                              | 类型        | 默认值 |\n| --------------------- | ----------------------------------------------------------------- | ----------- | ------ |\n| className             | 组件根节点类名                                                    | string      | -      |\n| content               | 文本内容                                                          | string      | -      |\n| duration              | 持续时间，为 0 时不会自动关闭                                     | number      | 2000   |\n| maskCloseable         | 点击蒙层是否关闭                                                  | boolean     | false  |\n| icon                  | 图标，支持 Icon 组件所有 type                                     | string      | -      |\n| image                 | 图片链接                                                          | string      | -      |\n| maskStyle             | 蒙层样式                                                          | string      | -      |\n| showMask              | 是否展示蒙层                                                      | boolean     | false  |\n| style                 | 样式                                                              | string      | -      |\n| type                  | 内置图标类型，可选 `success` `error` `warning` `loading` `alipay` | string      | -      |\n| textType              | 文字类型，可选 `short` `long`，short 类型的圆角更大               | string      | `long` |\n| visible               | 是否隐藏                                                          | boolean     | false  |\n| #if ALIPAY onClose    | Toast 关闭后的回调                                                | (e) => void | -      |\n| #if WECHAT bindclose | Toast 关闭后的回调                                                | (e) => void | -      |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                | 浅色模式默认值                                                                                                    | 深色模式默认值                                                                                                    | 备注               |\n| --------------------- | ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ------------------ |\n| --toast-default-bg    | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.75); color: #ffffff;\">rgba(0, 0, 0, 0.75)</div> | <div style=\"width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.75); color: #ffffff;\">rgba(0, 0, 0, 0.75)</div> | Toast 默认背景颜色 |\n| --toast-default-color | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #000000;\">#ffffff</div>                  | <div style=\"width: 150px; height: 30px; background-color: #ffffff; color: #000000;\">#ffffff</div>                  | Toast 默认文字颜色 |\n"
  },
  {
    "path": "src/Toast/index.ts",
    "content": "import {\n  Component,\n  getValueFromProps,\n  triggerEventOnly,\n} from '../_util/simply';\nimport { ToastDefaultProps } from './props';\n\nComponent({\n  props: ToastDefaultProps,\n  data: {\n    show: false,\n    closing: false,\n  },\n  timer: null,\n  methods: {\n    closeMask() {\n      const { closing } = this.data;\n      if (closing) {\n        return;\n      }\n      if (this.timer) {\n        clearTimeout(this.timer);\n      }\n      this.setData({ show: false, closing: true });\n      this.timer = null;\n      triggerEventOnly(this, 'close');\n    },\n    handleShowToast() {\n      this.setData({ show: true, closing: false });\n\n      const duration = getValueFromProps(this, 'duration');\n      if (duration > 0) {\n        const timer = setTimeout(() => {\n          this.closeMask();\n        }, duration);\n        this.timer = timer;\n      }\n    },\n    handleClickMask() {\n      const [showMask, maskCloseable] = getValueFromProps(this, [\n        'showMask',\n        'maskCloseable',\n      ]);\n      if (showMask && maskCloseable) {\n        this.closeMask();\n      }\n    },\n    onAnimationEnd() {\n      if (this.data.closing) {\n        this.setData({ show: false, closing: false });\n        this.timer = null;\n        triggerEventOnly(this, 'close');\n      }\n    },\n  },\n  /// #if ALIPAY\n  didUpdate(prev) {\n    const visible = getValueFromProps(this, 'visible');\n    if (!prev.visible && visible) {\n      this.handleShowToast();\n    } else if (!visible && this.data.show) {\n      this.closeMask();\n    }\n  },\n  didMount() {\n    const visible = getValueFromProps(this, 'visible');\n    if (visible) {\n      this.handleShowToast();\n    }\n  },\n  /// #endif\n\n  /// #if WECHAT\n  observers: {\n    'visible': function (visible) {\n      if (visible) {\n        this.handleShowToast();\n      } else if (!visible && this.data.show) {\n        this.closeMask();\n      }\n    },\n    'content': function (content) {\n      this.setData({\n        displayContent:\n          content === 'string' ? content.substring(0, 24) : content,\n      });\n    },\n  },\n  attached() {\n    const visible = getValueFromProps(this, 'visible');\n    if (visible) {\n      this.handleShowToast();\n    }\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/Toast/props.ts",
    "content": "import { IBaseProps, IconType } from '../_util/base';\n/**\n * @description 标签，突出利益点、以及属性说明。\n */\n\ntype EnumToastType = 'success' | 'warning' | 'error' | 'loading' | 'alipay';\n\n/**\n *  @description Toast 文字类型，short类型的圆角更大\n */\ntype EnumTextType = 'short' | 'long';\n\nexport interface IToastProps extends IBaseProps {\n  /**\n   * @description Toast 完全关闭后的回调\n   */\n  onClose: (e) => void;\n  /**\n   * @description Toast 文本内容\n   */\n  content: string;\n  /**\n   * @description Toast 图标\n   */\n  icon: IconType;\n  /**\n   * @description Toast 图片，与 icon 互斥，优先展示 icon\n   */\n  image: string;\n  /**\n   * @description Toast 持续时间\n   * @default 2000\n   */\n  duration: number;\n  /**\n   * @description 是否展示 Toast\n   */\n  visible: boolean;\n  /**\n   * @description 是否展示蒙层\n   */\n  showMask: boolean;\n  /**\n   * @description 点击蒙层是否隐藏 Toast\n   */\n  maskCloseable: boolean;\n  maskStyle: string;\n  /**\n   * @description 点击蒙层是否隐藏 Toast\n   */\n  type: EnumToastType;\n  textType: EnumTextType;\n}\n\nexport const ToastDefaultProps: Partial<IToastProps> = {\n  content: null,\n  icon: null,\n  image: null,\n  duration: 2000,\n  visible: false,\n  showMask: false,\n  maskCloseable: false,\n  maskStyle: '',\n  type: null,\n  textType: 'long',\n};\n"
  },
  {
    "path": "src/Toast/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n@toast-default-color: var(--toast-default-color, @COLOR_WHITE);\n\n@toast-default-bg: var(--toast-default-bg, rgba(0, 0, 0, 0.75));\n\n.toast-animation-opening() {\n  animation-name: ant-toast-scale, ant-toast-opacity;\n  animation-duration: 200ms, 100ms;\n  animation-timing-function: cubic-bezier(0.57, -0.22, 0, 1.2),\n    cubic-bezier(0.35, 0, 0.65, 1);\n  animation-fill-mode: forwards;\n}\n\n.toast-animation-closing() {\n  animation-name: ant-toast-scale-close, ant-toast-opacity-close;\n  animation-duration: 200ms, 200ms;\n  animation-timing-function: cubic-bezier(0.6, 0, 1, 0.6),\n    cubic-bezier(0.6, 0, 1, 0.6);\n  animation-fill-mode: forwards;\n}\n\n.mask-appear(@duration: 300ms) {\n  animation-fill-mode: forwards;\n  animation-duration: @duration;\n  animation-timing-function: cubic-bezier(0.35, 0, 0.65, 1);\n  animation-name: ant-popup-mask-appear;\n}\n\n.mask-close(@duration: 300ms) {\n  animation-delay: 100ms;\n  animation-fill-mode: forwards;\n  animation-duration: @duration;\n  animation-timing-function: cubic-bezier(0.35, 0, 0.65, 1);\n  animation-name: ant-popup-mask-close;\n}\n"
  },
  {
    "path": "src/Typography/index.axml",
    "content": "<import-sjs name=\"util\" from=\"./index.sjs\" />\n\n<!-- #if ALIPAY -->\n<view\n  class=\"ant-typography-container {{disabled ? 'ant-typography-disabled' : ''}} {{className}}\"\n  hover-class=\"{{onTap || catchTap ? `ant-typography-hover {{activeClassName}}` : ''}}\"\n  hover-start-time=\"{{20}}\"\n  hover-stay-time=\"{{40}}\"\n  style=\"{{style}}\"\n  onTap=\"{{ onTap || onDisabledTap ? 'onTap' : '' }}\"\n  catchTap=\"{{ catchTap ? 'catchTap' : '' }}\"\n>\n<!-- #endif -->\n<!-- #if WECHAT -->\n<view\n  class=\"ant-typography-container {{disabled ? 'ant-typography-disabled' : ''}} {{className}}\"\n  hover-class=\"ant-typography-hover {{activeClassName}}\"\n  hover-start-time=\"{{20}}\"\n  hover-stay-time=\"{{40}}\"\n  style=\"{{style}}\"\n  catchTap=\"onTap\"\n>\n<!-- #endif -->\n  <!-- 左侧图标 -->\n  <view class=\"ant-typography-icon-container {{iconPosition}}\" a:if=\"{{iconPosition === 'left'}}\">\n    <ant-icon\n      a:if=\"{{!util.isUrl(icon)}}\"\n      type=\"{{icon}}\"\n      className=\"ant-typography-icon\"\n    />\n    <image a:else class=\"ant-typography-icon-image\" style=\"{{fontSize ? `width: ${fontSize};height: ${fontSize};` : ''}}\" src=\"{{icon}}\"/>\n  </view>\n\n  <!-- 文案 -->\n  <text\n    selectable=\"{{selectable}}\"\n    number-of-lines=\"{{ellipsisRow}}\"\n    class=\"ant-typography-text {{lineThrough ? 'lineThrough' : ''}} {{underline ? 'underline' : ''}} {{util.isiOS(phonemodel) ? `ant-typography-text-${fontWeight || 'normal'}` : ''}}\"\n    style=\"{{!util.isiOS(phonemodel) ? `font-weight: ${util.getFontWeight(fontWeight, phonemodel)};` : ''}}\"\n  >\n    <slot>{{text}}</slot>\n  </text>\n\n  <!-- 右侧图标 -->\n  <view class=\"ant-typography-icon-container {{iconPosition}}\" a:if=\"{{iconPosition === 'right'}}\">\n    <ant-icon\n      a:if=\"{{!util.isUrl(icon)}}\"\n      type=\"{{icon}}\"\n      className=\"ant-typography-icon\"\n    />\n    <image a:else class=\"ant-typography-icon-image\" style=\"{{fontSize ? `width: ${fontSize};height: ${fontSize};` : ''}}\" src=\"{{icon}}\"/>\n  </view>\n</view>\n"
  },
  {
    "path": "src/Typography/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Information Display\n  order: 8\ntoc: content\n---\n\n# Typography\n\n- It is used when a piece of text needs to be displayed. It supports ellipsis and is compatible with bold on different platforms.\n- It can be used when action point operation buttons with icons are required.\n\n## Precautions\n\n- `icon` properties can support `Icon` Components `type` property, you can also pass in the link address of the icon directly.\n- In disabled mode, you can pass in `onDisabledTap` Event, used to listen for the user's click on the text in the disabled state.\n\n## Code Sample\n\n### Basic Usage\n\n<code src='../../demo/pages/Typography/index'></code>\n\n## Property\n\n| Property                        | Description                                                                | Type                           | Default Value   |\n| --------------------------- | ------------------------------------------------------------------- | ------------------------------ | -------- |\n| text                        | Text content                                                            | string                         | -        |\n| iconPosition                | Icon Location                                                            | `left` \\| `right`              | `right`  |\n| icon                        | Icon, you can support the type attribute of the Icon component, or you can directly pass in the link address of the icon.  | IconType \\| string             | ''       |\n| className                   | Style Class                                                              | string                         | -        |\n| activeClassName             | Click to activate the style class.                                                  | string                         | -        |\n| style                       | Style                                                                | string                         | -        |\n| disabled                    | Disable                                                            | boolean                        | false    |\n| selectable                  | Whether it can be selected                                                        | boolean                        | false    |\n| fontWeight                  | Heavy characters, compatible with iOS and Android platforms                              | `normal` \\| `medium` \\| `bold` | `normal` |\n| lineThrough                 | Add Strikethrough Style                                                      | boolean                        | false    |\n| underline                   | Add Underline Style                                                      | boolean                        | false    |\n| ellipsisRow                 | Multiple lines are omitted, and the value must be greater than or equal to 1, which is consistent with the-webkit-line-clamp attribute of css. | number                         | -        |\n| #if ALIPAY onTap            | Click the button to trigger this callback                                                | (e: Event) => void             | -        |\n| #if ALIPAY catchTap         | Click the button to trigger this callback, non-bubbling                                        | (e: Event) => void             | -        |\n| #if ALIPAY onDisabledTap    | In the disabled state, click the button to trigger this callback                                    | (e: Event) => void             | -        |\n| #if WECHAT bindtap         | Click the button to trigger this callback                                                | (e: Event) => void             | -        |\n| #if WECHAT binddisabledtap | In the disabled state, click the button to trigger this callback                                    | (e: Event) => void             | -        |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For details, see ConfigProvider Components.\n\n| Variable name                       | Light Mode Default                                                                                    | Dark Mode Default                                                                                    | Remarks         |\n| ---------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------ |\n| --typography-container-color | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | typography container color |\n"
  },
  {
    "path": "src/Typography/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-icon\": \"../Icon/index\"\n  }\n}"
  },
  {
    "path": "src/Typography/index.less",
    "content": "@import (reference) './variable.less';\n\n@tabsPrefix: ant-typography;\n\n.@{tabsPrefix} {\n  &-container {\n    font-size: 28 * @rpx;\n    display: flex;\n    align-items: center;\n    width: fit-content;\n    color: @typography-container-color;\n    .@{tabsPrefix} {\n      &-text {\n        line-height: @default-line-height;\n\n        &.lineThrough {\n          text-decoration: line-through;\n        }\n        &.underline {\n          text-decoration: underline;\n          text-decoration-skip-ink: auto;\n        }\n\n        &-normal {\n          font-family: PingFangSC-Regular;\n        }\n\n        &-medium {\n          font-family: PingFangSC-Medium;\n        }\n\n        &-bold {\n          font-family: PingFangSC-SemiBold;\n        }\n      }\n      &-icon {\n        &-container {\n          display: flex;\n          align-items: center;\n          &.left {\n            margin-right: @size-1;\n          }\n          &.right {\n            margin-left: @size-1;\n          }\n        }\n        &-image {\n          display: block;\n        }\n      }\n    }\n  }\n\n  &-disabled {\n    opacity: @opacity-disabled;\n  }\n\n  &-hover {\n    opacity: @opacity-disabled;\n  }\n}\n"
  },
  {
    "path": "src/Typography/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 数据展示\n  order: 8\ntoc: content\n---\n\n# Typography 排版\n\n- 需要对一段文本进行展示时使用，支持省略，兼容不同平台的加粗等。\n- 当需要带图标的行动点操作按钮时可以使用。\n\n## 注意事项\n\n- `icon` 属性可以支持 `Icon` 组件的 `type` 属性，也可以直接传入图标的链接地址。\n- 禁用模式下，可以传入 `onDisabledTap` 事件，用于监听禁用状态下，用户对文本的点击。\n\n## 代码示例\n\n### 基础用法\n\n<code src='../../demo/pages/Typography/index'></code>\n\n## 属性\n\n| 属性                        | 说明                                                                | 类型                           | 默认值   |\n| --------------------------- | ------------------------------------------------------------------- | ------------------------------ | -------- |\n| text                        | 文本内容                                                            | string                         | -        |\n| iconPosition                | 图标位置                                                            | `left` \\| `right`              | `right`  |\n| icon                        | 图标，可以支持 Icon 组件的 type 属性，也可以直接传入图标的链接地址  | IconType \\| string             | ''       |\n| className                   | 样式类                                                              | string                         | -        |\n| activeClassName             | 点击是激活态样式类                                                  | string                         | -        |\n| style                       | 样式                                                                | string                         | -        |\n| disabled                    | 是否禁用                                                            | boolean                        | false    |\n| selectable                  | 是否可被选中                                                        | boolean                        | false    |\n| fontWeight                  | 字重，兼容 iOS、Android 平台的加粗效果                              | `normal` \\| `medium` \\| `bold` | `normal` |\n| lineThrough                 | 添加删除线样式                                                      | boolean                        | false    |\n| underline                   | 添加下划线样式                                                      | boolean                        | false    |\n| ellipsisRow                 | 多行省略，值须大于等于 1，表现同 css 的 -webkit-line-clamp 属性一致 | number                         | -        |\n| #if ALIPAY onTap            | 点击按钮，触发此回调                                                | (e: Event) => void             | -        |\n| #if ALIPAY catchTap         | 点击按钮，触发此回调，非冒泡                                        | (e: Event) => void             | -        |\n| #if ALIPAY onDisabledTap    | 禁用状态下，点击按钮，触发此回调                                    | (e: Event) => void             | -        |\n| #if WECHAT bindtap         | 点击按钮，触发此回调                                                | (e: Event) => void             | -        |\n| #if WECHAT binddisabledtap | 禁用状态下，点击按钮，触发此回调                                    | (e: Event) => void             | -        |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                       | 浅色模式默认值                                                                                    | 深色模式默认值                                                                                    | 备注         |\n| ---------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------ |\n| --typography-container-color | <div style=\"width: 150px; height: 30px; background-color: #333333; color: #ffffff;\">#333333</div> | <div style=\"width: 150px; height: 30px; background-color: #c5cad1; color: #ffffff;\">#c5cad1</div> | 排版容器颜色 |\n"
  },
  {
    "path": "src/Typography/index.sjs.ts",
    "content": "function isUrl(string) {\n  if (!string) return;\n  return !!(\n    string.indexOf('http://') === 0 || string.indexOf('https://') === 0\n  );\n}\n\nfunction getFontWeight(fontWeight, phonemodel) {\n  const type2weight = {\n    normal: {\n      Android: 'normal',\n      iOS: 'normal',\n    },\n    medium: {\n      Android: 'bold',\n      iOS: '500',\n    },\n    bold: {\n      Android: 'bold',\n      iOS: 'bold',\n    },\n  };\n  return (type2weight[fontWeight] || type2weight['normal'])[phonemodel];\n}\n\nfunction isiOS(phonemodel) {\n  return phonemodel === 'iOS';\n}\n\nexport default {\n  isUrl,\n  getFontWeight,\n  isiOS,\n};\n"
  },
  {
    "path": "src/Typography/index.ts",
    "content": "import {\n  Component,\n  getValueFromProps,\n  triggerCatchEvent,\n  triggerEventOnly,\n} from '../_util/simply';\nimport { TypographyDefaultProps } from './props';\n\nComponent({\n  props: TypographyDefaultProps,\n  data: { phonemodel: '' },\n  methods: {\n    onTap(e) {\n      const disabled = getValueFromProps(this, 'disabled');\n      if (disabled) {\n        triggerEventOnly(this, 'disabledTap', e);\n        return;\n      }\n      triggerEventOnly(this, 'tap', e);\n    },\n    catchTap(e) {\n      const disabled = getValueFromProps(this, 'disabled');\n      if (disabled) {\n        triggerEventOnly(this, 'disabledTap', e);\n        return;\n      }\n      triggerCatchEvent(this, 'catchTap', e);\n    },\n  },\n  /// #if ALIPAY\n  onInit() {\n    const { platform } = my.env;\n    this.setData({\n      phonemodel: platform,\n    });\n  },\n  /// #endif\n  /// #if WECHAT\n  attached() {\n    // @ts-ignore\n    const { platform } = wx.getDeviceInfo();\n    let p = '';\n    if (platform === 'android') {\n      p = 'Android';\n    } else {\n      p = 'iOS';\n    }\n    this.setData({\n      phonemodel: p,\n    });\n  },\n  /// #endif\n});\n"
  },
  {
    "path": "src/Typography/props.ts",
    "content": "import { IBaseProps, IconType } from '../_util/base';\n\nexport interface ITypographyProps extends IBaseProps {\n  text?: string;\n  iconPosition?: 'left' | 'right';\n  icon?: IconType | string;\n  activeClassName?: string;\n  disabled?: boolean;\n  selectable?: boolean;\n  fontWeight?: 'normal' | 'medium' | 'bold' | '';\n  lineThrough?: boolean;\n  underline?: boolean;\n  ellipsisRow?: number;\n  onTap?: (event: any) => void;\n  catchTap?: (event: any) => void;\n  onDisabledTap?: (event: any) => void;\n}\n\nexport const TypographyDefaultProps: ITypographyProps = {\n  text: '',\n  iconPosition: 'right',\n  icon: '',\n  className: '',\n  activeClassName: '',\n  style: '',\n  disabled: false,\n  selectable: false,\n  fontWeight: 'normal',\n  lineThrough: false,\n  underline: false,\n  ellipsisRow: null,\n  onTap: null,\n  catchTap: null,\n  onDisabledTap: null,\n};\n"
  },
  {
    "path": "src/Typography/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n@typography-container-color: var(\n  --typography-container-color,\n  @COLOR_TEXT_PRIMARY\n);\n"
  },
  {
    "path": "src/Voucher/index.axml",
    "content": "<view class=\"ant-voucher-wrap {{direction === 'horizontal' && dataSource.length > 1 ? 'ant-voucher-wrap-show-after' : ''}} {{className}}\">\n  <view class=\"ant-voucher-container {{`ant-voucher-container-${direction}`}} {{`${dataSource.length > 1 ? 'multiple' : 'single'}`}}\">\n    <block a:for=\"{{dataSource}}\">\n      <view\n        class=\"ant-voucher-item {{`ant-voucher-item-${item.disabled ? 'disabled' : 'not-disabled'}`}} {{`ant-voucher-item-${size}`}}\"\n        data-index=\"{{index}}\"\n        onTap=\"handleVoucherTap\"\n      >\n        <view class=\"ant-voucher-item-left\">\n          <view class=\"ant-voucher-item-left-money {{direction === 'multipleColumn' ? item.money.length > 3 && 'ant-voucher-item-left-money-small' : item.money.length > 4 && 'ant-voucher-item-left-money-small'}}\">\n            {{item.money}}\n            <text\n              a:if=\"{{item.money}}\"\n              class=\"ant-voucher-item-left-money-unit\">\n              {{item.moneyUnit || '元'}}\n            </text>\n          </view>\n          <view a:if=\"{{item.threshold}}\" class=\"ant-voucher-item-left-threshold\">\n            {{item.threshold}}\n          </view>\n        </view>\n\n        <view class=\"ant-voucher-item-right\">\n          <view class=\"ant-voucher-item-right-content\">\n            <view class=\"ant-voucher-item-right-title\">\n              {{item.title}}\n            </view>\n            <view class=\"ant-voucher-item-right-desc\">\n              {{item.desc}}\n            </view>\n          </view>\n          <!-- #if ALIPAY -->\n          <slot name=\"voucher-action-area\" item=\"{{item}}\" index=\"{{index}}\">\n          <!-- #endif -->\n            <view class=\"voucher-action-area-default\">\n              <image class=\"image\" a:if=\"{{item.actionAreaInfo.imageUrl}}\" mode=\"widthFix\" src=\"{{item.actionAreaInfo.imageUrl}}\"/>\n              <ant-button\n                a:else\n                disabled=\"{{item.actionAreaInfo.disabled}}\"\n                inline\n                size=\"small\"\n                type=\"primary\"\n                data-index=\"{{index}}\"\n                onTap=\"handleBtnTap\">\n                {{item.actionAreaInfo.text}}\n              </ant-button>\n            </view>\n          <!-- #if ALIPAY -->\n          </slot>\n          <!-- #endif -->\n        </view>\n      </view>\n    </block>\n  </view>\n</view>\n"
  },
  {
    "path": "src/Voucher/index.en.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: Bizness Components\n  order: 15\ntoc: content\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Voucher\n\nGeneric Coupon Component.\n\n## Introduction\n\nIn `index.json` Introducing Components in\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-voucher\": \"antd-mini/es/Voucher/index\"\n#endif\n#if WECHAT\n  \"ant-voucher\": \"antd-mini/Voucher/index\"\n#endif\n}\n```\n\n## Code Sample\n\n### Basic Usage\n\n```xml\n<ant-voucher\n#if ALIPAY\n  onTap=\"onTap\"\n#endif\n#if WECHAT\n  bindtap=\"onTap\"\n#endif\n  dataSource=\"{{dataSource}}\"\n/>\n```\n\n```js\nPage({\n  data: {\n    dataSource: [\n      {\n        title: 'title',\n        desc: 'subTitle',\n        money: '50',\n        threshold: '500 to use',\n        actionAreaInfo: {\n          disabled: false,\n          text: 'to exchange',\n        },\n      },\n    ],\n  },\n});\n```\n\n### small size Voucher Style\n\n```xml\n<ant-voucher\n  size=\"small\"\n  dataSource=\"{{dataSource}}\"\n/>\n```\n\n### Horizontal (default)\n\n```xml\n<ant-voucher\n  direction=\"horizontal\"\n  dataSource=\"{{dataSource}}\"\n/>\n```\n\n### Vertical arrangement\n\n```xml\n<ant-voucher\n  direction=\"vertical\"\n  dataSource=\"{{dataSource}}\"\n/>\n```\n\n### Arrange in multiple columns\n\n```xml\n<ant-voucher\n  direction=\"multipleColumn\"\n  dataSource=\"{{dataSource}}\"\n/>\n```\n\n### Slot\n\n```xml\n<ant-voucher\n  size=\"small\"\n  dataSource=\"{{dataSource}}\"\n>\n  <view\n    slot=\"voucher-action-area\"\n    class=\"ant-voucher-slot-demo\"\n  >\n    Expired\n  </view>\n</ant-voucher>\n```\n\n### Demo Code\n\n<code src=\"../../demo/pages/Voucher/index\"></code>\n\n## Property\n\n| Property       | Type                                                   | Required | Default Value       | Description                 |\n| ---------- | ------------------------------------------------------ | ---- | ------------ | -------------------- |\n| className  | string                                                 | No   | \"\"           | Container className       |\n| size       | `small` &#124; `large`                                 | No   | `large`      | Voucher Style               |\n| direction  | `horizontal` &#124; `vertical` &#124; `multipleColumn` | No   | `horizontal` | Arrangement of multiple coupons |\n| dataSource | [Item](#item)[]                                        | Yes   | []           | Data Source               |\n\n### Item\n\n| Property           | Type             | Default Value  | Description                             |\n| -------------- | ---------------- | ------- | -------------------------------- |\n| title          | string           | None      | Title of the coupon                         |\n| desc           | string           | None      | Description of Voucher                         |\n| money          | string           | None      | Copy of the amount of the coupon                     |\n| moneyUnit      | string           | 'Yuan'    | The unit copy of the voucher, for example: xx yuan, xx discount |\n| threshold      | string           | None      | Restricted copy of coupons                     |\n| disabled       | bool             | `false` | Disable                         |\n| actionAreaInfo | [ActionAreaInfo] | None      | Area of action                         |\n\n### ActionAreaInfo\n\n| Property     | Type   | Default Value  | Description                             |\n| -------- | ------ | ------- | -------------------------------- |\n| disabled | bool   | `false` | Disable                         |\n| text     | string | None      | Button Copy                         |\n| imageUrl | string | None      | The picture in the completed state does not show the button when there is a picture. |\n\n## Event\n\n| Event Name                    | Description                 | Type                  |\n| ------------------------- | -------------------- | --------------------- |\n| #if ALIPAY onBtnTap       | Click the button to trigger this callback | `(item, event)=>void` |\n| #if ALIPAY onVoucherTap   | Click the card to trigger this callback | `(item, event)=>void` |\n| #if WECHAT bindbtntap     | Click the button to trigger this callback | `(item, event)=>void` |\n| #if WECHAT bindvouchertap | Click the card to trigger this callback | `(item, event)=>void` |\n\n## Slot\n\n| Name                | Description                   |\n| ------------------- | ---------------------- |\n| voucher-action-area | Action area (not supported by WeChat) |\n\n### Theme customization\n\n#### Style Variables\n\nComponent provides the following CSS variables, which can be used to customize styles. For more information, see ConfigProvider Components.\n\n| Variable name                             | Light Mode Default                                                                                                                   | Dark Mode Default                                                                                                                   | Remarks                 |\n| ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------- |\n| --voucher-background-image-start   | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0); color: #000;\">rgba(255, 255, 255, 0)</div>     | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0); color: #000;\">rgba(255, 255, 255, 0)</div>     | Voucher background map start color     |\n| --voucher-background-image-end     | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #000;\">#ffffff</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #000;\">#ffffff</div>                                   | Voucher background map end color     |\n| --voucher-multi-money-color        | <div style=\"width: 150px; height: 40px; background-color: #ff3b30; color: #ffffff;\">#ff3b30</div>                                | <div style=\"width: 150px; height: 40px; background-color: #ff3b30; color: #ffffff;\">#ff3b30</div>                                | Multiple Amount Colors         |\n| --voucher-threshold-color          | <div style=\"width: 150px; height: 40px; background-color: #666666; color: #ffffff;\">#666</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #808080; color: #ffffff;\">#808080</div>                                | Threshold Color             |\n| --voucher-action-btn-color         | <div style=\"width: 150px; height: 40px; background-color: #ff3141; color: #ffffff;\">#ff3141</div>                                | <div style=\"width: 150px; height: 40px; background-color: #ff4a58; color: #ffffff;\">#ff4a58</div>                                | Operation button color         |\n| --voucher-action-bg                | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #000;\">#ffffff</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #000;\">#ffffff</div>                                   | Operation background color         |\n| --voucher-action-left-bg           | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #000;\">#ffffff</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #000;\">#ffffff</div>                                   | Operation left background color     |\n| --voucher-action-left-threshold-bg | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #000;\">#ffffff</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #000;\">#ffffff</div>                                   | Operation Left Threshold Background Color |\n| --voucher-action-right-color       | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #000;\">#ffffff</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #000;\">#fffffff</div>                                  | Operation right color         |\n| --voucher-action-right-title-color | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #000;\">#ffffff</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #000;\">#ffffff</div>                                   | Manipulation Right Title Color     |\n| --voucher-action-right-desc-color  | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0.8); color: #000;\">rgba(255, 255, 255, 0.8)</div> | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0.8); color: #000;\">rgba(255, 255, 255, 0.8)</div> | Operation right description color     |\n| --voucher-item-right-title-color   | <div style=\"width: 150px; height: 40px; background-color: #383939; color: #ffffff;\">#383939</div>                                | <div style=\"width: 150px; height: 40px; background-color: #383939; color: #ffffff;\">#383939</div>                                | Right side title color 1     |\n| --voucher-item-right-title-color   | <div style=\"width: 150px; height: 40px; background-color: #666666; color: #ffffff;\">#666</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #808080; color: #ffffff;\">#808080</div>                                | Title color on right side of coupon 2     |\n"
  },
  {
    "path": "src/Voucher/index.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"shared\",\n  \"usingComponents\": {\n    \"ant-button\": \"../Button/index\"\n  }\n}\n"
  },
  {
    "path": "src/Voucher/index.less",
    "content": "@import (reference) './variable.less';\n\n@voucherPrefix: ant-voucher;\n\n.@{voucherPrefix} {\n  // 外层容器\n  &-wrap {\n    &-show-after {\n      position: relative;\n      &::after {\n        content: '';\n        position: absolute;\n        top: 0;\n        bottom: 0;\n        right: -1 * @rpx;\n        width: 60 * @rpx;\n        background-image: linear-gradient(\n          90deg,\n          @voucher-background-image-start 0%,\n          @voucher-background-image-end 100%\n        );\n      }\n    }\n  }\n\n  // 列表\n  &-container {\n    position: relative;\n    width: 100%;\n    border-radius: 16 * @rpx 0 0 16 * @rpx;\n    // 水平\n    &-horizontal {\n      display: flex;\n      flex-wrap: nowrap;\n      overflow: auto;\n      // 水平且多个\n      &.multiple {\n        .ant-voucher-item {\n          width: 81%;\n          margin-right: 16 * @rpx;\n          .voucher-action-area-default {\n            padding-left: 8 * @rpx;\n          }\n        }\n      }\n    }\n    // 竖直\n    &-vertical {\n      // 竖直且多个\n      &.multiple {\n        .ant-voucher-item {\n          margin-bottom: 16 * @rpx;\n          &:last-child {\n            margin: 0;\n          }\n        }\n      }\n    }\n    // 双列\n    &-multipleColumn {\n      display: flex;\n      flex-wrap: wrap;\n      .ant-voucher-item {\n        width: calc(50% - 8rpx);\n        height: 136 * @rpx;\n        background-image: url('https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*2dJySZuGgc0AAAAAAAAAAAAADtF8AQ/original'),\n          url('https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*Vu1qS7zDGscAAAAAAAAAAAAADtF8AQ/original');\n        background-size: 130rpx 100%, calc(100% - 128rpx) 100%;\n        background-position: left top, 128rpx top;\n        margin-bottom: 16 * @rpx;\n        &:nth-child(odd) {\n          margin-right: 16 * @rpx;\n        }\n\n        // 双列的样式统一\n        &-small,\n        &-large {\n          .voucher-action-area-default {\n            padding: 0 12 * @rpx 0 8 * @rpx;\n          }\n          .ant-voucher-item-left {\n            width: 117 * @rpx;\n            padding: 29 * @rpx 0 0;\n            &-money {\n              font-weight: 500;\n              font-size: 50 * @rpx;\n              line-height: 64 * @rpx;\n              color: @voucher-multi-money-color;\n              &-unit {\n                line-height: 24 * @rpx;\n                transform: translateY(-3 * @rpx);\n              }\n              &-small {\n                font-size: 28 * @rpx;\n                line-height: 36 * @rpx;\n                padding-top: 21 * @rpx;\n                .ant-voucher-item-left-money-unit {\n                  transform: translateY(-1 * @rpx);\n                }\n              }\n            }\n            &-threshold {\n              opacity: 0.8;\n              font-weight: 400;\n              font-size: 22 * @rpx;\n              line-height: 30 * @rpx;\n              color: @voucher-multi-threshold-color;\n              margin-top: 1 * @rpx;\n            }\n          }\n          .ant-voucher-item-right {\n            padding-left: 16 * @rpx;\n          }\n        }\n      }\n    }\n  }\n\n  // 单个券\n  &-item {\n    position: relative;\n    box-sizing: border-box;\n    flex-shrink: 0;\n    display: flex;\n    background-repeat: no-repeat;\n    border-radius: 16 * @rpx;\n    overflow: hidden;\n    width: 100%;\n    height: 168 * @rpx;\n    background-image: url('https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*WkmYTZUo3aQAAAAAAAAAAAAADtF8AQ/original'),\n      url('https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*_sfDQq-WhIMAAAAAAAAAAAAADtF8AQ/original');\n    background-size: 200rpx 100%, calc(100% - 195rpx) 100%;\n    background-position: left top, 195rpx top;\n    // 券禁用\n    &-disabled {\n      &::after {\n        content: '';\n        position: absolute;\n        top: 0;\n        bottom: 0;\n        left: 0;\n        right: 0;\n        z-index: 2;\n      }\n      .ant-voucher-item-left {\n        opacity: 0.5;\n      }\n      .ant-voucher-item-right {\n        opacity: 0.4;\n      }\n    }\n\n    // 默认为 large 的样式，size=small时在&-small中覆盖\n    .voucher-action-area-default {\n      flex-shrink: 0;\n      display: flex;\n      align-items: center;\n      height: 100%;\n      padding: 0 20 * @rpx 0 24 * @rpx;\n      .ant-button {\n        box-sizing: border-box;\n        box-shadow: none;\n        height: 56 * @rpx;\n        line-height: 56 * @rpx;\n        color: @voucher-action-btn-color;\n        font-size: 26 * @rpx;\n        font-weight: bold;\n        padding: 0 24 * @rpx;\n        background-color: @voucher-action-bg;\n        border-radius: 50 * @rpx;\n        margin-top: -1 * @rpx;\n        .ant-button-wrap {\n          transform: translateY(1 * @rpx);\n        }\n      }\n      .image {\n        position: absolute;\n        bottom: 0;\n        right: 0;\n        width: 100 * @rpx;\n        height: 100 * @rpx;\n      }\n    }\n    &-left {\n      width: 184 * @rpx;\n      box-sizing: border-box;\n      flex-shrink: 0;\n      padding: 21 * @rpx 0 24 * @rpx;\n      text-align: center;\n      &-money {\n        display: flex;\n        justify-content: center;\n        align-items: baseline;\n        font-weight: 500;\n        font-size: 65 * @rpx;\n        line-height: 83 * @rpx;\n        color: @voucher-action-left-color;\n        overflow: hidden;\n        margin-bottom: -1 * @rpx;\n        &-unit {\n          font-weight: 500;\n          font-size: 24 * @rpx;\n          line-height: 28 * @rpx;\n          display: inline-block;\n          transform: translateY(-3 * @rpx);\n        }\n        &-small {\n          font-size: 50 * @rpx;\n          line-height: 64 * @rpx;\n          padding-top: 22 * @rpx;\n          margin-bottom: 5 * @rpx;\n        }\n      }\n      &-threshold {\n        opacity: 0.8;\n        font-weight: 400;\n        font-size: 24 * @rpx;\n        line-height: 33 * @rpx;\n        color: @voucher-action-left-threshold-bg;\n        letter-spacing: 0;\n      }\n    }\n    &-right {\n      flex: 1;\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      padding-top: 2 * @rpx;\n      padding-left: 25 * @rpx;\n      overflow: hidden;\n      &-content {\n        flex: 1;\n        flex-shrink: 0;\n        display: flex;\n        flex-direction: column;\n        overflow: hidden;\n      }\n      &-title {\n        font-weight: 500;\n        font-size: 32 * @rpx;\n        line-height: 45 * @rpx;\n        color: @voucher-action-right-color;\n        overflow: hidden;\n        text-overflow: ellipsis;\n        display: -webkit-box;\n        -webkit-line-clamp: 2;\n        -webkit-box-orient: vertical;\n      }\n      &-desc {\n        align-items: center;\n        font-weight: 400;\n        font-size: 26 * @rpx;\n        line-height: 37 * @rpx;\n        color: @voucher-action-right-desc-color;\n        letter-spacing: 0;\n        margin-top: 8 * @rpx;\n        flex: 1;\n        white-space: nowrap;\n        text-overflow: ellipsis;\n        overflow: hidden;\n      }\n    }\n\n    // size = large\n    &-large {\n      height: 168 * @rpx;\n      background-image: url('https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*58psQJf569EAAAAAAAAAAAAADtF8AQ/original'),\n        url('https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*PINMS6DvAVQAAAAAAAAAAAAADtF8AQ/original');\n      background-size: 200rpx 100%, calc(100% - 195rpx) 100%;\n      background-position: left top, 195rpx top;\n      .ant-voucher-item-left {\n        width: 184 * @rpx;\n      }\n    }\n\n    // size = small\n    &-small {\n      height: 136 * @rpx;\n      padding-left: 1 * @rpx;\n      background-image: url('https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*bZfRSaKz1-QAAAAAAAAAAAAADtF8AQ/original'),\n        url('https://mdn.alipayobjects.com/huamei_2jrq4g/afts/img/A*PcgDR6BgE-4AAAAAAAAAAAAADtF8AQ/fmt.webp');\n      background-size: 160rpx 100%, calc(100% - 158rpx) 100%;\n      background-position: left top, 158rpx top;\n      .ant-voucher-item-left {\n        width: 140 * @rpx;\n        padding: 16 * @rpx 0 20 * @rpx;\n        margin-bottom: -1 * @rpx;\n        &-money {\n          font-weight: 500;\n          font-size: 50 * @rpx;\n          line-height: 64 * @rpx;\n          color: @voucher-multi-money-color;\n          margin-bottom: 1 * @rpx;\n          &-unit {\n            line-height: 24 * @rpx;\n            transform: translateY(-3 * @rpx);\n          }\n          &-small {\n            font-size: 36 * @rpx;\n            line-height: 46 * @rpx;\n            padding-top: 22 * @rpx;\n            margin-bottom: 3 * @rpx;\n          }\n        }\n        &-threshold {\n          opacity: 0.8;\n          font-weight: 400;\n          font-size: 22 * @rpx;\n          line-height: 30 * @rpx;\n          color: @voucher-multi-threshold-color;\n          margin-top: 1 * @rpx;\n        }\n      }\n      .ant-voucher-item-right {\n        padding-left: 29 * @rpx;\n        &-title {\n          font-weight: 600;\n          font-size: 24 * @rpx;\n          line-height: 33 * @rpx;\n          color: @voucher-item-right-title-color;\n        }\n        &-desc {\n          font-weight: 400;\n          font-size: 22 * @rpx;\n          line-height: 30 * @rpx;\n          color: @voucher-item-right-desc-color;\n          margin-top: 5 * @rpx;\n        }\n      }\n      .voucher-action-area-default {\n        .ant-button {\n          background-color: transparent;\n          &::after {\n            content: '';\n            position: absolute;\n            top: 0;\n            left: 0;\n            bottom: 0;\n            right: 0;\n            border: 1 * @rpx solid @voucher-action-btn-color;\n            border-radius: 50 * @rpx;\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/Voucher/index.md",
    "content": "---\nnav:\n  path: /components\ngroup:\n  title: 业务组件\n  order: 15\ntoc: content\nsupportPlatform: ['alipay', 'wechat']\n---\n\n# Voucher 优惠券\n\n通用优惠券组件。\n\n## 引入\n\n在 `index.json` 中引入组件\n\n```json\n\"usingComponents\": {\n#if ALIPAY\n  \"ant-voucher\": \"antd-mini/es/Voucher/index\"\n#endif\n#if WECHAT\n  \"ant-voucher\": \"antd-mini/Voucher/index\"\n#endif\n}\n```\n\n## 代码示例\n\n### 基础用法\n\n```xml\n<ant-voucher\n#if ALIPAY\n  onTap=\"onTap\"\n#endif\n#if WECHAT\n  bindtap=\"onTap\"\n#endif\n  dataSource=\"{{dataSource}}\"\n/>\n```\n\n```js\nPage({\n  data: {\n    dataSource: [\n      {\n        title: 'title',\n        desc: 'subTitle',\n        money: '50',\n        threshold: '500 to use',\n        actionAreaInfo: {\n          disabled: false,\n          text: 'to exchange',\n        },\n      },\n    ],\n  },\n});\n```\n\n### 小号券样式\n\n```xml\n<ant-voucher\n  size=\"small\"\n  dataSource=\"{{dataSource}}\"\n/>\n```\n\n### 水平排列（默认）\n\n```xml\n<ant-voucher\n  direction=\"horizontal\"\n  dataSource=\"{{dataSource}}\"\n/>\n```\n\n### 竖直排列\n\n```xml\n<ant-voucher\n  direction=\"vertical\"\n  dataSource=\"{{dataSource}}\"\n/>\n```\n\n### 多列方式排列\n\n```xml\n<ant-voucher\n  direction=\"multipleColumn\"\n  dataSource=\"{{dataSource}}\"\n/>\n```\n\n### 插槽\n\n```xml\n<ant-voucher\n  size=\"small\"\n  dataSource=\"{{dataSource}}\"\n>\n  <view\n    slot=\"voucher-action-area\"\n    class=\"ant-voucher-slot-demo\"\n  >\n    已过期\n  </view>\n</ant-voucher>\n```\n\n### Demo 代码\n\n<code src=\"../../demo/pages/Voucher/index\"></code>\n\n## 属性\n\n| 属性       | 类型                                                   | 必填 | 默认值       | 说明                 |\n| ---------- | ------------------------------------------------------ | ---- | ------------ | -------------------- |\n| className  | string                                                 | 否   | \"\"           | 容器 className       |\n| size       | `small` &#124; `large`                                 | 否   | `large`      | 券样式               |\n| direction  | `horizontal` &#124; `vertical` &#124; `multipleColumn` | 否   | `horizontal` | 多张券时候的排列方式 |\n| dataSource | [Item](#item)[]                                        | 是   | []           | 数据源               |\n\n### Item\n\n| 属性           | 类型             | 默认值  | 说明                             |\n| -------------- | ---------------- | ------- | -------------------------------- |\n| title          | string           | 无      | 券的标题                         |\n| desc           | string           | 无      | 券的描述                         |\n| money          | string           | 无      | 券的金额文案                     |\n| moneyUnit      | string           | '元'    | 券的单位文案，例如：xx 元、xx 折 |\n| threshold      | string           | 无      | 券的限制文案                     |\n| disabled       | bool             | `false` | 是否禁用                         |\n| actionAreaInfo | [ActionAreaInfo] | 无      | 行动区域                         |\n\n### ActionAreaInfo\n\n| 属性     | 类型   | 默认值  | 说明                             |\n| -------- | ------ | ------- | -------------------------------- |\n| disabled | bool   | `false` | 是否禁用                         |\n| text     | string | 无      | 按钮文案                         |\n| imageUrl | string | 无      | 完成态的图片，有图片时不展示按钮 |\n\n## 事件\n\n| 事件名                    | 说明                 | 类型                  |\n| ------------------------- | -------------------- | --------------------- |\n| #if ALIPAY onBtnTap       | 点击按钮，触发此回调 | `(item, event)=>void` |\n| #if ALIPAY onVoucherTap   | 点击卡片，触发此回调 | `(item, event)=>void` |\n| #if WECHAT bindbtntap     | 点击按钮，触发此回调 | `(item, event)=>void` |\n| #if WECHAT bindvouchertap | 点击卡片，触发此回调 | `(item, event)=>void` |\n\n## 插槽\n\n| 名称                | 说明                   |\n| ------------------- | ---------------------- |\n| voucher-action-area | 行动区域（微信不支持） |\n\n### 主题定制\n\n#### 样式变量\n\n组件提供了下列 CSS 变量，可用于自定义样式，使用方法请参考 ConfigProvider 组件。\n\n| 变量名                             | 浅色模式默认值                                                                                                                   | 深色模式默认值                                                                                                                   | 备注                 |\n| ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------- |\n| --voucher-background-image-start   | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0); color: #000;\">rgba(255, 255, 255, 0)</div>     | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0); color: #000;\">rgba(255, 255, 255, 0)</div>     | 券背景图开始颜色     |\n| --voucher-background-image-end     | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #000;\">#ffffff</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #000;\">#ffffff</div>                                   | 券背景图结束颜色     |\n| --voucher-multi-money-color        | <div style=\"width: 150px; height: 40px; background-color: #ff3b30; color: #ffffff;\">#ff3b30</div>                                | <div style=\"width: 150px; height: 40px; background-color: #ff3b30; color: #ffffff;\">#ff3b30</div>                                | 多个金额颜色         |\n| --voucher-threshold-color          | <div style=\"width: 150px; height: 40px; background-color: #666666; color: #ffffff;\">#666</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #808080; color: #ffffff;\">#808080</div>                                | 阈值颜色             |\n| --voucher-action-btn-color         | <div style=\"width: 150px; height: 40px; background-color: #ff3141; color: #ffffff;\">#ff3141</div>                                | <div style=\"width: 150px; height: 40px; background-color: #ff4a58; color: #ffffff;\">#ff4a58</div>                                | 操作按钮颜色         |\n| --voucher-action-bg                | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #000;\">#ffffff</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #000;\">#ffffff</div>                                   | 操作背景颜色         |\n| --voucher-action-left-bg           | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #000;\">#ffffff</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #000;\">#ffffff</div>                                   | 操作左侧背景颜色     |\n| --voucher-action-left-threshold-bg | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #000;\">#ffffff</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #000;\">#ffffff</div>                                   | 操作左侧阈值背景颜色 |\n| --voucher-action-right-color       | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #000;\">#ffffff</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #000;\">#fffffff</div>                                  | 操作右侧颜色         |\n| --voucher-action-right-title-color | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #000;\">#ffffff</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #ffffff; color: #000;\">#ffffff</div>                                   | 操作右侧标题颜色     |\n| --voucher-action-right-desc-color  | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0.8); color: #000;\">rgba(255, 255, 255, 0.8)</div> | <div style=\"width: 150px; height: 40px; background-color: rgba(255, 255, 255, 0.8); color: #000;\">rgba(255, 255, 255, 0.8)</div> | 操作右侧描述颜色     |\n| --voucher-item-right-title-color   | <div style=\"width: 150px; height: 40px; background-color: #383939; color: #ffffff;\">#383939</div>                                | <div style=\"width: 150px; height: 40px; background-color: #383939; color: #ffffff;\">#383939</div>                                | 券右侧标题颜色 1     |\n| --voucher-item-right-title-color   | <div style=\"width: 150px; height: 40px; background-color: #666666; color: #ffffff;\">#666</div>                                   | <div style=\"width: 150px; height: 40px; background-color: #808080; color: #ffffff;\">#808080</div>                                | 券右侧标题颜色 2     |\n"
  },
  {
    "path": "src/Voucher/index.ts",
    "content": "import isFunction from 'lodash.isfunction';\nimport { Component, getValueFromProps, triggerEvent } from '../_util/simply';\nimport { assertAilpayNativeNotSupport } from '../_util/support';\nimport { componentsProps } from './props';\n\nassertAilpayNativeNotSupport('Voucher');\n\nComponent({\n  props: componentsProps,\n  methods: {\n    getCurTapVoucher(event) {\n      const { index } = event.currentTarget.dataset;\n      const dataSource = getValueFromProps(this, 'dataSource');\n\n      return dataSource[index];\n    },\n\n    handleVoucherTap(e) {\n      triggerEvent(this, 'voucherTap', this.getCurTapVoucher(e), e);\n    },\n    handleBtnTap(e) {\n      const voucher = this.getCurTapVoucher(e);\n      const [onBtnTap, onTap] = getValueFromProps(this, ['onBtnTap', 'onTap']);\n      if (isFunction(onBtnTap)) {\n        triggerEvent(this, 'btnTap', voucher, e);\n      } else if (isFunction(onTap)) {\n        triggerEvent(this, 'tap', voucher, e);\n      }\n    },\n  },\n});\n"
  },
  {
    "path": "src/Voucher/props.ts",
    "content": "interface ActionAreaInfo {\n  disabled?: boolean;\n  text?: string;\n  imageUrl?: string;\n}\n\ninterface Item {\n  title?: string;\n  desc?: string;\n  money?: string;\n  moneyUnit?: string;\n  threshold?: string;\n  actionAreaInfo?: ActionAreaInfo;\n  disabled?: boolean;\n}\n\nexport interface IVoucherProps {\n  className?: string;\n  direction?: 'horizontal' | 'vertical' | 'multipleColumn';\n  size?: 'large' | 'small';\n  dataSource: Item[];\n  onVoucherTap?: (item, event) => void;\n  onBtnTap?: (item, event) => void;\n  /**\n   * @deprecated\n   */\n  onTap?: (item, event) => void;\n}\n\nexport const componentsProps: IVoucherProps = {\n  className: '',\n  size: 'large',\n  direction: 'horizontal',\n  dataSource: [],\n};\n"
  },
  {
    "path": "src/Voucher/variable.less",
    "content": "@import (reference) '../style/variables.less';\n@import (reference) '../style/themes/index.less';\n\n@voucher-background-image-start: var(\n  --voucher-background-image-start,\n  rgba(255, 255, 255, 0)\n);\n@voucher-background-image-end: var(--voucher-background-image-end, #fff);\n@voucher-multi-money-color: var(--voucher-multi-money-color, #ff3b30);\n@voucher-multi-threshold-color: var(--voucher-threshold-color, #666);\n@voucher-action-btn-color: var(--voucher-action-btn-color, #ff3141);\n@voucher-action-bg: var(--voucher-action-bg, #fff);\n@voucher-action-left-color: var(--voucher-action-left-bg, #fff);\n@voucher-action-left-threshold-bg: var(\n  --voucher-action-left-threshold-bg,\n  #fff\n);\n@voucher-action-right-color: var(--voucher-action-right-color, #fff);\n@voucher-action-right-title-color: var(\n  --voucher-action-right-title-color,\n  #fff\n);\n@voucher-action-right-desc-color: var(\n  --voucher-action-right-desc-color,\n  rgba(255, 255, 255, 0.8)\n);\n@voucher-item-right-title-color: var(--voucher-item-right-title-color, #383939);\n@voucher-item-right-desc-color: var(--voucher-item-right-title-color, #666);\n"
  },
  {
    "path": "src/_locale/ar-SA.ts",
    "content": "//ar-SA 阿拉伯语\n\nimport type { Locale } from '.';\n\nconst arSA: Locale = {\n  // locales for all components\n  locale: 'ar-SA',\n  global: {\n    placeholder: 'يرجى الاختيار',\n    emptyText: 'لا توجد بيانات حتى الآن',\n    okText: 'تأكيد',\n    cancelText: 'إلغاء',\n  },\n  input: {\n    placeholder: 'الرجاء إدخال',\n  },\n  calendar: {\n    weekdayNames: [\n      'الإثنين',\n      'الثلاثاء',\n      'الأربعاء',\n      'الخميس',\n      'الجمعة',\n      'السبت',\n      'الأحد',\n    ],\n    today: 'اليوم',\n    start: 'ابدأ',\n    end: 'النهاية',\n    startAndEnd: 'البداية/النهاية',\n    format: 'MM/YYYY',\n  },\n  rangePicker: {\n    startPlaceholder: 'لم يبدأ الاختيار',\n    endPlaceholder: 'لم يكتمل الاختيار',\n  },\n  guideTour: {\n    gotItText: 'فهمت ذلك',\n    nextStepText: 'الخطوة التالية',\n    prevStepText: 'الخطوة السابقة',\n    jumpText: 'تخطي',\n  },\n  imageUpload: {\n    uploadingText: 'جارٍ التحميل',\n    uploadfailedText: 'فشل في التحميل',\n  },\n  pageContainer: {\n    failed: {\n      title: 'تواجه الصفحة بعض المشكلات البسيطة',\n      message: 'سأحاول ذلك لاحقًا',\n    },\n    disconnected: {\n      title: 'الشبكة مشغولة بعض الشيء',\n      message: 'حرّك إصبعك للمساعدة في الإصلاح',\n    },\n    empty: {\n      title: 'لا يوجد شيء هنا',\n      message: 'انظر إلى أشياء أخرى',\n    },\n    busy: {\n      title: 'الازدحام الأمامي',\n      message: 'جرّب الانتعاش.',\n    },\n  },\n};\n\nexport default arSA;\n"
  },
  {
    "path": "src/_locale/de-DE.ts",
    "content": "import type { Locale } from '.';\n\nconst deDE: Locale = {\n  // locales for all components\n  locale: 'de-DE',\n  global: {\n    placeholder: 'Bitte wählen Sie',\n    emptyText: 'Keine Daten verfügbar',\n    okText: 'Bestimmt',\n    cancelText: 'Abbrechen',\n  },\n  input: {\n    placeholder: 'Bitte geben Sie ein',\n  },\n  calendar: {\n    weekdayNames: [\n      'Montag',\n      'Dienstag',\n      'Mittwoch',\n      'Donnerstag',\n      'Freitag',\n      'Samstag',\n      'Sonntag',\n    ],\n    today: 'Heute',\n    start: 'Start',\n    end: 'Ende',\n    startAndEnd: 'Anfang/Ende',\n    format: 'MM/YYYY',\n  },\n  rangePicker: {\n    startPlaceholder: 'Die Auswahl hat noch nicht begonnen',\n    endPlaceholder: 'Unvollständige Auswahl',\n  },\n  guideTour: {\n    gotItText: 'Ich habe es verstanden',\n    nextStepText: 'Nächster Schritt',\n    prevStepText: 'Vorheriger Schritt',\n    jumpText: 'Überspringen',\n  },\n  imageUpload: {\n    uploadingText: 'Hochladen',\n    uploadfailedText: 'Der Upload ist fehlgeschlagen',\n  },\n  pageContainer: {\n    failed: {\n      title: 'Auf der Seite treten einige kleinere Probleme auf',\n      message: 'Ich werde es später ausprobieren',\n    },\n    disconnected: {\n      title: 'Das Netzwerk ist etwas beschäftigt',\n      message: 'Bewegen Sie bitte Ihre Finger, um zu helfen, es zu reparieren.',\n    },\n    empty: {\n      title: 'Hier gibt es nichts.',\n      message: 'Schauen Sie sich auch die anderen an.',\n    },\n    busy: {\n      title: 'Stau voraus',\n      message: 'Versuchen Sie es erneut.',\n    },\n  },\n};\n\nexport default deDE;\n"
  },
  {
    "path": "src/_locale/en-US.ts",
    "content": "import type { Locale } from '.';\n\nconst enUS: Locale = {\n  // locales for all components\n  locale: 'en-US',\n  global: {\n    placeholder: 'Please select',\n    emptyText: 'No data available',\n    okText: 'Ok',\n    cancelText: 'Cancel',\n  },\n  input: {\n    placeholder: 'Please enter',\n  },\n  calendar: {\n    weekdayNames: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],\n    today: 'Today',\n    start: 'Start',\n    end: 'End',\n    startAndEnd: 'Start/End',\n    format: 'MMM D, YYYY',\n  },\n  rangePicker: {\n    startPlaceholder: 'No selection started',\n    endPlaceholder: 'Incomplete selection',\n  },\n  guideTour: {\n    gotItText: 'Got it',\n    nextStepText: 'Next step',\n    prevStepText: 'Prev step',\n    jumpText: 'Skip',\n  },\n  imageUpload: {\n    uploadingText: 'Uploading',\n    uploadfailedText: 'Upload failed',\n  },\n  pageContainer: {\n    failed: {\n      title: 'The page is experiencing some minor issues',\n      message: \"I'll try it later\",\n    },\n    disconnected: {\n      title: 'The network is a bit busy',\n      message: 'Move your fingers to help repair',\n    },\n    empty: {\n      title: \"There's nothing here\",\n      message: 'Check out the others',\n    },\n    busy: {\n      title: 'Congestion ahead',\n      message: 'Try refreshing',\n    },\n  },\n};\n\nexport default enUS;\n"
  },
  {
    "path": "src/_locale/es-ES.ts",
    "content": "import type { Locale } from '.';\n\nconst esES: Locale = {\n  // locales for all components\n  locale: 'es-ES',\n  global: {\n    placeholder: 'Por favor, seleccione',\n    emptyText: 'No hay datos disponibles',\n    okText: 'Confirmar',\n    cancelText: 'Cancelar',\n  },\n  input: {\n    placeholder: 'Por favor, introduzca',\n  },\n  calendar: {\n    weekdayNames: [\n      'Lunes',\n      'Martes',\n      'Miércoles',\n      'Jueves',\n      'Viernes',\n      'Sábado',\n      'Domingo',\n    ],\n    format: 'MM/YYYY',\n    today: 'Hoy',\n    start: 'Empezar',\n    end: 'Fin',\n    startAndEnd: 'Inicio/Fin',\n  },\n  rangePicker: {\n    startPlaceholder: 'No ha comenzado la selección',\n    endPlaceholder: 'Selección no completada',\n  },\n  guideTour: {\n    gotItText: 'Entendido',\n    nextStepText: 'Siguiente paso',\n    prevStepText: 'Paso anterior',\n    jumpText: 'Saltar',\n  },\n  imageUpload: {\n    uploadingText: 'Subiendo',\n    uploadfailedText: 'Error al subir',\n  },\n  pageContainer: {\n    failed: {\n      title: 'La página ha encontrado algunos pequeños problemas',\n      message: 'Lo probaré más tarde',\n    },\n    disconnected: {\n      title: 'La red está un poco ocupada',\n      message: 'Mueve tus dedos para ayudar a arreglarlo',\n    },\n    empty: {\n      title: 'Aquí no hay nada',\n      message: 'Echa un vistazo a los demás',\n    },\n    busy: {\n      title: 'Congestión por delante',\n      message: 'Intente refrescar',\n    },\n  },\n};\n\nexport default esES;\n"
  },
  {
    "path": "src/_locale/fr-FR.ts",
    "content": "import type { Locale } from '.';\n\nconst frFR: Locale = {\n  // locales for all components\n  locale: 'fr-FR',\n  global: {\n    placeholder: 'Veuillez sélectionner',\n    emptyText: 'Aucune donnée disponible',\n    okText: 'Déterminer',\n    cancelText: 'Annuler',\n  },\n  input: {\n    placeholder: 'Veuillez entrer',\n  },\n  calendar: {\n    weekdayNames: [\n      'Lundi',\n      'Mardi',\n      'Mercredi',\n      'Jeudi',\n      'Vendredi',\n      'Samedi',\n      'Dimanche',\n    ],\n    format: 'MM/YYYY',\n    today: \"Aujourd'hui\",\n    start: 'Commencer',\n    end: 'Fin',\n    startAndEnd: 'Début/Fin',\n  },\n  rangePicker: {\n    startPlaceholder: \"La sélection n'a pas commencé\",\n    endPlaceholder: 'Sélection incomplète',\n  },\n  guideTour: {\n    gotItText: \"J'ai compris\",\n    nextStepText: 'Prochaine étape',\n    prevStepText: 'Étape précédente',\n    jumpText: 'Sauter',\n  },\n  imageUpload: {\n    uploadingText: 'Téléchargement en cours',\n    uploadfailedText: 'Échec du téléchargement',\n  },\n  pageContainer: {\n    failed: {\n      title: 'La page rencontre quelques problèmes mineurs',\n      message: 'Je l’essaierai plus tard',\n    },\n    disconnected: {\n      title: 'Le réseau est un peu occupé.',\n      message: 'Bougez vos doigts pour aider à le réparer',\n    },\n    empty: {\n      title: \"Il n'y a rien ici.\",\n      message: 'Regardez les autres.',\n    },\n    busy: {\n      title: \"La congestion à l'avant\",\n      message: 'Essayez de rafraîchir.',\n    },\n  },\n};\n\nexport default frFR;\n"
  },
  {
    "path": "src/_locale/in-ID.ts",
    "content": "import type { Locale } from '.';\n\nconst inID: Locale = {\n  // locales for all components\n  locale: 'in-ID',\n  global: {\n    placeholder: 'Silakan pilih',\n    emptyText: 'Tidak ada data',\n    okText: 'Tentu',\n    cancelText: 'Pembatalan',\n  },\n  input: {\n    placeholder: 'Silakan masukkan',\n  },\n  calendar: {\n    weekdayNames: [\n      'Senin',\n      'Selasa',\n      'Rabu',\n      'Kamis',\n      'Jumat',\n      'Sabtu',\n      'Minggu',\n    ],\n    format: 'MM/YYYY',\n    today: 'Hari ini',\n    start: 'Mulai',\n    end: 'Akhir',\n    startAndEnd: 'Mulai/Akhir',\n  },\n  rangePicker: {\n    startPlaceholder: 'Seleksi belum dimulai',\n    endPlaceholder: 'Seleksi belum selesai',\n  },\n  guideTour: {\n    gotItText: 'Aku tahu',\n    nextStepText: 'Langkah selanjutnya',\n    prevStepText: 'Langkah sebelumnya',\n    jumpText: 'Lewati',\n  },\n  imageUpload: {\n    uploadingText: 'Sedang diunggah',\n    uploadfailedText: 'Gagal mengunggah',\n  },\n  pageContainer: {\n    failed: {\n      title: 'Halaman ini mengalami beberapa masalah kecil',\n      message: 'Saya akan mencobanya nanti.',\n    },\n    disconnected: {\n      title: 'Jaringannya agak sibuk',\n      message: 'Gerakkan jari Anda untuk membantu memperbaikinya',\n    },\n    empty: {\n      title: 'Tidak ada apa-apa di sini.',\n      message: 'Lihat yang lain.',\n    },\n    busy: {\n      title: 'Kemacetan di depan',\n      message: 'Cobalah menyegarkan',\n    },\n  },\n};\n\nexport default inID;\n"
  },
  {
    "path": "src/_locale/index.ts",
    "content": "export interface Locale {\n  /**\n   * 默认的语种标识\n   */\n  locale: string;\n  /**\n   * 全局通用多语言文案\n   */\n  global?: Record<string, any>;\n  /**\n   * Input组件使用的多语言文案\n   */\n  input?: Record<string, any>;\n  /**\n   * Calender组件使用的多语言文案\n   */\n  calendar?: Record<string, any>;\n  /**\n   * RangePicker组件独立出来，使用的多语言文案\n   */\n  rangePicker?: Record<string, any>;\n  /**\n   * GuideTour组件使用的多语言文案\n   */\n  guideTour?: Record<string, any>;\n  /**\n   * ImageUpload组件使用的多语言文案\n   */\n  imageUpload?: Record<string, any>;\n  /**\n   * NumberKeyboard组件使用的多语言文案\n   */\n  pageContainer?: Record<string, any>;\n}\n"
  },
  {
    "path": "src/_locale/it-IT.ts",
    "content": "import type { Locale } from '.';\n\nconst itIT: Locale = {\n  // locales for all components\n  locale: 'it-IT',\n  global: {\n    placeholder: 'Seleziona',\n    emptyText: 'Nessun dato disponibile',\n    okText: 'Certamente',\n    cancelText: 'Annulla',\n  },\n  input: {\n    placeholder: 'Inserisci',\n  },\n  calendar: {\n    weekdayNames: [\n      'Lunedì',\n      'Martedì',\n      'Mercoledì',\n      'Giovedì',\n      'Venerdì',\n      'Sabato',\n      'Domenica',\n    ],\n    format: 'MM/YYYY',\n    today: 'Oggi',\n    start: 'Inizia',\n    end: 'Fine',\n    startAndEnd: 'Inizio/Fine',\n  },\n  rangePicker: {\n    startPlaceholder: 'Nessuna selezione avviata',\n    endPlaceholder: 'Selezione non completata',\n  },\n  guideTour: {\n    gotItText: 'Capito',\n    nextStepText: 'Passo successivo',\n    prevStepText: 'Passaggio precedente',\n    jumpText: 'Salta',\n  },\n  imageUpload: {\n    uploadingText: 'Caricamento in corso',\n    uploadfailedText: 'Caricamento non riuscito',\n  },\n  pageContainer: {\n    failed: {\n      title: 'La pagina ha riscontrato alcuni problemi minori',\n      message: 'Lo proverò più tardi',\n    },\n    disconnected: {\n      title: \"La rete è un po' occupata\",\n      message: 'Muovi le dita per ripararlo',\n    },\n    empty: {\n      title: \"Non c'è niente qui\",\n      message: 'Guarda gli altri',\n    },\n    busy: {\n      title: 'Congestione in vista',\n      message: 'Prova a ricaricare',\n    },\n  },\n};\n\nexport default itIT;\n"
  },
  {
    "path": "src/_locale/ja-JP.ts",
    "content": "import type { Locale } from '.';\n\nconst jaJP: Locale = {\n  // locales for all components\n  locale: 'ja-JP',\n  global: {\n    placeholder: '選択してください',\n    emptyText: 'データはありません。',\n    okText: '確定',\n    cancelText: 'キャンセル',\n  },\n  input: {\n    placeholder: '入力してください',\n  },\n  calendar: {\n    weekdayNames: [\n      '月曜日',\n      '火曜日',\n      '水曜日',\n      '木曜日',\n      '金曜日',\n      '土曜日',\n      '日曜日',\n    ],\n    format: 'MM/YYYY',\n    today: '今日です',\n    start: '開始',\n    end: '終了',\n    startAndEnd: '開始/終了',\n  },\n  rangePicker: {\n    startPlaceholder: '選択が開始されていません',\n    endPlaceholder: '未完成の選択',\n  },\n  guideTour: {\n    gotItText: 'わかりました',\n    nextStepText: '次のステップ',\n    prevStepText: '前のステップ',\n    jumpText: 'スキップ',\n  },\n  imageUpload: {\n    uploadingText: 'アップロード中です',\n    uploadfailedText: 'アップロードに失敗しました',\n  },\n  pageContainer: {\n    failed: {\n      title: 'ページにいくつかの小さな問題が発生しています',\n      message: '後で試してみます',\n    },\n    disconnected: {\n      title: 'ネットワークが少し混雑しています',\n      message: '指を動かして修正してください',\n    },\n    empty: {\n      title: 'ここには何もありません',\n      message: '他のものをチェックしてください',\n    },\n    busy: {\n      title: '前方が渋滞しています',\n      message: 'リフレッシュしてみてください',\n    },\n  },\n};\n\nexport default jaJP;\n"
  },
  {
    "path": "src/_locale/ko-KR.ts",
    "content": "import type { Locale } from '.';\n\nconst koKR: Locale = {\n  // locales for all components\n  locale: 'ko-KR',\n  global: {\n    placeholder: '선택해 주세요',\n    emptyText: '데이터가 없습니다',\n    okText: '확실합니다',\n    cancelText: '취소',\n  },\n  input: {\n    placeholder: '입력해 주세요',\n  },\n  calendar: {\n    weekdayNames: [\n      '월요일',\n      '화요일',\n      '수요일',\n      '목요일',\n      '금요일',\n      '토요일',\n      '일요일',\n    ],\n    format: 'MM/YYYY',\n    today: '오늘',\n    start: '시작',\n    end: '끝',\n    startAndEnd: '시작/종료',\n  },\n  rangePicker: {\n    startPlaceholder: '선택이 시작되지 않았습니다',\n    endPlaceholder: '선택이 완료되지 않았습니다',\n  },\n  guideTour: {\n    gotItText: '알았어요',\n    nextStepText: '다음 단계',\n    prevStepText: '이전 단계',\n    jumpText: '건너뛰기',\n  },\n  imageUpload: {\n    uploadingText: '업로드 중',\n    uploadfailedText: '업로드 실패',\n  },\n  pageContainer: {\n    failed: {\n      title: '페이지에 작은 문제가 발생했습니다',\n      message: '나중에 해볼게요',\n    },\n    disconnected: {\n      title: '네트워크가 좀 바쁩니다',\n      message: '손가락을 움직여 문제를 해결하세요',\n    },\n    empty: {\n      title: '여기에는 아무것도 없습니다',\n      message: '다른 것을 보세요',\n    },\n    busy: {\n      title: '전방 혼잡',\n      message: '새로 고침 해보세요',\n    },\n  },\n};\n\nexport default koKR;\n"
  },
  {
    "path": "src/_locale/ms-MY.ts",
    "content": "import type { Locale } from '.';\n\nconst msMY: Locale = {\n  // locales for all components\n  locale: 'ms-MY',\n  global: {\n    placeholder: 'Sila pilih',\n    emptyText: 'Tiada data',\n    okText: 'Tentu',\n    cancelText: 'Batal',\n  },\n  input: {\n    placeholder: 'Sila masukkan',\n  },\n  calendar: {\n    weekdayNames: [\n      'Isnin',\n      'Selasa',\n      'Rabu',\n      'Khamis',\n      'Jumaat',\n      'Sabtu',\n      'Ahad',\n    ],\n    format: 'MM/YYYY',\n    today: 'Hari ini',\n    start: 'Mula',\n    end: 'Tamat',\n    startAndEnd: 'Mula/Tamat',\n  },\n  rangePicker: {\n    startPlaceholder: 'Pemilihan belum bermula',\n    endPlaceholder: 'Pilihan yang belum selesai',\n  },\n  guideTour: {\n    gotItText: 'Tahu',\n    nextStepText: 'Langkah seterusnya',\n    prevStepText: 'Langkah sebelumnya',\n    jumpText: 'Langkau',\n  },\n  imageUpload: {\n    uploadingText: 'Sedang memuat naik',\n    uploadfailedText: 'Muat naik gagal',\n  },\n  pageContainer: {\n    failed: {\n      title: 'Halaman ini mengalami beberapa masalah kecil',\n      message: 'Saya akan cuba nanti',\n    },\n    disconnected: {\n      title: 'Jaringan agak sibuk',\n      message: 'Gerakkan jari anda untuk membantu membetulkan',\n    },\n    empty: {\n      title: 'Tiada apa-apa di sini',\n      message: 'Lihat yang lain',\n    },\n    busy: {\n      title: 'Kesesakan di hadapan',\n      message: 'Cuba segarkan semula',\n    },\n  },\n};\n\nexport default msMY;\n"
  },
  {
    "path": "src/_locale/pt-BR.ts",
    "content": "import type { Locale } from '.';\n\nconst ptBR: Locale = {\n  // locales for all components\n  locale: 'pt-BR',\n  global: {\n    placeholder: 'Por favor, selecione',\n    emptyText: 'Não há dados disponíveis',\n    okText: 'Confirmar',\n    cancelText: 'Cancelar',\n  },\n  input: {\n    placeholder: 'Por favor, insira.',\n  },\n  calendar: {\n    weekdayNames: [\n      'Segunda-feira',\n      'Terça-feira',\n      'Quarta-feira',\n      'Quinta-feira',\n      'Sexta-feira',\n      'Sábado',\n      'Domingo',\n    ],\n    format: 'MM/YYYY',\n    today: 'Hoje',\n    start: 'Início',\n    end: 'Fim',\n    startAndEnd: 'Início/Fim',\n  },\n  rangePicker: {\n    startPlaceholder: 'Nenhuma seleção foi iniciada',\n    endPlaceholder: 'Seleção não concluída',\n  },\n  guideTour: {\n    gotItText: 'Entendi',\n    nextStepText: 'Próximo passo',\n    prevStepText: 'Etapa anterior',\n    jumpText: 'Pular',\n  },\n  imageUpload: {\n    uploadingText: 'Carregando',\n    uploadfailedText: 'Falha no upload',\n  },\n  pageContainer: {\n    failed: {\n      title: 'A página encontrou alguns pequenos problemas',\n      message: 'Vou tentar mais tarde',\n    },\n    disconnected: {\n      title: 'A rede está um pouco ocupada',\n      message: 'Mova os dedos para ajudar a consertar',\n    },\n    empty: {\n      title: 'Não há nada aqui',\n      message: 'Veja outros',\n    },\n    busy: {\n      title: 'Congestionamento à frente',\n      message: 'Tente atualizar',\n    },\n  },\n};\n\nexport default ptBR;\n"
  },
  {
    "path": "src/_locale/ru-RU.ts",
    "content": "import type { Locale } from '.';\n\nconst ruRU: Locale = {\n  // locales for all components\n  locale: 'ru-RU',\n  global: {\n    placeholder: 'Пожалуйста, выберите',\n    emptyText: 'Нет данных',\n    okText: 'Конечно',\n    cancelText: 'Отмена',\n  },\n  input: {\n    placeholder: 'Пожалуйста, введите',\n  },\n  calendar: {\n    weekdayNames: [\n      'Понедельник',\n      'Вторник',\n      'Среда',\n      'Четверг',\n      'Пятница',\n      'Суббота',\n      'Воскресенье',\n    ],\n    format: 'MM/YYYY',\n    today: 'Сегодня',\n    start: 'Начать',\n    end: 'Конец',\n    startAndEnd: 'Начало/конец',\n  },\n  rangePicker: {\n    startPlaceholder: 'Выбор не начался',\n    endPlaceholder: 'Выбор не завершен',\n  },\n  guideTour: {\n    gotItText: 'Понял',\n    nextStepText: 'Следующий шаг',\n    prevStepText: 'Предыдущий шаг',\n    jumpText: 'Пропустить',\n  },\n  imageUpload: {\n    uploadingText: 'Загрузка',\n    uploadfailedText: 'Загрузка не удалась',\n  },\n  pageContainer: {\n    failed: {\n      title: 'На странице возникли небольшие проблемы',\n      message: 'Попробую позже',\n    },\n    disconnected: {\n      title: 'Сеть немного загружена',\n      message: 'Пожалуйста, помогите исправить, немного пошевелив пальцами',\n    },\n    empty: {\n      title: 'Здесь ничего нет',\n      message: 'Посмотрите на другие',\n    },\n    busy: {\n      title: 'Впереди заторы',\n      message: 'Попробуйте обновить',\n    },\n  },\n};\n\nexport default ruRU;\n"
  },
  {
    "path": "src/_locale/th-TH.ts",
    "content": "import type { Locale } from '.';\n\nconst thTH: Locale = {\n  // locales for all components\n  locale: 'th-TH',\n  global: {\n    placeholder: 'กรุณาเลือก',\n    emptyText: 'ยังไม่มีข้อมูล',\n    okText: 'แน่นอน',\n    cancelText: 'ยกเลิก',\n  },\n  input: {\n    placeholder: 'กรุณากรอก',\n  },\n  calendar: {\n    weekdayNames: [\n      'วันจันทร์',\n      'วันอังคาร',\n      'วันพุธ',\n      'วันพฤหัสบดี',\n      'วันศุกร์',\n      'วันเสาร์',\n      'วันอาทิตย์',\n    ],\n    format: 'MM/YYYY',\n    today: 'วันนี้',\n    start: 'เริ่มต้น',\n    end: 'สิ้นสุด',\n    startAndEnd: 'เริ่ม/สิ้นสุด',\n  },\n  rangePicker: {\n    startPlaceholder: 'ยังไม่ได้เริ่มเลือก',\n    endPlaceholder: 'การเลือกไม่สมบูรณ์',\n  },\n  guideTour: {\n    gotItText: 'รู้แล้ว',\n    nextStepText: 'ขั้นตอนต่อไป',\n    prevStepText: 'ขั้นตอนก่อนหน้า',\n    jumpText: 'ข้าม',\n  },\n  imageUpload: {\n    uploadingText: 'กำลังอัปโหลด',\n    uploadfailedText: 'อัปโหลดล้มเหลว',\n  },\n  pageContainer: {\n    failed: {\n      title: 'หน้าเว็บพบปัญหาเล็กน้อย',\n      message: 'จะลองในภายหลัง',\n    },\n    disconnected: {\n      title: 'เครือข่ายยุ่งนิดหน่อย',\n      message: 'ขยับนิ้วของคุณเพื่อช่วยแก้ไข',\n    },\n    empty: {\n      title: 'ที่นี่ไม่มีอะไรเลย',\n      message: 'ดูสิ่งอื่นๆ',\n    },\n    busy: {\n      title: 'ความแออัดข้างหน้า',\n      message: 'ลองรีเฟรชดูครับ',\n    },\n  },\n};\n\nexport default thTH;\n"
  },
  {
    "path": "src/_locale/tr-TR.ts",
    "content": "import type { Locale } from '.';\n\nconst trTR: Locale = {\n  // locales for all components\n  locale: 'tr-TR',\n  global: {\n    placeholder: 'Lütfen seçin',\n    emptyText: 'Henüz veri yok.',\n    okText: 'Kesinlikle',\n    cancelText: 'İptal',\n  },\n  input: {\n    placeholder: 'Lütfen girin',\n  },\n  calendar: {\n    weekdayNames: [\n      'Pazartesi',\n      'Salı',\n      'Çarşamba',\n      'Perşembe',\n      'Cuma',\n      'Cumartesi',\n      'Pazar',\n    ],\n    format: 'MM/YYYY',\n    today: 'Bugün',\n    start: 'Başla',\n    end: 'Bitiyor',\n    startAndEnd: 'Başlangıç/Bitiş',\n  },\n  rangePicker: {\n    startPlaceholder: 'Seçim henüz başlamadı',\n    endPlaceholder: 'Seçim tamamlanmadı',\n  },\n  guideTour: {\n    gotItText: 'Anladım',\n    nextStepText: 'Sonraki adım',\n    prevStepText: 'Önceki adım',\n    jumpText: 'Atla',\n  },\n  imageUpload: {\n    uploadingText: 'Yükleniyor',\n    uploadfailedText: 'Yükleme başarısız oldu',\n  },\n  pageContainer: {\n    failed: {\n      title: 'Sayfa bazı küçük sorunlar yaşıyor',\n      message: 'Daha sonra deneyeceğim',\n    },\n    disconnected: {\n      title: 'Ağ biraz meşgul',\n      message: 'Düzeltmeye yardımcı olmak için parmağınızı hareket ettirin',\n    },\n    empty: {\n      title: 'Burada hiçbir şey yok',\n      message: 'Diğerlerine bir göz atın',\n    },\n    busy: {\n      title: 'Önümüzde trafik sıkışıklığı',\n      message: 'Yenilemeyi deneyin',\n    },\n  },\n};\n\nexport default trTR;\n"
  },
  {
    "path": "src/_locale/vi-VN.ts",
    "content": "import type { Locale } from '.';\n\nconst viVN: Locale = {\n  // locales for all components\n  locale: 'vi-VN',\n  global: {\n    placeholder: 'Vui lòng chọn',\n    emptyText: 'Hiện tại không có dữ liệu',\n    okText: 'Xác định',\n    cancelText: 'Hủy bỏ',\n  },\n  input: {\n    placeholder: 'Vui lòng nhậper',\n  },\n  calendar: {\n    weekdayNames: [\n      'Thứ Hai',\n      'Thứ ba',\n      'Thứ Tư',\n      'Thứ Năm',\n      'Thứ Sáu',\n      'Thứ Bảy',\n      'Chủ nhật',\n    ],\n    today: 'Hôm nay',\n    start: 'Bắt đầu',\n    end: 'Kết thúc',\n    startAndEnd: 'Bắt đầu/Kết thúc',\n    format: 'MM/YYYY',\n  },\n  rangePicker: {\n    startPlaceholder: 'Lựa chọn chưa bắt đầu',\n    endPlaceholder: 'Lựa chọn chưa hoàn thành',\n  },\n  guideTour: {\n    gotItText: 'Biết rồi',\n    nextStepText: 'Bước tiếp theo',\n    prevStepText: 'Bước trước',\n    jumpText: 'Bỏ qua',\n  },\n  imageUpload: {\n    uploadingText: 'Đang tải lên',\n    uploadfailedText: 'Tải lên không thành công',\n  },\n  pageContainer: {\n    failed: {\n      title: 'Trang gặp phải một số vấn đề nhỏ',\n      message: 'Chờ một chút rồi thử xem',\n    },\n    disconnected: {\n      title: 'Mạng hơi bận',\n      message: 'Di chuyển ngón tay của bạn để giúp khắc phục sự cố',\n    },\n    empty: {\n      title: 'Ở đây không có gì cả',\n      message: 'Hãy xem những cái khác đi',\n    },\n    busy: {\n      title: 'Tắc nghẽn phía trước',\n      message: 'Hãy thử làm mới',\n    },\n  },\n};\n\nexport default viVN;\n"
  },
  {
    "path": "src/_locale/zh-CN.ts",
    "content": "import type { Locale } from '.';\n\nconst zhCN: Locale = {\n  // locales for all components\n  locale: 'zh-CN',\n  global: {\n    placeholder: '请选择',\n    emptyText: '暂无数据',\n    okText: '确定',\n    cancelText: '取消',\n  },\n  input: {\n    placeholder: '请输入',\n  },\n  calendar: {\n    weekdayNames: ['一', '二', '三', '四', '五', '六', '日'],\n    today: '今日',\n    start: '开始',\n    end: '结束',\n    startAndEnd: '开始/结束',\n    format: 'YYYY年MM月',\n  },\n  rangePicker: {\n    startPlaceholder: '未选择',\n    endPlaceholder: '未选择',\n  },\n  guideTour: {\n    gotItText: '知道了',\n    nextStepText: '下一步',\n    prevStepText: '上一步',\n    jumpText: '跳过',\n  },\n  imageUpload: {\n    uploadingText: '上传中',\n    uploadfailedText: '上传失败',\n  },\n  pageContainer: {\n    failed: {\n      title: '页面遇到一些小问题',\n      message: '待会来试试',\n    },\n    disconnected: {\n      title: '网络有点忙',\n      message: '动动手指帮忙修复',\n    },\n    empty: {\n      title: '这里什么也没有',\n      message: '看看其它吧',\n    },\n    busy: {\n      title: '前方拥堵',\n      message: '刷新试试',\n    },\n  },\n};\n\nexport default zhCN;\n"
  },
  {
    "path": "src/_locale/zh-HK.ts",
    "content": "//zh_HK 繁体中文（中国香港）\nimport type { Locale } from '.';\n\nconst zhHK: Locale = {\n  // locales for all components\n  locale: 'zh_HK',\n  global: {\n    placeholder: '請選擇',\n    emptyText: '暫無數據',\n    okText: '確定',\n    cancelText: '取消',\n  },\n  input: {\n    placeholder: '請輸入',\n  },\n  calendar: {\n    weekdayNames: ['一', '二', '三', '四', '五', '六', '日'],\n    today: '今日',\n    start: '開始',\n    end: '結束',\n    startAndEnd: '開始/結束',\n    format: 'YYYY年MM月',\n  },\n  rangePicker: {\n    startPlaceholder: '未選擇',\n    endPlaceholder: '未選擇',\n  },\n  guideTour: {\n    gotItText: '知道了',\n    nextStepText: '下一步',\n    prevStepText: '上一步',\n    jumpText: '跳過',\n  },\n  imageUpload: {\n    uploadingText: '上傳中',\n    uploadfailedText: '上傳失敗',\n  },\n  pageContainer: {\n    failed: {\n      title: '頁面遇到一些小問題',\n      message: '待會來試試',\n    },\n    disconnected: {\n      title: '網絡有點忙',\n      message: '動動手指幫忙修復',\n    },\n    empty: {\n      title: '這裡什麼也沒有',\n      message: '看看其它吧',\n    },\n    busy: {\n      title: '前方擁堵',\n      message: '刷新試試',\n    },\n  },\n};\n\nexport default zhHK;\n"
  },
  {
    "path": "src/_locale/zh-TW.ts",
    "content": "//zh_TW 繁体中文（中国台湾）\nimport type { Locale } from '.';\n\nconst zhTW: Locale = {\n  // locales for all components\n  locale: 'zh_TW',\n  global: {\n    placeholder: '請選擇',\n    emptyText: '暫無數據',\n    okText: '確定',\n    cancelText: '取消',\n  },\n  input: {\n    placeholder: '請輸入',\n  },\n  calendar: {\n    weekdayNames: ['一', '二', '三', '四', '五', '六', '日'],\n    today: '今日',\n    start: '開始',\n    end: '結束',\n    startAndEnd: '開始/結束',\n    format: 'YYYY年MM月',\n  },\n  rangePicker: {\n    startPlaceholder: '未選擇',\n    endPlaceholder: '未選擇',\n  },\n  guideTour: {\n    gotItText: '知道了',\n    nextStepText: '下一步',\n    prevStepText: '上一步',\n    jumpText: '跳過',\n  },\n  imageUpload: {\n    uploadingText: '上傳中',\n    uploadfailedText: '上傳失敗',\n  },\n  pageContainer: {\n    failed: {\n      title: '頁面遇到一些小問題',\n      message: '待會來試試',\n    },\n    disconnected: {\n      title: '網路有點忙',\n      message: '動動手指幫忙修復',\n    },\n    empty: {\n      title: '這裡什麼也沒有',\n      message: '看看其它吧',\n    },\n    busy: {\n      title: '前方擁堵',\n      message: '刷新試試',\n    },\n  },\n};\n\nexport default zhTW;\n"
  },
  {
    "path": "src/_util/arrow.sjs.ts",
    "content": "const arrowType = {\n  right: 'RightOutline',\n  up: 'UpOutline',\n  down: 'DownOutline',\n};\n\nconst getArrow = (arrow) => {\n  if (arrow === true) {\n    return arrowType.right;\n  }\n  return arrowType[arrow] || '';\n};\n\nexport default {\n  getArrow,\n};\n"
  },
  {
    "path": "src/_util/assert-component2.ts",
    "content": "export function assertComponent2() {\n  if (typeof my === 'undefined') {\n    return;\n  }\n  // @ts-ignore\n  const component2 = my.canIUse('component2') || typeof ac === 'object';\n  if (!component2) {\n    console.log('项目未开启 component2，无法使用 Ant Design Mini 组件库');\n    console.log(\n      '请在 IDE 中的 详情 > 项目配置 中，勾选 启用 component2 编译 。'\n    );\n    console.log('参考文档 https://2x-mini.ant.design/guide/migration-v2');\n    throw new Error('Ant Design Mini 组件库需要依赖 component2 特性');\n  }\n}\n\nassertComponent2();\n"
  },
  {
    "path": "src/_util/base.ts",
    "content": "export interface IBaseProps {\n  id?: string;\n  /**\n   * @description 类名\n   */\n  className?: string;\n  /**\n   * @description 样式\n   */\n  style?: string;\n}\n\nexport declare type IconType = string;\n\nexport interface IBoundingClientRect {\n  /**\n   * @summary 上边界\n   */\n  top: number;\n  /**\n   * @summary 右边界\n   */\n  right: number;\n  /**\n   * @summary 下边界\n   */\n  bottom: number;\n  /**\n   * @summary 左边界\n   */\n  left: number;\n  /**\n   * @summary 宽度\n   */\n  width: number;\n  /**\n   * @summary 高度\n   */\n  height: number;\n}\n"
  },
  {
    "path": "src/_util/compareVersion.ts",
    "content": "export function compareVersion(v1: string, v2: string): number {\n  if (v1 === v2) return 0;\n  const v1Arr = v1.split('.');\n  const v2Arr = v2.split('.');\n  const len = v1Arr.length < v2Arr.length ? v1Arr.length : v2Arr.length;\n  let i = 0;\n  while (i <= len) {\n    if (v1Arr[i] === v2Arr[i]) {\n      i++;\n    } else if (!v1Arr[i] || !v2Arr[i]) {\n      return v1Arr.length > v2Arr.length ? 1 : -1;\n    } else {\n      return Number(v1Arr[i]) === Number(v2Arr[i])\n        ? 0\n        : Number(v1Arr[i]) > Number(v2Arr[i])\n          ? 1\n          : -1;\n    }\n  }\n}\n"
  },
  {
    "path": "src/_util/console.ts",
    "content": "export enum EComponents {\n  Alphabet = 'Alphabet',\n  AmountInput = 'AmountInput',\n  Badge = 'Badge',\n  Button = 'Button',\n  Checkbox = 'Checkbox',\n  CheckboxGroup = 'CheckboxGroup',\n  CheckboxItem = 'CheckboxItem',\n  Collapse = 'Collapse',\n  CollapseItem = 'CollapseItem',\n  Container = 'Container',\n  DatePicker = 'DatePicker',\n  Filter = 'Filter',\n  Footer = 'Footer',\n  FooterEnd = 'FooterEnd',\n  FooterImage = 'FooterImage',\n  FooterLink = 'FooterLink',\n  FooterTag = 'FooterTag',\n  FooterText = 'FooterText',\n  Form = 'Form',\n  FormItem = 'FormItem',\n  Grid = 'Grid',\n  GuideModal = 'GuideModal',\n  GuideItem = 'GuideItem',\n  HorizontalScrollbar = 'HorizontalScrollbar',\n  Icon = 'Icon',\n  Input = 'Input',\n  List = 'List',\n  ListItem = 'ListItem',\n  Loading = 'Loading',\n  Mask = 'Mask',\n  Modal = 'Modal',\n  NoticeBar = 'NoticeBar',\n  NoticeBarCapsule = 'NoticeBarCapsule',\n  Pagination = 'Pagination',\n  Picker = 'Picker',\n  Popover = 'Popover',\n  PopoverItem = 'PopoverItem',\n  Popup = 'Popup',\n  RadioGroup = 'RadioGroup',\n  Radio = 'Radio',\n  Result = 'Result',\n  SafeArea = 'SafeArea',\n  SearchBar = 'SearchBar',\n  Selector = 'Selector',\n  Stepper = 'Stepper',\n  Steps = 'Steps',\n  StepItem = 'StepItem',\n  SwipeAction = 'SwipeAction',\n  Switch = 'Switch',\n  Tabs = 'Tabs',\n  TabItem = 'TabItem',\n  Tag = 'Tag',\n  Terms = 'Terms',\n  Textarea = 'Textarea',\n  Tips = 'Tips',\n  Title = 'Title',\n  VerifyCode = 'VerifyCode',\n  WhiteSpace = 'WhiteSpace',\n  GuideTour = 'GuideTour',\n}\n\nexport type TComponents = keyof typeof EComponents;\n\nexport const log = {\n  warn(component: TComponents, message: string): void {\n    const info = `[antd-mini: ${component}] 📡 ${message}`;\n    // eslint-disable-next-line no-console\n    console.warn(info);\n  },\n  error(component: TComponents, message: string): void {\n    const info = `[antd-mini: ${component}] 📡 ${message}`;\n    // eslint-disable-next-line no-console\n    console.error(info);\n  },\n};\n"
  },
  {
    "path": "src/_util/dayjs/iso-weekday.ts",
    "content": "import { Dayjs } from 'dayjs';\n\n/**\n * see https://github.com/iamkun/dayjs/blob/305f54099172ada45d10ba4c9bb5ec95e2a9d441/src/plugin/isoWeek/index.js#L37\n */\nexport function isoWeekday(day: Dayjs): number {\n  return day.day() || 7;\n}\n"
  },
  {
    "path": "src/_util/event.sjs.ts",
    "content": "function disableScrollEvent(event) {\n  event.preventDefault();\n}\n\nfunction enableScrollEvent(event) {\n  event.stopPropagation();\n}\n\nexport default {\n  disableScrollEvent,\n  enableScrollEvent,\n};\n"
  },
  {
    "path": "src/_util/flattenObject.ts",
    "content": "export function flattenObject(obj, parentKey = '', result = {}) {\n  for (const key in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, key)) {\n      const currentKey = parentKey ? `${parentKey}.${key}` : key;\n      const value = obj[key];\n\n      if (Object.prototype.toString.call(value) === '[object Object]') {\n        flattenObject(value, currentKey, result);\n      } else {\n        result[currentKey] = value;\n      }\n    }\n  }\n  return result;\n}\n\nexport default flattenObject;\n"
  },
  {
    "path": "src/_util/fmtEvent.ts",
    "content": "/* eslint-disable @typescript-eslint/no-explicit-any */\nexport default function fmtEvent(\n  props: Record<string, any>,\n  e: Record<string, any> = {}\n): Record<string, any> {\n  const dataset = {};\n  for (const key in props) {\n    if (/data-/gi.test(key)) {\n      dataset[key.replace(/data-/gi, '')] = props[key];\n    }\n  }\n  return Object.assign({}, e, {\n    currentTarget: { dataset },\n    target: { dataset, targetDataset: dataset },\n  });\n}\n"
  },
  {
    "path": "src/_util/get.ts",
    "content": "export function get(obj, path, defaultValue?) {\n  // If path is not an array, convert it to an array\n  if (!Array.isArray(path)) {\n    path = path.split('.').map((key) => key.replace(/\\[(\\d+)]/g, '$1'));\n  }\n\n  // Use reduce to traverse the path\n  let result = path.reduce(\n    (acc, key) => (acc && acc[key] !== undefined ? acc[key] : undefined),\n    obj\n  );\n\n  return result === undefined ? defaultValue : result;\n}\n\nexport default get;\n"
  },
  {
    "path": "src/_util/isPropsEmpty.sjs.ts",
    "content": "function isPropsEmpty(propsValue) {\n  return [undefined, null].indexOf(propsValue) !== -1;\n}\n\nexport default {\n  isPropsEmpty,\n};\n"
  },
  {
    "path": "src/_util/jsapi/base.ts",
    "content": "import { platform } from '../platform';\n\ninterface JSAPIImpl<T, A> {\n  wechat?: (instance: any, args: A) => T;\n  alipay?: (instance: any, args: A) => T;\n}\n\nexport function implJsapi<T, A>(impl: JSAPIImpl<T, A>) {\n  return (args?: A) => {\n    /// #if WECHAT\n    if (platform() === 'wechat' && impl.wechat) {\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      //@ts-ignore\n      return impl.wechat(wx, args);\n    }\n    /// #endif\n\n    if (platform() === 'alipay' && impl.alipay) {\n      return impl.alipay(my, args);\n    }\n\n    throw new Error('unsupported platform');\n  };\n}\n"
  },
  {
    "path": "src/_util/jsapi/choose-image.ts",
    "content": "import { implJsapi } from './base';\n\ntype Files = {\n  size: number;\n  path: string;\n}[];\n\nexport interface ChooseImageResult {\n  tempFiles: Files;\n  apFilePaths?: Files;\n  filePaths?: Files;\n  tempFilePaths?: Files;\n}\n\nexport interface ChooseImageOptions {\n  count: number;\n  sourceType: string[];\n}\n\nexport const chooseImage = implJsapi<\n  Promise<ChooseImageResult>,\n  ChooseImageOptions\n>({\n  /// #if WECHAT\n  wechat: (instance, args: ChooseImageOptions) => {\n    return new Promise<ChooseImageResult>((resolve, reject) => {\n      /**\n       * @see https://developers.weixin.qq.com/minigame/dev/api/media/video/wx.chooseMedia.html\n       */\n      instance.chooseMedia({\n        mediaType: ['image'],\n        count: args.count,\n        sourceType: args.sourceType,\n        success: (res) => {\n          const tempFiles = res.tempFiles.map((file) => {\n            return {\n              size: file.size,\n              path: file.tempFilePath,\n            };\n          });\n          resolve({\n            tempFiles,\n          });\n        },\n        fail: (err) => {\n          reject(err);\n        },\n      });\n    });\n  },\n  /// #endif\n  alipay: (instance, args: ChooseImageOptions) => {\n    return new Promise<ChooseImageResult>((resolve, reject) => {\n      /**\n       * @see https://opendocs.alipay.com/mini/api/media/image/my.chooseimage\n       */\n      instance.chooseImage({\n        count: args.count,\n        sourceType: args.sourceType,\n        success: (res) => {\n          resolve(res);\n        },\n        fail: (err) => {\n          reject(err);\n        },\n      });\n    });\n  },\n});\n"
  },
  {
    "path": "src/_util/jsapi/create-canvas-context.ts",
    "content": "import { implJsapi } from './base';\n\nexport const createCanvasContext = implJsapi<Promise<any>, [string, any]>({\n  /// #if WECHAT\n  wechat: (instance, args: [string, any]) => {\n    return new Promise<any>((resolve) => {\n      const res = instance.createCanvasContext(args[0], args[1]);\n      resolve(res);\n    });\n  },\n  /// #endif\n  alipay: (instance, args: [string, any]) => {\n    return new Promise<any>((resolve) => {\n      const res = instance.createCanvasContext(args[0]);\n      resolve(res);\n    });\n  },\n});\n"
  },
  {
    "path": "src/_util/jsapi/get-instance-bounding-client-rect.ts",
    "content": "export function getInstanceBoundingClientRect(instance: any, selector: string) {\n  return new Promise<any>((resolve) => {\n    instance\n      .createSelectorQuery()\n      .select(selector)\n      .boundingClientRect()\n      .exec((ret) => {\n        if (ret && ret[0]) {\n          resolve(ret[0]);\n        } else {\n          resolve(null);\n        }\n      });\n  });\n}\n\nexport function getAllInstanceBoundingClientRect(\n  instance: any,\n  selector: string\n) {\n  return new Promise<any>((resolve) => {\n    instance\n      .createSelectorQuery()\n      .selectAll(selector)\n      .boundingClientRect()\n      .exec((ret) => {\n        if (ret && ret[0]) {\n          resolve(ret[0]);\n        } else {\n          resolve(null);\n        }\n      });\n  });\n}\n"
  },
  {
    "path": "src/_util/jsapi/get-system-info.ts",
    "content": "import { implJsapi } from './base';\n\nexport interface SystemInfo {\n  windowWidth: number;\n  windowHeight: number;\n  pixelRatio: number;\n}\n\nexport const getSystemInfo = implJsapi<Promise<SystemInfo>, undefined>({\n  /// #if WECHAT\n  wechat: (instance) => {\n    return new Promise((resolve, reject) => {\n      instance.getSystemInfo({\n        success: (res) => {\n          resolve(res);\n        },\n        fail: (err) => {\n          reject(err);\n        },\n      });\n    });\n  },\n  /// #endif\n  alipay: (instance) => {\n    return new Promise<{\n      windowWidth: number;\n      windowHeight: number;\n      pixelRatio: number;\n    }>((resolve, reject) => {\n      instance.getSystemInfo({\n        success: (res) => {\n          resolve(res);\n        },\n        fail: () => {\n          reject();\n        },\n      });\n    });\n  },\n});\n"
  },
  {
    "path": "src/_util/jsapi/load-font-face.ts",
    "content": "import { implJsapi } from './base';\n\nexport interface LoadFontOptions {\n  family: string;\n  source: string;\n}\n\nexport const loadFontFace = implJsapi<Promise<void>, LoadFontOptions>({\n  /// #if WECHAT\n  wechat: (instance, options) => {\n    return new Promise((resolve, reject) => {\n      instance.loadFontFace({\n        family: options.family,\n        source: options.source,\n        success: (res) => {\n          resolve(res);\n        },\n        fail: (err) => {\n          reject(err);\n        },\n      });\n    });\n  },\n  /// #endif\n  alipay: (instance, options) => {\n    return new Promise((resolve, reject) => {\n      instance.loadFontFace({\n        family: options.family,\n        source: options.source,\n        success: (res) => {\n          resolve(res);\n        },\n        fail: (err) => {\n          reject(err);\n        },\n      });\n    });\n  },\n});\n"
  },
  {
    "path": "src/_util/platform.ts",
    "content": "import { compareVersion } from './compareVersion';\n\nexport function supportUndefinedProperty(): boolean {\n  let support = true;\n\n  /// #if WECHAT\n  support = false;\n  /// #endif\n\n  return support;\n}\n\nexport function platform() {\n  let platform = 'unknown';\n\n  /// #if WECHAT\n  platform = 'wechat';\n  /// #endif\n\n  /// #if ALIPAY\n  platform = 'alipay';\n  /// #endif\n\n  return platform;\n}\n\nexport function resolveEventValue(value) {\n  /// #if WECHAT\n\n  if (platform() === 'wechat') {\n    return value.detail;\n  }\n  /// #endif\n\n  return value;\n}\n\nexport function resolveEventValues(args1: any, args2?: any, ...rest) {\n  /// #if WECHAT\n\n  if (platform() === 'wechat') {\n    return args1.detail;\n  }\n  /// #endif\n\n  return [args1, args2, ...rest];\n}\n\nexport function isOldSDKVersion() {\n  if (platform() === 'wechat') {\n    return false;\n  }\n  const SDKVersion = my.SDKVersion;\n  const isOldVersion = compareVersion(SDKVersion, '2.0.0') < 0;\n  return isOldVersion;\n}\n"
  },
  {
    "path": "src/_util/promisify.ts",
    "content": "/*\n *@Description: 把所有my.xx的方法变成promise\n */\n function promisifyMy(name: string) {\n  return function (options: any): any {\n    return new Promise((resolve, reject) => {\n      my[name]({\n        ...options,\n        success: resolve,\n        fail: reject,\n      });\n    });\n  };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\ndeclare namespace My {\n  interface TempFile {\n    /**\n     * @description 本地临时文件路径（本地路径）\n     */\n    path: string;\n    /**\n     * @description 本地临时文件大小，单位为 B\n     */\n    size: number;\n  }\n\n  interface ChooseImage {\n    apFilePaths?: string[];\n    tempFilePaths?: string[];\n    filePaths?: string[];\n    tempFiles?: TempFile[];\n  }\n\n  interface ChooseVideo {\n    tempFilePath: string;\n    duration: number;\n    size: number;\n    height: number;\n    width: number;\n    success: boolean;\n  }\n\n  interface ChooseFileFromDisk {\n    apFilePath: string;\n    success: boolean;\n  }\n\n  interface UploadFile {\n    data: string;\n    statusCode: string | number;\n    header: string;\n  }\n\n  interface GetFileInfo {\n    digest: string;\n    size: number;\n  }\n\n  interface DownloadFile {\n    apFilePath: string;\n  }\n}\n\nexport const chooseImage: (option: any) => Promise<My.ChooseImage> = promisifyMy('chooseImage');\nexport const chooseVideo: (option: any) => Promise<My.ChooseVideo> = promisifyMy('chooseVideo');\nexport const chooseFileFromDisk: (option?: any) => Promise<My.ChooseFileFromDisk> = promisifyMy('chooseFileFromDisk');\nexport const uploadFile: (option: any) => Promise<My.UploadFile> = promisifyMy('uploadFile');\nexport const getFileInfo: (option: any) => Promise<My.GetFileInfo> = promisifyMy('getFileInfo');\nexport const previewImage: (option: any) => void = promisifyMy('previewImage');\nexport const downloadFile: (option: any) => Promise<My.DownloadFile> = promisifyMy('downloadFile');"
  },
  {
    "path": "src/_util/set.ts",
    "content": "export function set(obj, path, value) {\n  // If path is not an array, convert it to an array\n  if (!Array.isArray(path)) {\n    path = path.split('.').reduce((acc, key) => {\n      key.split(/\\[([^}]+)\\]/g).forEach((k) => {\n        if (k !== '') acc.push(isNaN(k) ? k : Number(k));\n      });\n      return acc;\n    }, []);\n  }\n\n  // Traverse the object according to the path\n  path.slice(0, -1).reduce((acc, key, index) => {\n    if (acc[key] === undefined) {\n      acc[key] = typeof path[index + 1] === 'number' ? [] : {};\n    }\n    return acc[key];\n  }, obj)[path[path.length - 1]] = value;\n\n  return obj;\n}\n\nexport default set;\n"
  },
  {
    "path": "src/_util/simply.ts",
    "content": "import fmtEvent from './fmtEvent';\n\nfunction removeNullProps(props) {\n  const newProps = {};\n  for (const key in props) {\n    if (props[key] !== null) {\n      newProps[key] = props[key];\n    }\n  }\n  return newProps;\n}\n\nfunction buildProperties(props) {\n  const newProperties = {};\n  for (const key in props) {\n    let type = null;\n    switch (typeof props[key]) {\n      case 'string':\n        type = String;\n        break;\n      case 'number':\n        type = Number;\n        break;\n      case 'boolean':\n        type = Boolean;\n        break;\n    }\n    newProperties[key] = {\n      type,\n      value: props[key],\n    };\n  }\n  return newProperties;\n}\n\nfunction mergeDefaultProps(defaultProps: Record<string, any> = {}) {\n  return {\n    /// #if WECHAT\n    className: '',\n    style: '',\n    /// #endif\n    ...defaultProps,\n  };\n}\n\ntype ComponentInstance<Props, Methods, Data, Mixins, InstanceMethods> = unknown;\n\n// 增加store使用的版本\ninterface IComponentOptions {\n  // TODO: 需要考虑没有启用 Component2 的情况\n  onInit?: () => void;\n  didUnmount?: () => void;\n}\ntype ExtendedInstanceMethods = Partial<IComponentOptions> & Record<string, any>;\nexport const ComponentWithSignalStoreImpl = <\n  S,\n  M extends Record<string, (o: { store: S }) => unknown>,\n  Props,\n  Methods = unknown,\n  Data = unknown,\n  Mixins = unknown,\n  InstanceMethods extends ExtendedInstanceMethods = ExtendedInstanceMethods\n>({\n  storeOptions,\n  props: defaultProps,\n  methods,\n  data,\n  mixins,\n  ...instanceMethods\n}: {\n  storeOptions?: TStoreOptions<S, M>;\n  props?: Props;\n  methods?: Methods;\n  data?: Data;\n  mixins?: Mixins & any;\n} & InstanceMethods) => {\n  const storeBinder = new StoreBinder(storeOptions);\n\n  const defaultOnInit = function () {\n    storeBinder.init(this as unknown as TStoreInitOptions<S>);\n  };\n  const instanceMethodsCopy: ExtendedInstanceMethods = { ...instanceMethods };\n\n  /// #if ALIPAY\n  // 确保 instanceMethods 存在\n  // 备份原有的 onInit 和 didUnmount 方法\n  const onInitBackup = instanceMethodsCopy.onInit || (() => {});\n  const onDidUnmountBackup = instanceMethodsCopy.didUnmount || (() => {});\n\n  instanceMethodsCopy.onInit = function () {\n    defaultOnInit.call(this);\n    if (onInitBackup) {\n      onInitBackup.call(this);\n    }\n  };\n\n  instanceMethodsCopy.didUnmount = function () {\n    if (onDidUnmountBackup) {\n      onDidUnmountBackup.call(this);\n    }\n    storeBinder.dispose();\n  };\n\n  // 这里确保 instanceMethodsCopy.onInit 被正确执行\n  if (!instanceMethodsCopy.onInit) {\n    instanceMethodsCopy.onInit = defaultOnInit;\n  }\n  /// #endif\n\n  /// #if WECHAT\n  const attachedBackup = instanceMethodsCopy.attached || (() => {});\n  const detachedBackup = instanceMethodsCopy.detached || (() => {});\n\n  instanceMethodsCopy.attached = function () {\n    defaultOnInit.call(this);\n    if (attachedBackup) {\n      attachedBackup.call(this);\n    }\n  };\n\n  instanceMethodsCopy.detached = function () {\n    if (detachedBackup) {\n      detachedBackup.call(this);\n    }\n    storeBinder.dispose();\n  };\n\n  if (!instanceMethodsCopy.created) {\n    instanceMethodsCopy.created = defaultOnInit;\n  }\n  /// #endif\n\n  /// #if WECHAT\n  Component({\n    properties: buildProperties(mergeDefaultProps(defaultProps)),\n    options: {\n      styleIsolation: 'shared',\n      multipleSlots: true,\n      virtualHost: true,\n    } as any,\n    methods,\n    behaviors: mixins,\n    data,\n    ...(instanceMethodsCopy || {}),\n  });\n  /// #endif\n\n  /// #if ALIPAY\n  Component({\n    props: removeNullProps(mergeDefaultProps(defaultProps)),\n    methods,\n    mixins: mixins || [],\n    data,\n    ...(instanceMethodsCopy || {}),\n  });\n  /// #endif\n};\n\ntype TMapState<S> = Record<string, (o: { store: S }) => unknown>;\n\n// 这里类型直接抄了 PageWithAnyStore，但其实对于 antd-mini 的场景，store 和 updateHook 都可以写死而不需要使用时自定义\nexport type TStoreOptions<S, M extends TMapState<S>> = {\n  /**\n   * store 的创建器，因为页面会有多实例，所以 store 必须每个页面实例单独创建一次\n   * 如果你非要多个实例共用一个 store，那你可以 const store = new Store(); store: => store;\n   */\n  store: () => S;\n  /**\n   * store 数据更新后的 listener，通过它来触发向页面数据的同步，返回值是一个 dispose 函数。\n   * 在 mobx 是 autorun、redux 是 subscribe、你要不在意性能，setInterval 也可以\n   */\n  updateHook: (fn: () => void) => () => void;\n  /**\n   * store 数据到页面 data 的映射关系\n   */\n  mapState: M;\n};\n\nexport type TStoreInitOptions<S> = {\n  setData: (o: Record<string, unknown>, callback?: () => void) => void;\n  $store?: S;\n};\n\nexport class StoreBinder<S, M extends TMapState<S>> {\n  private disposeStore?: () => void = undefined;\n  constructor(private storeOptions: TStoreOptions<S, M>) {}\n\n  /**\n   * 绑定和 store 的关系\n   */\n  init(theThis: TStoreInitOptions<S>) {\n    const store = this.storeOptions.store();\n    const disposes = Object.keys(this.storeOptions.mapState).map((key) => {\n      return this.storeOptions.updateHook(() => {\n        theThis.setData({\n          [key]: this.storeOptions.mapState[key]({ store }),\n        });\n      });\n    });\n    theThis.$store = store;\n\n    this.disposeStore = () => disposes.forEach((d) => d());\n  }\n\n  /**\n   * 释放和 store 的关系\n   */\n  dispose() {\n    if (this.disposeStore) {\n      this.disposeStore();\n    }\n  }\n}\n\nfunction ComponentImpl<\n  Props,\n  Data = unknown,\n  Methods = unknown,\n  Mixins = unknown,\n  InstanceMethods = unknown\n>({\n  props: defaultProps,\n  data,\n  methods,\n  mixins,\n  ...instanceMethods\n}: {\n  props?: Props;\n  data?: Data;\n  methods?: Methods;\n  mixins?: Mixins & any;\n} & InstanceMethods) {\n  /// #if WECHAT\n  Component({\n    properties: buildProperties(mergeDefaultProps(defaultProps)),\n    options: {\n      styleIsolation: 'shared',\n      multipleSlots: true,\n      virtualHost: true,\n    } as any,\n    methods,\n    behaviors: mixins,\n    data,\n    ...instanceMethods,\n  });\n  /// #endif\n\n  /// #if ALIPAY\n  Component({\n    props: removeNullProps(mergeDefaultProps(defaultProps)),\n    methods,\n    mixins: mixins || [],\n    data,\n    ...instanceMethods,\n  });\n  /// #endif\n}\n\nexport interface IPlatformEvent {\n  currentTarget: {\n    dataset: Record<string, unknown>;\n  };\n  target: {\n    dataset: Record<string, unknown>;\n  };\n}\n\nexport function triggerEvent(\n  instance: any,\n  eventName: string,\n  value: unknown,\n  e?: any\n) {\n  // 首字母大写，然后加上 on\n\n  /// #if ALIPAY\n  const alipayCallbackName =\n    'on' + eventName.charAt(0).toUpperCase() + eventName.slice(1);\n  const props = instance.props;\n  if (props[alipayCallbackName]) {\n    props[alipayCallbackName](value, fmtEvent(props, e));\n  }\n  /// #endif\n\n  /// #if WECHAT\n  instance.triggerEvent(eventName.toLocaleLowerCase(), value);\n  /// #endif\n}\n\nexport function triggerEventOnly(instance: any, eventName: string, e?: any) {\n  // 首字母大写，然后加上 on\n\n  /// #if ALIPAY\n  const alipayCallbackName =\n    'on' + eventName.charAt(0).toUpperCase() + eventName.slice(1);\n  const props = instance.props;\n  if (props[alipayCallbackName]) {\n    props[alipayCallbackName](fmtEvent(props, e));\n  }\n  /// #endif\n\n  /// #if WECHAT\n  instance.triggerEvent(eventName.toLocaleLowerCase());\n  /// #endif\n}\n\nexport function triggerEventValues(\n  instance: any,\n  eventName: string,\n  values: any[],\n  e?: any\n) {\n  // 首字母大写，然后加上 on\n\n  /// #if ALIPAY\n  const alipayCallbackName =\n    'on' + eventName.charAt(0).toUpperCase() + eventName.slice(1);\n  const props = instance.props;\n  if (props[alipayCallbackName]) {\n    props[alipayCallbackName](...values, fmtEvent(props, e));\n  }\n  /// #endif\n\n  /// #if WECHAT\n  instance.triggerEvent(eventName.toLocaleLowerCase(), values);\n  /// #endif\n}\n\nexport function triggerCatchEvent(instance: any, eventName: string, e?: any) {\n  /// #if ALIPAY\n  const props = instance.props;\n  if (props[eventName]) {\n    props[eventName](fmtEvent(props, e));\n  }\n  /// #endif\n\n  /// #if WECHAT\n  instance.triggerEvent(eventName.toLocaleLowerCase());\n  /// #endif\n}\n\nexport function getValueFromProps(instance: any, propName?: string | string[]) {\n  let value;\n  /// #if ALIPAY\n  const props = instance.props;\n  if (!propName) {\n    return props;\n  }\n  if (typeof propName === 'string') {\n    value = props[propName];\n  }\n  if (Array.isArray(propName)) {\n    value = propName.map((name) => props[name]);\n  }\n  /// #endif\n\n  /// #if WECHAT\n  const properties = instance.properties;\n  if (!propName) {\n    return properties;\n  }\n  if (typeof propName === 'string') {\n    value = properties[propName];\n  }\n  if (Array.isArray(propName)) {\n    value = propName.map((name) => properties[name]);\n  }\n  /// #endif\n\n  return value;\n}\n\nexport {\n  ComponentWithSignalStoreImpl as ComponentWithSignalStore,\n  ComponentImpl as Component,\n};\n"
  },
  {
    "path": "src/_util/store.ts",
    "content": "import { signal } from '@preact/signals-core';\nimport { Locale } from '../_locale/index';\nimport zhCN from '../_locale/zh-CN';\n\nclass SharedStore {\n  // 当前语种\n  currentLocale = signal<Locale>(zhCN);\n  // 当前主题\n  currentTheme = signal<'light' | 'dark'>('light');\n  // 语种全局切换标记\n  localeChangeFlag = signal<boolean>(false);\n  // 主题全局切换标记\n  themeChangeFlag = signal<boolean>(false);\n  // 切换语言, 确保每个page只能切换一次\n  switchLocale(locale: Locale) {\n    if (!this.localeChangeFlag.value && locale !== this.currentLocale.value) {\n      this.currentLocale.value = locale;\n      this.localeChangeFlag.value = true;\n    }\n  }\n  // 切换主题, 确保每个page只能切换一次\n  switchTheme(theme: 'light' | 'dark') {\n    if (!this.themeChangeFlag.value && theme !== this.currentTheme.value) {\n      this.currentTheme.value = theme;\n      this.themeChangeFlag.value = true;\n    }\n  }\n}\n\nexport default new SharedStore();\n"
  },
  {
    "path": "src/_util/support.ts",
    "content": "export function isAilpayNative() {\n  // @ts-ignore\n  if (typeof ac === 'object') {\n    return true;\n  }\n  return false;\n}\n\nexport function isSupport(componentName) {\n  if (typeof componentName !== 'string') {\n    console.error('supportInNative 的入参需要是字符串类型');\n    return;\n  }\n  if (typeof my === 'undefined') {\n    // @ts-ignore\n    return wx.canIUse(componentName);\n  }\n  return my.canIUse(componentName);\n}\n\nexport function assertAilpayNativeNotSupport(componentName) {\n  if (isAilpayNative()) {\n    console.error(\n      `Ant Design Mini 暂不支持在 AlipayNative 环境使用: ${componentName} 组件`\n    );\n  }\n}\n"
  },
  {
    "path": "src/mixins/computed.ts",
    "content": "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport deepEqual from 'fast-deep-equal';\nimport { getValueFromProps } from '../_util/simply';\n\nfunction computedData(this: any) {\n  const nextData = this.computed(getValueFromProps(this));\n  // 浅比较就行了\n  const changedData = Object.keys(nextData).reduce((prev, item) => {\n    // 移除 _ $ 开头的保留 props\n    if (item[0] === '_' || item[0] === '$') {\n      return prev;\n    }\n\n    if (typeof nextData[item] === 'function') {\n      return prev;\n    }\n    if (deepEqual(this.data[item], nextData[item])) {\n      return prev;\n    }\n\n    // eslint-disable-next-line no-param-reassign\n    prev[item] = nextData[item];\n    return prev;\n  }, {});\n\n  if (Object.keys(changedData).length === 0) {\n    return;\n  }\n\n  this.setData(changedData);\n}\n\nexport default function () {\n  let mixin = {\n    /// #if ALIPAY\n    didMount(): void {\n      computedData.call(this);\n    },\n    didUpdate(): void {\n      computedData.call(this);\n    },\n    /// #endif\n\n    /// #if WECHAT\n    attached(): void {\n      computedData.call(this);\n    },\n    observers: {\n      '**': function () {\n        computedData.call(this);\n      },\n    },\n    /// #endif\n  };\n\n  /// #if WECHAT\n  // @ts-ignore\n  mixin = Behavior(mixin);\n  /// #endif\n\n  return mixin;\n}\n"
  },
  {
    "path": "src/mixins/value.ts",
    "content": "import { IMixin4Legacy } from '@mini-types/alipay';\nimport { getValueFromProps } from '../_util/simply';\n\nfunction equal(a, b) {\n  if (a === b) {\n    return true;\n  }\n  if (a !== a && b !== b) {\n    return true;\n  }\n  return false;\n}\n\n/// #if ALIPAY\n// @ts-ignore\nconst component2 = my.canIUse('component2') || typeof ac === 'object';\n/// #endif\n\nexport default ({\n  valueKey = 'value',\n  defaultValueKey = 'defaultValue',\n  scopeKey = 'mixin',\n  transformValue = (value) => ({\n    needUpdate: true,\n    value,\n  }),\n}: {\n  valueKey?: string;\n  defaultValueKey?: string;\n  scopeKey?: string;\n  transformValue?: (\n    this: any,\n    value: any,\n    extra: { nextProps: Record<string, any> },\n    ...args: any\n  ) => {\n    needUpdate: boolean;\n    value?: any;\n  };\n} = {}) => {\n  let mixin = {\n    data: {\n      [scopeKey]: {\n        value: undefined,\n        updated: false,\n        controlled: false,\n      },\n    },\n    /// #if ALIPAY\n    onInit() {\n      this.init();\n    },\n    deriveDataFromProps(nextProps) {\n      if (!equal(nextProps[valueKey], getValueFromProps(this, valueKey))) {\n        this.update(nextProps[valueKey], {\n          nextProps,\n        });\n      }\n    },\n    didUpdate(prevProps) {\n      if (component2) {\n        return;\n      }\n      if (!equal(prevProps[valueKey], getValueFromProps(this, valueKey))) {\n        this.update(getValueFromProps(this, valueKey), {\n          nextProps: getValueFromProps(this),\n        });\n      }\n    },\n    didMount() {\n      if (component2) {\n        return;\n      }\n      this.init();\n    },\n    /// #endif\n\n    /// #if WECHAT\n    created() {\n      this.init();\n    },\n    observers: {\n      [`${valueKey}`]: function (value) {\n        this.update(value, {\n          nextProps: this.properties,\n        });\n      },\n    },\n\n    attached() {\n      const value =\n        this.properties[valueKey] !== null\n          ? this.properties[valueKey]\n          : this.properties[defaultValueKey];\n      const { needUpdate } = this.update(value, {\n        nextProps: this.properties,\n      });\n      if (!needUpdate) {\n        this.updateControlled();\n      }\n    },\n    /// #endif\n    methods: {\n      init() {\n        let value;\n        /// #if ALIPAY\n        value =\n          getValueFromProps(this, valueKey) !== undefined\n            ? getValueFromProps(this, valueKey)\n            : getValueFromProps(this, defaultValueKey);\n        /// #endif\n        /// #if WECHAT\n        value =\n          getValueFromProps(this, valueKey) !== null\n            ? getValueFromProps(this, valueKey)\n            : getValueFromProps(this, defaultValueKey);\n        /// #endif\n        const { needUpdate } = this.update(value, {\n          nextProps: getValueFromProps(this),\n        });\n        if (!needUpdate) {\n          this.updateControlled();\n        }\n      },\n      getValue(prevData?) {\n        return (prevData || this.data)[scopeKey].value;\n      },\n      isEqualValue(prevData) {\n        if (!prevData[scopeKey].updated) {\n          return true;\n        }\n        return equal(this.getValue(prevData), this.getValue());\n      },\n      isControlled() {\n        if ('controlled' in getValueFromProps(this)) {\n          return getValueFromProps(this, 'controlled');\n        }\n\n        /// #if ALIPAY\n        return valueKey in getValueFromProps(this);\n        /// #endif\n        /// #if WECHAT\n        return getValueFromProps(this, valueKey) !== null;\n        /// #endif\n      },\n      updateControlled() {\n        this.setData({\n          [scopeKey]: {\n            controlled: this.isControlled(),\n          },\n        });\n      },\n      update(val, extra?, ...args) {\n        const { needUpdate, value } =\n          transformValue.call(this, val, extra, ...args) || {};\n        if (needUpdate) {\n          this.setData({\n            [scopeKey]: {\n              value,\n              updated: true,\n              controlled: this.isControlled(),\n            },\n          });\n        }\n        return {\n          needUpdate,\n          value,\n        };\n      },\n    },\n  } as IMixin4Legacy<\n    Record<string, any>,\n    Record<string, any>,\n    {\n      getValue(prevData?: any): any;\n      isControlled(): boolean;\n      updateControlled(): void;\n      update(\n        val: any,\n        extra?: any,\n        ...args: any\n      ): {\n        needUpdate: boolean;\n        value: any;\n      };\n      isEqualValue(prevData: any): boolean;\n    }\n  >;\n\n  /// #if WECHAT\n  // @ts-ignore\n  mixin = Behavior(mixin);\n  /// #endif\n\n  return mixin;\n};\n"
  },
  {
    "path": "src/style/mixins/hairline.less",
    "content": "@import (reference) '../themes/color.less';\n\n.scale-hairline-common(@color, @top, @right, @bottom, @left) {\n  content: '';\n  position: absolute;\n  background-color: @color;\n  display: block;\n  top: @top;\n  right: @right;\n  bottom: @bottom;\n  left: @left;\n}\n\n.hairline(@direction, @color: @COLOR_BORDER) when (@direction = 'top') {\n  &::before {\n    .scale-hairline-common(@color, 0, 0, auto, 0);\n    height: 1px;\n    transform: scaleY(0.5);\n  }\n}\n\n.hairline(@direction, @color: @COLOR_BORDER) when (@direction = 'right') {\n  &::after {\n    .scale-hairline-common(@color, 0, 0, 0, auto);\n    width: 1px;\n    transform: scaleX(0.5);\n  }\n}\n\n.hairline(@direction, @color: @COLOR_BORDER) when (@direction = 'bottom') {\n  &::after {\n    .scale-hairline-common(@color, auto, 0, 0, 0);\n    height: 1px;\n    transform: scaleY(0.5);\n  }\n}\n\n.hairline(@direction, @color: @COLOR_BORDER) when (@direction = 'left') {\n  &::after {\n    .scale-hairline-common(@color, 0, auto, 0, 0);\n    width: 1px;\n    transform: scaleX(0.5);\n  }\n}\n\n.hairline-popover(@direction, @color: @COLOR_BORDER)\n  when\n  (@direction = 'bottom') {\n  &::after {\n    .scale-hairline-common(@color, auto, 0, 0, 104 * @rpx);\n    height: 1px;\n    transform: scaleY(0.5);\n  }\n}\n.hairline-collapse(@direction, @color: @COLOR_BORDER)\n  when\n  (@direction = 'bottom') {\n  &::after {\n    .scale-hairline-common(@color, auto, 0, 0, 24 * @rpx);\n    height: 1px;\n    transform: scaleY(0.5);\n    width: 100%;\n  }\n}\n\n.hairline-picker(@direction) when (@direction = 'bottom') {\n  &::after {\n    .scale-hairline-common(#e5e5e5, auto, 0, 0, 0);\n    height: 1px;\n    transform: scaleY(0.5);\n    width: 100%;\n  }\n}\n\n.hairline-radius(@color: @COLOR_BORDER, @radius) {\n  position: relative;\n  &::before {\n    content: '';\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 200%;\n    height: 200%;\n    transform-origin: 0 0;\n    pointer-events: none;\n    border: 1px solid @color;\n    border-radius: @radius;\n    transform: scale(0.5);\n    box-sizing: border-box;\n  }\n}\n"
  },
  {
    "path": "src/style/themes/color.less",
    "content": "/* 给css变量的默认底色，用来兜底使用 */\n\n@COLOR_Link_DEFAULT: #4b6b99;\n\n@COLOR_BORDER_GREYCARD_DEFAULT: #e5e5e5;\n\n@COLOR_BRAND1_DEFAULT: #1677ff;\n@COLOR_BRAND1_FADED_1: fade(@COLOR_BRAND1_DEFAULT, 10%);\n@COLOR_BRAND1_FADED_3: fade(@COLOR_BRAND1, 30%);\n@COLOR_BRAND2_DEFAULT: #1677ff;\n\n@COLOR_BRAND1: @COLOR_BRAND1_DEFAULT;\n\n@COLOR_BRAND2: @COLOR_BRAND2_DEFAULT;\n\n@COLOR_LINK: @COLOR_Link_DEFAULT;\n\n@COLOR_WATHET_DEFAULT: #e7f1ff;\n@COLOR_WATHET: @COLOR_WATHET_DEFAULT;\n\n@COLOR_RED_DEFAULT: #ff3141;\n@COLOR_RED: @COLOR_RED_DEFAULT;\n@COLOR_RED_FADED: fade(@COLOR_RED_DEFAULT, 30%);\n\n@COLOR_YELLOW_DEFAULT: #ff9f18;\n@COLOR_YELLOW: @COLOR_YELLOW_DEFAULT;\n\n@COLOR_GREEN_DEFAULT: #22b35e;\n@COLOR_GREEN: @COLOR_GREEN_DEFAULT;\n@COLOR_GREEN_FADED: fade(@COLOR_GREEN_DEFAULT, 30%);\n\n@COLOR_TEXT_PRIMARY_DEFAULT: #333333;\n@COLOR_TEXT_PRIMARY: @COLOR_TEXT_PRIMARY_DEFAULT;\n\n@COLOR_WHITE_DEFAULT: #ffffff;\n@COLOR_WHITE: @COLOR_WHITE_DEFAULT;\n@COLOR_WHITE_FADED: fade(@COLOR_WHITE_DEFAULT, 92%);\n\n@COLOR_TEXT_ASSIST_DEFAULT: #999999;\n@COLOR_TEXT_ASSIST: @COLOR_TEXT_ASSIST_DEFAULT;\n\n@COLOR_BORDER_DEFAULT: #e5e5e5;\n@COLOR_BORDER: @COLOR_BORDER_DEFAULT;\n@COLOR_BORDER_GREYCARD: @COLOR_BORDER_GREYCARD_DEFAULT;\n\n@COLOR_BACKGROUND_DEFAULT: #f5f5f5;\n@COLOR_BACKGROUND: @COLOR_BACKGROUND_DEFAULT;\n\n@COLOR_BACKGROUND2_DEFAULT: #f0f3f7;\n@COLOR_BACKGROUND2: @COLOR_BACKGROUND2_DEFAULT;\n\n@COLOR_TEXT_WEAK_DEFAULT: #cccccc;\n@COLOR_TEXT_WEAK: @COLOR_TEXT_WEAK_DEFAULT;\n@COLOR_TEXT_WEAK_FADED: fade(@COLOR_TEXT_WEAK, 60%);\n\n@COLOR_CARD_DEFAULT: #ffffff;\n@COLOR_CARD: @COLOR_CARD_DEFAULT;\n@COLOR_CARD_FADED_95: fade(@COLOR_CARD, 95);\n@COLOR_CARD_FADED_60: fade(@COLOR_CARD, 60);\n\n@COLOR_CARD2_DEFAULT: #ffffff;\n@COLOR_CARD2: @COLOR_CARD2_DEFAULT;\n\n@COLOR_WHITE_CARD_DEFAULT: #ffffff;\n@COLOR_WHITE_CARD: @COLOR_WHITE_CARD_DEFAULT;\n\n@COLOR_TEXT_SECONDARY_DEFAULT: #666666;\n@COLOR_TEXT_SECONDARY: @COLOR_TEXT_SECONDARY_DEFAULT;\n\n@COLOR_GREY_CARD_DEFAULT: #f5f5f5;\n@COLOR_GREY_CARD: @COLOR_GREY_CARD_DEFAULT;\n\n@COLOR_BLACK_CARD_DEFAULT: #000000;\n@COLOR_BLACK_CARD: @COLOR_BLACK_CARD_DEFAULT;\n\n@COLOR_ORANGE_DEFAULT: #ff6430;\n@COLOR_ORANGE: @COLOR_ORANGE_DEFAULT;\n@COLOR_ORANG_FADED: fade(@COLOR_ORANGE, 30%);\n\n@COLOR_BLACK_DEFAULT: #000000;\n@COLOR_BLACK: @COLOR_BLACK_DEFAULT;\n@COLOR_BLACK_FADED: fade(@COLOR_BLACK, 0%);\n@COLOR_BLACK_FADED_20: fade(@COLOR_BLACK, 20%);\n@COLOR_BLACK_FADED_10: fade(@COLOR_BLACK, 10%);\n@COLOR_BLACK_FADED_8: fade(@COLOR_BLACK, 8%);\n\n@COLOR_WHITE_DYNAMIC_DEFAULT: #ffffff;\n@COLOR_WHITE_DYNAMIC: @COLOR_WHITE_DYNAMIC_DEFAULT;\n\n@COLOR_WHITE_CHANGE_DEFAULT: @COLOR_WHITE;\n@COLOR_WHITE_CHANGE: @COLOR_WHITE_CHANGE_DEFAULT;\n\n@COLOR_BLACK_CHANGE_DEFAULT: @COLOR_BLACK;\n@COLOR_BLACK_CHANGE: @COLOR_BLACK_CHANGE_DEFAULT;\n\n// 以下是没有是颜色系统里面的\n@COLOR_GOLDEN_2: #fff3d9;\n@COLOR_GOLDEN_3: #fff9ed;\n\n@COLOR_TANGERINE_1: #ff6010;\n@COLOR_TANGERINE_2: #ffece3;\n\n@COLOR_GREY_2: #e5e5e5;\n@COLOR_TEXT_WARNING: #ff3b30;\n\n@COLOR_ORANGE_1: #ff8f1f;\n@COLOR_ORANGE_2: #ffefdf;\n\n@COLOR_POMONAGREEN_1: #00b578;\n@COLOR_POMONAGREEN_2: #d4fff1;\n\n@color-ironblack-1: #454955; //铁黑\n\n@COLOR_BACKGROUND_POPOVER: #404040; //popover默认底色\n"
  },
  {
    "path": "src/style/themes/index.less",
    "content": "@import (reference) './color.less';\n\n// @hd: 1px;\n// @rpx: 0.5 * @hd;\n@rpx: 1rpx;\n@size-base: 8 * @rpx;\n@default-line-height: 1.4;\n\n//尺寸\n@size-0: 0;\n@size-1: @size-base * 1;\n@size-2: @size-base * 2;\n@size-3: @size-base * 3;\n@size-4: @size-base * 4;\n@size-5: @size-base * 5;\n@size-6: @size-base * 6;\n@size-7: @size-base * 7;\n@size-8: @size-base * 8;\n@size-9: @size-base * 9;\n@size-10: @size-base * 10;\n@size-11: @size-base * 11;\n@size-12: @size-base * 12;\n@size-13: @size-base * 13;\n@size-14: @size-base * 14;\n@size-15: @size-base * 15;\n@size-16: @size-base * 16;\n@size-17: @size-base * 17;\n@size-18: @size-base * 18;\n@size-19: @size-base * 19;\n@size-20: @size-base * 20;\n@sizeIconFont: 44 * @rpx;\n\n@font-size-subcontent: 24 * @rpx; //次常规内容\n@font-size-content: 26 * @rpx; //常规内容\n@font-size-subtitle: 30 * @rpx; //小标题\n@font-size-list: 34 * @rpx; //列表\n@font-size-title: 36 * @rpx; //大标题\n@font-size-list: 34 * @rpx; //列表\n@font-size-weak: 22 * @rpx; //弱化内容和弱辅助文案\n\n@opacity-disabled: 0.4;\n@opacity-product-mask: 0.6;\n@opacity-marketing-mask: 0.75;\n\n@h-spacing-mini: 8 * @rpx; //更小间距\n@h-spacing-small: 12 * @rpx; //小间距\n@h-spacing-standard: 16 * @rpx; //标准\n@h-spacing-large: 24 * @rpx; //大间距\n@v-spacing-small: 12 * @rpx; //更小间距\n@v-spacing-standard: 16 * @rpx; //标准\n@v-spacing-large: 24 * @rpx; //大间距\n\n//圆角\n@corner-radius-sm: 4 * @rpx; //小\n@corner-radius-md: 8 * @rpx; //中\n@corner-radius-md-plus: 12 * @rpx; //中加\n@corner-radius-lg: 16 * @rpx; //大\n@corner-radius-xl: 24 * @rpx;\n@corner-radius-xxl: 46 * @rpx;\n@corner-radius-circle: 50vh; //圆\n\n//行高\n@line-height-base: 1; // 单行行高\n@line-height-paragraph: 1.5; // 多行行高\n\n//图标尺寸\n@icon-size-xs: 36 * @rpx; //特小\n@icon-size-sm: 44 * @rpx; //小\n@icon-size-md: 56 * @rpx; //中\n@icon-size-lg: 64 * @rpx; //大\n\n//边框尺寸\n@border-width-standard: 2 * @rpx; //标准\n@border-width-thick: 4 * @rpx; //粗\n\n@color-product-mask: fade(@COLOR_BLACK, @opacity-product-mask*100); //产品蒙层\n@color-marketing-mask: fade(\n  @COLOR_BLACK,\n  @opacity-marketing-mask*100\n); //营销蒙层\n\n@SIZE_RADIUS_XS: 8 * @rpx;\n@SIZE_RADIUS_S: 16 * @rpx;\n@SIZE_RADIUS_M: 24 * @rpx;\n@SIZE_RADIUS_L: 32 * @rpx;\n@SIZE_RADIUS_XL: 40 * @rpx;\n@SIZE_RADIUS_DIALOG: 48 * @rpx;\n\n@SIZE_SPACE_PAGE_MARGIN: 16 * @rpx;\n\n@SIZE_SPACE1: 4 * @rpx;\n\n@OPACITY_PRESS: 0.08;\n@OPACITY_DISABLE: 0.4;\n@OPACITY_MASK: 0.55;\n@OPACITY_MODULE: 0.9;\n\n@sizeFont1: 22 * @rpx;\n@sizeFont2: 24 * @rpx;\n@sizeFont3: 26 * @rpx;\n@sizeFont4: 28 * @rpx;\n@sizeFont5: 30 * @rpx;\n@sizeFont6: 32 * @rpx;\n\n@sizeFont7: 34 * @rpx;\n@sizeFont8: 36 * @rpx;\n@sizeFont9: 40 * @rpx;\n@sizeFont10: 48 * @rpx;\n@sizeFont11: 56 * @rpx;\n@sizeFont12: 64 * @rpx;\n@sizeFont13: 72 * @rpx;\n@sizeFont14: 88 * @rpx;\n"
  },
  {
    "path": "src/style/themes/theme-black.less",
    "content": "/* 深色主题 */\n:root,\npage {\n  // primary\n  --color-brand1: #3086ff;\n  --color-border-faded: rgba(48, 134, 255, 0.9);\n  --color-brand2: #0a0a0a;\n  // secondary\n  --color-link: #3f5980;\n  --color-wathet: #0d2543;\n  --color-orange: #e65a2b;\n  --color-yellow: #ffa930;\n  --color-green: #34b368;\n  --color-red: #ff4a58;\n\n  // neutral\n  --color-text-primary: #c5cad1;\n  --color-text-secondary: #808080;\n  --color-text-assist: #616161;\n  --color-text-weak: #474747;\n  --color-text-weak-faded: rgba(71, 71, 71, 0.6);\n  --color-border: #2b2b2b;\n  --color-border-greycard: #444444;\n  --color-background2: #121212;\n  --color-background: #121212;\n  --color-card: #1a1a1a;\n  --color-card2: #222222;\n  --color-white-card: #2b2b2b;\n  --color-grey-card: #2b2b2b;\n  --color-black-card: #525252;\n  --color_text_secondary: #808080;\n\n  // reverse\n  --color-white: #ffffff;\n  --color-black: #000000;\n  --color-black-fade: rgba(0, 0, 0, 1);\n  --color-white-dynamic: #c5cad1;\n  --color-white-change: #000000;\n  --color-black-change: #ffffff;\n\n  // 以下没在颜色系统中\n  --color-golden-2: #fff3d9;\n  --color-golden-3: #fff9ed;\n\n  --color-tangerine-1: #ff6010;\n  --color-tangerine-2: #ffece3;\n  --color-grey-2: #444444;\n  --color-text-warning: #ff3b30;\n  --color-orange-1: #ff8f1f;\n  --color-orange-2: #ffefdf;\n  --color-pomonagreen-1: #00b578;\n  --color-pomonagree-2: #d4fff1;\n\n  // radius\n  --size-radius-xs: 8rpx;\n  --size-radius-s: 16rpx;\n  --size-radius-m: 24rpx;\n  --size-radius-l: 32rpx;\n  --size-radius-xl: 40rpx;\n  --size-radius-xxl: 48rpx;\n\n  // space\n  --size-space-page-margin: 16rpx;\n  --size-space1: 4rpx;\n\n  // opacity\n  --opacity-press: 0.08;\n  --opacity-disabled: 0.4;\n  --opacity-mask: 0.55;\n  --opacity-module: 0.9;\n\n  // font-size\n  --size-font1: 22rpx;\n  --size-font2: 24rpx;\n  --size-font3: 26rpx;\n  --size-font4: 28rpx;\n  --size-font5: 30rpx;\n  --size-font6: 32rpx;\n  --size-font7: 34rpx;\n  --size-font8: 36rpx;\n  --size-font9: 40rpx;\n  --size-font10: 48rpx;\n  --size-font11: 56rpx;\n  --size-font12: 64rpx;\n\n  // popoverList\n  --popover-content-bg: rgba(255, 255, 255, 0.45);\n  --popover-content-color: #c5cad1;\n\n  // button\n  --button-disabled-opacity: 0.4;\n  --button-color: #3086ff;\n  --button-background-color: #1a1a1a;\n  --button-border-color: #3086ff;\n  --button-primary-border-color: #3086ff;\n  --button-primary-background-color: #3086ff;\n  --button-primary-color: #ffffff;\n  --button-primary-aide-border-color: #0d2543;\n  --button-primary-aide-color: #3086ff;\n  --button-default-aide-border-color: #121212;\n  --button-default-aide-background-color: #1a1a1a;\n  --button-default-aide-color: #c5cad1;\n  --button-primary-danger-background-color: #ff4a58;\n  --button-primary-danger-border-color: #ff4a58;\n  --button-primary-danger-color: #ffffff;\n  --button-default-danger-background-color: #1a1a1a;\n  --button-default-danger-border-color: #ff4a58;\n  --button-default-danger-color: #ff4a58;\n  --button-text-danger-color: #ff4a58;\n  --button-danger-default-color: #ff4a58;\n  --button-active-bg: rgba(255, 255, 255, 0.08);\n\n  // actionsheet\n  --actionsheet-danger-color: #ff4a58;\n  --actionsheet-title-color: #616161;\n  --actionsheet-item-color: #c5cad1;\n  --actionsheet-item-active-bg: #2b2b2b;\n  --activesheet-item-cancel-bg: #121212;\n\n  // tabbar\n  --tabbar-bg: #1a1a1a;\n  --tabbar-item-color: #808080;\n  --tabbar-active-color: #3086ff;\n\n  // tabs\n  --tabs-basic-color: #c5cad1;\n  --tabs-weaken-color: #616161;\n  --tabs-inverse-color: #1a1a1a;\n  --tabs-active-color: #3086ff;\n  --tabs-active-decorate-color: #3086ff;\n  --tabs-underline-border-color: #2b2b2b;\n  --tabs-plus-color: #000000;\n  --tabs-capsule-title-bg: #121212;\n  --tabs-subtitle-color: #1a1a1a;\n  --tabs-count-color: #474747;\n  --tabs-badge-size: 28rpx;\n\n  // feedBack\n  --feedback-text-color: #c5cad1;\n  --feedback-background-color: rgba(216, 216, 216, 0.42);\n  --feedback-mask-color: rgba(0, 0, 0, 0.25);\n  --feedback-content-background-color: #ffffff;\n  --feedback-list-background-color: #121212;\n  --feedback-list-text-color: #c5cad1;\n\n  // calendar\n  --calendar-cell-disabled-opacity: 0.4;\n  --calendar-weekday-names-bg: #070707;\n  --calendar-default-color: #c5cad1;\n  --calendar-selected-color: rgba(22, 119, 255, 0.1);\n  --calendar-assist-color: #616161;\n  --calendar-selected-end-color: #ffffff;\n  --calendar-selected-color: #3086ff;\n\n  // collapse\n  --collapse-title-background-color: #1a1a1a;\n  --collapse-title-color: #c5cad1;\n  --collapse-title-icon-color: #474747;\n  --collapse-content-background-color: #1a1a1a;\n  --collapse-border-color: #2b2b2b;\n  --collapse-node-text-color: #616161;\n  --collapse-container-background-color: #1a1a1a;\n\n  // container\n  --container-header-color: #c5cad1;\n  --container-color-text-assist: #616161;\n  --container-background-color: #1a1a1a;\n\n  // divider\n  --divider-text-color: #c5cad1;\n  --divider-border-color: #2b2b2b;\n\n  // empty\n  --empty-text-color: #c5cad1;\n  --empty-asisst-text-color: #616161;\n\n  // grid\n  --ant-grid-title-color: #c5cad1;\n  --ant-grid-description-color: #616161;\n  --ant-grid-border-color: #2b2b2b;\n\n  // guide-tour\n  --guide-tour-text-color: #ffffff;\n  --guide-tour-clear-color: #616161;\n  --guide-tour-dot-color: #616161;\n  --guide-tour-border-color: #2b2b2b;\n  --guide-tour-btn-color: #333333;\n\n  // indexbar\n  --index-bar-tip-background-color: #474747;\n  --index-bar-text-color: #ffffff;\n  --index-bar-assist-color: #616161;\n  --index-bar-active-color: #3086ff;\n\n  // input\n  --input-item-color: #c5cad1;\n  --input-item-placeholder-color: #474747;\n  --input-item-clear-color: #616161;\n  --input-background-color: #1a1a1a;\n\n  // list\n  --list-header-color: #616161;\n  --list-footer-color: #616161;\n  --list-background-color: #1a1a1a;\n  --list-content-color: #c5cad1;\n  --list-extra-brief-color: #616161;\n  --list-item-border-color: #2b2b2b;\n  --list-item-text-color: #474747;\n\n  // progress\n  --progress-stroke-color: #3086ff;\n  --progress-trail-color: #121212;\n  --progress-success-color: #34b368;\n  --progress-indicator-color: #c5cad1;\n  --progress-exception-color: #ff4a58;\n  --progress-assist-color: #616161;\n\n  // stepsf\n  --steps-non-active-bg: #444444;\n  --steps-title-color: #c5cad1;\n  --steps-desc-color: #616161;\n  --steps-default-bg: #3086ff;\n  --steps-finish-bg: #ff4a58;\n\n  // swipe-action\n  --swipe-action-color: #ffffff;\n\n  // tag\n  --tag-primary-color: #3086ff;\n  --tag-warning-color: #e65a2b 橙色;\n  --tag-danger-color: #ff4a58;\n  --tag-success-color: #34b368;\n  --tag-primary-light-color: #0d2543;\n  --tag-warning-light-color: #ffefdf;\n  --tag-danger-light-color: #ffece3;\n  --tag-success-light-color: #d4fff1;\n  --tag-base-color: #ffffff;\n  --tag-primary-color-faded: rgba(22, 119, 255, 0.3);\n  --tag-warning-color-faded: rgba(255, 100, 48, 0.7);\n  --tag-danger-color-faded: rgba(255, 49, 65, 0.7);\n  --tag-success-color-faded: rgba(34, 179, 94, 0.7);\n\n  // checkbox\n  --checkbox-header-color: #616161;\n  --checkbox-border-color: #474747;\n  --checkbox-background-color: #3086ff;\n  --checkbox-disabled-background: #121212;\n  --checkbox-text-color: #c5cad1;\n  --checkbox-fake-icon-background-color: #1a1a1a;\n\n  // checkboxList\n  --checklist-background-color: #3086ff;\n  --check-list-item-title-color: #c5cad1;\n  --check-list-item-background-color: #1a1a1a;\n  --check-list-item-hover-background-color: #2b2b2b;\n  --check-list-item-content-color: #c5cad1;\n  --check-list-item-description-color: #616161;\n\n  // data-picker\n  --range-picker-shadow-color: #000000;\n  --range-picker-item-color: #c5cad1;\n  --range-picker-active-color: #3086ff;\n  --range-picker-placeholder-color: #474747;\n  --range-picker-shadow-color-faded: rgba(0, 0, 0, 0.9);\n\n  // form\n  --form-text-color: #474747;\n  --form-item-color: #808080;\n  --form-item-bg: #1a1a1a;\n  --form-error-color: #ff4a58;\n  --form-extra-color: #616161;\n  --form-asterisk-color: #ff3b30;\n\n  // imageUpload\n  --image-upload-wrapper-background: #121212;\n  --image-upload-cover-background: rgba(0, 0, 0, 0.4);\n  --image-upload-text-color: #ffffff;\n  --image-upload-background-color: #1a1a1a;\n\n  // loading\n  --loading-text-color: #454955; //铁黑\n  --loading-icon-light-color: #999;\n\n  // mask\n  --mask-background-color: rgba(0, 0, 0, 0.55);\n\n  // numberKeyboard\n  --number-key-board-active-background-color: #d3d3d3;\n  --number-key-board-text-color: #c5cad1;\n  --number-key-board-none-text-color: #616161;\n  --number-key-board-iphonex-safe-background-color: #1a1a1a;\n  --number-key-board-background-color: #121212;\n  --number-key-board-border-color: #2b2b2b;\n  --number-key-board-transfer-bg: #3086ff;\n  --number-key-board-transfer-color: #ffffff;\n\n  // picker\n  --picker-item-color: #c5cad1;\n  --picker-header-action-color: #3086ff;\n  --picker-placeholder-color: #474747;\n  --picker-header-color: #2b2b2b;\n  --picker-content-background-color: #1a1a1a;\n  --picker-mask-bg-faded-95: rgba(255, 255, 255, 0.02);\n  --picker-mask-bg-faded-60: rgba(255, 255, 255, 0.01);\n\n  // radio\n  --radio-header-color: #616161;\n  --radio-border-color: #474747;\n  --radio-background-color: #3086ff;\n  --radio-disabled-background: #121212;\n  --radio-text-color: #c5cad1;\n  --radio-fake-icon-background-color: #1a1a1a;\n  --radio-icon-color: #ffffff;\n\n  // popoverList\n  --popover-list-content-bg: rgba(0, 0, 0, 0.93);\n  --popover-list-content-color: #ffffff;\n  --popover-list-badge-color: #ff411c;\n  --popover-list-item-bg: #444444;\n\n  // rare-words\n  --rare-words-bg: rgba(0, 0, 0, 0.45);\n  --rare-keyboard-bg: #4a4a4a;\n  --rare-words-keyboard-color: #c5cad1;\n  --rare-words-border-color: #2b2b2b;\n  --rare-words-kb-bg: #121212;\n  --rare-words-pinyin-key-color: #1a1a1a;\n  --rare-words-inner-bg: #474747;\n  --rare-words-active-color: #3086ff;\n  --rare-words-pinyin-color: #121212;\n  --rare-words-keyboard-bg: #4a4a4a;\n  --rare-words-item-tips-color: #808080;\n\n  // selector\n  --selector-background-color: #1a1a1a;\n  --selector-item-background: #121212;\n  --selector-item-active-background: #0d2543;\n  --selector-item-color: #c5cad1;\n  --selector-item-sub-color: #616161;\n  --selector-item-color: #3086ff;\n\n  //slide\n  --slide-block-shadow: rgba(0, 0, 0, 0.12);\n  --slider-default-primary-color: #3086ff;\n  --slider-track-bg: #1a1a1a;\n  --slider-fill-bg: #121212;\n  --slider-number-color: #c5cad1;\n  --slide-block-bg: #ffffff;\n  --slide-block-shadow: rgba(0, 0, 0, 0.12);\n  --slide-back-bg: #121212;\n\n  // stepper\n  --stepper-handler-tap-bg: #ddd;\n  --stepper-handler-border-color: #444444;\n  --stepper-border-color: #444444;\n  --stepper-background-color: #1a1a1a;\n  --stepper-hover-bg: rgba(0, 0, 0, 0.92);\n  --stepper-input-font-color: #c5cad1;\n\n  // switch\n  --switch-fill: #3086ff;\n  --switch-border-color: #2b2b2b;\n  --switch-loading-color: #3086ff;\n  --switch-handle-bg: #ffffff;\n  --switch-inner-color: #616161;\n\n  // dialog\n  --dialog-background-color: #1a1a1a;\n  --dialog-title-color: #c5cad1;\n  --dialog-content-color: #c5cad1;\n  --dialog-close-text-color: #616161;\n\n  // modal\n  --modal-background-color: #1a1a1a;\n  --modal-title-color: #c5cad1;\n  --modal-content-color: #c5cad1;\n  --modal-close-text-color: #616161;\n\n  // popover\n  --color-background-popover: #404040; //popover默认底色\n  --popover-bg: #1a1a1a;\n  --popover-text-color: #ffffff;\n  --popover-inner-color: #ffffff;\n\n  // popup\n  --popup-background: #1a1a1a;\n  --popup-color: #c5cad1;\n  --popup-assit-color: #616161;\n  --popup-mask-close-bg: rgba(0, 0, 0, 0);\n\n  // rate\n  --rate-active-icon: #ffa930;\n  --rate-icon-color: #2b2b2b;\n\n  // result\n  --result-main-background: #1a1a1a;\n  --result-title-color: #ffffff;\n  --result-desc-color: #c5cad1;\n  --result-success-color: #3086ff;\n  --result-error-color: #ff544a;\n  --result-warning-color: #ff9c38;\n  --result-wait-color: #12b57e;\n\n  // skeleton\n  --skeleton-animation-25: #2b2b2b;\n  --skeleton-animation-37: rgba(204, 204, 204, 0.6);\n  --skeleton-animation-63: #2b2b2b;\n  // toast\n  --toast-default-bg: rgba(0, 0, 0, 0.75);\n  --toast-default-color: #ffffff;\n\n  // badge\n  --badge-text-color: #ffffff;\n  --badge-background-color: #ff4a58;\n\n  // notice-bar\n  --notice-background-color: #fff9ed;\n  --notice-border-color: #fff3d9;\n  --notice-color: #ff6010;\n  --notice-error-border-color: #fff3d9;\n  --notice-error-color: #ffffff;\n  --notice-error-background-color: #ff4a58;\n  --notice-primary-border-color: rgba(22, 119, 255, 0.72);\n  --notice-primary-color: #3086ff;\n  --notice-primary-background-color: rgba(208, 228, 255, 1);\n  --notice-info-text-color: #ffffff;\n  --notice-info-background-color: #808080;\n\n  // page-container\n  --page-container-background-color: #121212;\n\n  // typography\n  --typography-container-color: #c5cad1;\n\n  // pagination\n  --pagination-area-background-color: #f5f5f5;\n  --pagination-move-background-color: #3086ff;\n\n  // table\n  --table-item-color: #c5cad1;\n  --table-item-bg: #1a1a1a;\n  --table-shadow-color: rgba(5, 5, 5, 0.06);\n  --table-empty-bg: #c5cad1;\n  // sticky\n  --sticky-check-bg: rgba(238, 238, 238, 0);\n  // voucher\n  --voucher-background-image-start: rgba(255, 255, 255, 0);\n  --voucher-background-image-end: #fff;\n  --voucher-multi-money-color: #ff3b30;\n  --voucher-threshold-color: #808080;\n  --voucher-action-btn-color: #ff4a58;\n  --voucher-action-bg: #ffffff;\n  --voucher-action-left-bg: #c5cad1;\n  --voucher-action-left-threshold-bg: #c5cad1;\n  --voucher-action-right-color: #c5cad1;\n  --voucher-action-right-title-color: #c5cad1;\n  --voucher-action-right-desc-color: rgba(255, 255, 255, 0.8);\n  --voucher-item-right-title-color: #383939;\n  --voucher-item-right-title-color: #808080;\n  // card\n  --ant-card-bg: #1a1a1a;\n  --ant-card-header-title-color: #c5cad1;\n  --ant-card-header-link-color: #616161;\n  --ant-card-fold-btn-color: #3086ff;\n  --ant-card-divider-color: #2b2b2b;\n  // countdown\n  --ant-countdown-color: #808080;\n  --ant-countdown-number-color: #000000;\n  --ant-countdown-number-bg: #3086ff;\n  // select-contact\n  --select-contact-search-bar-focus-color: #3086ff;\n  --select-contact-search-cancel-color: #c5cad1;\n  --select-contact-wrap-loading-bg: #1a1a1a;\n  --select-contact-scroll-bg: #1a1a1a;\n  --select-contact-list-bg: #1a1a1a;\n  --select-contact-title-bg: #1a1a1a;\n  --select-contact-title-color: #999;\n  --select-contact-title-first-color: #c5cad1;\n  --select-contact-title-first-border: #2b2b2b;\n  --select-contact-tag-color: #ff6010;\n  --select-contact-tag-border: #ffcfb7;\n  --select-contact-empty-bg: #1a1a1a;\n  --select-contact-empty-color: #616161;\n  --select-contact-loading-bg: #616161;\n  --select-contact-display-light-color: #fa6300;\n\n  // number-input\n  --number-input-background-color: #1a1a1a;\n  --number-input-title-color: #c5cad1;\n  --number-input-link-color: #3f5980;\n  --number-input-unit-color: #616161;\n  --number-input-border-color: #2b2b2b;\n  --number-input-prefix-color: #c5cad1;\n  --number-input-caret-color: #3086ff;\n  --number-input-quick-text-color: #3086ff;\n  --number-input-quick-border-color: #3086ff;\n  // postScript\n  --postscript-background-color: #1a1a1a;\n  --postscript-title-color: #c5cad1;\n  --postscript-input-color: #c5cad1;\n  --postscript-caret-color: #3086ff;\n  --postscript-placeholder-color: #474747;\n  --postscript-quick-text-color: #808080;\n  --postscript-quick-border-color: #2b2b2b;\n  // footer\n  --footer-color: #474747;\n  --footer-divider-color: #2b2b2b;\n  --footer-link-color: #3086ff;\n  --footer-chip-background-color: #121212;\n  --footer-chip-color: #3086ff;\n  --footer-chip-disabled-background-color: #2b2b2b;\n  --footer-chip-disabled-color: #616161;\n  // thought-chain\n  --thought-chain-title-color: rgba(255, 255, 255, 0.45);\n  --thought-chain-content-color: rgba(255, 255, 255, 0.55);\n  // welcome\n  --welcome-background-color: linear-gradient(106deg, #0d0601 0%, #080c00 100%);\n  --welcome-text-color: rgba(255, 255, 255, 0.88);\n  // terms\n  --terms-fixed-background-color: #1a1a1a;\n  --terms-fixed-border-color: #2b2b2b;\n  --terms-protocol-item-color: #3086ff;\n  --terms-protocol-text-color: #616161;\n  --terms-read-shadow-background: linear-gradient(\n    180deg,\n    rgba(255, 255, 255, 0) 12%,\n    #1a1a1a 86%\n  );\n  --terms-read-protocol-border: #2b2b2b;\n  --terms-read-protocol-box-shadow-color: rgba(0, 0, 0, 0.1);\n  --terms-read-protocol-item-color: #c5cad1;\n  --terms-read-protocol-text-color: #616161;\n\n  // prompts\n  --prompts-title-color: rgba(255, 255, 255, 0.25);\n  --prompts-item-border-color: rgba(255, 255, 255, 0.1);\n  --prompts-item-label-color: rgba(255, 255, 255, 0.88);\n  --prompts-item-description-color: rgba(255, 255, 255, 0.88);\n  --prompts-item-arrow-color: rgba(255, 255, 255, 0.45);\n\n  // conversations\n  --conversations-swipe-item-view-label-color: rgba(255, 255, 255, 0.88);\n  --conversations-swipe-item-view-timestamp-color: #b0b0b0;\n  --conversations-swipe-item-view-desc-color: rgba(255, 255, 255, 0.45);\n\n  // suggestion\n  --suggestion-item-border-color: rgba(255, 255, 255, 0.15);\n  --suggestion-item-text-color: rgba(255, 255, 255, 0.85);\n\n  // actions\n  --actions-background-color: #1f1f1f;\n  --actions-item-hover-background-color: #2f2f2f;\n\n  // bubble\n  --bubble-background-color: #1f1f1f;\n  --bubble-user-background-color: #1668dc; // 深色模式下稍微暗一点的蓝色\n  --bubble-text-color: rgba(255, 255, 255, 0.85);\n  --bubble-text-color-user: #ffffff;\n\n  // sender\n  --sender-background-color: #141414;\n  --sender-text-color: rgba(255, 255, 255, 0.85);\n  --sender-placeholder-color: rgba(255, 255, 255, 0.3);\n  --sender-send-color: #1668dc;\n  --sender-input-text-color: rgba(255, 255, 255, 0.85);\n  --sender-input-caret-color: #1668dc;\n  --sender-focus-border-color: #1668dc;\n  --sender-max-height: 192rpx; // 保持不变\n}\n"
  },
  {
    "path": "src/style/themes/theme-mode.less",
    "content": "/* 浅色模式的css变量 */\n@media (prefers-color-scheme: light) {\n  @import url(\"../variables.less\");\n}\n\n/* 深色模式的css变量 */\n@media (prefers-color-scheme: dark) {\n  @import url(\"./theme-black.less\");\n}\n"
  },
  {
    "path": "src/style/variables.less",
    "content": "/* default主题，浅色主题 */\n:root,\npage {\n  // primary\n  --color-brand1: #1677ff;\n  --color-brand1-faded: rgba(22, 119, 255, 0.1);\n  --color-brand1-faded-3: rgba(22, 119, 255, 0.3);\n  --color-brand2: #1677ff;\n\n  // secondary\n  --color-link: #4b6b99;\n  --color-wathet: #e7f1ff;\n  --color-orange: #ff6430;\n  --color-orange-faded: rgba(255, 100, 48, 0.7);\n  --color-yellow: #ff9f18;\n  --color-green: #22b35e;\n  --color-green-faded: rgba(34, 179, 94, 0.7);\n  --color-red: #ff3141;\n  --color-red-faded: rgba(255, 49, 65, 0.7);\n\n  // neutral\n  --color-text-primary: #333333;\n  --color-text-secondary: #666666;\n  --color-text-assist: #999999;\n  --color-text-weak: #cccccc;\n  --color-text-weak-faded: rgba(204, 204, 204, 0.6);\n  --color-border: #eeeeee;\n  --color-border-greycard: #e5e5e5;\n\n  --color-background2: #f0f3f7;\n  --color-background: #f5f5f5;\n  --color-card: #ffffff;\n  --color-card-faded-95: rgba(255, 255, 255, 0.05);\n  --color-card-faded-60: rgba(255, 255, 255, 0.4);\n  --color-card2: #ffffff;\n  --color-white-card: #ffffff;\n  --color-grey-card: #f5f5f5;\n  --color-black-card: #000000e6;\n  --color-text-secondary: #666666;\n\n  // reverse\n  --color-white: #ffffff;\n  --color-white-faded: rgba(255, 255, 255, 0.08);\n  --color-black: #000000;\n  --color-black-fade: rgba(0, 0, 0, 1);\n  --color-black-fade-20: rgba(0, 0, 0, 0.2);\n  --color-black-fade-10: rgba(0, 0, 0, 0.1);\n  --color-black-fade-8: rgba(0, 0, 0, 0.08);\n  --color-white-dynamic: #ffffff;\n  --color-white-change: #ffffff;\n  --color-black-change: #000000;\n\n  // 以下没在颜色系统中\n  --color-golden-2: #fff3d9;\n  --color-golden-3: #fff9ed;\n\n  --color-tangerine-1: #ff6010;\n  --color-tangerine-2: #ffece3;\n  --color-grey-2: #e5e5e5;\n  --color-text-warning: #ff3b30;\n  --color-orange-1: #ff8f1f;\n  --color-orange-2: #ffefdf;\n  --color-pomonagreen-1: #00b578;\n  --color-pomonagree-2: #d4fff1;\n\n  // radius\n  --size-radius-xs: 8rpx;\n  --size-radius-s: 16rpx;\n  --size-radius-m: 24rpx;\n  --size-radius-l: 32rpx;\n  --size-radius-xl: 40rpx;\n  --size-radius-xxl: 48rpx;\n\n  // space\n  --size-space-page-margin: 16rpx;\n  --size-space1: 4rpx;\n\n  // opacity\n  --opacity-press: 0.08;\n  --opacity-disabled: 0.4;\n  --opacity-mask: 0.55;\n  --opacity-module: 0.9;\n\n  // font-size\n  --size-font1: 22rpx;\n  --size-font2: 24rpx;\n  --size-font3: 26rpx;\n  --size-font4: 28rpx;\n  --size-font5: 30rpx;\n  --size-font6: 32rpx;\n  --size-font7: 34rpx;\n  --size-font8: 36rpx;\n  --size-font9: 40rpx;\n  --size-font10: 48rpx;\n  --size-font11: 56rpx;\n  --size-font12: 64rpx;\n\n  // button\n  --button-disabled-opacity: 0.4;\n  --button-color: #1677ff;\n  --button-background-color: #ffffff;\n  --button-border-color: #1677ff;\n  --button-primary-border-color: #1677ff;\n  --button-primary-background-color: #1677ff;\n  --button-primary-color: #ffffff;\n  --button-primary-aide-border-color: #e7f1ff;\n  --button-primary-aide-color: #1677ff;\n  --button-default-aide-border-color: #f5f5f5;\n  --button-default-aide-background-color: #ffffff;\n  --button-default-aide-color: #333333;\n  --button-primary-danger-background-color: #ff3141;\n  --button-primary-danger-border-color: #ff3141;\n  --button-primary-danger-color: #ffffff;\n  --button-default-danger-background-color: #ffffff;\n  --button-default-danger-border-color: #ff3141;\n  --button-default-danger-color: #ff3141;\n  --button-text-danger-color: #ff3141;\n  --button-danger-default-color: #ff3141;\n  --button-active-bg: rgba(255, 255, 255, 0.08);\n  --button-inline-size: 30rpx;\n  --button-font-size: 38rpx;\n  --button-large-font-size: 38rpx;\n  --button-medium-font-size: 34rpx;\n  --button-small-font-size: 30rpx;\n  --button-icon-size: 44rpx;\n  --button-padding: 24rpx;\n  --button-large-padding: 24rpx;\n  --button-medium-padding-top: 16rpx;\n  --button-medium-padding-left: 24rpx;\n  --button-small-padding-top: 8rpx;\n  --button-small-padding-left: 24rpx;\n  --button-subtext-size: 24rpx;\n  --button-border-size: 2rpx;\n\n  // actionsheet\n  --actionsheet-danger-color: #ff3141;\n  --actionsheet-title-color: #999999;\n  --actionsheet-item-color: #333333;\n  --actionsheet-item-active-bg: #eeeeee;\n  --activesheet-item-cancel-bg: #f5f5f5;\n\n  // tabbar\n  --tabbar-bg: #ffffff;\n  --tabbar-item-color: #666666;\n  --tabbar-active-color: #1677ff;\n\n  // tabs\n  --tabs-basic-color: #333333;\n  --tabs-weaken-color: #999999;\n  --tabs-inverse-color: #ffffff;\n  --tabs-active-color: #1677ff;\n  --tabs-active-decorate-color: #1677ff;\n  --tabs-underline-border-color: #eeeeee;\n  --tabs-plus-color: #000000;\n  --tabs-capsule-title-bg: #f5f5f5;\n  --tabs-subtitle-color: #ffffff;\n  --tabs-count-color: #cccccc;\n  --tabs-badge-size: 28rpx;\n\n  // feedBack\n  --feedback-text-color: #333333;\n  --feedback-background-color: rgba(216, 216, 216, 0.42);\n  --feedback-mask-color: rgba(0, 0, 0, 0.25);\n  --feedback-content-background-color: #ffffff;\n  --feedback-list-background-color: #f5f5f5;\n  --feedback-list-text-color: #333333;\n\n  // calendar\n  --calendar-cell-disabled-opacity: 0.4;\n  --calendar-weekday-names-bg: #f8f8f8;\n  --calendar-default-color: #333333;\n  --calendar-selected-color: rgba(22, 119, 255, 0.1);\n  --calendar-assist-color: #999999;\n  --calendar-selected-end-color: #ffffff;\n  --calendar-selected-color: #1677ff;\n\n  // collapse\n  --collapse-title-background-color: #ffffff;\n  --collapse-title-color: #333333;\n  --collapse-title-icon-color: #cccccc;\n  --collapse-content-background-color: #ffffff;\n  --collapse-border-color: #eeeeee;\n  --collapse-node-text-color: #999999;\n  --collapse-container-background-color: #ffffff;\n\n  // container\n  --container-header-color: #333333;\n  --container-color-text-assist: #999999;\n  --container-background-color: #ffffff;\n\n  // divider\n  --divider-text-color: #333333;\n  --divider-border-color: #e5e5e5;\n\n  // empty\n  --empty-text-color: #333333;\n  --empty-asisst-text-color: #999999;\n\n  // grid\n  --ant-grid-title-color: #333333;\n  --ant-grid-description-color: #999999;\n  --ant-grid-border-color: #eeeeee;\n\n  // guide-tour\n  --guide-tour-text-color: #ffffff;\n  --guide-tour-clear-color: #999999;\n  --guide-tour-dot-color: #999999;\n  --guide-tour-border-color: #eeeeee;\n  --guide-tour-btn-color: #333333;\n\n  // indexbar\n  --index-bar-tip-background-color: #cccccc;\n  --index-bar-text-color: #ffffff;\n  --index-bar-assist-color: #999999;\n  --index-bar-active-color: #1677ff;\n\n  // input\n  --input-item-color: #333333;\n  --input-item-placeholder-color: #cccccc;\n  --input-item-clear-color: #999999;\n  --input-background-color: #ffffff;\n\n  // list\n  --list-header-color: #999999;\n  --list-footer-color: #999999;\n  --list-background-color: #ffffff;\n  --list-content-color: #333333;\n  --list-extra-brief-color: #999999;\n  --list-item-border-color: #eeeeee;\n  --list-item-text-color: #cccccc;\n\n  // progress\n  --progress-stroke-color: #1677ff;\n  --progress-trail-color: #f5f5f5;\n  --progress-success-color: #22b35e;\n  --progress-indicator-color: #333333;\n  --progress-exception-color: #ff3141;\n  --progress-assist-color: #999999;\n\n  // stepsf\n  --steps-non-active-bg: #e5e5e5;\n  --steps-title-color: #333333;\n  --steps-desc-color: #999999;\n  --steps-default-bg: #1677ff;\n  --steps-finish-bg: #ff3141;\n\n  // swipe-action\n  --swipe-action-color: #ffffff;\n\n  // tag\n  --tag-primary-color: #1677ff;\n  --tag-warning-color: #ff6430;\n  --tag-danger-color: #ff3141;\n  --tag-success-color: #22b35e;\n  --tag-primary-light-color: #e7f1ff;\n  --tag-warning-light-color: #ffefdf;\n  --tag-danger-light-color: #ffece3;\n  --tag-success-light-color: #d4fff1;\n  --tag-base-color: #ffffff;\n  --tag-primary-color-faded: rgba(22, 119, 255, 0.3);\n  --tag-warning-color-faded: rgba(255, 100, 48, 0.7);\n  --tag-danger-color-faded: rgba(255, 49, 65, 0.7);\n  --tag-success-color-faded: rgba(34, 179, 94, 0.7);\n\n  // checkbox\n  --checkbox-header-color: #999999;\n  --checkbox-border-color: #cccccc;\n  --checkbox-background-color: #1677ff;\n  --checkbox-disabled-background: #f5f5f5;\n  --checkbox-text-color: #333333;\n  --checkbox-fake-icon-background-color: #ffffff;\n\n  // checkboxList\n  --checklist-background-color: #1677ff;\n  --check-list-item-title-color: #333333;\n  --check-list-item-background-color: #ffffff;\n  --check-list-item-hover-background-color: #eeeeee;\n  --check-list-item-content-color: #333333;\n  --check-list-item-description-color: #999999;\n\n  // data-picker\n  --range-picker-shadow-color: #000000;\n  --range-picker-item-color: #333333;\n  --range-picker-active-color: #1677ff;\n  --range-picker-placeholder-color: #cccccc;\n  --range-picker-shadow-color-faded: rgba(0, 0, 0, 0.9);\n\n  // form\n  --form-text-color: #cccccc;\n  --form-item-color: #666666;\n  --form-item-bg: #ffffff;\n  --form-error-color: #ff3141;\n  --form-extra-color: #999999;\n  --form-asterisk-color: #ff3b30;\n\n  // imageUpload\n  --image-upload-cover-background: #ffffff;\n  --image-upload-wrapper-background: #f5f5f5;\n  --image-upload-background-color: #ffffff;\n  --image-upload-text-color: #ffffff;\n\n  // loading\n  --loading-text-color: #d8d8d8; //铁黑\n  --loading-icon-light-color: rgba(255, 255, 255, 0.6);\n\n  // mask\n  --mask-background-color: rgba(0, 0, 0, 0.55);\n\n  // numberKeyboard\n  --number-key-board-active-background-color: #d3d3d3;\n  --number-key-board-text-color: #333333;\n  --number-key-board-none-text-color: #999999;\n  --number-key-board-iphonex-safe-background-color: #ffffff;\n  --number-key-board-background-color: #f5f5f5;\n  --number-key-board-border-color: #eeeeee;\n  --number-key-board-transfer-bg: #1677ff;\n  --number-key-board-transfer-color: #ffffff;\n\n  // picker\n  --picker-item-color: #333333;\n  --picker-header-action-color: #1677ff;\n  --picker-placeholder-color: #cccccc;\n  --picker-header-color: #eeeeee;\n  --picker-content-background-color: #ffffff;\n  --picker-mask-bg-faded-95: rgba(255, 255, 255, 0.05);\n  --picker-mask-bg-faded-60: rgba(255, 255, 255, 0.4);\n\n  // radio\n  --radio-header-color: #999999;\n  --radio-border-color: #cccccc;\n  --radio-background-color: #1677ff;\n  --radio-disabled-background: #f5f5f5;\n  --radio-text-color: #333333;\n  --radio-fake-icon-background-color: #ffffff;\n  --radio-icon-color: #ffffff;\n\n  // popoverList\n  --popover-list-content-bg: rgba(0, 0, 0, 0.93);\n  --popover-list-content-color: #ffffff;\n  --popover-list-badge-color: #ff411c;\n  --popover-list-item-bg: #e5e5e5;\n\n  // rare-words\n  --rare-words-bg: rgba(0, 0, 0, 0.45);\n  --rare-keyboard-bg: #d8d8d8;\n  --rare-words-keyboard-color: #333333;\n  --rare-words-border-color: #eeeeee;\n  --rare-words-kb-bg: #f5f5f5;\n  --rare-words-pinyin-key-color: #ffffff;\n  --rare-words-inner-bg: #cccccc;\n  --rare-words-active-color: #1677ff;\n  --rare-words-pinyin-color: #f5f5f5;\n  --rare-words-keyboard-bg: #4a4a4a;\n  --rare-words-item-tips-color: #666666;\n\n  // selector\n  --selector-background-color: #ffffff;\n  --selector-item-background: #f5f5f5;\n  --selector-item-active-background: #e7f1ff;\n  --selector-item-color: #333333;\n  --selector-item-sub-color: #999999;\n  --selector-item-color: #1677ff;\n\n  //slide\n  --slide-block-shadow: rgba(0, 0, 0, 0.12);\n  --slider-default-primary-color: #1677ff;\n  --slider-track-bg: #ffffff;\n  --slider-fill-bg: #f5f5f5;\n  --slider-number-color: #333333;\n  --slide-block-bg: #ffffff;\n  --slide-block-shadow: rgba(0, 0, 0, 0.12);\n  --slide-back-bg: #f5f5f5;\n\n  // stepper\n  --stepper-handler-tap-bg: #ddd;\n  --stepper-handler-border-color: #e5e5e5;\n  --stepper-border-color: #e5e5e5;\n  --stepper-background-color: #ffffff;\n  --stepper-hover-bg: rgba(0, 0, 0, 0.08);\n  --stepper-input-font-color: #333333;\n\n  // switch\n  --switch-fill: #1677ff;\n  --switch-border-color: #eeeeee;\n  --switch-loading-color: #1677ff;\n  --switch-handle-bg: #ffffff;\n  --switch-inner-color: #999999;\n\n  // dialog\n  --dialog-background-color: #ffffff;\n  --dialog-title-color: #333333;\n  --dialog-content-color: #333333;\n  --dialog-close-text-color: #999999;\n\n  // modal\n  --modal-background-color: #ffffff;\n  --modal-title-color: #333333;\n  --modal-content-color: #333333;\n  --modal-close-text-color: #999999;\n\n  // popover\n  --popover-color-background: #404040; //popover默认底色\n  --popover-bg: #ffffff;\n  --popover-text-color: #000000;\n  --popover-inner-color: #ffffff;\n\n  // popup\n  --popup-background: #ffffff;\n  --popup-color: #333333;\n  --popup-assit-color: #999999;\n  --popup-mask-close-bg: rgba(0, 0, 0, 0);\n\n  // rate\n  --rate-active-icon: #ff9f18;\n  --rate-icon-color: #eeeeee;\n\n  // result\n  --result-main-background: #ffffff;\n  --result-title-color: #000000;\n  --result-desc-color: #333333;\n  --result-success-color: #1677ff;\n  --result-error-color: #ff3b30;\n  --result-warning-color: #ff8f1f;\n  --result-wait-color: #00b578;\n\n  // skeleton\n  --skeleton-animation-25: #eeeeee;\n  --skeleton-animation-37: rgba(204, 204, 204, 0.6);\n  --skeleton-animation-63: #eeeeee;\n  // toast\n  --toast-default-bg: rgba(0, 0, 0, 0.75);\n  --toast-default-color: #ffffff;\n\n  // badge\n  --badge-text-color: #ffffff;\n  --badge-background-color: #ff3141;\n\n  // notice-bar\n  --notice-background-color: #fff9ed;\n  --notice-border-color: #fff3d9;\n  --notice-color: #ff6010;\n  --notice-error-border-color: #fff3d9;\n  --notice-error-color: #ffffff;\n  --notice-error-background-color: #ff3141;\n  --notice-primary-border-color: rgba(22, 119, 255, 0.72);\n  --notice-primary-color: #1677ff;\n  --notice-primary-background-color: rgba(208, 228, 255, 1);\n  --notice-info-text-color: #ffffff;\n  --notice-info-background-color: #666666;\n  // page-container\n  --page-container-background-color: #f5f5f5;\n  // typography\n  --typography-container-color: #333333;\n  // pagination\n  --pagination-area-background-color: #f5f5f5;\n  --pagination-move-background-color: #1677ff;\n\n  // table\n  --table-item-color: #333333;\n  --table-item-bg: #ffffff;\n  --table-shadow-color: rgba(5, 5, 5, 0.06);\n  --table-empty-bg: #fff;\n\n  // sticky\n  --sticky-check-bg: rgba(238, 238, 238, 0);\n\n  // voucher\n  --voucher-background-image-start: rgba(255, 255, 255, 0);\n  --voucher-background-image-end: #fff;\n  --voucher-multi-money-color: #ff3b30;\n  --voucher-threshold-color: #666;\n  --voucher-action-btn-color: #ff3141;\n  --voucher-action-bg: #fff;\n  --voucher-action-left-bg: #fff;\n  --voucher-action-left-threshold-bg: #fff;\n  --voucher-action-right-color: #fff;\n  --voucher-action-right-title-color: #fff;\n  --voucher-action-right-desc-color: rgba(255, 255, 255, 0.8);\n  --voucher-item-right-title-color: #383939;\n  --voucher-item-right-title-color: #666;\n\n  // card\n  --ant-card-bg: #ffffff;\n  --ant-card-header-title-color: #333333;\n  --ant-card-header-link-color: #999999;\n  --ant-card-fold-btn-color: #1677ff;\n  --ant-card-divider-color: #eeeeee;\n\n  // countDown\n  --ant-countdown-color: #666;\n  --ant-countdown-number-color: #ffffff;\n  --ant-countdown-number-bg: #1677ff;\n\n  // select-contact\n  --select-contact-search-bar-focus-color: #1677ff;\n  --select-contact-search-cancel-color: #333333;\n  --select-contact-wrap-loading-bg: #fff;\n  --select-contact-scroll-bg: #fff;\n  --select-contact-list-bg: #fff;\n  --select-contact-list-bg: #fff;\n  --select-contact-list-color: #999;\n  --select-contact-title-first-color: #333;\n  --select-contact-title-first-border: #eee;\n  --select-contact-tag-color: #ff6010;\n  --select-contact-tag-border: #ffcfb7;\n  --select-contact-empty-bg: #fff;\n  --select-contact-empty-color: #999;\n  --select-contact-loading-bg: #999;\n  --select-contact-display-light-color: #fa6300;\n\n  // numberInput\n  --number-input-background-color: #ffffff;\n  --number-input-title-color: #333333;\n  --number-input-link-color: #4b6b99;\n  --number-input-unit-color: #999999;\n  --number-input-border-color: #eeeeee;\n  --number-input-prefix-color: #333333;\n  --number-input-caret-color: #1677ff;\n  --number-input-quick-text-color: #1677ff;\n  --number-input-quick-border-color: #1677ff;\n\n  // postScript\n  --postscript-background-color: #ffffff;\n  --postscript-title-color: #333;\n  --postscript-input-color: #333;\n  --postscript-caret-color: #1677ff;\n  --postscript-placeholder-color: #cccccc;\n  --postscript-quick-text-color: #666;\n  --postscript-quick-border-color: #eeeeee;\n\n  // footer\n  --footer-color: #cccccc;\n  --footer-divider-color: #eeeeee;\n  --footer-link-color: #1677ff;\n  --footer-chip-background-color: #f0f3f7;\n  --footer-chip-color: #1677ff;\n  --footer-chip-disabled-background-color: #f5f5f5;\n  --footer-chip-disabled-color: #999999;\n\n  // thought-chain\n  --thought-chain-title-color: rgba(0, 0, 0, .45);\n  --thought-chain-content-color: rgba(0, 0, 0, 0.55);\n\n  // welcome\n  --welcome-background-color: linear-gradient(106deg, #F2F9FE 0%, #F7F3FF 100%);\n  --welcome-text-color: rgba(0, 0, 0, 0.88);\n\n  // terms\n  --terms-fixed-background-color: #ffffff;\n  --terms-fixed-border-color: #eeeeee;\n  --terms-protocol-item-color: #1677ff;\n  --terms-protocol-text-color: #999999;\n  --terms-read-shadow-background: linear-gradient(180deg,\n      rgba(255, 255, 255, 0) 12%,\n      #ffffff 86%);\n  --terms-read-protocol-border: #eeeeee;\n  --terms-read-protocol-box-shadow-color: rgba(0, 0, 0, 0.1);\n  --terms-read-protocol-item-color: #333333;\n  --terms-read-protocol-text-color: #999999;\n\n  // prompts\n  --prompts-title-color: rgba(0, 0, 0, 0.25);\n  --prompts-item-border-color: rgba(0, 0, 0, 0.1);\n  --prompts-item-label-color: rgba(0, 0, 0, 0.88);\n  --prompts-item-description-color: rgba(0, 0, 0, 0.88);\n  --prompts-item-arrow-color: rgba(0, 0, 0, 0.45);\n\n  // suggestion\n  --suggestion-item-border-color: rgba(0, 0, 0, 0.1);\n  --suggestion-item-text-color: rgba(0, 0, 0, 0.88);\n\n  // actions\n  --actions-background-color: #F7F7F7;  // 背景色\n  --actions-item-hover-background-color: #EEEEEE;  // actions-item hover背景色\n\n  // bubble\n  --bubble-background-color: #F7F7F7;  // 气泡背景色\n  --bubble-user-background-color: #1677FF;  // 用户消息气泡背景色\n  --bubble-text-color: rgba(0,0,0,0.88);  // 气泡文本颜色\n  --bubble-text-color-user: #ffffff;  // 用户消息文本颜色\n\n  // sender\n  --sender-background-color: #ffffff;  // 输入框背景色\n  --sender-text-color: #333333;  // 输入框文本颜色\n  --sender-placeholder-color: rgba(0, 0, 0, 0.25);  // 输入框占位文字颜色\n  --sender-send-color: #1677ff;  // 发送按钮颜色\n  --sender-input-text-color: #000000;  // 输入框内容文本颜色\n  --sender-input-caret-color: #1677ff;  // 输入框光标颜色\n  --sender-focus-border-color: #1677ff;  // 输入框聚焦时的边框颜色\n  --sender-max-height: 192rpx;  // 输入框最大高度\n\n  // conversations\n  --conversations-swipe-item-view-label-color: rgba(0, 0, 0, 0.88);\n  --conversations-swipe-item-view-timestamp-color: #848484;\n  --conversations-swipe-item-view-desc-color: rgba(0, 0, 0, 0.45);\n}\n"
  },
  {
    "path": "tests/alipay/ActionSheet/__tests__/index.test.ts",
    "content": "import { getInstance } from 'tests/utils';\nimport fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport { describe, it, expect, vi } from 'vitest';\n\ndescribe('actionSheet onClose', () => {\n  it('actionSheet onClose', () => {\n    const onClose = vi.fn();\n    const instance = getInstance('ActionSheet', {\n      onClose,\n    });\n    instance.callMethod('onClose');\n    expect(onClose).toBeCalled();\n  });\n});\n\ndescribe('actionSheet onAction', () => {\n  it('actionSheet onAction', () => {\n    const onClose = vi.fn();\n    const onAction = vi.fn();\n    const instance = getInstance('ActionSheet', {\n      onClose,\n      onAction,\n      disabled: true,\n    });\n\n    instance.callMethod(\n      'onAction',\n      fmtEvent({ 'data-item': {}, 'data-index': 1 })\n    );\n    expect(onClose).toBeCalled();\n    expect(onAction).toBeCalledWith({}, 1, fmtEvent({}));\n  });\n  it('actionSheet disabled', () => {\n    const onClose = vi.fn();\n    const onAction = vi.fn();\n    const instance = getInstance('ActionSheet', {\n      onClose,\n      onAction,\n    });\n\n    instance.callMethod(\n      'onAction',\n      fmtEvent({ 'data-item': { disabled: true }, 'data-index': 1 })\n    );\n    expect(onClose).not.toBeCalled();\n    expect(onAction).not.toBeCalled();\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Badge/__tests__/index.test.ts",
    "content": "import { getInstance } from 'tests/utils';\nimport { describe, it, expect } from 'vitest';\n\ndescribe('badge', () => {\n  it('Badge config', () => {\n    const instance = getInstance('Badge', {});\n    expect(instance.getConfig()).toMatchFileSnapshot(\n      'snapshot/badge_alipay_config.txt'\n    );\n  });\n  it.skip('badge overCount true', () => {\n    const instance = getInstance('Badge', {\n      text: 102,\n    });\n    expect(instance.getData().overCount).toBe(true);\n  });\n  it.skip('badge overCount false', () => {\n    const instance = getInstance('Badge', {\n      text: 75,\n    });\n\n    expect(instance.getData().overCount).toBe(false);\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Badge/__tests__/snapshot/badge_alipay_config.txt",
    "content": "{\n  \"data\": undefined,\n  \"methods\": undefined,\n  \"mixins\": [],\n  \"props\": {\n    \"bgColor\": \"\",\n    \"position\": \"top-right\",\n    \"stroke\": false,\n    \"type\": \"dot\",\n  },\n}\n"
  },
  {
    "path": "tests/alipay/Button/__tests__/index.test.ts",
    "content": "import { getInstance } from 'tests/utils';\nimport { describe, it, expect, vi } from 'vitest';\n\ndescribe('button onTap', () => {\n  it('button onTap', () => {\n    const onTap = vi.fn();\n    const instance = getInstance('Button', {\n      onTap,\n    });\n    instance.callMethod('onTap');\n    expect(onTap).toBeCalled();\n  });\n\n  it('button disabled', () => {\n    const onTap = vi.fn();\n    const instance = getInstance('Button', {\n      onTap,\n      disabled: true,\n    });\n    instance.callMethod('onTap');\n    expect(onTap).not.toBeCalled();\n  });\n\n  it('button loading', () => {\n    const onTap = vi.fn();\n    const instance = getInstance('Button', {\n      onTap,\n      loading: true,\n    });\n    instance.callMethod('onTap');\n    expect(onTap).not.toBeCalled();\n  });\n});\n\ndescribe('button catchTap', () => {\n  it('button catchTap', () => {\n    const catchTap = vi.fn();\n    const instance = getInstance('Button', {\n      catchTap,\n    });\n    instance.callMethod('catchTap');\n    expect(catchTap).toBeCalled();\n  });\n\n  it('button disabled', () => {\n    const catchTap = vi.fn();\n    const instance = getInstance('Button', {\n      catchTap,\n      disabled: true,\n    });\n    instance.callMethod('catchTap');\n    expect(catchTap).not.toBeCalled();\n  });\n\n  it('button loading', () => {\n    const catchTap = vi.fn();\n    const instance = getInstance('Button', {\n      catchTap,\n      loading: true,\n    });\n    instance.callMethod('catchTap');\n    expect(catchTap).not.toBeCalled();\n  });\n});\n\ndescribe('button extra function', () => {\n  it('button onGetAuthorize', () => {\n    const onGetAuthorize = vi.fn();\n    const instance = getInstance('Button', {\n      onGetAuthorize,\n    });\n    instance.callMethod('onGetAuthorize');\n    expect(onGetAuthorize).toBeCalled();\n  });\n\n  it('button onFollowLifestyle', () => {\n    const onFollowLifestyle = vi.fn();\n    const instance = getInstance('Button', {\n      onFollowLifestyle,\n    });\n    instance.callMethod('onFollowLifestyle');\n    expect(onFollowLifestyle).toBeCalled();\n  });\n\n  it('button onError', () => {\n    const onError = vi.fn();\n    const instance = getInstance('Button', {\n      onError,\n    });\n    instance.callMethod('onError');\n    expect(onError).toBeCalled();\n  });\n\n  it('button onGetUserInfo', () => {\n    const onGetUserInfo = vi.fn();\n    const instance = getInstance('Button', {\n      onGetUserInfo,\n    });\n    instance.callMethod('onGetUserInfo');\n    expect(onGetUserInfo).toBeCalled();\n  });\n\n  it('button onGetUserInfo', () => {\n    const onGetPhoneNumber = vi.fn();\n    const instance = getInstance('Button', {\n      onGetPhoneNumber,\n    });\n    instance.callMethod('onGetPhoneNumber');\n    expect(onGetPhoneNumber).toBeCalled();\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Calendar/__tests__/calendar.spec.ts",
    "content": "import dayjs from 'dayjs';\nimport { describe, expect, it, vi } from 'vitest';\nimport { findDate, getSelectedDay, initCalendar, sleep } from './testUtils';\nimport { TestInstance } from 'tests/utils';\nimport { getScrollIntoViewId } from 'compiled-alipay/Calendar/utils';\n\ndescribe('Calendar', () => {\n  it('测试默认值', () => {\n    const instance = initCalendar({});\n\n    const {\n      className,\n      style,\n      selectionMode,\n      weekStartsOn,\n      changedScrollIntoView,\n    } = instance.getConfig().props;\n    expect({\n      className,\n      style,\n      selectionMode,\n      weekStartsOn,\n      changedScrollIntoView,\n    }).toMatchFileSnapshot('snapshot/alipay_config_props.txt');\n\n    const initData = instance.getData();\n\n    const { monthList, markItems } = initData;\n\n    // 默认显示 6 个月\n    expect(monthList.length).toEqual(3);\n    // 默认从周日开启\n    expect(markItems).toEqual(['日', '一', '二', '三', '四', '五', '六']);\n    const today = findDate(monthList[0].cells, dayjs());\n    // 默认显示今天\n    expect(today.top?.label).toEqual('今日');\n    // 默认不选择\n    expect(today.isSelected).toEqual(false);\n  });\n\n  it('onFormatter 只允许修改三个字段', () => {\n    const instance = initCalendar({\n      weekStartsOn: 'Monday',\n      monthRange: [\n        new Date('2023-01-01').getTime(),\n        new Date('2023-02-01').getTime(),\n      ],\n      onFormatter() {\n        return {\n          disabled: true,\n          top: {\n            label: 'top',\n            className: 'top',\n          },\n          bottom: {\n            label: 'bottom',\n            className: 'bottom',\n          },\n          time: 0,\n          isSelected: true,\n          isSelectedBegin: true,\n          isSelectedEnd: true,\n          inThisMonth: true,\n        };\n      },\n    });\n\n    const first = instance.getData().monthList[0].cells[0];\n    // 数据不可改变\n    expect(\n      JSON.stringify({ ...first, time: null }, null, 2)\n    ).toMatchInlineSnapshot(\n      `\n      \"{\n        \"index\": 0,\n        \"disabled\": true,\n        \"time\": null,\n        \"date\": 26,\n        \"isSelected\": false,\n        \"isSelectedBegin\": false,\n        \"top\": {\n          \"label\": \"top\",\n          \"className\": \"top\"\n        },\n        \"isSelectedEnd\": false,\n        \"inThisMonth\": false,\n        \"isRowBegin\": true,\n        \"isRowEnd\": false,\n        \"isRange\": false,\n        \"bottom\": {\n          \"label\": \"bottom\",\n          \"className\": \"bottom\"\n        }\n      }\"\n    `\n    );\n  });\n\n  it('测试 value 修改', async () => {\n    const instance = initCalendar({\n      weekStartsOn: 'Monday',\n      value: new Date('2023-01-01').getTime(),\n      monthRange: [\n        new Date('2023-01-01').getTime(),\n        new Date('2023-02-01').getTime(),\n      ],\n    });\n    expect(getSelectedDay(instance.getData())).toEqual(['2023-01-01']);\n\n    instance.setProps({\n      value: new Date('2023-01-02').getTime(),\n    });\n    await sleep(100);\n    expect(getSelectedDay(instance.getData())).toEqual(['2023-01-02']);\n  });\n\n  it('测试 weekStartsOn', () => {\n    const instance = initCalendar({\n      weekStartsOn: 'Monday',\n      monthRange: [\n        new Date('2023-01-01').getTime(),\n        new Date('2023-02-01').getTime(),\n      ],\n    });\n\n    const initData = instance.getData();\n    const { monthList, markItems } = initData;\n    expect(monthList.length).toEqual(2);\n    // 默认从周日开启\n    expect(markItems).toEqual(['一', '二', '三', '四', '五', '六', '日']);\n    const firstWeek = monthList[0].cells.slice(0, 7).map((cell) => {\n      return dayjs(cell.time).format('YYYY-MM-DD');\n    });\n    expect(firstWeek).toEqual([\n      '2022-12-26',\n      '2022-12-27',\n      '2022-12-28',\n      '2022-12-29',\n      '2022-12-30',\n      '2022-12-31',\n      '2023-01-01',\n    ]);\n  });\n\n  function extendInstance(instance: TestInstance) {\n    return {\n      clickCell(date: string) {\n        instance.callMethod('clickCell', {\n          currentTarget: {\n            dataset: {\n              time: {\n                time: dayjs(date).toDate().getTime(),\n              },\n            },\n          },\n        });\n      },\n    };\n  }\n\n  it('测试点击', async () => {\n    const instance = initCalendar({\n      weekStartsOn: 'Monday',\n      monthRange: [\n        new Date('2023-01-01').getTime(),\n        new Date('2023-02-01').getTime(),\n      ],\n    });\n    const extendFunctions = extendInstance(instance);\n\n    extendFunctions.clickCell('2023-01-04');\n    await sleep(100);\n    expect(getSelectedDay(instance.getData())).toEqual(['2023-01-04']);\n\n    // 如果选择的日期早于当前日期， 则切换 start\n    extendFunctions.clickCell('2023-01-02');\n    await sleep(100);\n    expect(getSelectedDay(instance.getData())).toEqual(['2023-01-02']);\n\n    extendFunctions.clickCell('2023-01-06');\n    await sleep(100);\n    expect(getSelectedDay(instance.getData())).toEqual([\n      '2023-01-02',\n      '2023-01-03',\n      '2023-01-04',\n      '2023-01-05',\n      '2023-01-06',\n    ]);\n  });\n\n  it('defaultValue 应该生效', async () => {\n    const instance = initCalendar({\n      defaultValue: new Date('2023-01-04').getTime(),\n      monthRange: [\n        new Date('2023-01-01').getTime(),\n        new Date('2023-02-01').getTime(),\n      ],\n    });\n    expect(getSelectedDay(instance.getData())).toEqual(['2023-01-04']);\n\n    const instance2 = initCalendar({\n      defaultValue: [\n        new Date('2023-01-04').getTime(),\n        new Date('2023-01-05').getTime(),\n      ],\n      monthRange: [\n        new Date('2023-01-01').getTime(),\n        new Date('2023-02-01').getTime(),\n      ],\n    });\n    expect(getSelectedDay(instance2.getData())).toEqual([\n      '2023-01-04',\n      '2023-01-05',\n    ]);\n  });\n\n  it('value 优先级大于 default value', async () => {\n    const instance = initCalendar({\n      value: new Date('2023-01-01').getTime(),\n      defaultValue: new Date('2023-01-04').getTime(),\n      monthRange: [\n        new Date('2023-01-01').getTime(),\n        new Date('2023-02-01').getTime(),\n      ],\n    });\n    expect(getSelectedDay(instance.getData())).toEqual(['2023-01-01']);\n  });\n\n  function lastClickDate(args: [number | [number, number]] | undefined) {\n    if (!args) {\n      return;\n    }\n    const first = args[0];\n    if (Array.isArray(first)) {\n      return first.map((o) => dayjs(o).format('YYYY-MM-DD'));\n    }\n\n    return dayjs(first).format('YYYY-MM-DD');\n  }\n\n  it('测试点击', async () => {\n    const mockFn = vi.fn();\n    const getLastChange = () => lastClickDate(mockFn.mock.lastCall);\n    const instance = initCalendar({\n      weekStartsOn: 'Monday',\n      monthRange: [\n        new Date('2023-01-01').getTime(),\n        new Date('2023-02-01').getTime(),\n      ],\n      onChange: mockFn,\n    });\n    const extendFunctions = extendInstance(instance);\n    extendFunctions.clickCell('2023-01-04');\n\n    await sleep(200);\n    expect(getLastChange()).toEqual(['2023-01-04']);\n    expect(getSelectedDay(instance.getData())).toEqual(['2023-01-04']);\n\n    // 如果选择的日期早于当前日期， 则切换 start\n    extendFunctions.clickCell('2023-01-02');\n    await sleep(100);\n    expect(getLastChange()).toEqual(['2023-01-02']);\n    expect(getSelectedDay(instance.getData())).toEqual(['2023-01-02']);\n\n    extendFunctions.clickCell('2023-01-06');\n    await sleep(100);\n    expect(getLastChange()).toEqual(['2023-01-02', '2023-01-06']);\n    expect(getSelectedDay(instance.getData())).toEqual([\n      '2023-01-02',\n      '2023-01-03',\n      '2023-01-04',\n      '2023-01-05',\n      '2023-01-06',\n    ]);\n    instance.setProps({\n      selectionMode: 'single',\n    });\n    await sleep(100);\n    extendFunctions.clickCell('2023-01-06');\n    await sleep(100);\n    expect(getLastChange()).toEqual('2023-01-06');\n    expect(getSelectedDay(instance.getData())).toEqual(['2023-01-06']);\n    extendFunctions.clickCell('2023-01-02');\n    await sleep(100);\n    expect(getLastChange()).toEqual('2023-01-02');\n    expect(getSelectedDay(instance.getData())).toEqual(['2023-01-02']);\n    instance.setProps({\n      onFormatter: (cell) => {\n        if (dayjs(cell.time).format('YYYY-MM-DD') === '2023-01-10') {\n          return {\n            disabled: true,\n          };\n        }\n      },\n    });\n    await sleep(100);\n    extendFunctions.clickCell('2023-01-02');\n    await sleep(100);\n    expect(getSelectedDay(instance.getData())).toEqual(['2023-01-02']);\n  });\n\n  it('测试滚动到选中位置', async () => {\n    const defaultValue = dayjs().add(1, 'M').toDate().getTime();\n    const instance = initCalendar({\n      defaultValue,\n      selectionMode: 'single',\n      changedScrollIntoView: true,\n    });\n    expect(instance.getData().scrollIntoViewId).toEqual(\n      getScrollIntoViewId(defaultValue)\n    );\n\n    const extendFunctions = extendInstance(instance);\n    extendFunctions.clickCell(\n      dayjs(defaultValue).add(1, 'd').format('YYYY-MM-DD')\n    );\n\n    await sleep(300);\n    expect(instance.getData().scrollIntoViewId).toEqual('');\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Calendar/__tests__/snapshot/alipay_config_props.txt",
    "content": "{\n  \"changedScrollIntoView\": undefined,\n  \"className\": undefined,\n  \"selectionMode\": \"range\",\n  \"style\": undefined,\n  \"weekStartsOn\": \"Sunday\",\n}\n"
  },
  {
    "path": "tests/alipay/Calendar/__tests__/testUtils.ts",
    "content": "import dayjs, { Dayjs } from 'dayjs';\nimport { CellState, ICalendarProps } from 'compiled-alipay/Calendar/props';\nimport { getInstance } from 'tests/utils';\n\nexport function getSelectedDay(data: { monthList: { cells: CellState[] }[] }) {\n  const result: string[] = [];\n  data.monthList\n    .map((o) => o.cells)\n    .forEach((cellList) => {\n      cellList.forEach((cell) => {\n        if (cell.isSelected) {\n          result.push(dayjs(cell.time).format('YYYY-MM-DD'));\n        }\n      });\n    });\n\n  return result;\n}\n\nexport function sleep(time) {\n  return new Promise<void>((resolve) => {\n    setTimeout(resolve, time);\n  });\n}\n\nexport function findDate(monthCells: CellState[], date: Dayjs) {\n  return monthCells.find((cell: CellState) => {\n    return date.isSame(dayjs(cell.time), 'date');\n  });\n}\n\nexport class SelectorQuery {\n  select() {\n    return this;\n  }\n  boundingClientRect() {\n    return this;\n  }\n  exec(callback: (ret) => void) {\n    callback([\n      {\n        top: 0,\n        bottom: 0,\n        height: 0,\n      },\n    ]);\n  }\n}\n\nexport function initCalendar(props: Partial<ICalendarProps>) {\n  return getInstance('Calendar', props, {\n    createSelectorQuery: () => {\n      return new SelectorQuery();\n    },\n    canIUse: () => {\n      return true;\n    },\n  });\n}\n"
  },
  {
    "path": "tests/alipay/Calendar/__tests__/utils.spec.ts",
    "content": "import dayjs, { Dayjs } from 'dayjs';\nimport { describe, expect, it } from 'vitest';\nimport {\n  getDate,\n  getMonthListFromRange,\n  getScrollIntoViewId,\n} from 'compiled-alipay/Calendar/utils';\n\ndescribe('Calendar utils', () => {\n  it('test dayjsToCalendarDate', () => {\n    expect(\n      getMonthListFromRange(dayjs('2023-10-01'), dayjs('2023-11-01')).map((o) =>\n        o.format('YYYY-MM-DD')\n      )\n    ).toEqual(['2023-10-01', '2023-11-01']);\n\n    expect(\n      getMonthListFromRange(dayjs('2023-10-01'), dayjs('2023-10-01')).map((o) =>\n        o.format('YYYY-MM-DD')\n      )\n    ).toEqual(['2023-10-01']);\n\n    expect(() =>\n      getMonthListFromRange(dayjs('2023-11-01'), dayjs('2023-10-01')).map((o) =>\n        o.format('YYYY-MM-DD')\n      )\n    ).toThrowError(`Start time can't be later than end time.`);\n  });\n});\n\nit('测试 checkDates 生成的日期是否正确', () => {\n  let flag = dayjs('2000-01-01');\n  for (let i = 0; i < 12 * 100; i++) {\n    expect(checkDates(flag, 'Monday')).toBeTruthy();\n    expect(checkDates(flag, 'Sunday')).toBeTruthy();\n    flag = flag.add(1, 'month');\n  }\n});\n\nit('测试 getScrollIntoViewId 获取滚动视图的元素id是否正确', () => {\n  let flag = dayjs('2024-03-29 13:40:23').toDate().getTime();\n  for (let i = 0; i < 12 * 100; i++) {\n    expect(getScrollIntoViewId(flag)).toEqual(\n      `id_${dayjs('2024-03-22').toDate().getTime()}`\n    );\n  }\n});\n\nfunction checkDates(month: Dayjs, start: 'Monday' | 'Sunday') {\n  const dates = getDate(month, start);\n  if (dates.length % 7 !== 0) {\n    return false;\n  }\n  // 每周第一天必须为对应日期\n  if (start === 'Monday' && dates[0].day() === 0) {\n    return false;\n  }\n  if (start === 'Sunday' && dates[0].day() === 6) {\n    return false;\n  }\n  //第一周必须包含当月第一天\n  if (\n    !dates.slice(0, 7).some((o) => o.isSame(month.startOf('month'), 'date'))\n  ) {\n    return false;\n  }\n  //最后一周必须包含当月最后一天\n  if (!dates.slice(-7).some((o) => o.isSame(month.endOf('month'), 'date'))) {\n    return false;\n  }\n  return true;\n}\n"
  },
  {
    "path": "tests/alipay/Checkbox/CheckboxGroup/index.spec.ts",
    "content": "import { getInstance, sleep, TestInstance } from 'tests/utils';\nimport { describe, expect, it, vi } from 'vitest';\n\nasync function clickIndex(instance: TestInstance, index: number) {\n  instance.callMethod(\n    'onChange',\n    {},\n    {\n      currentTarget: {\n        dataset: {\n          index,\n        },\n      },\n    }\n  );\n  await sleep(100);\n}\n\ndescribe('Calendar', () => {\n  it('测试默认的 props', () => {\n    const instance = getInstance('Checkbox/CheckboxGroup', {});\n    expect(instance.getConfig().props).toEqual({\n      color: '',\n      defaultValue: [],\n      options: [],\n      disabled: false,\n      position: 'vertical',\n    });\n    expect(instance.getData().mixin.value).toEqual([]);\n  });\n\n  it('测试 value 和 defaultValue 优先级', () => {\n    const instance = getInstance('Checkbox/CheckboxGroup', {\n      value: ['1'],\n      defaultValue: [],\n    });\n    expect(instance.getData().mixin.value).toEqual(['1']);\n  });\n\n  it('测试 clickIndex 点击', async () => {\n    const instance = getInstance('Checkbox/CheckboxGroup', {\n      options: [{ value: '1' }, { value: '2' }],\n    });\n    await clickIndex(instance, 1);\n    expect(instance.getData().mixin.value).toEqual(['2']);\n    await clickIndex(instance, 0);\n    expect(instance.getData().mixin.value).toEqual(['2', '1']);\n    await clickIndex(instance, 0);\n    expect(instance.getData().mixin.value).toEqual(['2']);\n    instance.setProps({\n      disabled: true,\n    });\n    await clickIndex(instance, 0);\n    expect(instance.getData().mixin.value).toEqual(['2']);\n    instance.setProps({ disabled: false });\n    await clickIndex(instance, 0);\n    expect(instance.getData().mixin.value).toEqual(['2', '1']);\n  });\n\n  it('测试受控模式', async () => {\n    const onChange = vi.fn();\n    const instance = getInstance('Checkbox/CheckboxGroup', {\n      options: [{ value: '1' }, { value: '2' }],\n      onChange,\n      value: ['1'],\n      'data-id': 'test',\n    });\n    await clickIndex(instance, 1);\n    expect(instance.getData().mixin.value).toEqual(['1']);\n    expect(onChange.mock.calls.length).toBe(1);\n    expect(onChange.mock.calls[0][0]).toEqual(['1', '2']);\n    expect(onChange.mock.calls[0][1]).toMatchInlineSnapshot(`\n      {\n        \"currentTarget\": {\n          \"dataset\": {\n            \"id\": \"test\",\n          },\n        },\n        \"target\": {\n          \"dataset\": {\n            \"id\": \"test\",\n          },\n          \"targetDataset\": {\n            \"id\": \"test\",\n          },\n        },\n      }\n    `);\n    instance.setProps({\n      value: ['1', '2'],\n    });\n    expect(instance.getData().mixin.value).toEqual(['1', '2']);\n  });\n\n  it('测试 disabled', async () => {\n    const instance = getInstance('Checkbox/CheckboxGroup', {\n      options: [{ value: '1' }, { value: '2' }],\n      defaultValue: [],\n    });\n    instance.setProps({\n      disabled: true,\n    });\n    await clickIndex(instance, 0);\n    expect(instance.getData().mixin.value).toEqual([]);\n    instance.setProps({\n      disabled: false,\n    });\n    await clickIndex(instance, 0);\n    expect(instance.getData().mixin.value).toEqual(['1']);\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Checkbox/index.spec.ts",
    "content": "import { getInstance, sleep } from 'tests/utils';\nimport { describe, expect, it, vi } from 'vitest';\n\ndescribe('Calendar', () => {\n  it('测试默认的 props', () => {\n    const instance = getInstance('Checkbox', {});\n    expect(instance.getConfig().props).toEqual({\n      color: '',\n      disabled: false,\n    });\n    expect(instance.getData().mixin.value).toEqual(undefined);\n  });\n\n  it('测试 defaultChecked', async () => {\n    const instance = getInstance('Checkbox', {\n      defaultChecked: true,\n    });\n    expect(instance.getData().mixin.value).toEqual(true);\n    instance.callMethod('onChange', {});\n    await sleep(10);\n    expect(instance.getData().mixin.value).toEqual(false);\n    instance.callMethod('onChange', {});\n    await sleep(20);\n    expect(instance.getData().mixin.value).toEqual(true);\n  });\n\n  it('测试 defaultChecked 和 value 优先级', () => {\n    const instance = getInstance('Checkbox', {\n      checked: false,\n      defaultChecked: true,\n    });\n    expect(instance.getData().mixin.value).toEqual(false);\n  });\n\n  it('测试受控模式', () => {\n    const onChange = vi.fn();\n    const instance = getInstance('Checkbox', {\n      checked: false,\n      defaultChecked: true,\n      'data-id': 1,\n      onChange,\n    });\n    expect(instance.getData().mixin.value).toEqual(false);\n    instance.callMethod('onChange', {});\n    expect(instance.getData().mixin.value).toEqual(false);\n    expect(onChange.mock.calls.length).toEqual(1);\n    expect(onChange.mock.calls[0][0]).toEqual(true);\n    expect(onChange.mock.calls[0][1]).toMatchInlineSnapshot(`\n      {\n        \"currentTarget\": {\n          \"dataset\": {\n            \"id\": 1,\n          },\n        },\n        \"target\": {\n          \"dataset\": {\n            \"id\": 1,\n          },\n          \"targetDataset\": {\n            \"id\": 1,\n          },\n        },\n      }\n    `);\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Checklist/__tests__/index.test.ts",
    "content": "import { getInstance, sleep } from 'tests/utils';\nimport fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport { describe, it, expect, vi } from 'vitest';\n\ndescribe('checklist onChange', () => {\n  it('checklistItem onChange', () => {\n    const onChange = vi.fn();\n    const instance = getInstance('Checklist/ChecklistItem', {\n      onChange,\n    });\n    instance.callMethod('onChecklistItemClick');\n    expect(onChange).toBeCalled();\n  });\n  it('check with multiple false', async () => {\n    const my = {\n      canIUse() {\n        return true;\n      },\n    };\n    const onChange = vi.fn();\n    const options = [{ value: 0 }, { value: 1 }, { value: 2 }];\n    const instance = getInstance(\n      'Checklist',\n      {\n        onChange,\n        options,\n      },\n      my\n    );\n    instance.callMethod('onChange', { value: 1 });\n    expect(onChange).toBeCalledWith(1, { value: 1 }, fmtEvent({}));\n    await sleep(20);\n    expect(instance.getData().mixin.value).toBe(1);\n  });\n  it('check with multiple true', async () => {\n    const my = {\n      canIUse() {\n        return true;\n      },\n    };\n    const onChange = vi.fn();\n    const options = [{ value: 0 }, { value: 1 }, { value: 2 }];\n    const instance = getInstance(\n      'Checklist',\n      {\n        onChange,\n        options,\n        multiple: true,\n      },\n      my\n    );\n    instance.callMethod('onChange', { value: 1 });\n    await sleep(20);\n    expect(onChange).toBeCalledWith([1], [{ value: 1 }], fmtEvent({}));\n    expect(instance.getData().mixin.value).toEqual([1]);\n  });\n  it('uncheck with multiple true', async () => {\n    const my = {\n      canIUse() {\n        return true;\n      },\n    };\n    const onChange = vi.fn();\n    const options = [{ value: 0 }, { value: 1 }, { value: 2 }];\n    const instance = getInstance(\n      'Checklist',\n      {\n        onChange,\n        options,\n        multiple: true,\n      },\n      my\n    );\n    instance.callMethod('onChange', { value: 1 });\n    await sleep(20);\n    instance.callMethod('onChange', { value: 1 });\n    await sleep(20);\n    expect(onChange).toBeCalledWith([], [], fmtEvent({}));\n    expect(instance.getData().mixin.value).toEqual([]);\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Collapse/index.test.ts",
    "content": "import fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport { createSelectorQueryFactory, MockSelect } from 'tests/selector-query';\nimport { getInstance, sleep } from 'tests/utils';\nimport { describe, expect, it, vi } from 'vitest';\nimport { ICollapseProps } from '../../../src/Collapse/props';\n\nfunction createCollapse(props: Partial<ICollapseProps>, mock: MockSelect) {\n  const my = {\n    canIUse() {\n      return true;\n    },\n    createSelectorQuery: createSelectorQueryFactory(mock),\n  };\n\n  const onChange = vi.fn();\n\n  const instance = getInstance(\n    'Collapse',\n    {\n      onChange,\n      ...props,\n    },\n    my\n  );\n\n  async function clickIndex(index: string | number) {\n    instance.callMethod('onChange', {\n      currentTarget: {\n        dataset: { index },\n      },\n    });\n    await sleep(40);\n  }\n\n  async function resetContentHeight(index: string | number) {\n    instance.callMethod('resetContentHeight', {\n      currentTarget: {\n        dataset: { index },\n      },\n    });\n    await sleep(40);\n  }\n\n  return { instance, clickIndex, resetContentHeight, onChange };\n}\n\ndescribe('', () => {\n  const mockSelector: MockSelect = () => {\n    return {\n      height: 100,\n    };\n  };\n  const mockItems = [\n    {\n      title: '0',\n      content: 'one',\n    },\n    {\n      title: '2',\n      content: '',\n      disabled: true,\n    },\n    {\n      title: '3',\n      content: '',\n    },\n    {\n      title: '4',\n      content: '',\n    },\n  ];\n  it('测试 contentHeight', async () => {\n    const { instance } = createCollapse(\n      {\n        items: mockItems,\n      },\n      mockSelector\n    );\n    await sleep(100);\n    expect(instance.getData().contentHeight).toEqual([\n      '0px',\n      '0px',\n      '0px',\n      '0px',\n    ]);\n    expect(instance.getData().hasChange).toEqual(true);\n    expect(instance.getData().mixin.value).toEqual([]);\n  });\n\n  it('测试事件', async () => {\n    const { instance, clickIndex, onChange } = createCollapse(\n      {\n        current: [0, 1, 2],\n        items: mockItems,\n      },\n      mockSelector\n    );\n    expect(instance.getData().contentHeight).toEqual(['', '0px', '', '0px']);\n    await clickIndex(0);\n    expect(instance.getData().mixin.value).toEqual([0, 2]);\n    expect(onChange.mock.calls[0]).toEqual([[2], fmtEvent({})]);\n    await sleep(30);\n    instance.setProps({\n      current: [2],\n    });\n    await sleep(30);\n    expect(instance.getData().contentHeight).toEqual(['0px', '0px', '', '0px']);\n  });\n\n  it('测试点击', async () => {\n    const { instance, clickIndex, resetContentHeight } = createCollapse(\n      {\n        items: mockItems,\n      },\n      mockSelector\n    );\n    await clickIndex(0);\n    expect(instance.getData().mixin.value).toEqual([0]);\n    await clickIndex(1);\n    expect(instance.getData().contentHeight).toEqual([\n      '100px',\n      '0px',\n      '0px',\n      '0px',\n    ]);\n    expect(instance.getData().mixin.value).toEqual([0]);\n    await clickIndex(2);\n    expect(instance.getData().mixin.value).toEqual([0, 2]);\n    await clickIndex(3);\n    expect(instance.getData().mixin.value).toEqual([0, 2, 3]);\n    await clickIndex(0);\n    expect(instance.getData().mixin.value).toEqual([2, 3]);\n    expect(instance.getData().contentHeight).toEqual([\n      '0px',\n      '0px',\n      '100px',\n      '100px',\n    ]);\n    instance.setProps({\n      accordion: true,\n    });\n    expect(instance.getData().mixin.value).toEqual([2, 3]);\n    await clickIndex(0);\n    expect(instance.getData().mixin.value).toEqual([0]);\n    expect(instance.getData().contentHeight).toEqual([\n      '100px',\n      '0px',\n      '0px',\n      '0px',\n    ]);\n    await clickIndex(3);\n    expect(instance.getData().mixin.value).toEqual([3]);\n    expect(instance.getData().contentHeight).toEqual([\n      '0px',\n      '0px',\n      '0px',\n      '100px',\n    ]);\n    await resetContentHeight(3);\n    await resetContentHeight(100);\n    expect(instance.getData().contentHeight).toEqual(['0px', '0px', '0px', '']);\n  });\n});\n"
  },
  {
    "path": "tests/alipay/DatePicker/RangePicker/index.test.ts",
    "content": "import fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport dayjs from 'dayjs';\nimport { describe, expect, it } from 'vitest';\nimport { createDateRangePicker } from './utils';\nimport { sleep } from 'tests/utils';\n\n\ndescribe('非受控模式', () => {\n  it('测试 onCancel', async () => {\n    const { onCancel, callMethod } = createDateRangePicker({\n      'data-test': '123',\n    } as any);\n    await callMethod('onCancel');\n    expect(onCancel).toBeCalledWith(\n      fmtEvent({\n        'data-test': '123',\n      })\n    );\n  });\n\n  it('测试 onVisibleChange', async () => {\n    const { onVisibleChange, callVisibleChange } = createDateRangePicker({});\n    await callVisibleChange(true);\n    expect(onVisibleChange.mock.lastCall).toEqual([true, fmtEvent({})]);\n    await callVisibleChange(false);\n    expect(onVisibleChange.mock.lastCall).toEqual([false, fmtEvent({})]);\n  });\n\n  it('测试 onOk 与 onPickerChange', async () => {\n    const { onPickerChange, callMethod, callVisibleChange, onOk } = createDateRangePicker();\n    await callVisibleChange(true);\n    await callMethod('onChange', [2023, 10, 1]);\n    expect(onPickerChange.mock.lastCall).toEqual([\n      'start',\n      dayjs('2023-10-01').toDate(),\n      '2023/10/01',\n      fmtEvent({}),\n    ]);\n    await callMethod('onChangeCurrentPickerType', {\n      currentTarget: {\n        dataset: {\n          type: 'end',\n        },\n      },\n    });\n    await callMethod('onChange', [2023, 10, 2]);\n    expect(onPickerChange.mock.lastCall).toEqual([\n      'end',\n      dayjs('2023-10-02').toDate(),\n      '2023/10/02',\n      fmtEvent({}),\n    ]);\n\n    await callMethod('onOk');\n    expect(onOk.mock.lastCall).toEqual([\n      [dayjs('2023-10-01').toDate(), dayjs('2023-10-02').toDate()],\n      ['2023/10/01', '2023/10/02'],\n      fmtEvent({}),\n    ]);\n  });\n\n  it('测试 onFormat', async () => {\n    const x: unknown[] = [];\n    const { instance } = createDateRangePicker({\n      defaultValue: [\n        dayjs('2023-01-01').toDate(),\n        dayjs('2023-10-01').toDate(),\n      ],\n      format: 'YYYY / MM / DD',\n      onFormat: (value, datestr) => {\n        x.push(datestr);\n        return value.map((v) => dayjs(v).format('YYYY--MM--DD')).join('-|-');\n      },\n    });\n    expect(instance.getData().formattedValueText).toEqual(\n      '2023--01--01-|-2023--10--01'\n    );\n    expect(x).toEqual([['2023 / 01 / 01', '2023 / 10 / 01']]);\n  });\n\n  it('测试调整数据', async () => {\n    const { instance, callMethod, callVisibleChange, onPickerChange } = createDateRangePicker({\n      defaultValue: [\n        dayjs('2023-01-01').toDate(),\n        dayjs('2023-10-02').toDate(),\n      ],\n    });\n    expect(instance.getData().formattedValueText).toEqual(\n      '2023/01/01-2023/10/02'\n    );\n    await callVisibleChange(true);\n    await callMethod('onChange', [2023, 9, 5]);\n    expect(onPickerChange.mock.lastCall).toEqual([\n      'start',\n      dayjs('2023-09-05').toDate(),\n      '2023/09/05',\n      fmtEvent({}),\n    ]);\n    await callMethod('onChangeCurrentPickerType', {\n      currentTarget: {\n        dataset: {\n          type: 'end',\n        },\n      },\n    });\n    await callMethod('onChange', [2023, 9, 10]);\n    await callMethod('onChange', [2023, 9, 20]);\n    await callMethod('onOk');\n    expect(instance.getData().formattedValueText).toEqual(\n      '2023/09/05-2023/09/20'\n    );\n  });\n\n  it('当 start 晚于 end , 或者 end 早于 start 时', async () => {\n    const { callMethod, callVisibleChange, currentDate } = createDateRangePicker({\n      defaultValue: [\n        dayjs('2023-01-01').toDate(),\n        dayjs('2023-10-02').toDate(),\n      ],\n    });\n    await callVisibleChange(true);\n    expect(currentDate()).toEqual({\n      currentStartDate: dayjs('2023-01-01').toDate().toISOString(),\n      currentEndDate: dayjs('2023-10-02').toDate().toISOString(),\n    });\n    await callMethod('onChange', [2023, 10, 3]);\n    expect(currentDate()).toEqual({\n      currentStartDate: dayjs('2023-10-03').toDate().toISOString(),\n      currentEndDate: null,\n    });\n    await callMethod('onChangeCurrentPickerType', {\n      currentTarget: {\n        dataset: {\n          type: 'end',\n        },\n      },\n    });\n    await callMethod('onChange', [2023, 10, 5]);\n    expect(currentDate()).toEqual({\n      currentStartDate: dayjs('2023-10-03').toDate().toISOString(),\n      currentEndDate: dayjs('2023-10-05').toDate().toISOString(),\n    });\n    await callMethod('onChange', [2023, 9, 5]);\n    expect(currentDate()).toEqual({\n      currentStartDate: null,\n      currentEndDate: dayjs('2023-09-05').toDate().toISOString(),\n    });\n  });\n\n  it('测试 min 与 max', async () => {\n    const { callMethod, callVisibleChange, currentDate } = createDateRangePicker({\n      defaultValue: [\n        dayjs('2023-01-01').toDate(),\n        dayjs('2023-10-02').toDate(),\n      ],\n      min: dayjs('2023-01-20').toDate(),\n      max: dayjs('2024-12-10').toDate(),\n    });\n    await callVisibleChange(true);\n    expect(currentDate()).toEqual({\n      currentStartDate: dayjs('2023-01-01').toDate().toISOString(),\n      currentEndDate: dayjs('2023-10-02').toDate().toISOString(),\n    });\n    await callMethod('onChange', [2023, 1, 1]);\n    expect(currentDate()).toEqual({\n      currentStartDate: dayjs('2023-01-20').toDate().toISOString(),\n      currentEndDate: dayjs('2023-10-02').toDate().toISOString(),\n    });\n    await callMethod('onChangeCurrentPickerType', {\n      currentTarget: {\n        dataset: {\n          type: 'end',\n        },\n      },\n    });\n    await callMethod('onChange', [2025, 1, 1]);\n    expect(currentDate()).toEqual({\n      currentStartDate: dayjs('2023-01-20').toDate().toISOString(),\n      currentEndDate: dayjs('2024-12-10').toDate().toISOString(),\n    });\n  });\n});\n\ndescribe('value 受控模式', () => {\n  it('测试 onOk 事件', async () => {\n    const { instance, callMethod, callVisibleChange, onOk } = createDateRangePicker({\n      value: [dayjs('2023-01-01').toDate(), dayjs('2023-10-01').toDate()],\n    });\n    expect(instance.getData().formattedValueText).toEqual(\n      '2023/01/01-2023/10/01'\n    );\n    await callVisibleChange(true);\n    await callMethod('onChange', [2023, 1, 4]);\n\n    await callMethod('onChangeCurrentPickerType', {\n      currentTarget: {\n        dataset: {\n          type: 'end',\n        },\n      },\n    });\n    await callMethod('onChange', [2023, 10, 4]);\n    await callMethod('onOk');\n    expect(\n      onOk.mock.calls[0][0].map((o) => dayjs(o).format('YYYY-MM-DD'))\n    ).toEqual(['2023-01-04', '2023-10-04']);\n    expect(onOk.mock.calls[0][1]).toEqual(['2023/01/04', '2023/10/04']);\n    expect(onOk.mock.calls[0][2]).toEqual(fmtEvent({}));\n  });\n\n  it('测试 onOk 事件', async () => {\n    const { instance } = createDateRangePicker({\n      value: [dayjs('2023-01-01').toDate(), dayjs('2023-10-01').toDate()],\n    });\n    instance.setProps({\n      value: [dayjs('2023-01-01').toDate(), dayjs('2023-10-02').toDate()],\n    });\n    expect(instance.getData().formattedValueText).toEqual(\n      '2023/01/01-2023/10/02'\n    );\n  });\n});\n\ndescribe('visible 受控模式', () => {\n  it('visible 优先级大于 defaultVisible', async () => {\n    const { instance, onVisibleChange, callVisibleChange } = createDateRangePicker({\n      visible: false,\n      defaultVisible: true,\n    });\n    expect(instance.getData().visible).toEqual(false);\n    await callVisibleChange(true);\n    expect(instance.getData().visible).toEqual(false);\n    expect(onVisibleChange).toBeCalledWith(true, fmtEvent({}));\n  });\n  it('visible 受控', async () => {\n    const { instance } = createDateRangePicker({\n      visible: false,\n    });\n    expect(instance.getData().visible).toEqual(false);\n    instance.setProps({\n      visible: true,\n    });\n    await sleep(100);\n    expect(instance.getData().visible).toEqual(true);\n  });\n});\n\ndescribe('测试各个精度', () => {\n  async function getColumnText(\n    precision: 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second'\n  ) {\n    const { instance, callVisibleChange } = createDateRangePicker({\n      defaultValue: [\n        dayjs('2023-01-01').toDate(),\n        dayjs('2023-01-01').toDate(),\n      ],\n      min: dayjs('2023-01-20').toDate(),\n      max: dayjs('2024-12-10').toDate(),\n      precision: precision,\n    });\n    await callVisibleChange(true);\n    return instance\n      .getData()\n      .columns.map((o) => {\n        return o.map((p) => `${p.label}`).join(',');\n      })\n      .join('\\n');\n  }\n\n  it('测试 onFormatLabel', async () => {\n    const { instance, callVisibleChange } = createDateRangePicker({\n      defaultValue: [\n        dayjs('2023-01-01').toDate(),\n        dayjs('2023-01-01').toDate(),\n      ],\n      min: dayjs('2023-01-20').toDate(),\n      max: dayjs('2024-12-10').toDate(),\n      onFormatLabel: (v, v2) => `${v} ${v2}`,\n      precision: 'year',\n    });\n    await callVisibleChange(true);\n    expect(\n      instance\n        .getData()\n        .columns.map((o) => {\n          return o.map((p) => `${p.label}`).join(',');\n        })\n        .join('\\n')\n    ).toEqual(`year 2023,year 2024`);\n  });\n\n  it('精度为年', async () => {\n    expect(await getColumnText('year')).toEqual('2023年,2024年');\n  });\n\n  it('精度为月', async () => {\n    expect(await getColumnText('month')).toEqual(\n      `2023年,2024年\\n1月,2月,3月,4月,5月,6月,7月,8月,9月,10月,11月,12月`\n    );\n  });\n\n  it('精度为小时', async () => {\n    expect(await getColumnText('hour')).toEqual(\n      `2023年,2024年\n1月,2月,3月,4月,5月,6月,7月,8月,9月,10月,11月,12月\n20日,21日,22日,23日,24日,25日,26日,27日,28日,29日,30日,31日\n0时,1时,2时,3时,4时,5时,6时,7时,8时,9时,10时,11时,12时,13时,14时,15时,16时,17时,18时,19时,20时,21时,22时,23时`\n    );\n  });\n\n  it('精度为分', async () => {\n    expect(await getColumnText('minute')).toEqual(\n      `2023年,2024年\n1月,2月,3月,4月,5月,6月,7月,8月,9月,10月,11月,12月\n20日,21日,22日,23日,24日,25日,26日,27日,28日,29日,30日,31日\n0时,1时,2时,3时,4时,5时,6时,7时,8时,9时,10时,11时,12时,13时,14时,15时,16时,17时,18时,19时,20时,21时,22时,23时\n0分,1分,2分,3分,4分,5分,6分,7分,8分,9分,10分,11分,12分,13分,14分,15分,16分,17分,18分,19分,20分,21分,22分,23分,24分,25分,26分,27分,28分,29分,30分,31分,32分,33分,34分,35分,36分,37分,38分,39分,40分,41分,42分,43分,44分,45分,46分,47分,48分,49分,50分,51分,52分,53分,54分,55分,56分,57分,58分,59分`\n    );\n  });\n\n  it('精度为秒', async () => {\n    expect(await getColumnText('second')).toEqual(\n      `2023年,2024年\n1月,2月,3月,4月,5月,6月,7月,8月,9月,10月,11月,12月\n20日,21日,22日,23日,24日,25日,26日,27日,28日,29日,30日,31日\n0时,1时,2时,3时,4时,5时,6时,7时,8时,9时,10时,11时,12时,13时,14时,15时,16时,17时,18时,19时,20时,21时,22时,23时\n0分,1分,2分,3分,4分,5分,6分,7分,8分,9分,10分,11分,12分,13分,14分,15分,16分,17分,18分,19分,20分,21分,22分,23分,24分,25分,26分,27分,28分,29分,30分,31分,32分,33分,34分,35分,36分,37分,38分,39分,40分,41分,42分,43分,44分,45分,46分,47分,48分,49分,50分,51分,52分,53分,54分,55分,56分,57分,58分,59分\n0秒,1秒,2秒,3秒,4秒,5秒,6秒,7秒,8秒,9秒,10秒,11秒,12秒,13秒,14秒,15秒,16秒,17秒,18秒,19秒,20秒,21秒,22秒,23秒,24秒,25秒,26秒,27秒,28秒,29秒,30秒,31秒,32秒,33秒,34秒,35秒,36秒,37秒,38秒,39秒,40秒,41秒,42秒,43秒,44秒,45秒,46秒,47秒,48秒,49秒,50秒,51秒,52秒,53秒,54秒,55秒,56秒,57秒,58秒,59秒`\n    );\n  });\n});\n"
  },
  {
    "path": "tests/alipay/DatePicker/RangePicker/utils.ts",
    "content": "import { getInstance, sleep } from 'tests/utils';\nimport { vi } from 'vitest';\nimport { IDateRangePickerProps } from 'compiled-alipay/DatePicker/RangePicker/props';\n\nexport const createDateRangePicker = (\n  props?: Partial<IDateRangePickerProps>\n) => {\n  const onOk = vi.fn();\n  const onCancel = vi.fn();\n  const onPickerChange = vi.fn();\n  const onVisibleChange = vi.fn();\n\n  const instance = getInstance('DatePicker/RangePicker', {\n    onOk,\n    onCancel,\n    onPickerChange,\n    onVisibleChange,\n    ...(props || {}),\n  });\n\n  async function callVisibleChange(visible) {\n    instance.callMethod('onVisibleChange', visible);\n    await sleep(100);\n  }\n\n  return {\n    callVisibleChange,\n    onOk,\n    onCancel,\n    onPickerChange,\n    onVisibleChange,\n    instance,\n    callMethod: async (name, ...args) => {\n      const res = instance.callMethod(name, ...args);\n      await sleep(20);\n      return res;\n    },\n\n    currentDate() {\n      const { currentStartDate, currentEndDate } = instance.getData();\n      return {\n        currentEndDate,\n        currentStartDate,\n      };\n    },\n  };\n};\n"
  },
  {
    "path": "tests/alipay/DatePicker/index.test.ts",
    "content": "import fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport dayjs from 'dayjs';\nimport { describe, expect, it } from 'vitest';\nimport { createDatePicker } from './utils';\nimport { sleep } from 'tests/utils';\n\nconst date = [\n  dayjs().get('year'),\n  dayjs().get('month') + 1,\n  dayjs().get('date'),\n];\n\ndescribe('DatePicker', () => {\n  it('测试 onCancel 事件', async () => {\n    const { onCancel, callMethod } = createDatePicker({\n      'data-test': '123',\n    } as any);\n    callMethod('onCancel');\n    expect(onCancel).toBeCalledWith(\n      fmtEvent({\n        'data-test': '123',\n      })\n    );\n  });\n\n  it('测试 onVisibleChange 事件', async () => {\n    const { onVisibleChange, callVisibleChange } = createDatePicker();\n    await callVisibleChange(true);\n    expect(onVisibleChange.mock.lastCall).toEqual([true, fmtEvent({})]);\n    await callVisibleChange(false);\n    expect(onVisibleChange.mock.lastCall).toEqual([false, fmtEvent({})]);\n  });\n\n  it('测试 onOk 事件', async () => {\n    const { onOk, callMethod, callVisibleChange } = createDatePicker();\n    await callVisibleChange(true);\n    await callMethod('onChange', [2023, 1, 2]);\n    await callMethod('onOk');\n    expect(onOk.mock.lastCall).toEqual([\n      dayjs('2023-01-02').toDate(),\n      '2023/01/02',\n      fmtEvent({}),\n    ]);\n  });\n\n  it('当前时间不在 min max 范围', async () => {\n    const { instance, callVisibleChange } = createDatePicker({\n      min: new Date('2020-01-01'),\n      max: new Date('2021-01-01'),\n    });\n    await callVisibleChange(true);\n    expect(instance.getData().currentValue).toEqual([2020, 1, 1]);\n  });\n\n  it('测试 columns', async () => {\n    const { instance, callVisibleChange } = createDatePicker();\n    await callVisibleChange(true);\n    expect(instance.getData().currentValue).toEqual(date);\n    expect(instance.getData().columns.length).toEqual(3);\n    expect(instance.getData().columns[0]).toEqual(\n      new Array(21).fill(1).map((_, i) => {\n        const value = dayjs().subtract(10, 'year').add(i, 'year').get('year');\n        return {\n          label: `${value}年`,\n          value: value,\n        };\n      })\n    );\n    expect(instance.getData().columns[1]).toEqual(\n      new Array(12).fill(1).map((_, i) => {\n        return {\n          label: `${i + 1}月`,\n          value: i + 1,\n        };\n      })\n    );\n    expect(instance.getData().columns[2]).toEqual(\n      new Array(dayjs().endOf('month').date()).fill(1).map((_, i) => {\n        return {\n          label: `${i + 1}日`,\n          value: i + 1,\n        };\n      })\n    );\n  });\n\n  it('非受控模式修改', async () => {\n    const { instance, changeSelect, callOk, callVisibleChange } = createDatePicker({\n      defaultValue: dayjs('2023-01-01').toDate(),\n    });\n    await callVisibleChange(true);\n    expect(instance.getData().formattedValueText).toEqual('2023/01/01');\n    await changeSelect([2023, 2, 1]);\n    await callOk();\n    expect(instance.getData().formattedValueText).toEqual('2023/02/01');\n  });\n\n  it('测试当 defaultValue 为字符串格式化的问题', async () => {\n    const { instance, callVisibleChange } = createDatePicker({\n      defaultValue: '2023-01-01',\n    });\n    expect(instance.getData().formattedValueText).toEqual('2023/01/01');\n    await callVisibleChange(true);\n    expect(instance.getData().columns.length).toEqual(3);\n  });\n\n  it('测试 onFormat', async () => {\n    let x = '';\n    const { instance } = createDatePicker({\n      defaultValue: dayjs('2023-01-01').toDate(),\n      format: 'YYYY / MM / DD',\n      onFormat: (v, datestr) => {\n        x = datestr;\n        return dayjs(v).format('YYYY--MM--DD');\n      },\n    });\n    expect(instance.getData().formattedValueText).toEqual('2023--01--01');\n    expect(x).toEqual('2023 / 01 / 01');\n  });\n\n  it('测试 min max', async () => {\n    const { instance, changeSelect, callOk, callVisibleChange } = createDatePicker({\n      min: dayjs('2023-01-20').toDate(),\n      max: dayjs('2023-05-15').toDate(),\n      defaultValue: dayjs('2023-02-01').toDate(),\n    });\n    expect(instance.getData().formattedValueText).toEqual('2023/02/01');\n    await callVisibleChange(true);\n    expect(\n      instance.getData().columns.map((o) => {\n        return o.map((p) => `${p.label}`).join(',');\n      })\n    ).toMatchInlineSnapshot(\n      `\n      [\n        \"2023年\",\n        \"1月,2月,3月,4月,5月\",\n        \"1日,2日,3日,4日,5日,6日,7日,8日,9日,10日,11日,12日,13日,14日,15日,16日,17日,18日,19日,20日,21日,22日,23日,24日,25日,26日,27日,28日\",\n      ]\n    `\n    );\n    await changeSelect([2023, 1, 1]);\n    expect(\n      instance.getData().columns.map((o) => {\n        return o.map((p) => `${p.label}`).join(',');\n      })\n    ).toMatchInlineSnapshot(\n      `\n      [\n        \"2023年\",\n        \"1月,2月,3月,4月,5月\",\n        \"20日,21日,22日,23日,24日,25日,26日,27日,28日,29日,30日,31日\",\n      ]\n    `\n    );\n    expect(instance.getData().currentValue).toEqual([2023, 1, 20]);\n\n    await changeSelect([2023, 5, 30]);\n    expect(instance.getData().currentValue).toEqual([2023, 5, 15]);\n\n    await changeSelect([2023, 5, 12]);\n    expect(instance.getData().currentValue).toEqual([2023, 5, 12]);\n\n    await callOk();\n    expect(instance.getData().formattedValueText).toEqual('2023/05/12');\n  });\n});\n\ndescribe('受控模式', () => {\n  it('测试', async () => {\n    const { callVisibleChange, instance, changeSelect, callOk, onOk } =\n      createDatePicker({\n        value: '2023-01-01',\n        defaultValue: dayjs('2023-01-02').toDate(),\n      });\n    await callVisibleChange(true);\n    expect(instance.getData().formattedValueText).toEqual('2023/01/01');\n    await changeSelect([2023, 2, 1]);\n    expect(instance.getData().currentValue).toEqual([2023, 2, 1]);\n    await callOk();\n    // 数据应该不变\n    expect(instance.getData().formattedValueText).toEqual('2023/01/01');\n    expect(onOk.mock.calls[0]).toEqual([\n      dayjs('2023-02-01').toDate(),\n      '2023/02/01',\n      fmtEvent({}),\n    ]);\n  });\n});\n\ndescribe('visible 受控模式', () => {\n  it('visible 优先级大于 defaultVisible', async () => {\n    const { instance, onVisibleChange, callVisibleChange } = createDatePicker({\n      visible: false,\n      defaultVisible: true,\n    });\n    expect(instance.getData().visible).toEqual(false);\n    await callVisibleChange(true);\n    expect(instance.getData().visible).toEqual(false);\n    expect(onVisibleChange).toBeCalledWith(true, fmtEvent({}));\n  });\n  it('visible 受控', async () => {\n    const { instance } = createDatePicker({\n      visible: false,\n    });\n    expect(instance.getData().visible).toEqual(false);\n    instance.setProps({\n      visible: true,\n    });\n    await sleep(100);\n    expect(instance.getData().visible).toEqual(true);\n  });\n});\n\ndescribe('各个精度', () => {\n  async function getColumnText(precision: string) {\n    const { instance, callVisibleChange } = createDatePicker({\n      defaultValue: dayjs('2023-01-01').toDate(),\n      min: dayjs('2023-01-20').toDate(),\n      max: dayjs('2024-12-10').toDate(),\n      precision: precision as any,\n    });\n    await callVisibleChange(true);\n    return instance\n      .getData()\n      .columns.map((o) => {\n        return o.map((p) => `${p.label}`).join(',');\n      })\n      .join('\\n');\n  }\n\n  it('测试 onFormatLabel', async () => {\n    const { instance, callVisibleChange } = createDatePicker({\n      defaultValue: dayjs('2023-01-01').toDate(),\n      min: '2023-01-20',\n      max: dayjs('2024-12-10').toDate(),\n      onFormatLabel: (v, v2) => `${v} ${v2}`,\n      precision: 'year',\n    });\n    await callVisibleChange(true);\n    expect(\n      instance\n        .getData()\n        .columns.map((o) => {\n          return o.map((p) => `${p.label}`).join(',');\n        })\n        .join('\\n')\n    ).toEqual(`year 2023,year 2024`);\n  });\n\n  it('精度为年', async () => {\n    expect(await getColumnText('year')).toEqual('2023年,2024年');\n  });\n\n  it('精度为月', async () => {\n    expect(await getColumnText('month')).toEqual(\n      `2023年,2024年\\n1月,2月,3月,4月,5月,6月,7月,8月,9月,10月,11月,12月`\n    );\n  });\n\n  it('精度为小时', async () => {\n    expect(await getColumnText('hour')).toEqual(\n      `2023年,2024年\n1月,2月,3月,4月,5月,6月,7月,8月,9月,10月,11月,12月\n20日,21日,22日,23日,24日,25日,26日,27日,28日,29日,30日,31日\n0时,1时,2时,3时,4时,5时,6时,7时,8时,9时,10时,11时,12时,13时,14时,15时,16时,17时,18时,19时,20时,21时,22时,23时`\n    );\n  });\n\n  it('精度为分', async () => {\n    expect(await getColumnText('minute')).toEqual(\n      `2023年,2024年\n1月,2月,3月,4月,5月,6月,7月,8月,9月,10月,11月,12月\n20日,21日,22日,23日,24日,25日,26日,27日,28日,29日,30日,31日\n0时,1时,2时,3时,4时,5时,6时,7时,8时,9时,10时,11时,12时,13时,14时,15时,16时,17时,18时,19时,20时,21时,22时,23时\n0分,1分,2分,3分,4分,5分,6分,7分,8分,9分,10分,11分,12分,13分,14分,15分,16分,17分,18分,19分,20分,21分,22分,23分,24分,25分,26分,27分,28分,29分,30分,31分,32分,33分,34分,35分,36分,37分,38分,39分,40分,41分,42分,43分,44分,45分,46分,47分,48分,49分,50分,51分,52分,53分,54分,55分,56分,57分,58分,59分`\n    );\n  });\n\n  it('精度为秒', async () => {\n    expect(await getColumnText('second')).toEqual(\n      `2023年,2024年\n1月,2月,3月,4月,5月,6月,7月,8月,9月,10月,11月,12月\n20日,21日,22日,23日,24日,25日,26日,27日,28日,29日,30日,31日\n0时,1时,2时,3时,4时,5时,6时,7时,8时,9时,10时,11时,12时,13时,14时,15时,16时,17时,18时,19时,20时,21时,22时,23时\n0分,1分,2分,3分,4分,5分,6分,7分,8分,9分,10分,11分,12分,13分,14分,15分,16分,17分,18分,19分,20分,21分,22分,23分,24分,25分,26分,27分,28分,29分,30分,31分,32分,33分,34分,35分,36分,37分,38分,39分,40分,41分,42分,43分,44分,45分,46分,47分,48分,49分,50分,51分,52分,53分,54分,55分,56分,57分,58分,59分\n0秒,1秒,2秒,3秒,4秒,5秒,6秒,7秒,8秒,9秒,10秒,11秒,12秒,13秒,14秒,15秒,16秒,17秒,18秒,19秒,20秒,21秒,22秒,23秒,24秒,25秒,26秒,27秒,28秒,29秒,30秒,31秒,32秒,33秒,34秒,35秒,36秒,37秒,38秒,39秒,40秒,41秒,42秒,43秒,44秒,45秒,46秒,47秒,48秒,49秒,50秒,51秒,52秒,53秒,54秒,55秒,56秒,57秒,58秒,59秒`\n    );\n  });\n});\n"
  },
  {
    "path": "tests/alipay/DatePicker/utils.ts",
    "content": "import { IDatePickerProps } from 'compiled-alipay/DatePicker/props';\nimport { getInstance, sleep } from 'tests/utils';\nimport { vi } from 'vitest';\n\nexport const createDatePicker = (props?: Partial<IDatePickerProps>) => {\n  const onOk = vi.fn();\n  const onCancel = vi.fn();\n  const onPickerChange = vi.fn();\n  const onVisibleChange = vi.fn();\n\n  const instance = getInstance('DatePicker', {\n    onOk,\n    onCancel,\n    onPickerChange,\n    onVisibleChange,\n    ...(props || {}),\n  });\n\n  async function callVisibleChange(visible) {\n    instance.callMethod('onVisibleChange', visible);\n    await sleep(100);\n  }\n\n  async function changeSelect(value) {\n    instance.callMethod('onChange', value);\n    await sleep(20);\n  }\n\n  async function callOk() {\n    instance.callMethod('onOk');\n    await sleep(20);\n  }\n\n  return {\n    callVisibleChange,\n    changeSelect,\n    callOk,\n    onOk,\n    onCancel,\n    onPickerChange,\n    onVisibleChange,\n    instance,\n    callMethod: async (name, ...args) => {\n      const res = instance.callMethod(name, ...args);\n      await sleep(20);\n      return res;\n    },\n  };\n};\n"
  },
  {
    "path": "tests/alipay/Form/FormCascaderPicker/index.test.ts",
    "content": "import { FromItemRef } from 'compiled-alipay/Form/form';\nimport { FormCascaderPickerProps } from 'compiled-alipay/Form/FormCascaderPicker/props';\nimport fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport { getInstance, sleep } from 'tests/utils';\nimport { describe, expect, it, vi } from 'vitest';\nimport { createForm } from '../utils';\n\nfunction createFormCascaderPicker(props: Partial<FormCascaderPickerProps>) {\n  const onOk = vi.fn();\n  const onPickerChange = vi.fn();\n  const onVisibleChange = vi.fn();\n  const onFormat = vi.fn();\n  const onCancel = vi.fn();\n  const onChange = vi.fn();\n\n  const propsData = {\n    onOk,\n    onPickerChange,\n    onVisibleChange,\n    onFormat,\n    onCancel,\n    onChange,\n    name: 'name',\n    'data-test': 'test',\n    ...props,\n  };\n\n  const instance = getInstance('Form/FormCascaderPicker', propsData);\n  const ref = instance.ref<FromItemRef>();\n  const form = createForm();\n  form.addItem(ref);\n  return {\n    form,\n    instance,\n    onOk,\n    onPickerChange,\n    onVisibleChange,\n    onFormat,\n    onCancel,\n    onChange,\n    propsData,\n  };\n}\n\ndescribe('CascaderPicker', () => {\n  it('测试集成 form', async () => {\n    const { instance, form } = createFormCascaderPicker({});\n    instance.callMethod('onOk', 2);\n    await sleep(10);\n    expect(form.getFieldsValue()).toEqual({\n      name: 2,\n    });\n  });\n\n  it('测试 props 改变', async () => {\n    const { instance } = createFormCascaderPicker({});\n    instance.setProps({ required: true });\n    expect(instance.getData().formData.required).toEqual(true);\n  });\n\n  describe('测试事件', () => {\n    const TestValue = 2;\n    const TestOption = [{ label: 'label', value: 'value' }];\n    const TestEvent = fmtEvent({});\n\n    it('测试 onOk', () => {\n      const { onOk, instance, propsData } = createFormCascaderPicker({});\n      instance.callMethod('onOk', TestValue, TestOption, TestEvent);\n      expect(onOk.mock.calls.length).toEqual(1);\n      expect(onOk.mock.calls[0]).toEqual([\n        TestValue,\n        TestOption,\n        fmtEvent(propsData),\n      ]);\n    });\n\n    it('测试 onPickerChange', () => {\n      const { onPickerChange, instance, propsData } = createFormCascaderPicker(\n        {}\n      );\n      instance.callMethod(\n        'onPickerChange',\n        TestValue,\n        TestOption,\n        fmtEvent({})\n      );\n      expect(onPickerChange.mock.calls.length).toEqual(1);\n      expect(onPickerChange.mock.calls[0]).toEqual([\n        TestValue,\n        TestOption,\n        fmtEvent(propsData),\n      ]);\n    });\n\n    it('测试 onVisibleChange', () => {\n      const { onVisibleChange, instance, propsData } = createFormCascaderPicker(\n        {}\n      );\n      instance.callMethod('onVisibleChange', false, fmtEvent({}));\n      expect(onVisibleChange.mock.calls.length).toEqual(1);\n      expect(onVisibleChange.mock.calls[0]).toEqual([\n        false,\n        fmtEvent(propsData),\n      ]);\n    });\n\n    it('测试 onFormat', () => {\n      const { onFormat, instance } = createFormCascaderPicker({});\n      instance.callMethod('handleFormat', TestValue, TestOption);\n      expect(onFormat.mock.calls.length).toEqual(1);\n      expect(onFormat.mock.calls[0]).toEqual([TestValue, TestOption]);\n    });\n\n    it('测试 onDismissPicker', () => {\n      const { onCancel, instance, propsData } = createFormCascaderPicker({});\n      instance.callMethod('onDismissPicker', fmtEvent({}));\n      expect(onCancel.mock.calls.length).toEqual(1);\n      expect(onCancel.mock.calls[0]).toEqual([fmtEvent(propsData)]);\n    });\n\n    it('测试 onChange', () => {\n      const { onChange, instance, propsData } = createFormCascaderPicker({});\n      instance.callMethod('onChange', TestValue, TestOption, fmtEvent({}));\n      expect(onChange.mock.calls.length).toEqual(1);\n      expect(onChange.mock.calls[0]).toEqual([\n        TestValue,\n        TestOption,\n        fmtEvent(propsData),\n      ]);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Form/FormCheckboxGroup/index.test.ts",
    "content": "import { FromItemRef } from 'compiled-alipay/Form/form';\nimport { FormCheckboxGroupProps } from 'compiled-alipay/Form/FormCheckboxGroup/props';\nimport fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport { getInstance, sleep } from 'tests/utils';\nimport { describe, expect, it, vi } from 'vitest';\nimport { createForm } from '../utils';\n\nfunction createFormCheckboxGroup(props: Partial<FormCheckboxGroupProps>) {\n  const onChange = vi.fn();\n\n  const propsData = {\n    onChange,\n    name: 'group',\n    'data-test': 'test',\n    ...props,\n  };\n\n  const instance = getInstance('Form/FormCheckboxGroup', propsData);\n\n  const ref = instance.ref<FromItemRef>();\n  const form = createForm();\n  form.addItem(ref);\n\n  return {\n    form,\n    instance,\n    onChange,\n    propsData,\n  };\n}\n\ndescribe('FormCheckboxGroup', () => {\n  it('测试集成 form', async () => {\n    const { instance, form } = createFormCheckboxGroup({});\n    instance.callMethod('onChange', 2);\n    await sleep(10);\n    expect(form.getFieldsValue()).toEqual({\n      group: 2,\n    });\n  });\n\n  it('测试 props 改变', async () => {\n    const { instance } = createFormCheckboxGroup({});\n    instance.setProps({ required: true });\n    expect(instance.getData().formData.required).toEqual(true);\n  });\n\n  describe('测试事件', () => {\n    it('测试 onChange 事件', () => {\n      const { instance, onChange, propsData } = createFormCheckboxGroup({});\n      const TestValue = ['option1', 'option2'];\n      const TestEvent = fmtEvent({});\n\n      instance.callMethod('onChange', TestValue, TestEvent);\n      expect(onChange.mock.calls.length).toEqual(1);\n      expect(onChange.mock.calls[0]).toEqual([TestValue, fmtEvent(propsData)]);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Form/FormDatePicker/index.test.ts",
    "content": "import { FromItemRef } from 'compiled-alipay/Form/form';\nimport { FormDatePickerProps } from 'compiled-alipay/Form/FormDatePicker/props';\nimport fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport { getInstance, sleep } from 'tests/utils';\nimport { describe, expect, it, vi } from 'vitest';\nimport { createForm } from '../utils';\n\nfunction createFormDatePicker(props: Partial<FormDatePickerProps>) {\n  const onOk = vi.fn();\n  const onPickerChange = vi.fn();\n  const onVisibleChange = vi.fn();\n  const onFormat = vi.fn();\n  const onDismissPicker = vi.fn();\n  const onFormatLabel = vi.fn();\n\n  const propsData = {\n    onOk,\n    onPickerChange,\n    onVisibleChange,\n    onFormat,\n    onDismissPicker,\n    onFormatLabel,\n    name: 'birthday',\n    'data-test': 'test',\n    ...props,\n  };\n\n  const instance = getInstance('Form/FormDatePicker', propsData);\n  const ref = instance.ref<FromItemRef>();\n  const form = createForm();\n  form.addItem(ref);\n  return {\n    form,\n    instance,\n    onOk,\n    onPickerChange,\n    onVisibleChange,\n    onFormat,\n    onDismissPicker,\n    onFormatLabel,\n    propsData,\n  };\n}\n\ndescribe('FormDatePicker', () => {\n  it('测试集成 form', async () => {\n    const { instance, form } = createFormDatePicker({});\n    const testDate = new Date(2023, 3, 14); // April 14, 2023\n    instance.callMethod('onOk', testDate);\n    await sleep(10);\n    expect(form.getFieldsValue()).toEqual({\n      birthday: testDate,\n    });\n  });\n\n  it('测试 props 改变', async () => {\n    const { instance } = createFormDatePicker({});\n    instance.setProps({ required: true });\n    expect(instance.getData().formData.required).toEqual(true);\n  });\n\n  describe('测试事件', () => {\n    const TestDate = new Date(2023, 3, 14);\n    const TestDateStr = '2023-04-14';\n    const TestEvent = fmtEvent({});\n    const TestType = 'start';\n\n    it('测试 onOk', () => {\n      const { onOk, instance, propsData } = createFormDatePicker({});\n      instance.callMethod('onOk', TestDate, TestDateStr, TestEvent);\n      expect(onOk.mock.calls.length).toEqual(1);\n      expect(onOk.mock.calls[0]).toEqual([\n        TestDate,\n        TestDateStr,\n        fmtEvent(propsData),\n      ]);\n    });\n\n    it('测试 onPickerChange', () => {\n      const { onPickerChange, instance, propsData } = createFormDatePicker({});\n      instance.callMethod('onPickerChange', TestDate, TestDateStr, TestEvent);\n      expect(onPickerChange.mock.calls.length).toEqual(1);\n      expect(onPickerChange.mock.calls[0]).toEqual([\n        TestDate,\n        TestDateStr,\n        fmtEvent(propsData),\n      ]);\n    });\n\n    it('测试 onVisibleChange', () => {\n      const { onVisibleChange, instance, propsData } = createFormDatePicker({});\n      instance.callMethod('onVisibleChange', true, TestEvent);\n      expect(onVisibleChange.mock.calls.length).toEqual(1);\n      expect(onVisibleChange.mock.calls[0]).toEqual([\n        true,\n        fmtEvent(propsData),\n      ]);\n    });\n\n    it('测试 onDismissPicker', () => {\n      const { onDismissPicker, instance, propsData } = createFormDatePicker({});\n      instance.callMethod('onDismissPicker', TestEvent);\n      expect(onDismissPicker.mock.calls.length).toEqual(1);\n      expect(onDismissPicker.mock.calls[0]).toEqual([fmtEvent(propsData)]);\n    });\n\n    it('测试 onFormat', () => {\n      const { onFormat, instance } = createFormDatePicker({});\n      instance.callMethod('handleFormat', TestDate, TestDateStr);\n      expect(onFormat.mock.calls.length).toEqual(1);\n      expect(onFormat.mock.calls[0]).toEqual([TestDate, TestDateStr]);\n    });\n\n    it('测试 onFormatLabel', () => {\n      const { onFormatLabel, instance } = createFormDatePicker({});\n      instance.callMethod('handleFormatLabel', TestType, TestDate);\n      expect(onFormatLabel.mock.calls.length).toEqual(1);\n      expect(onFormatLabel.mock.calls[0]).toEqual([TestType, TestDate]);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Form/FormImageUpload/index.test.ts",
    "content": "import { FromItemRef } from 'compiled-alipay/Form/form';\nimport { FormImageUploadProps } from 'compiled-alipay/Form/FormImageUpload/props';\nimport { getInstance, sleep } from 'tests/utils';\nimport { describe, expect, it, vi } from 'vitest';\nimport { createForm } from '../utils';\n\nfunction createFormImageUpload(props: Partial<FormImageUploadProps>) {\n  const onChange = vi.fn();\n  const onUpload = vi.fn();\n  const onRemove = vi.fn();\n  const onPreview = vi.fn();\n  const onBeforeUpload = vi.fn();\n  const onChooseImageError = vi.fn();\n\n  const propsData = {\n    onChange,\n    onUpload,\n    onRemove,\n    onPreview,\n    onBeforeUpload,\n    onChooseImageError,\n    name: 'upload',\n    'data-test': 'test',\n    ...props,\n  };\n\n  const instance = getInstance('Form/FormImageUpload', propsData);\n\n  const ref = instance.ref<FromItemRef>();\n  const form = createForm();\n  form.addItem(ref);\n\n  return {\n    form,\n    instance,\n    onChange,\n    onUpload,\n    onRemove,\n    onPreview,\n    onBeforeUpload,\n    onChooseImageError,\n    propsData,\n  };\n}\n\ndescribe('FormImageUpload', () => {\n  it('测试集成 form', () => {\n    const { instance, form } = createFormImageUpload({});\n    const TestValue = ['image1.png', 'image2.png'];\n    instance.callMethod('onChange', TestValue);\n    expect(form.getFieldsValue()).toEqual({\n      upload: TestValue,\n    });\n  });\n\n  it('测试 props 改变', async () => {\n    const { instance } = createFormImageUpload({});\n    instance.setProps({ required: true });\n    expect(instance.getData().formData.required).toEqual(true);\n  });\n\n  describe('测试事件', () => {\n    it('测试 onChange 事件', async () => {\n      const { instance, onChange } = createFormImageUpload({});\n      const TestValue = ['image1.png', 'image2.png'];\n      const updateFn = vi.fn();\n      instance.callMethod('handleRef', {\n        update: updateFn,\n      });\n      await sleep(20);\n      instance.callMethod('onChange', TestValue);\n      expect(onChange).toHaveBeenCalledTimes(1);\n      expect(onChange.mock.calls[0]).toEqual([\n        ['image1.png', 'image2.png'],\n        {\n          'currentTarget': {\n            'dataset': {\n              'test': 'test',\n            },\n          },\n          'target': {\n            'dataset': {\n              'test': 'test',\n            },\n            'targetDataset': {\n              'test': 'test',\n            },\n          },\n        },\n      ]);\n      await sleep(10);\n      expect(updateFn).toBeCalled();\n    });\n\n    it('测试 onUpload 事件', () => {\n      const { instance, onUpload } = createFormImageUpload({});\n      const TestFile = { name: 'image1.png' };\n\n      instance.callMethod('handleUpload', TestFile);\n      expect(onUpload).toHaveBeenCalledTimes(1);\n      expect(onUpload).toHaveBeenCalledWith(TestFile);\n    });\n\n    it('测试 onRemove 事件', () => {\n      const { instance, onRemove } = createFormImageUpload({});\n      const TestFile = { name: 'image1.png' };\n\n      instance.callMethod('handleRemove', TestFile);\n      expect(onRemove).toHaveBeenCalledTimes(1);\n      expect(onRemove.mock.calls[0]).toEqual([\n        {\n          'name': 'image1.png',\n        },\n      ]);\n    });\n\n    it('测试 onRemove 返回结果', () => {\n      const { instance } = createFormImageUpload({\n        onRemove: () => {\n          return false;\n        },\n      });\n      expect(instance.callMethod('handleRemove')).toBe(false);\n    });\n\n    it('测试 onPreview 事件', () => {\n      const { instance, onPreview } = createFormImageUpload({});\n      const TestFile = { name: 'image1.png' };\n\n      instance.callMethod('onPreview', TestFile);\n      expect(onPreview).toHaveBeenCalledTimes(1);\n      expect(onPreview.mock.calls[0]).toEqual([\n        {\n          'name': 'image1.png',\n        },\n        {\n          'currentTarget': {\n            'dataset': {\n              'test': 'test',\n            },\n          },\n          'target': {\n            'dataset': {\n              'test': 'test',\n            },\n            'targetDataset': {\n              'test': 'test',\n            },\n          },\n        },\n      ]);\n    });\n\n    it('测试 onBeforeUpload 事件', () => {\n      const { instance, onBeforeUpload } = createFormImageUpload({});\n      onBeforeUpload.mockImplementation((v) => v);\n      const TestFileList = [{ name: 'image1.png' }];\n\n      const res = instance.callMethod('handleBeforeUpload', TestFileList);\n      expect(res).toEqual(TestFileList);\n      expect(onBeforeUpload).toHaveBeenCalledTimes(1);\n      expect(onBeforeUpload).toHaveBeenCalledWith(TestFileList);\n    });\n\n    it('测试 onChooseImageError 事件', () => {\n      const { instance, onChooseImageError } = createFormImageUpload({});\n      const TestError = { message: 'Error choosing image' };\n\n      instance.callMethod('onChooseImageError', TestError);\n      expect(onChooseImageError).toHaveBeenCalledTimes(1);\n      expect(onChooseImageError.mock.calls[0]).toEqual([\n        {\n          'message': 'Error choosing image',\n        },\n        {\n          'currentTarget': {\n            'dataset': {\n              'test': 'test',\n            },\n          },\n          'target': {\n            'dataset': {\n              'test': 'test',\n            },\n            'targetDataset': {\n              'test': 'test',\n            },\n          },\n        },\n      ]);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Form/FormInput/index.test.ts",
    "content": "import { FromItemRef } from 'compiled-alipay/Form/form';\nimport { FormInputProps } from 'compiled-alipay/Form/FormInput/props';\nimport fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport { getInstance, sleep } from 'tests/utils';\nimport { describe, expect, it, vi } from 'vitest';\nimport { createForm } from '../utils';\n\nfunction createFormInput(props: Partial<FormInputProps>) {\n  const onChange = vi.fn();\n  const onBlur = vi.fn();\n  const onFocus = vi.fn();\n  const onConfirm = vi.fn();\n  const InputRefUpdate = vi.fn();\n\n  const propsData = {\n    onChange,\n    onBlur,\n    onFocus,\n    onConfirm,\n    name: 'input',\n    'data-test': 'test',\n    ...props,\n  };\n\n  const instance = getInstance('Form/FormInput', propsData);\n  const ref = instance.ref<FromItemRef>();\n  instance.callMethod('handleRef', {\n    update: InputRefUpdate,\n  });\n  const form = createForm();\n  form.addItem(ref);\n  return {\n    form,\n    instance,\n    onChange,\n    onBlur,\n    onFocus,\n    onConfirm,\n    propsData,\n    InputRefUpdate,\n  };\n}\n\ndescribe('FormInput', () => {\n  it('测试集成 form', async () => {\n    const { instance, form, InputRefUpdate } = createFormInput({});\n    instance.callMethod('onChange', 'test value');\n    await sleep(10);\n    expect(form.getFieldsValue()).toEqual({\n      input: 'test value',\n    });\n    expect(InputRefUpdate.mock.lastCall).toEqual(['test value']);\n  });\n\n  it('测试集成 form', async () => {\n    const { instance, form } = createFormInput({\n      required: true,\n    });\n    const handleChange = vi.fn();\n    form.onValuesChange(handleChange);\n    instance.callMethod('onChange', '');\n    expect(form.getFieldsValue()).toEqual({\n      input: '',\n    });\n    await sleep(10);\n    expect(form.getFieldValidatorStatus('input')).toEqual({\n      errors: ['input is required'],\n      status: 'error',\n    });\n  });\n\n  it('测试 props 改变', async () => {\n    const { instance } = createFormInput({});\n    instance.setProps({ required: true });\n    expect(instance.getData().formData.required).toEqual(true);\n  });\n\n  describe('测试事件', () => {\n    const TestValue = 'test value';\n    const TestEvent = fmtEvent({});\n\n    it('测试 onChange 事件', () => {\n      const { instance, onChange, propsData } = createFormInput({});\n      instance.callMethod('onChange', TestValue, TestEvent);\n      expect(onChange.mock.calls.length).toEqual(1);\n      expect(onChange.mock.calls[0]).toEqual([TestValue, fmtEvent(propsData)]);\n    });\n\n    it('测试 onBlur 事件', () => {\n      const { instance, onBlur, propsData } = createFormInput({});\n      instance.callMethod('onBlur', TestValue, TestEvent);\n      expect(onBlur.mock.calls.length).toEqual(1);\n      expect(onBlur.mock.lastCall).toEqual([TestValue, fmtEvent(propsData)]);\n    });\n\n    it('测试 onFocus 事件', () => {\n      const { instance, onFocus, propsData } = createFormInput({});\n      instance.callMethod('onFocus', TestValue, TestEvent);\n      expect(onFocus.mock.calls.length).toEqual(1);\n      expect(onFocus.mock.calls[0]).toEqual([TestValue, fmtEvent(propsData)]);\n    });\n\n    it('测试 onConfirm 事件', () => {\n      const { instance, onConfirm, propsData } = createFormInput({});\n      instance.callMethod('onConfirm', TestValue, TestEvent);\n      expect(onConfirm.mock.calls.length).toEqual(1);\n      expect(onConfirm.mock.calls[0]).toEqual([TestValue, fmtEvent(propsData)]);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Form/FormPicker/index.test.ts",
    "content": "import { FromItemRef } from 'compiled-alipay/Form/form';\nimport { FormPickerProps } from 'compiled-alipay/Form/FormPicker/props';\nimport fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport { getInstance, sleep } from 'tests/utils';\nimport { describe, expect, it, vi } from 'vitest';\nimport { createForm } from '../utils';\n\nfunction createFormPicker(props: Partial<FormPickerProps>) {\n  const onOk = vi.fn();\n  const onChange = vi.fn();\n  const onVisibleChange = vi.fn();\n  const onFormat = vi.fn();\n  const onCancel = vi.fn();\n\n  const propsData = {\n    onOk,\n    onChange,\n    onVisibleChange,\n    onFormat,\n    onCancel,\n    name: 'picker',\n    'data-test': 'test',\n    ...props,\n  };\n\n  const instance = getInstance('Form/FormPicker', propsData);\n  const ref = instance.ref<FromItemRef>();\n  const form = createForm();\n  form.addItem(ref);\n\n  return {\n    form,\n    instance,\n    onOk,\n    onChange,\n    onVisibleChange,\n    onFormat,\n    onCancel,\n    propsData,\n  };\n}\n\ndescribe('FormPicker', () => {\n  it('测试集成 form', async () => {\n    const { instance, form } = createFormPicker({});\n    instance.callMethod('onOk', 'value');\n    await sleep(10);\n    expect(form.getFieldsValue()).toEqual({\n      picker: 'value',\n    });\n  });\n\n  it('测试 props 改变', async () => {\n    const { instance } = createFormPicker({});\n    instance.setProps({ required: true });\n    expect(instance.getData().formData.required).toEqual(true);\n  });\n\n  describe('测试事件', () => {\n    const TestValue = 'value';\n    const TestColumn = { label: 'label', value: 'value' };\n    const TestEvent = fmtEvent({});\n\n    it('测试 onOk', () => {\n      const { onOk, instance, propsData } = createFormPicker({});\n      instance.callMethod('onOk', TestValue, TestColumn, TestEvent);\n      expect(onOk.mock.calls.length).toEqual(1);\n      expect(onOk.mock.calls[0]).toEqual([\n        TestValue,\n        TestColumn,\n        fmtEvent(propsData),\n      ]);\n    });\n\n    it('测试 onChange', () => {\n      const { onChange, instance, propsData } = createFormPicker({});\n      instance.callMethod('onChange', TestValue, TestColumn, TestEvent);\n      expect(onChange.mock.calls.length).toEqual(1);\n      expect(onChange.mock.calls[0]).toEqual([\n        TestValue,\n        TestColumn,\n        fmtEvent(propsData),\n      ]);\n    });\n\n    it('测试 onVisibleChange', () => {\n      const { onVisibleChange, instance, propsData } = createFormPicker({});\n      instance.callMethod('onVisibleChange', true, TestEvent);\n      expect(onVisibleChange.mock.calls.length).toEqual(1);\n      expect(onVisibleChange.mock.calls[0]).toEqual([\n        true,\n        fmtEvent(propsData),\n      ]);\n    });\n\n    it('测试 onFormat', () => {\n      const { onFormat, instance } = createFormPicker({});\n      instance.callMethod('handleFormat', TestValue, TestColumn);\n      expect(onFormat.mock.calls.length).toEqual(1);\n      expect(onFormat.mock.calls[0]).toEqual([TestValue, TestColumn]);\n    });\n\n    it('测试 onDismissPicker', () => {\n      const { onCancel, instance, propsData } = createFormPicker({});\n      instance.callMethod('onDismissPicker', TestEvent);\n      expect(onCancel.mock.calls.length).toEqual(1);\n      expect(onCancel.mock.calls[0]).toEqual([fmtEvent(propsData)]);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Form/FormRadioGroup/index.test.ts",
    "content": "import { FromItemRef } from 'compiled-alipay/Form/form';\nimport { FormRadioGroupProps } from 'compiled-alipay/Form/FormRadioGroup/props';\nimport fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport { getInstance, sleep } from 'tests/utils';\nimport { describe, expect, it, vi } from 'vitest';\nimport { createForm } from '../utils';\n\nfunction createFormRadioGroup(props: Partial<FormRadioGroupProps>) {\n  const onChange = vi.fn();\n\n  const propsData = {\n    onChange,\n    name: 'radioGroup',\n    'data-test': 'test',\n    ...props,\n  };\n\n  const instance = getInstance('Form/FormRadioGroup', propsData);\n\n  const ref = instance.ref<FromItemRef>();\n  const form = createForm();\n  form.addItem(ref);\n\n  return {\n    form,\n    instance,\n    onChange,\n    propsData,\n  };\n}\n\ndescribe('FormRadioGroup', () => {\n  it('测试集成 form', async () => {\n    const { instance, form } = createFormRadioGroup({});\n    instance.callMethod('onChange', 'option1');\n    await sleep(10);\n    expect(form.getFieldsValue()).toEqual({\n      radioGroup: 'option1',\n    });\n  });\n\n  it('测试 props 改变', async () => {\n    const { instance } = createFormRadioGroup({});\n    instance.setProps({ required: true });\n    expect(instance.getData().formData.required).toEqual(true);\n  });\n\n  describe('测试事件', () => {\n    it('测试 onChange 事件', () => {\n      const { instance, onChange, propsData } = createFormRadioGroup({});\n      const TestValue = 'option1';\n      const TestEvent = fmtEvent({});\n\n      instance.callMethod('onChange', TestValue, TestEvent);\n      expect(onChange.mock.calls.length).toEqual(1);\n      expect(onChange.mock.calls[0]).toEqual([TestValue, fmtEvent(propsData)]);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Form/FormRangePicker/index.test.ts",
    "content": "import { FromItemRef } from 'compiled-alipay/Form/form';\nimport { FormRangePickerProps } from 'compiled-alipay/Form/FormRangePicker/props';\nimport fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport { getInstance, sleep } from 'tests/utils';\nimport { describe, expect, it, vi } from 'vitest';\nimport { createForm } from '../utils';\n\nfunction createFormRangePicker(props: Partial<FormRangePickerProps>) {\n  const onOk = vi.fn();\n  const onPickerChange = vi.fn();\n  const onVisibleChange = vi.fn();\n  const onFormat = vi.fn();\n  const onDismissPicker = vi.fn();\n  const onFormatLabel = vi.fn();\n\n  const propsData = {\n    onOk,\n    onPickerChange,\n    onVisibleChange,\n    onFormat,\n    onDismissPicker,\n    onFormatLabel,\n    name: 'range',\n    'data-test': 'test',\n    ...props,\n  };\n\n  const instance = getInstance('Form/FormRangePicker', propsData);\n  const ref = instance.ref<FromItemRef>();\n  const form = createForm();\n  form.addItem(ref);\n\n  return {\n    form,\n    instance,\n    onOk,\n    onPickerChange,\n    onVisibleChange,\n    onFormat,\n    onDismissPicker,\n    onFormatLabel,\n    propsData,\n  };\n}\n\ndescribe('FormRangePicker', () => {\n  it('测试集成 form', async () => {\n    const { instance, form } = createFormRangePicker({});\n    const TestDate = [new Date(2023, 3, 1), new Date(2023, 3, 15)];\n    instance.callMethod('onOk', TestDate);\n    await sleep(10);\n    expect(form.getFieldsValue()).toEqual({\n      range: TestDate,\n    });\n  });\n\n  it('测试 props 改变', async () => {\n    const { instance } = createFormRangePicker({});\n    instance.setProps({ required: true });\n    expect(instance.getData().formData.required).toEqual(true);\n  });\n\n  describe('测试事件', () => {\n    const TestDate = [new Date(2023, 3, 1), new Date(2023, 3, 15)];\n    const TestDateStr = ['2023-04-01', '2023-04-15'];\n    const TestEvent = fmtEvent({});\n    const TestType = 'start';\n\n    it('测试 onOk', () => {\n      const { onOk, instance, propsData } = createFormRangePicker({});\n      instance.callMethod('onOk', TestDate, TestDateStr, TestEvent);\n      expect(onOk.mock.calls.length).toEqual(1);\n      expect(onOk.mock.calls[0]).toEqual([\n        TestDate,\n        TestDateStr,\n        fmtEvent(propsData),\n      ]);\n    });\n\n    it('测试 onPickerChange', () => {\n      const { onPickerChange, instance, propsData } = createFormRangePicker({});\n      instance.callMethod(\n        'onPickerChange',\n        TestType,\n        TestDate,\n        TestDateStr,\n        TestEvent\n      );\n      expect(onPickerChange.mock.calls.length).toEqual(1);\n      expect(onPickerChange.mock.calls[0]).toEqual([\n        TestType,\n        TestDate,\n        TestDateStr,\n        fmtEvent(propsData),\n      ]);\n    });\n\n    it('测试 onVisibleChange', () => {\n      const { onVisibleChange, instance, propsData } = createFormRangePicker(\n        {}\n      );\n      instance.callMethod('onVisibleChange', true, TestEvent);\n      expect(onVisibleChange.mock.calls.length).toEqual(1);\n      expect(onVisibleChange.mock.calls[0]).toEqual([\n        true,\n        fmtEvent(propsData),\n      ]);\n    });\n\n    it('测试 onFormat', () => {\n      const { onFormat, instance } = createFormRangePicker({});\n      instance.callMethod('handleFormat', TestDate, TestDateStr);\n      expect(onFormat.mock.calls.length).toEqual(1);\n      expect(onFormat.mock.calls[0]).toEqual([TestDate, TestDateStr]);\n    });\n\n    it('测试 onDismissPicker', () => {\n      const { onDismissPicker, instance, propsData } = createFormRangePicker(\n        {}\n      );\n      instance.callMethod('onDismissPicker', TestEvent);\n      expect(onDismissPicker.mock.calls.length).toEqual(1);\n      expect(onDismissPicker.mock.calls[0]).toEqual([fmtEvent(propsData)]);\n    });\n\n    it('测试 onFormatLabel', () => {\n      const { onFormatLabel, instance } = createFormRangePicker({});\n      onFormatLabel.mockImplementation(() => 'label');\n      const res = instance.callMethod(\n        'handleFormatLabel',\n        TestType,\n        TestDate[0]\n      );\n      expect(res).toEqual('label');\n      expect(onFormatLabel.mock.calls.length).toEqual(1);\n      expect(onFormatLabel.mock.calls[0]).toEqual([TestType, TestDate[0]]);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Form/FormRate/index.test.ts",
    "content": "import { FromItemRef } from 'compiled-alipay/Form/form';\nimport { FormRateProps } from 'compiled-alipay/Form/FormRate/props';\nimport fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport { getInstance, sleep } from 'tests/utils';\nimport { describe, expect, it, vi } from 'vitest';\nimport { createForm } from '../utils';\n\nfunction createFormRate(props: Partial<FormRateProps>) {\n  const onChange = vi.fn();\n\n  const propsData = {\n    onChange,\n    name: 'rate',\n    'data-test': 'test',\n    ...props,\n  };\n\n  const instance = getInstance('Form/FormRate', propsData);\n\n  const ref = instance.ref<FromItemRef>();\n  const form = createForm();\n  form.addItem(ref);\n\n  return {\n    form,\n    instance,\n    onChange,\n    propsData,\n  };\n}\n\ndescribe('FormRate', () => {\n  it('测试集成 form', async () => {\n    const { instance, form } = createFormRate({});\n    instance.callMethod('onChange', 3);\n    await sleep(10);\n    expect(form.getFieldsValue()).toEqual({\n      rate: 3,\n    });\n  });\n\n  it('测试 props 改变', async () => {\n    const { instance } = createFormRate({});\n    instance.setProps({ required: true });\n    expect(instance.getData().formData.required).toEqual(true);\n  });\n\n  describe('测试事件', () => {\n    it('测试 onChange 事件', () => {\n      const { instance, onChange, propsData } = createFormRate({});\n      const TestValue = 4;\n      const TestEvent = fmtEvent({});\n\n      instance.callMethod('onChange', TestValue, TestEvent);\n      expect(onChange.mock.calls.length).toEqual(1);\n      expect(onChange.mock.calls[0]).toEqual([TestValue, fmtEvent(propsData)]);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Form/FormSelector/index.test.ts",
    "content": "import { FromItemRef } from 'compiled-alipay/Form/form';\nimport { FormSelectorProps } from 'compiled-alipay/Form/FormSelector/props';\nimport fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport { getInstance, sleep } from 'tests/utils';\nimport { describe, expect, it, vi } from 'vitest';\nimport { createForm } from '../utils';\n\nfunction createFormSelector(props: Partial<FormSelectorProps>) {\n  const onChange = vi.fn();\n  const onSelectMax = vi.fn();\n  const onSelectMin = vi.fn();\n\n  const propsData = {\n    onChange,\n    onSelectMax,\n    onSelectMin,\n    name: 'selector',\n    'data-test': 'test',\n    ...props,\n  };\n\n  const instance = getInstance('Form/FormSelector', propsData);\n  const ref = instance.ref<FromItemRef>();\n  const form = createForm();\n  form.addItem(ref);\n\n  return {\n    form,\n    instance,\n    onChange,\n    onSelectMax,\n    onSelectMin,\n    propsData,\n  };\n}\n\ndescribe('FormSelector', () => {\n  it('测试集成 form', async () => {\n    const { instance, form } = createFormSelector({});\n    const TestValue = 'option1';\n    instance.callMethod('onChange', TestValue);\n    await sleep(10);\n    expect(form.getFieldsValue()).toEqual({\n      selector: TestValue,\n    });\n  });\n\n  it('测试 props 改变', async () => {\n    const { instance } = createFormSelector({});\n    instance.setProps({ required: true });\n    expect(instance.getData().formData.required).toEqual(true);\n  });\n\n  describe('测试事件', () => {\n    const TestValue = 'option1';\n    const TestItem = { label: 'Option 1', value: 'option1' };\n    const TestEvent = fmtEvent({});\n\n    it('测试 onChange 事件', () => {\n      const { instance, onChange, propsData } = createFormSelector({});\n      instance.callMethod('onChange', TestValue, TestItem, TestEvent);\n      expect(onChange.mock.calls.length).toEqual(1);\n      expect(onChange.mock.calls[0]).toEqual([\n        TestValue,\n        TestItem,\n        fmtEvent(propsData),\n      ]);\n    });\n\n    it('测试 onSelectMax 事件', () => {\n      const { instance, onSelectMax, propsData } = createFormSelector({});\n      instance.callMethod('onSelectMax', TestValue, TestItem, TestEvent);\n      expect(onSelectMax.mock.calls.length).toEqual(1);\n      expect(onSelectMax.mock.calls[0]).toEqual([\n        TestValue,\n        TestItem,\n        fmtEvent(propsData),\n      ]);\n    });\n\n    it('测试 onSelectMin 事件', () => {\n      const { instance, onSelectMin, propsData } = createFormSelector({});\n      instance.callMethod('onSelectMin', TestValue, TestItem, TestEvent);\n      expect(onSelectMin.mock.calls.length).toEqual(1);\n      expect(onSelectMin.mock.calls[0]).toEqual([\n        TestValue,\n        TestItem,\n        fmtEvent(propsData),\n      ]);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Form/FormSlider/index.test.ts",
    "content": "import { FromItemRef } from 'compiled-alipay/Form/form';\nimport { FormSliderProps } from 'compiled-alipay/Form/FormSlider/props';\nimport fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport { getInstance, sleep } from 'tests/utils';\nimport { describe, expect, it, vi } from 'vitest';\nimport { createForm } from '../utils';\n\nfunction createFormSlider(props: Partial<FormSliderProps>) {\n  const onChange = vi.fn();\n  const onAfterChange = vi.fn();\n\n  const propsData = {\n    onChange,\n    onAfterChange,\n    name: 'slider',\n    'data-test': 'test',\n    ...props,\n  };\n\n  const instance = getInstance('Form/FormSlider', propsData);\n\n  const ref = instance.ref<FromItemRef>();\n  const form = createForm();\n  form.addItem(ref);\n\n  return {\n    form,\n    instance,\n    onChange,\n    onAfterChange,\n    propsData,\n  };\n}\n\ndescribe('FormSlider', () => {\n  it('测试集成 form', async () => {\n    const { instance, form } = createFormSlider({});\n    instance.callMethod('onChange', 50);\n    await sleep(10);\n    expect(form.getFieldsValue()).toEqual({\n      slider: 50,\n    });\n  });\n\n  it('测试 props 改变', async () => {\n    const { instance } = createFormSlider({});\n    instance.setProps({ required: true });\n    expect(instance.getData().formData.required).toEqual(true);\n  });\n\n  describe('测试事件', () => {\n    const TestValue = 50;\n    const TestEvent = fmtEvent({});\n\n    it('测试 onChange 事件', () => {\n      const { instance, onChange, propsData } = createFormSlider({});\n      instance.callMethod('onChange', TestValue, TestEvent);\n      expect(onChange.mock.calls.length).toEqual(1);\n      expect(onChange.mock.calls[0]).toEqual([TestValue, fmtEvent(propsData)]);\n    });\n\n    it('测试 onAfterChange 事件', () => {\n      const { instance, onAfterChange, propsData } = createFormSlider({});\n      instance.callMethod('onAfterChange', TestValue, TestEvent);\n      expect(onAfterChange.mock.calls.length).toEqual(1);\n      expect(onAfterChange.mock.calls[0]).toEqual([\n        TestValue,\n        fmtEvent(propsData),\n      ]);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Form/FormStepper/index.test.ts",
    "content": "import { FromItemRef } from 'compiled-alipay/Form/form';\nimport { FormStepperProps } from 'compiled-alipay/Form/FormStepper/props';\nimport fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport { getInstance, sleep } from 'tests/utils';\nimport { describe, expect, it, vi } from 'vitest';\nimport { createForm } from '../utils';\n\nfunction createFormStepper(props: Partial<FormStepperProps>) {\n  const onChange = vi.fn();\n  const onBlur = vi.fn();\n  const onFocus = vi.fn();\n  const onConfirm = vi.fn();\n\n  const propsData = {\n    onChange,\n    onBlur,\n    onFocus,\n    onConfirm,\n    name: 'stepper',\n    'data-test': 'test',\n    ...props,\n  };\n\n  const instance = getInstance('Form/FormStepper', propsData);\n\n  const ref = instance.ref<FromItemRef>();\n  const form = createForm();\n  form.addItem(ref);\n\n  return {\n    form,\n    instance,\n    onChange,\n    onBlur,\n    onFocus,\n    onConfirm,\n    propsData,\n  };\n}\n\ndescribe('FormStepper', () => {\n  it('测试集成 form', async () => {\n    const { instance, form } = createFormStepper({});\n    instance.callMethod('onChange', 2);\n    await sleep(10);\n    expect(form.getFieldsValue()).toEqual({\n      stepper: 2,\n    });\n  });\n\n  it('测试 props 改变', async () => {\n    const { instance } = createFormStepper({});\n    instance.setProps({ required: true });\n    expect(instance.getData().formData.required).toEqual(true);\n  });\n\n  describe('测试事件', () => {\n    const TestValue = 2;\n    const TestEvent = fmtEvent({});\n\n    it('测试 onChange 事件', () => {\n      const { instance, onChange, propsData } = createFormStepper({});\n      instance.callMethod('onChange', TestValue, TestEvent);\n      expect(onChange.mock.calls.length).toEqual(1);\n      expect(onChange.mock.calls[0]).toEqual([TestValue, fmtEvent(propsData)]);\n    });\n\n    it('测试 onBlur 事件', () => {\n      const { instance, onBlur, propsData } = createFormStepper({});\n      instance.callMethod('onBlur', TestEvent);\n      expect(onBlur.mock.calls.length).toEqual(1);\n      expect(onBlur.mock.calls[0]).toEqual([fmtEvent(propsData)]);\n    });\n\n    it('测试 onFocus 事件', () => {\n      const { instance, onFocus, propsData } = createFormStepper({});\n      instance.callMethod('onFocus', TestEvent);\n      expect(onFocus.mock.calls.length).toEqual(1);\n      expect(onFocus.mock.calls[0]).toEqual([fmtEvent(propsData)]);\n    });\n\n    it('测试 onConfirm 事件', () => {\n      const { instance, onConfirm, propsData } = createFormStepper({});\n      instance.callMethod('onConfirm', TestValue, TestEvent);\n      expect(onConfirm.mock.calls.length).toEqual(1);\n      expect(onConfirm.mock.calls[0]).toEqual([TestValue, fmtEvent(propsData)]);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Form/FormSwitch/index.test.ts",
    "content": "import { FromItemRef } from 'compiled-alipay/Form/form';\nimport { FormSwitchProps } from 'compiled-alipay/Form/FormSwitch/props';\nimport fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport { getInstance, sleep } from 'tests/utils';\nimport { describe, expect, it, vi } from 'vitest';\nimport { createForm } from '../utils';\n\nfunction createFormSwitch(props: Partial<FormSwitchProps>) {\n  const onChange = vi.fn();\n\n  const propsData = {\n    onChange,\n    name: 'switch',\n    'data-test': 'test',\n    ...props,\n  };\n\n  const instance = getInstance('Form/FormSwitch', propsData);\n\n  const ref = instance.ref<FromItemRef>();\n  const form = createForm();\n  form.addItem(ref);\n\n  return {\n    form,\n    instance,\n    onChange,\n    propsData,\n  };\n}\n\ndescribe('FormSwitch', () => {\n  it('测试集成 form', async () => {\n    const { instance, form } = createFormSwitch({});\n    instance.callMethod('onChange', true);\n    await sleep(10);\n    expect(form.getFieldsValue()).toEqual({\n      switch: true,\n    });\n  });\n\n  it('测试 props 改变', async () => {\n    const { instance } = createFormSwitch({});\n    instance.setProps({ required: true });\n    expect(instance.getData().formData.required).toEqual(true);\n  });\n\n  describe('测试事件', () => {\n    it('测试 onChange 事件', () => {\n      const { instance, onChange, propsData } = createFormSwitch({});\n      const TestValue = true;\n      const TestEvent = fmtEvent({});\n\n      instance.callMethod('onChange', TestValue, TestEvent);\n      expect(onChange.mock.calls.length).toEqual(1);\n      expect(onChange.mock.calls[0]).toEqual([TestValue, fmtEvent(propsData)]);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Form/FormTextarea/index.test.ts",
    "content": "import { FromItemRef } from 'compiled-alipay/Form/form';\nimport { FormTextareaProps } from 'compiled-alipay/Form/FormTextarea/props';\nimport fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport { getInstance, sleep } from 'tests/utils';\nimport { describe, expect, it, vi } from 'vitest';\nimport { createForm } from '../utils';\n\nfunction createFormTextarea(props: Partial<FormTextareaProps>) {\n  const onChange = vi.fn();\n  const onBlur = vi.fn();\n  const onFocus = vi.fn();\n  const onConfirm = vi.fn();\n  const InputRefUpdate = vi.fn();\n\n  const propsData = {\n    onChange,\n    onBlur,\n    onFocus,\n    onConfirm,\n    name: 'textarea',\n    'data-test': 'test',\n    ...props,\n  };\n\n  const instance = getInstance('Form/FormTextarea', propsData);\n  const ref = instance.ref<FromItemRef>();\n  instance.callMethod('handleRef', {\n    update: InputRefUpdate,\n  });\n  const form = createForm();\n  form.addItem(ref);\n\n  return {\n    form,\n    instance,\n    onChange,\n    onBlur,\n    onFocus,\n    onConfirm,\n    propsData,\n  };\n}\n\ndescribe('FormTextarea', () => {\n  it('测试集成 form', async () => {\n    const { instance, form } = createFormTextarea({});\n    instance.callMethod('onChange', 'test value');\n    await sleep(10);\n    expect(form.getFieldsValue()).toEqual({\n      textarea: 'test value',\n    });\n  });\n\n  it('测试 props 改变', async () => {\n    const { instance } = createFormTextarea({});\n    instance.setProps({ required: true });\n    expect(instance.getData().formData.required).toEqual(true);\n  });\n\n  describe('测试事件', () => {\n    const TestValue = 'test value';\n    const TestEvent = fmtEvent({});\n\n    it('测试 onChange 事件', () => {\n      const { instance, onChange, propsData } = createFormTextarea({});\n      instance.callMethod('onChange', TestValue, TestEvent);\n      expect(onChange.mock.calls.length).toEqual(1);\n      expect(onChange.mock.calls[0]).toEqual([TestValue, fmtEvent(propsData)]);\n    });\n\n    it('测试 onBlur 事件', () => {\n      const { instance, onBlur, propsData } = createFormTextarea({});\n      instance.callMethod('onBlur', TestValue, TestEvent);\n      expect(onBlur.mock.calls.length).toEqual(1);\n      expect(onBlur.mock.calls[0]).toEqual([TestValue, fmtEvent(propsData)]);\n    });\n\n    it('测试 onFocus 事件', () => {\n      const { instance, onFocus, propsData } = createFormTextarea({});\n      instance.callMethod('onFocus', TestValue, TestEvent);\n      expect(onFocus.mock.calls.length).toEqual(1);\n      expect(onFocus.mock.calls[0]).toEqual([TestValue, fmtEvent(propsData)]);\n    });\n\n    it('测试 onConfirm 事件', () => {\n      const { instance, onConfirm, propsData } = createFormTextarea({});\n      instance.callMethod('onConfirm', TestValue, TestEvent);\n      expect(onConfirm.mock.calls.length).toEqual(1);\n      expect(onConfirm.mock.calls[0]).toEqual([TestValue, fmtEvent(propsData)]);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Form/form.test.ts",
    "content": "import { getInstance, sleep } from 'tests/utils';\nimport { expect, it } from 'vitest';\nimport { createForm } from './utils';\n\nit('测试 updateRules', async () => {\n  const form = createForm();\n  const instance = getInstance('Form/FormPicker', {\n    name: 'test',\n  });\n  form.addItem(instance.ref());\n  expect(instance.getData().formData.required).toBeFalsy();\n  form.updateRules({\n    test: [\n      {\n        required: true,\n        message: '请输入姓名',\n      },\n    ],\n  });\n  await sleep(10);\n  expect(instance.getData().formData.required).toBeTruthy();\n  instance.setProps({ label: 'label' });\n  expect(instance.getData().formData.required).toBeTruthy();\n});\n\nit('测试 updateRules', async () => {\n  const form = createForm({\n    validateMessages: {\n      required: '需要输入${label}',\n      string: {\n        min: '${label}最少${min}个字符',\n      },\n    },\n    rules: {\n      test: [\n        {\n          required: true,\n          min: 6,\n        },\n      ],\n    },\n  });\n  const instance = getInstance('Form/FormInput', {\n    name: 'test',\n    label: 'input',\n  });\n  form.addItem(instance.ref());\n  instance.callMethod('onChange', '');\n  await sleep(10);\n  expect(form.getFieldValidatorStatus('test')).toEqual({\n    'errors': ['需要输入input'],\n    'status': 'error',\n  });\n\n  instance.callMethod('onChange', '1');\n  await sleep(10);\n  expect(form.getFieldValidatorStatus('test')).toEqual({\n    'errors': ['input最少6个字符'],\n    'status': 'error',\n  });\n\n  // 测试 getFieldValidatorStatus 找不到字段的情况\n  expect(form.getFieldValidatorStatus('xx')).toEqual(undefined);\n});\n\nit('测试 实例方法', async () => {\n  const form = createForm({\n    validateMessages: {\n      required: '需要输入${label}',\n      string: {\n        min: '${label}最少${min}个字符',\n      },\n    },\n    rules: {\n      test: [\n        {\n          required: true,\n          min: 6,\n        },\n      ],\n    },\n  });\n  const instance = getInstance('Form/FormInput', {\n    name: 'test',\n    label: 'input',\n  });\n  form.addItem(instance.ref());\n\n  let changedValue;\n  let changedAllValues;\n  form.onValueChange('test', (value) => {\n    changedValue = value;\n  });\n\n  form.onValuesChange((allValues) => {\n    changedAllValues = allValues;\n  });\n  instance.callMethod('onChange', '111');\n  await sleep(10);\n  expect(changedValue).toEqual('111');\n  expect(changedAllValues).toEqual({\n    test: '111',\n  });\n\n  // 校验不通过\n  try {\n    await form.submit();\n  } catch (err) {\n    expect(err.errorFields.length > 0).toBeTruthy();\n  }\n\n  // 通过校验\n  instance.callMethod('onChange', '1234567');\n  const values = await form.submit();\n  expect(values.test).toEqual('1234567');\n});\n\nit('测试 字段嵌套', async () => {\n  const initName = '123123';\n  const initPhone = '10086';\n  const form = createForm({\n    rules: {\n      'user.name': [\n        {\n          required: true,\n          min: 6,\n        },\n      ],\n    },\n    initialValues: {\n      user: {\n        name: initName,\n        phone: initPhone,\n      },\n    },\n  });\n  const nameInstance = getInstance('Form/FormInput', {\n    name: 'user.name',\n    label: 'input',\n  });\n  const phoneInstance = getInstance('Form/FormInput', {\n    name: 'user.phone',\n    label: 'input',\n  });\n  form.addItem(nameInstance.ref());\n  form.addItem(phoneInstance.ref());\n  expect(nameInstance.getData().formData.value).toEqual(initName);\n  expect(form.getFieldValue('user.name')).toEqual(initName);\n  expect(form.getFieldValue('user.phone')).toEqual(initPhone);\n  expect(form.getFieldsValue()).toEqual({\n    user: {\n      name: initName,\n      phone: initPhone,\n    },\n  });\n\n  const changeName = 'andy';\n  // onChange 触发之后回调\n  form.onValueChange('user.name', (value, allValues) => {\n    expect(value).toEqual(changeName);\n    expect(allValues).toEqual({ user: { name: changeName, phone: initPhone } });\n  });\n  form.onValuesChange((value, allValues) => {\n    expect(value).toEqual({ user: { name: changeName } });\n    expect(allValues).toEqual({ user: { name: changeName, phone: initPhone } });\n  });\n  nameInstance.callMethod('onChange', changeName);\n  expect(nameInstance.getData().formData.value).toEqual(changeName);\n  expect(form.getFieldValue('user.name')).toEqual(changeName);\n  expect(form.getFieldsValue()).toEqual({\n    user: {\n      name: changeName,\n      phone: initPhone,\n    },\n  });\n\n  await sleep(10);\n  expect(form.getFieldValidatorStatus('user.name')).toEqual({\n    'errors': ['user.name must be at least 6 characters'],\n    'status': 'error',\n  });\n\n  form.reset();\n  expect(form.getFieldsValue()).toEqual({\n    user: {\n      name: initName,\n      phone: initPhone,\n    },\n  });\n\n  // setInitialValues需要配合reset一起用，才可生效\n  form.setInitialValues({\n    user: { name: 'tony', phone: '10000' },\n  });\n  form.reset();\n\n  expect(form.getFieldsValue()).toEqual({\n    user: {\n      name: 'tony',\n      phone: '10000',\n    },\n  });\n\n  expect(form.getFieldValue('user.name')).toEqual('tony');\n\n  form.setFieldValue('user.phone', '808080');\n\n  expect(form.getFieldValue('user.phone')).toEqual('808080');\n\n  form.setFieldsValue({ user: { name: 'william', phone: '110110' } });\n  expect(form.getFieldsValue()).toEqual({\n    user: { name: 'william', phone: '110110' },\n  });\n  expect(form.getFieldsValue(['user.name'])).toEqual({\n    user: {\n      name: 'william',\n    },\n  });\n  expect(form.getFieldsValue(['user.phone'])).toEqual({\n    user: {\n      phone: '110110',\n    },\n  });\n\n  expect(await form.submit()).toEqual({\n    user: {\n      name: 'william',\n      phone: '110110',\n    },\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Form/form.ts",
    "content": "import { Form } from '../../../compiled/alipay/src/Form/form';\n\ndeclare function updateResult(res): void;\n\nupdateResult(Form);\n"
  },
  {
    "path": "tests/alipay/Form/utils.ts",
    "content": "import { Form, FormConfig } from 'compiled-alipay/Form/form';\nimport { resolve } from 'path';\nimport { runInMiniprogram } from 'tests/utils';\n\nexport function createForm(formConfig?: FormConfig): Form {\n  const FromComponent: any = runInMiniprogram(\n    resolve(__dirname, 'form.ts'),\n    {}\n  );\n\n  return new FromComponent(formConfig);\n}\n"
  },
  {
    "path": "tests/alipay/Grid/__tests__/index.test.ts",
    "content": "import { getInstance } from 'tests/utils';\nimport { describe, it, expect, vi } from 'vitest';\n\ndescribe('grid onTap', () => {\n  it('grid onTap', () => {\n    const onTap = vi.fn();\n    const instance = getInstance('Grid', {\n      onTap,\n    });\n    instance.callMethod('onTap', { currentTarget: { dataset: { item: {} } } });\n    expect(onTap).toBeCalled();\n  });\n});\ndescribe('grid onFirstAppear', () => {\n  it('grid onFirstAppear', () => {\n    const onFirstAppear = vi.fn();\n    const instance = getInstance('Grid', {\n      onFirstAppear,\n    });\n    instance.callMethod('onFirstAppear', { currentTarget: { dataset: { item: {} } } });\n    expect(onFirstAppear).toBeCalled();\n  });\n});\n"
  },
  {
    "path": "tests/alipay/GuideTour/index.test.ts",
    "content": "import fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport { getInstance, sleep } from 'tests/utils';\nimport { describe, it, expect, vi } from 'vitest';\nimport { IGuideTour } from '../../../src/GuideTour/props';\n\nconst createGuideTour = (options: Partial<IGuideTour>) => {\n  const my = {\n    canIUse() {\n      return true;\n    },\n  };\n  const onChange = vi.fn();\n  const onCancel = vi.fn();\n  const instance = getInstance(\n    'GuideTour',\n    {\n      onCancel,\n      onChange,\n      ...options,\n    },\n    my\n  );\n  return {\n    instance,\n    onCancel,\n    onChange,\n  };\n};\n\ndescribe('guideTour onCancel', () => {\n  it('guideTour onCancel', () => {\n    const { instance, onCancel } = createGuideTour({});\n    instance.callMethod('onCancel');\n    expect(onCancel).toBeCalled();\n  });\n});\n\ndescribe('guideTour onChange', () => {\n  it('guideTour onNext', async () => {\n    const { instance, onChange } = createGuideTour({});\n    instance.callMethod('onNext');\n    await sleep(10);\n    expect(instance.getData().mixin.value).toBe(1);\n    expect(onChange).toBeCalledWith(1, fmtEvent({}));\n  });\n\n  it('guideTour onPrev', async () => {\n    const { instance, onChange } = createGuideTour({\n      defaultCurrent: 1,\n    });\n\n    instance.callMethod('onPrev');\n    await sleep(10);\n    expect(instance.getData().mixin.value).toBe(0);\n    expect(onChange).toBeCalledWith(0, fmtEvent({}));\n  });\n  it('guideTour onSwiperChange', () => {\n    const { instance, onChange } = createGuideTour({\n      defaultCurrent: 1,\n    });\n    instance.callMethod('onSwiperChange', { detail: { current: 1 } });\n    expect(instance.getData().mixin.value).toBe(1);\n    expect(onChange).toBeCalledWith(1, fmtEvent({}));\n  });\n  it('guideTour controlled', () => {\n    const { instance, onChange } = createGuideTour({\n      current: 0,\n    });\n    instance.callMethod('onNext');\n    expect(instance.getData().mixin.value).toBe(0);\n    expect(onChange).toBeCalledWith(1, fmtEvent({}));\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Icon/__tests__/index.test.ts",
    "content": "import { getInstance } from 'tests/utils';\nimport { describe, it, expect, vi } from 'vitest';\n\ndescribe('icon onTap', () => {\n  it('icon onTap', () => {\n    const onTap = vi.fn();\n    const instance = getInstance('Icon', {\n      onTap,\n    });\n    instance.callMethod('onTap');\n    expect(onTap).toBeCalled();\n  });\n});\n\ndescribe('icon catchTap', () => {\n  it('icon catchTap', () => {\n    const catchTap = vi.fn();\n    const instance = getInstance('Icon', {\n      catchTap,\n    });\n    instance.callMethod('catchTap');\n    expect(catchTap).toBeCalled();\n  });\n});\n"
  },
  {
    "path": "tests/alipay/ImageUpload/helper.ts",
    "content": "import { getInstance, sleep } from 'tests/utils';\nimport { expect, vi } from 'vitest';\n\nexport function createImageUpload(props = {}) {\n  const onUpload = vi.fn().mockImplementation((file) => {\n    return `path-${file.path}-size-${file.size}`;\n  });\n  const onRemove = vi.fn();\n  const onChange = vi.fn();\n  const onPreview = vi.fn();\n  const onChooseImageError = vi.fn();\n  const onBeforeUpload = vi.fn();\n  const chooseImage = vi.fn().mockImplementation(({ success }) => {\n    return success({\n      tempFiles: [\n        {\n          path: '2',\n          size: 2,\n        },\n      ],\n    });\n  });\n  const my = {\n    chooseImage: chooseImage,\n  };\n  const instance = getInstance(\n    'ImageUpload',\n    {\n      ...props,\n      onUpload,\n      onPreview,\n      onRemove,\n      onChooseImageError,\n      onBeforeUpload,\n      onChange,\n    },\n    my\n  );\n\n  return {\n    onUpload,\n    onChange,\n    instance,\n    onPreview,\n    onRemove,\n    onChooseImageError,\n    onBeforeUpload,\n    chooseImage,\n  };\n}\n\nexport async function callChooseImage(instance) {\n  instance.callMethod('chooseImage');\n  await sleep(10);\n}\n\nfunction removeUid(files) {\n  return files.map(removeFileUid);\n}\n\nexport function removeFileUid(file) {\n  return {\n    ...file,\n    uid: typeof file.uid,\n  };\n}\n\nexport async function expectData(instance, expectData) {\n  expect(removeUid(instance.getData().mixin.value)).toEqual(expectData);\n}\n\nexport async function callOnPreview(instance, index: number) {\n  const data = instance.getData().mixin.value;\n  const item = data[index];\n  instance.callMethod('onPreview', {\n    currentTarget: {\n      dataset: {\n        uid: item.uid,\n      },\n    },\n  });\n  await sleep(10);\n}\n\nexport async function callOnRemove(instance, index: number) {\n  const data = instance.getData().mixin.value;\n  const item = data[index];\n  instance.callMethod('onRemove', {\n    currentTarget: {\n      dataset: {\n        uid: item.uid,\n      },\n    },\n  });\n  await sleep(10);\n}\n"
  },
  {
    "path": "tests/alipay/ImageUpload/index.test.ts",
    "content": "import fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport { getInstance, sleep } from 'tests/utils';\nimport { describe, expect, it } from 'vitest';\nimport {\n  callChooseImage,\n  callOnPreview,\n  callOnRemove,\n  createImageUpload,\n  expectData,\n  removeFileUid,\n} from './helper';\n\ndescribe('ImageUpload', () => {\n  it('测试 defaultFileList', async () => {\n    const { instance } = createImageUpload({\n      defaultFileList: [{ url: 'a' }],\n    });\n    expectData(instance, [\n      {\n        status: 'done',\n        uid: 'string',\n        url: 'a',\n      },\n    ]);\n  });\n\n  it('fileList 优先级大于 defaultFileList', async () => {\n    const { instance } = createImageUpload({\n      fileList: [{ url: 'a1' }],\n      defaultFileList: [{ url: 'a' }],\n    });\n    expectData(instance, [\n      {\n        status: 'done',\n        uid: 'string',\n        url: 'a1',\n      },\n    ]);\n  });\n\n  it('测试 Upload 流程', async () => {\n    const { instance, onUpload } = createImageUpload();\n\n    await callChooseImage(instance);\n    expect(onUpload.mock.calls.length).toBe(1);\n    expect(onUpload.mock.calls[0][0]).toEqual({\n      path: '2',\n      size: 2,\n    });\n    expectData(instance, [\n      {\n        path: '2',\n        size: 2,\n        status: 'done',\n        uid: 'string',\n        url: 'path-2-size-2',\n      },\n    ]);\n  });\n\n  it('ChooseImage 失败需要调用 onChooseImageError', async () => {\n    const { instance, onChooseImageError, chooseImage } = createImageUpload();\n    chooseImage.mockImplementation((e) => {\n      e.fail(new Error('cancel'));\n    });\n    await callChooseImage(instance);\n    expect(onChooseImageError.mock.calls.length).toBe(1);\n    expect(onChooseImageError.mock.calls[0][0].message).toEqual('cancel');\n  });\n\n  it('测试 onBeforeUpload 过滤数据', async () => {\n    const { instance, chooseImage, onBeforeUpload, onUpload } =\n      createImageUpload();\n    chooseImage.mockImplementation((e) => {\n      e.success({ apFilePaths: ['1', '2'] });\n    });\n    onBeforeUpload.mockImplementation((o) => {\n      return o.filter((o) => o.path === '2');\n    });\n    await callChooseImage(instance);\n    expect(onBeforeUpload.mock.calls[0][0]).toEqual([\n      {\n        path: '1',\n      },\n      {\n        path: '2',\n      },\n    ]);\n    expect(onUpload.mock.calls.length).toBe(1);\n    expect(onUpload.mock.calls[0][0]).toEqual({\n      path: '2',\n    });\n  });\n\n  it('测试 onBeforeUpload 返回 false', async () => {\n    const { instance, chooseImage, onBeforeUpload, onUpload } =\n      createImageUpload();\n    chooseImage.mockImplementation((e) => {\n      e.success({ apFilePaths: ['1', '2'] });\n    });\n    onBeforeUpload.mockImplementation(() => {\n      return false;\n    });\n    await callChooseImage(instance);\n    expect(onUpload.mock.calls.length).toBe(0);\n  });\n\n  it('测试 onPreview', async () => {\n    const { instance, onPreview } = createImageUpload();\n    await callChooseImage(instance);\n    await callOnPreview(instance, 0);\n    expect(onPreview.mock.calls.length).toBe(1);\n    expect(removeFileUid(onPreview.mock.calls[0][0])).toEqual({\n      path: '2',\n      size: 2,\n      status: 'done',\n      uid: 'string',\n      url: 'path-2-size-2',\n    });\n  });\n\n  it('测试 onRemove', async () => {\n    const { instance, onRemove, onChange } = createImageUpload();\n    await callChooseImage(instance);\n    await callOnRemove(instance, 0);\n    expect(onRemove.mock.calls.length).toBe(1);\n    expect(removeFileUid(onRemove.mock.calls[0][0])).toEqual({\n      path: '2',\n      size: 2,\n      status: 'done',\n      uid: 'string',\n      url: 'path-2-size-2',\n    });\n\n    expect(onChange.mock.lastCall).toEqual([[], fmtEvent({})]);\n    expectData(instance, []);\n  });\n\n  it('如果没有 onUpload, 需要报错', async () => {\n    const instance = getInstance('ImageUpload', {}, {});\n    let err: Error;\n    try {\n      await instance.callMethod('chooseImage');\n    } catch (error) {\n      err = error;\n    }\n    expect(err.message).toEqual('need props onUpload');\n  });\n\n  it('需要支持通过 update 更新数据', async () => {\n    const instance = getInstance('ImageUpload', {}, {});\n    await instance.callMethod('update', [\n      {\n        path: '2',\n        size: 2,\n        status: 'done',\n        uid: 'string',\n        url: 'path-2-size-2',\n      },\n    ]);\n    await sleep(20);\n    expect(instance.getData().mixin.value).toEqual([\n      {\n        'path': '2',\n        'size': 2,\n        'status': 'done',\n        'uid': 'string',\n        'url': 'path-2-size-2',\n      },\n    ]);\n  });\n\n  it('测试 onRemove 返回 false', async () => {\n    const { instance, onRemove } = createImageUpload();\n    onRemove.mockImplementation(() => false);\n    await callChooseImage(instance);\n    await callOnRemove(instance, 0);\n    expect(onRemove.mock.calls.length).toBe(1);\n    expect(removeFileUid(onRemove.mock.calls[0][0])).toEqual({\n      path: '2',\n      size: 2,\n      status: 'done',\n      uid: 'string',\n      url: 'path-2-size-2',\n    });\n    expectData(instance, [\n      {\n        path: '2',\n        size: 2,\n        status: 'done',\n        uid: 'string',\n        url: 'path-2-size-2',\n      },\n    ]);\n  });\n\n  it('测试同时上传多个图片', async () => {\n    const { instance, onChange, chooseImage, onUpload } = createImageUpload();\n    onUpload.mockImplementation(async (file) => {\n      await sleep(200);\n      return `path-${file.path}-size-${file.size}`;\n    });\n    chooseImage.mockImplementation(({ success }) => {\n      return success({\n        tempFiles: [\n          {\n            path: '2',\n            size: 2,\n          },\n          {\n            path: '3',\n            size: 3,\n          },\n        ],\n      });\n    });\n    await callChooseImage(instance);\n    expect(onChange.mock.calls.length).toEqual(2);\n    expect(\n      onChange.mock.calls[0].map((v, index) => {\n        if (index === 0) {\n          return v.map((item) => ({ ...item, uid: 'uid' }));\n        }\n        return v;\n      })\n    ).toEqual([\n      [\n        {\n          path: '2',\n          size: 2,\n          status: 'uploading',\n          uid: 'uid',\n        },\n      ],\n      fmtEvent({}),\n    ]);\n    expect(\n      onChange.mock.calls[1].map((v, index) => {\n        if (index === 0) {\n          return v.map((item) => ({ ...item, uid: 'uid' }));\n        }\n        return v;\n      })\n    ).toEqual([\n      [\n        {\n          path: '2',\n          size: 2,\n          status: 'uploading',\n          uid: 'uid',\n          url: '',\n        },\n        {\n          path: '3',\n          size: 3,\n          status: 'uploading',\n          uid: 'uid',\n        },\n      ],\n      fmtEvent({}),\n    ]);\n\n    await sleep(500);\n    expect(onChange.mock.calls.length).toEqual(4);\n  });\n\n  it('测试受控模式', async () => {\n    const { instance, onChange, chooseImage, onUpload } = createImageUpload({\n      fileList: [{ url: 'a1' }],\n    });\n    onUpload.mockImplementation(async (file) => {\n      return `path-${file.path}-size-${file.size}`;\n    });\n    chooseImage.mockImplementation(({ success }) => {\n      return success({\n        tempFiles: [\n          {\n            path: '2',\n            size: 2,\n          },\n          {\n            path: '3',\n            size: 3,\n          },\n        ],\n      });\n    });\n    onChange.mockImplementation((fileList) => {\n      instance.setProps({\n        fileList,\n      });\n    });\n    await callChooseImage(instance);\n    expect(onChange.mock.calls.length).toEqual(4);\n    expect(\n      onChange.mock.lastCall.map((v, index) => {\n        if (index === 0) {\n          return v.map((item) => ({ ...item, uid: 'uid' }));\n        }\n        return v;\n      })\n    ).toEqual([\n      [\n        { url: 'a1', uid: 'uid', status: 'done' },\n        {\n          path: '2',\n          size: 2,\n          uid: 'uid',\n          status: 'done',\n          url: 'path-2-size-2',\n        },\n        {\n          path: '3',\n          size: 3,\n          uid: 'uid',\n          status: 'done',\n          url: 'path-3-size-3',\n        },\n      ],\n      fmtEvent({}),\n    ]);\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Input/InputBlur/index.test.ts",
    "content": "import { callMethod, getInstance, wrapValue } from 'tests/utils';\nimport { describe, expect, it, vi } from 'vitest';\n\nit('测试 InputBlur 默认的 props', () => {\n  const instance = getInstance('Input/InputBlur', {\n    value: '1',\n  });\n  expect(instance.getConfig().props).toEqual({\n    placeholderClassName: '',\n    placeholderStyle: '',\n  });\n});\n\ndescribe('InputBlur 的受控模式', () => {\n  it('InputBlur 即使在受控模式下, 也会更新', async () => {\n    const onChange = vi.fn();\n    const instance = getInstance('Input/InputBlur', {\n      value: '1',\n      onChange,\n    });\n    expect(instance.getData().state.value).toBe('1');\n    await callMethod(instance, 'onChange', wrapValue('3'));\n    expect(instance.getData().state.value).toMatchInlineSnapshot('\"3\"');\n  });\n\n  it('受控模式, 随着 value 改变而改变', async () => {\n    const onFocus = vi.fn();\n    const instance = getInstance('Input/InputBlur', {\n      value: '1',\n      onFocus,\n    });\n\n    instance.setProps({ value: '2' });\n    expect(instance.getData().state.value).toEqual('2');\n  });\n\n  it('onFocus 时，不会随着 value 改变而改变', async () => {\n    const onFocus = vi.fn();\n    const instance = getInstance('Input/InputBlur', {\n      value: '1',\n      onFocus,\n    });\n\n    await callMethod(instance, 'onFocus', wrapValue('2'));\n    expect(onFocus.mock.calls.map((o) => o[0])).toEqual(['2']);\n    expect(instance.getData().state.value).toMatchInlineSnapshot('\"1\"');\n\n    // focus 的时候不响应 props 的变化\n    instance.setProps({ value: '2' });\n    expect(instance.getData().state.value).toEqual('1');\n\n    await callMethod(instance, 'onChange', wrapValue('4'));\n    expect(instance.getData().state.value).toMatchInlineSnapshot('\"4\"');\n  });\n\n  it('onBlur 时候需要将 value 更新为 props 的数值', async () => {\n    const onBlur = vi.fn();\n    const instance = getInstance('Input/InputBlur', {\n      value: '1',\n      onBlur,\n    });\n    await callMethod(instance, 'onFocus', wrapValue('2'));\n\n    await callMethod(instance, 'onChange', wrapValue('2'));\n    expect(instance.getData().state.value).toEqual('2');\n\n    instance.setProps({ value: '2.0' });\n    expect(instance.getData().state.value).toEqual('2');\n\n    // on blur 时候, 将 value 更新为 props.value\n    await callMethod(instance, 'onBlur', wrapValue('4'));\n    expect(onBlur.mock.calls.map((o) => o[0])).toEqual(['4']);\n    expect(instance.getData().state.value).toEqual('2.0');\n  });\n\n  it('test onConfirm', async () => {\n    const onConfirm = vi.fn();\n    const instance = getInstance('Input/InputBlur', {\n      value: '1',\n      onConfirm,\n    });\n    await callMethod(instance, 'onConfirm', wrapValue('2'));\n    expect(instance.getData().state.value).toMatchInlineSnapshot('\"1\"');\n    expect(onConfirm.mock.calls.map((o) => o[0])).toEqual(['2']);\n  });\n});\n\ndescribe('InputBlur 的非受控模式', () => {\n  it('非受控模式下, 内部的 value 一直不变, value 一直是 undefined', async () => {\n    const onChange = vi.fn();\n    const instance = getInstance('Input/InputBlur', {\n      onChange,\n    });\n    expect(instance.getData().state.value).toBe(undefined);\n    await callMethod(instance, 'onChange', wrapValue('3'));\n    expect(onChange.mock.calls.map((o) => o[0])).toEqual(['3']);\n    expect(instance.getData().state.value).toBe(undefined);\n\n    instance.setProps({ value: '4' });\n    expect(instance.getData().state.value).toBe('4');\n\n    instance.setProps({ value: undefined });\n    expect(instance.getData().state.value).toBe(undefined);\n  });\n\n  it('controlled 优先级高于 value', async () => {\n    const onChange = vi.fn();\n    const instance = getInstance('Input/InputBlur', {\n      value: '3',\n      controlled: false,\n      onChange,\n    });\n    expect(instance.getData().state.value).toBe('3');\n    await callMethod(instance, 'onChange', wrapValue('2'));\n    expect(onChange.mock.calls.map((o) => o[0])).toEqual(['2']);\n    expect(instance.getData().state.value).toBe('3');\n\n    instance.setProps({ value: '4' });\n    expect(instance.getData().state.value).toBe('4');\n\n    instance.setProps({ value: undefined });\n    expect(instance.getData().state.value).toBe(undefined);\n  });\n\n  it('在有 value 的非受控模式, 仍然有 onBlur 的逻辑', async () => {\n    const onChange = vi.fn();\n    const instance = getInstance('Input/InputBlur', {\n      value: '3',\n      controlled: false,\n      onChange,\n    });\n    await callMethod(instance, 'onFocus', wrapValue('2'));\n    instance.setProps({ value: '4' });\n    expect(instance.getData().state.value).toBe('3');\n    await callMethod(instance, 'onBlur', wrapValue('4'));\n    instance.setProps({ value: '4' });\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Input/Textarea/index.test.ts",
    "content": "import { textInputAndTextArea } from '../common';\n\ntextInputAndTextArea('Input/Textarea', { enableNative: false });\n"
  },
  {
    "path": "tests/alipay/Input/common.ts",
    "content": "import { callMethod, getInstance, sleep, wrapValue } from 'tests/utils';\nimport { describe, expect, it, vi } from 'vitest';\n\nexport function textInputAndTextArea(componentName: string, defaultProps) {\n  it('test default props', async () => {\n    const instance = getInstance(componentName, {});\n    expect(instance.getConfig().props).toEqual(defaultProps);\n  });\n\n  describe('Input 非受控', () => {\n    it('测试 default value', async () => {\n      const onChange = vi.fn();\n      const instance = getInstance(componentName, {\n        defaultValue: '1',\n        onChange,\n      });\n      expect(instance.getData().state.value).toBe('1');\n      instance.setProps({ value: '2' });\n      expect(instance.getData().state.value).toEqual('2');\n      instance.setProps({ value: undefined });\n      expect(instance.getData().state.value).toEqual(undefined);\n    });\n\n    it('测试 default value 和 value 同时存在', async () => {\n      const onChange = vi.fn();\n      const instance = getInstance(componentName, {\n        value: '3',\n        isControlled: false,\n        defaultValue: '1',\n        onChange,\n      });\n      expect(instance.getData().state.value).toBe('3');\n      instance.setProps({ value: '2' });\n      expect(instance.getData().state.value).toEqual('2');\n      instance.setProps({ value: undefined });\n      expect(instance.getData().state.value).toEqual(undefined);\n    });\n\n    it('如果有 value 且 controlled 为 false, 以 controlled 为准', async () => {\n      const onChange = vi.fn();\n      const instance = getInstance(componentName, {\n        value: '1',\n        controlled: false,\n        onChange,\n      });\n      expect(instance.getData().state.value).toBe('1');\n      expect(instance.getData().state.controlled).toBe(false);\n      await callMethod(instance, 'onChange', wrapValue('3'));\n      expect(instance.getData().state.value).toEqual('3');\n      expect(onChange.mock.calls.map((o) => o[0])).toEqual(['3']);\n\n      instance.setProps({ value: '2' });\n      expect(instance.getData().state.value).toEqual('2');\n      instance.setProps({ value: undefined });\n      expect(instance.getData().state.value).toEqual(undefined);\n      instance.setProps({ value: null });\n      expect(instance.getData().state.value).toEqual(null);\n    });\n\n    it('调用 update 函数的时候, 不触发 onChange', async () => {\n      const onChange = vi.fn();\n      const instance = getInstance(componentName, {\n        value: '1',\n        controlled: false,\n        onChange,\n      });\n      await callMethod(instance, 'update', '2');\n      expect(instance.getData().state.value).toBe('2');\n      expect(onChange.mock.calls.map((o) => o[0])).toEqual([]);\n    });\n\n    it('onClear 触发的时候会调用 onChange', async () => {\n      const onChange = vi.fn();\n      const instance = getInstance(componentName, { onChange });\n      expect(instance.getData().state.controlled).toBe(false);\n      expect(instance.getData().state.value).toEqual(undefined);\n\n      await callMethod(instance, 'onChange', wrapValue('3'));\n      expect(instance.getData().state.value).toEqual('3');\n\n      await callMethod(instance, 'onClear', {});\n      expect(instance.getData().state.value).toEqual('');\n\n      expect(onChange.mock.calls.map((o) => o[0])).toMatchInlineSnapshot(`\n        [\n          \"3\",\n          \"\",\n        ]\n      `);\n    });\n  });\n\n  describe('Input 受控模式', () => {\n    it('测试 default value 和 value 同时存在', async () => {\n      const onChange = vi.fn();\n      const instance = getInstance(componentName, {\n        value: '3',\n        defaultValue: '1',\n        onChange,\n      });\n      expect(instance.getData().state.value).toBe('3');\n      instance.setProps({ value: '2' });\n      expect(instance.getData().state.value).toEqual('2');\n      instance.setProps({ value: undefined });\n      expect(instance.getData().state.value).toEqual(undefined);\n    });\n\n    it('如果有 controlled, 以 controlled 为准', async () => {\n      const instance = getInstance(componentName, {\n        controlled: true,\n      });\n      expect(instance.getData().state.controlled).toBe(true);\n\n      instance.setProps({ value: '2' });\n      expect(instance.getData().state.value).toEqual('2');\n      instance.setProps({ value: undefined });\n      expect(instance.getData().state.value).toEqual(undefined);\n      instance.setProps({ value: null });\n      expect(instance.getData().state.value).toEqual(null);\n    });\n\n    it('受控模式下, update 无效', async () => {\n      const instance = getInstance(componentName, {\n        value: '1',\n      });\n      expect(instance.getData().state.controlled).toBe(true);\n      expect(instance.getData().state.value).toBe('1');\n\n      instance.setProps({ value: '2' });\n      expect(instance.getData().state.value).toEqual('2');\n      instance.setProps({ value: undefined });\n      expect(instance.getData().state.value).toEqual(undefined);\n      instance.setProps({ value: null });\n      expect(instance.getData().state.value).toEqual(null);\n    });\n\n    // it('受控模式下, update 无效', async () => {\n    //   const instance = getInstance(componentName, {\n    //     value: '1',\n    //     controlled: true,\n    //   });\n    //   expect(instance.getData().state.value).toBe('1');\n    //   expect(instance.getData().state.controlled).toBe(true);\n    //   await callMethod(instance, 'update', '3');\n    //   expect(instance.getData().state.value).toBe('1');\n    // });\n\n    it('受控模式下 onChange 无效', async () => {\n      const onChange = vi.fn();\n      const instance = getInstance(componentName, {\n        value: '1',\n        onChange,\n      });\n      expect(instance.getData().state.value).toBe('1');\n      await callMethod(instance, 'onChange', wrapValue('3'));\n      expect(instance.getData().state.value).toEqual('1');\n      expect(onChange.mock.calls.map((o) => o[0])).toEqual(['3']);\n      instance.setProps({ value: '3' });\n      expect(instance.getData().state.value).toEqual('3');\n    });\n\n    it('测试 onFocus 和 onBlur', async () => {\n      const onFocus = vi.fn();\n      const onBlur = vi.fn();\n      const instance = getInstance(componentName, {\n        value: '1',\n        onFocus,\n        onBlur,\n      });\n      expect(instance.getData().selfFocus).toBeFalsy();\n      await callMethod(instance, 'onFocus', wrapValue('3'));\n      await sleep(30);\n      expect(instance.getData().selfFocus).toBeTruthy();\n      expect(onFocus.mock.calls.map((o) => o[0])).toEqual(['3']);\n      await callMethod(instance, 'onBlur', wrapValue('4'));\n      expect(instance.getData().state.value).toMatchInlineSnapshot('\"1\"');\n      expect(onBlur.mock.calls.map((o) => o[0])).toEqual(['4']);\n    });\n\n    it('test onConfirm', async () => {\n      const onConfirm = vi.fn();\n      const instance = getInstance(componentName, {\n        value: '1',\n        onConfirm,\n      });\n      await callMethod(instance, 'onConfirm', wrapValue('1'));\n      expect(onConfirm.mock.calls.map((o) => o[0])).toEqual(['1']);\n    });\n\n    it('受控模式下调用 onClear, 数据不变', async () => {\n      const onChange = vi.fn();\n      const instance = getInstance(componentName, {\n        value: '1',\n        onChange,\n      });\n      await callMethod(instance, 'onClear', {});\n      expect(onChange.mock.calls.map((o) => o[0])).toEqual(['']);\n      expect(instance.getData().state.value).toEqual('1');\n    });\n  });\n}\n"
  },
  {
    "path": "tests/alipay/Input/index.test.ts",
    "content": "import { callMethod, getInstance, wrapValue } from 'tests/utils';\nimport { expect, it, vi } from 'vitest';\nimport { textInputAndTextArea } from './common';\n\ntextInputAndTextArea('Input', {\n  'precision': -1,\n});\n\nit('数字键盘精度和范围限制', async () => {\n  const onBlur = vi.fn();\n  const instance = getInstance('Input', {\n    type: 'number',\n    max: 200,\n    min: -10,\n    precision: 2,\n    onBlur,\n  });\n  await callMethod(instance, 'onBlur', wrapValue('400.0'));\n  expect(onBlur.mock.calls.map((o) => o[0])[0]).toEqual('200.00');\n\n  await callMethod(instance, 'onBlur', wrapValue('-100'));\n  expect(onBlur.mock.calls.map((o) => o[0])[1]).toEqual('-10.00');\n\n  await callMethod(instance, 'onBlur', wrapValue('20.0122'));\n  expect(onBlur.mock.calls.map((o) => o[0])[2]).toEqual('20.01');\n\n  // 输入有效数字后生效\n  await callMethod(instance, 'onBlur', wrapValue('-1.2..0'));\n  expect(onBlur.mock.calls.map((o) => o[0])[3]).toEqual('-1.2..0');\n});\n"
  },
  {
    "path": "tests/alipay/List/__tests__/List.test.ts",
    "content": "import { getInstance } from 'tests/utils';\nimport { describe, it, expect, vi } from 'vitest';\n\ndescribe('list props', () => {\n  it('list getConfig', () => {\n    const onTap = vi.fn();\n    const instance = getInstance('List', {\n      onTap,\n    });\n    expect(instance.getConfig()).toMatchFileSnapshot(\n      'snapshot/list_alipay_config.txt'\n    );\n  });\n});\n"
  },
  {
    "path": "tests/alipay/List/__tests__/ListItem.test.ts",
    "content": "import { getInstance } from 'tests/utils';\nimport { describe, it, expect, vi } from 'vitest';\n\ndescribe('listItem props', () => {\n  it('listItem getConfig', () => {\n    const onTap = vi.fn();\n    const instance = getInstance('List/ListItem', {\n      onTap,\n    });\n    expect(instance.getConfig()).toMatchFileSnapshot(\n      'snapshot/list_item_alipay_config.txt'\n    );\n  });\n});\n\ndescribe('listItem onTap', () => {\n  it('listItem onTap', () => {\n    const onTap = vi.fn();\n    const instance = getInstance('List/ListItem', {\n      onTap,\n    });\n    instance.callMethod('onTap');\n    expect(onTap).toBeCalled();\n  });\n  it('listItem disabled', () => {\n    const onTap = vi.fn();\n    const instance = getInstance('List/ListItem', {\n      onTap,\n      disabled: true,\n    });\n    instance.callMethod('onTap');\n    expect(onTap).not.toBeCalled();\n  });\n});\n\ndescribe('listItem catchTap', () => {\n  it('listItem catchTap', () => {\n    const catchTap = vi.fn();\n    const instance = getInstance('List/ListItem', {\n      catchTap,\n    });\n    instance.callMethod('catchTap');\n    expect(catchTap).toBeCalled();\n  });\n  it('listItem disabled', () => {\n    const catchTap = vi.fn();\n    const instance = getInstance('List/ListItem', {\n      catchTap,\n      disabled: true,\n    });\n    instance.callMethod('catchTap');\n    expect(catchTap).not.toBeCalled();\n  });\n});\n"
  },
  {
    "path": "tests/alipay/List/__tests__/snapshot/list_alipay_config.txt",
    "content": "{\n  \"data\": undefined,\n  \"methods\": undefined,\n  \"mixins\": [],\n  \"props\": {\n    \"footer\": \"\",\n    \"header\": \"\",\n    \"radius\": false,\n  },\n}\n"
  },
  {
    "path": "tests/alipay/List/__tests__/snapshot/list_item_alipay_config.txt",
    "content": "{\n  \"data\": undefined,\n  \"methods\": {\n    \"catchTap\": [Function],\n    \"onTap\": [Function],\n  },\n  \"mixins\": [],\n  \"props\": {\n    \"arrow\": false,\n    \"brief\": \"\",\n    \"disabled\": false,\n    \"extra\": \"\",\n    \"extraBrief\": \"\",\n    \"image\": \"\",\n    \"showDivider\": true,\n    \"title\": \"\",\n  },\n}\n"
  },
  {
    "path": "tests/alipay/Modal/__tests__/index.test.ts",
    "content": "import { getInstance } from 'tests/utils';\nimport { describe, it, expect, vi } from 'vitest';\n\ndescribe('init', () => {\n  it('测试默认值', () => {\n    const instance = getInstance('Modal', {});\n\n    const {\n      bodyClassName,\n      bodyStyle,\n      maskClassName,\n      maskStyle,\n      maskClosable,\n      type,\n      closable,\n      duration,\n      animation,\n      zIndex,\n      title,\n      content,\n      visible,\n      destroyOnClose,\n      primaryButtonText,\n      secondaryButtonText,\n      cancelButtonText,\n      primaryButtonStyle,\n      secondaryButtonStyle,\n      cancelButtonStyle,\n    } = instance.getConfig().props;\n    expect({\n      bodyClassName,\n      bodyStyle,\n      maskClassName,\n      maskStyle,\n      maskClosable,\n      type,\n      closable,\n      duration,\n      animation,\n      zIndex,\n      title,\n      content,\n      visible,\n      destroyOnClose,\n      primaryButtonText,\n      secondaryButtonText,\n      cancelButtonText,\n      primaryButtonStyle,\n      secondaryButtonStyle,\n      cancelButtonStyle,\n    }).toMatchFileSnapshot('snapshot/alipay_config_props.txt');\n  });\n});\n\ndescribe('modal onClose', () => {\n  it('modal onClose', () => {\n    const onClose = vi.fn();\n    const instance = getInstance('Modal', {\n      onClose,\n    });\n    instance.callMethod('onClose');\n    expect(onClose).toBeCalled();\n  });\n});\ndescribe('modal onMaskClose', () => {\n  it('modal onMaskClose', () => {\n    const onClose = vi.fn();\n    const instance = getInstance('Modal', {\n      onClose,\n      maskClosable: true,\n    });\n    instance.callMethod('onMaskClose');\n    expect(onClose).toBeCalled();\n  });\n\n  it('maskClosable false', () => {\n    const onClose = vi.fn();\n    const instance = getInstance('Modal', {\n      onClose,\n      maskClosable: false,\n    });\n    instance.callMethod('onMaskClose');\n    expect(onClose).not.toBeCalled();\n  });\n});\ndescribe('modal button function', () => {\n  it('modal onPrimaryButtonTap', () => {\n    const onPrimaryButtonTap = vi.fn();\n    const instance = getInstance('Modal', {\n      onPrimaryButtonTap,\n    });\n    instance.callMethod('onPrimaryButtonTap');\n    expect(onPrimaryButtonTap).toBeCalled();\n  });\n\n  it('modal onSecondaryButtonTap', () => {\n    const onSecondaryButtonTap = vi.fn();\n    const instance = getInstance('Modal', {\n      onSecondaryButtonTap,\n    });\n    instance.callMethod('onSecondaryButtonTap');\n    expect(onSecondaryButtonTap).toBeCalled();\n  });\n  it('modal onCancelButtonTap', () => {\n    const onCancelButtonTap = vi.fn();\n    const instance = getInstance('Modal', {\n      onCancelButtonTap,\n    });\n    instance.callMethod('onCancelButtonTap');\n    expect(onCancelButtonTap).toBeCalled();\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Modal/__tests__/snapshot/alipay_config_props.txt",
    "content": "{\n  \"animation\": true,\n  \"bodyClassName\": \"\",\n  \"bodyStyle\": \"\",\n  \"cancelButtonStyle\": \"\",\n  \"cancelButtonText\": \"\",\n  \"closable\": true,\n  \"content\": \"\",\n  \"destroyOnClose\": false,\n  \"duration\": 200,\n  \"maskClassName\": \"\",\n  \"maskClosable\": true,\n  \"maskStyle\": \"\",\n  \"primaryButtonStyle\": \"\",\n  \"primaryButtonText\": \"\",\n  \"secondaryButtonStyle\": \"\",\n  \"secondaryButtonText\": \"\",\n  \"title\": \"\",\n  \"type\": \"default\",\n  \"visible\": false,\n  \"zIndex\": 998,\n}\n"
  },
  {
    "path": "tests/alipay/NoticeBar/index.test.ts",
    "content": "import { getInstance, sleep } from 'tests/utils';\nimport { describe, expect, it, vi } from 'vitest';\nimport { INoticeBarProps } from '../../../src/NoticeBar/props';\nimport { SelectorQuery } from '../../selector-query';\n\nconst createNoticeBar = (options?: Partial<INoticeBarProps>) => {\n  const handleQuery = vi.fn();\n  const selector = SelectorQuery.create(handleQuery);\n\n  const my = {\n    canIUse() {\n      return true;\n    },\n    createSelectorQuery() {\n      return selector;\n    },\n  };\n  const onTransitionEnd = vi.fn();\n  const onTap = vi.fn();\n  const instance = getInstance(\n    'NoticeBar',\n    {\n      onTransitionEnd,\n      onTap,\n      handleQuery,\n      ...options,\n    },\n    my\n  );\n  return {\n    instance,\n    onTransitionEnd,\n    handleQuery,\n    onTap,\n  };\n};\n\ndescribe('modal onClose', () => {\n  it('测试 enableMarquee', async () => {\n    const { instance, handleQuery } = createNoticeBar({\n      enableMarquee: true,\n    });\n    handleQuery.mockImplementation((id: string, index: number) => {\n      return {\n        width: {\n          ['.ant-notice-bar-marquee-1']: [200],\n          ['.ant-notice-bar-content-1']: [100],\n        }[id][index],\n      };\n    });\n    await sleep(30);\n    expect(instance.getData()).toEqual({\n      'marqueeStyle':\n        'transform: translate3d(-100px, 0, 0); transition: 2.5s all linear 0.5s;',\n      'show': true,\n    });\n    handleQuery.mockImplementation((id: string, index: number) => {\n      return {\n        width: {\n          ['.ant-notice-bar-marquee-1']: [300],\n          ['.ant-notice-bar-content-1']: [100],\n        }[id][index],\n      };\n    });\n    instance.setProps({\n      mode: 'link',\n    });\n    await sleep(30);\n    expect(instance.getData()).toEqual({\n      'marqueeStyle':\n        'transform: translate3d(-200px, 0, 0); transition: 5s all linear 0.5s;',\n      'show': true,\n    });\n  });\n\n  it('测试 loop', async () => {\n    const { instance, handleQuery } = createNoticeBar({\n      enableMarquee: true,\n      loop: true,\n    });\n    handleQuery.mockImplementation((id: string, index: number) => {\n      return {\n        width: {\n          ['.ant-notice-bar-marquee-1']: [200],\n          ['.ant-notice-bar-content-1']: [100],\n        }[id][index],\n      };\n    });\n    await sleep(30);\n    expect(instance.getData()).toEqual({\n      'marqueeStyle':\n        'transform: translate3d(-200px, 0, 0); transition: 5s all linear 0.5s;',\n      'show': true,\n    });\n    handleQuery.mockImplementation(async (id: string, index: number) => {\n      await sleep(300, true);\n      return {\n        width: {\n          ['.ant-notice-bar-marquee-1']: [200],\n          ['.ant-notice-bar-content-1']: [100],\n        }[id][index],\n      };\n    });\n    // expect(handleQuery).toBeCalledTimes(4);\n    // await sleep(500); // 不会无脑循环\n    // expect(handleQuery).toBeCalledTimes(4);\n\n    instance.callMethod('onTransitionEnd');\n    await sleep(100, true);\n    // 需要等 200 ms 才开始调用\n    // expect(handleQuery).toBeCalledTimes(4);\n    await sleep(100 + 300 * 2, true);\n    await sleep(20);\n\n    // 执行 reset\n    expect(instance.getData()).toEqual({\n      'marqueeStyle':\n        'transform: translate3d(100px, 0, 0); transition: 0s all linear;',\n      'show': true,\n    });\n\n    await sleep(300 * 2, true);\n    expect(instance.getData()).toEqual({\n      'marqueeStyle':\n        'transform: translate3d(-200px, 0, 0); transition: 5s all linear 0.5s;',\n      'show': true,\n    });\n\n    await sleep(300 * 3, true);\n    // 触发 use effect\n    // expect(handleQuery).toBeCalledTimes(10);\n    expect(instance.getData()).toEqual({\n      'marqueeStyle':\n        'transform: translate3d(-200px, 0, 0); transition: 5s all linear 0.5s;',\n      'show': true,\n    });\n  }, 10000);\n\n  it('测试 overflowWidth < 0', async () => {\n    const { instance, handleQuery } = createNoticeBar({\n      enableMarquee: true,\n    });\n\n    handleQuery.mockImplementation((id: string, index: 0) => {\n      return {\n        width: {\n          ['.ant-notice-bar-marquee-1']: [100],\n          ['.ant-notice-bar-content-1']: [200],\n        }[id][index],\n      };\n    });\n    await sleep(30);\n    expect(instance.getData()).toEqual({\n      'marqueeStyle': '',\n      'show': true,\n    });\n  });\n});\n\ndescribe('tab', () => {\n  it('测试 closeable', async () => {\n    const { instance, onTap } = createNoticeBar({\n      mode: 'closeable',\n    });\n\n    instance.callMethod('onTap');\n    await sleep(30);\n    expect(instance.getData().show).toEqual(false);\n    expect(onTap).toBeCalledTimes(1);\n  });\n\n  it('测试 closeable 且 onTap 不是函数', async () => {\n    const { instance } = createNoticeBar({\n      mode: 'closeable',\n      onTap: null,\n    });\n\n    instance.callMethod('onTap');\n    await sleep(30);\n    expect(instance.getData().show).toEqual(true);\n  });\n\n  it('测试 link', async () => {\n    const { instance, onTap } = createNoticeBar({\n      mode: 'link',\n    });\n\n    instance.callMethod('onTap');\n    await sleep(30);\n    expect(instance.getData().show).toEqual(true);\n    expect(onTap).toBeCalledTimes(1);\n  });\n});\n"
  },
  {
    "path": "tests/alipay/NumberKeyboard/index.spec.ts",
    "content": "import { getInstance, sleep } from 'tests/utils';\nimport { describe, expect, it, vi } from 'vitest';\nimport { INumberKeyboardProps } from '../../../src/NumberKeyboard/props';\n\nfunction createNumberKeyboard(\n  props: Partial<INumberKeyboardProps>,\n  myOverride?: Record<string, any>\n) {\n  const canIUse = vi.fn().mockImplementation(() => true);\n  const onChange = vi.fn();\n  const onClose = vi.fn();\n  const vibrateShort = vi.fn();\n  const my = {\n    canIUse(args: string) {\n      return canIUse(args);\n    },\n    vibrateShort,\n    ...myOverride,\n  };\n  const instance = getInstance(\n    'NumberKeyboard',\n    {\n      onChange,\n      onClose,\n      ...props,\n    },\n    my\n  );\n\n  async function clickKey(key: string) {\n    instance.callMethod('tapButton', {\n      currentTarget: {\n        dataset: {\n          key,\n        },\n      },\n    });\n    await sleep(20);\n  }\n\n  return { onClose, instance, canIUse, vibrateShort, onChange, clickKey };\n}\n\nit('默认的 number keyboard', () => {\n  const { instance } = createNumberKeyboard({});\n  expect(instance.getData()).toEqual({\n    'numArr': [\n      [1, 2, 3],\n      [4, 5, 6],\n      [7, 8, 9],\n    ],\n    'randomArr': [],\n  });\n});\n\nit('测试点击', async () => {\n  const { instance, clickKey, onChange, onClose } = createNumberKeyboard({});\n  expect(instance.getData()).toEqual({\n    'numArr': [\n      [1, 2, 3],\n      [4, 5, 6],\n      [7, 8, 9],\n    ],\n    'randomArr': [],\n  });\n  onChange.mockImplementation((v) => {\n    instance.setProps({\n      value: v,\n    });\n  });\n  await clickKey('del');\n  expect(onChange.mock.lastCall[0]).toEqual('');\n  await clickKey('1');\n  expect(onChange.mock.lastCall[0]).toEqual('1');\n  await clickKey('5');\n  expect(onChange.mock.lastCall[0]).toEqual('15');\n  await clickKey('del');\n  await clickKey('del');\n  await clickKey('del');\n  expect(onChange.mock.lastCall[0]).toEqual('');\n  expect(onClose).toBeCalledTimes(0);\n  await clickKey('enter');\n  expect(onClose).toBeCalledTimes(2);\n});\n\nit('测试点击', async () => {\n  const { clickKey, onClose, vibrateShort } = createNumberKeyboard({\n    confirmDisabled: true,\n  });\n\n  expect(onClose).toBeCalledTimes(0);\n  expect(vibrateShort).toBeCalledTimes(0);\n  await clickKey('enter');\n  expect(onClose).toBeCalledTimes(0);\n  expect(vibrateShort).toBeCalledTimes(0);\n});\n\nit('测试点击 vibrate', async () => {\n  const { clickKey, vibrateShort } = createNumberKeyboard({\n    confirmDisabled: true,\n    vibrate: true,\n  });\n\n  expect(vibrateShort).toBeCalledTimes(0);\n  await clickKey('enter');\n  expect(vibrateShort).toBeCalledTimes(1);\n  await clickKey('enter');\n  expect(vibrateShort).toBeCalledTimes(2);\n});\n\ndescribe('random', () => {\n  it('测试点击', async () => {\n    const { instance } = createNumberKeyboard({\n      random: true,\n    });\n    expect(instance.getData().randomArr.length).toBe(3);\n    const previousRandom = JSON.parse(\n      JSON.stringify(instance.getData().randomArr)\n    );\n    instance.callMethod('catchAppearModal');\n    await sleep(20);\n    expect(previousRandom).not.toEqual(instance.getData().randomArr);\n    expect(instance.getData().randomArr.length).toBe(3);\n  });\n});\n"
  },
  {
    "path": "tests/alipay/PageContainer/index.test.ts",
    "content": "import { getInstance, sleep } from 'tests/utils';\nimport { describe, it, expect, vi } from 'vitest';\n\ndescribe('PageContainer', () => {\n  it('PageContainer config', async () => {\n    const onActionTap = vi.fn();\n    const instance = getInstance('PageContainer', {\n      onActionTap\n    });\n    const { props } = instance.getConfig();\n\n    expect({ props }).toMatchFileSnapshot(\n      'snapshot/page_alipay_config.txt'\n    );\n\n    instance.callMethod('handleActionTap');\n    await sleep(10);\n    expect(onActionTap).toBeCalled();\n  });\n});\n"
  },
  {
    "path": "tests/alipay/PageContainer/snapshot/page_alipay_config.txt",
    "content": " {\n  \"props\": {\n    \"actionText\": \"\",\n    \"image\": \"\",\n    \"loading\": false,\n    \"loadingColor\": \"#ccc\",\n    \"loadingSize\": \"medium\",\n    \"loadingType\": \"spin\",\n    \"message\": \"\",\n    \"safeArea\": \"both\",\n    \"secondaryActionText\": \"\",\n    \"title\": \"\",\n  },\n}\n"
  },
  {
    "path": "tests/alipay/Pagination/index.test.ts",
    "content": "import { createSelectorQueryFactory } from 'tests/selector-query';\nimport { getInstance, sleep } from 'tests/utils';\nimport { expect, it, vi } from 'vitest';\n\nfunction createPagination(props, myOverride?: Record<string, any>) {\n  const selectorMock = vi.fn();\n  const canIUse = vi.fn().mockImplementation(() => true);\n  const my = {\n    canIUse(args: string) {\n      return canIUse(args);\n    },\n    ...myOverride,\n  };\n  const instanceApi = {\n    createSelectorQuery: createSelectorQueryFactory(selectorMock),\n  };\n  const instance = getInstance('Pagination', props, my, instanceApi);\n  return { instance, selectorMock, canIUse };\n}\n\nit('test selectorMock', async () => {\n  const { instance, selectorMock } = createPagination({});\n  selectorMock.mockImplementation(async () => {\n    return {\n      left: 0,\n      width: 100,\n    };\n  });\n  await instance.callMethod('onScroll', {\n    detail: {\n      scrollLeft: 50,\n      scrollWidth: 200,\n    },\n  });\n  await sleep(30);\n  expect(instance.getData().pageDeg).toEqual(50);\n  await instance.callMethod('onScroll', {\n    detail: {\n      scrollLeft: 60,\n      scrollWidth: 200,\n    },\n  });\n  await sleep(30);\n  expect(instance.getData().pageDeg).toEqual(60);\n});\n\nit('test supportSjs', async () => {\n  const canIUse = vi.fn().mockImplementation((key) => {\n    if (key === 'sjs.event') {\n      return false;\n    }\n    return true;\n  });\n  const { instance } = createPagination(\n    {},\n    {\n      canIUse,\n    }\n  );\n  expect(instance.getData().supportSjs).toEqual(false);\n});\n"
  },
  {
    "path": "tests/alipay/Picker/CascaderPicker/__tests__/index.test.ts",
    "content": "import fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport { describe, expect, it } from 'vitest';\nimport { cityList, createCascaderPicker } from './utils';\nimport { sleep } from 'tests/utils';\n\ndescribe('cascaderPicker onVisibleChange', () => {\n  it('onVisibleChange', () => {\n    const { onVisibleChange, callVisibleChange } = createCascaderPicker({\n      options: cityList,\n    });\n\n    callVisibleChange(true);\n    expect(onVisibleChange).toBeCalledWith(true, fmtEvent({}));\n  });\n  it('onCancel', () => {\n    const { callMethod, onCancel } = createCascaderPicker({\n      options: cityList,\n    });\n\n    callMethod('onCancel', true);\n    expect(onCancel).toBeCalled();\n  });\n});\n\ndescribe('columns ', () => {\n  it('测试默认的 currentValue 和 columns', () => {\n    const { instance } = createCascaderPicker({\n      options: cityList,\n    });\n    expect(instance.getData().currentValue).toEqual([]);\n    expect(instance.getData().columns).toEqual([\n      [\n        {\n          label: '北京',\n          value: '11',\n        },\n        {\n          label: '河北',\n          value: '18',\n        },\n      ],\n      [\n        {\n          label: '北京',\n          value: '110',\n        },\n      ],\n    ]);\n  });\n\n  it('测试选择后切换 columns', async () => {\n    const { instance, callMethod } = createCascaderPicker({\n      options: cityList,\n    });\n    await callMethod('onChange', ['18', '110']);\n    expect(instance.getData().currentValue).toEqual(['18', '188']);\n    expect(instance.getData().columns).toEqual([\n      [\n        {\n          label: '北京',\n          value: '11',\n        },\n        {\n          label: '河北',\n          value: '18',\n        },\n      ],\n      [\n        {\n          label: '石家庄',\n          value: '188',\n        },\n        {\n          label: '唐山',\n          value: '181',\n        },\n        {\n          label: '秦皇岛',\n          value: '182',\n        },\n      ],\n    ]);\n  });\n});\n\ndescribe('cascaderPicker select', () => {\n  it('cascaderPicker select', async () => {\n    const { callMethod, onChange, onOk } = createCascaderPicker({\n      options: cityList,\n    });\n\n    await callMethod('onChange', ['11', '110']);\n    await callMethod('onChange', ['18', '188']);\n    expect(onChange).toBeCalledWith(\n      ['18', '188'],\n      [\n        { value: '18', label: '河北' },\n        { value: '188', label: '石家庄' },\n      ],\n      fmtEvent({})\n    );\n    callMethod('onOk');\n    expect(onOk).toBeCalledWith(\n      ['18', '188'],\n      [\n        { value: '18', label: '河北' },\n        { value: '188', label: '石家庄' },\n      ],\n      fmtEvent({})\n    );\n  });\n\n  it('选择后再次打开 需要恢复状态', async () => {\n    const { callMethod, callVisibleChange, instance } = createCascaderPicker({\n      options: cityList,\n    });\n\n    await callMethod('onChange', ['18', '188']);\n\n    await callVisibleChange(false);\n    await callVisibleChange(true);\n    expect(instance.getData().currentValue).toEqual(['11', '110']);\n  });\n});\ndescribe('cascaderPicker update', () => {\n  it('cascaderPicker updateValue', async () => {\n    const value = ['11', '110'];\n    const { callMethod, callVisibleChange, instance, onOk } = createCascaderPicker({\n      options: cityList,\n      value,\n    });\n    instance.setProps({ value: ['18', '188'] });\n    await callVisibleChange(true);\n    await callMethod('onOk');\n    expect(onOk).toBeCalledWith(\n      ['18', '188'],\n      [\n        { value: '18', label: '河北' },\n        { value: '188', label: '石家庄' },\n      ],\n      fmtEvent({})\n    );\n  });\n\n  it('cascaderPicker updateOptions', () => {\n    const { instance } = createCascaderPicker({\n      options: cityList,\n    });\n\n    instance.setProps({\n      options: [\n        {\n          label: '北京',\n          children: [\n            {\n              label: '北京',\n              value: '110',\n            },\n          ],\n          value: '11',\n        },\n        {\n          label: '河北',\n          children: [\n            {\n              label: '石家庄',\n              value: '188',\n            },\n          ],\n          value: '18',\n        },\n      ],\n    });\n    instance.setProps({\n      value: ['18', '188'],\n      options: [\n        {\n          label: '北京',\n          children: [\n            {\n              label: '北京',\n              value: '110',\n            },\n          ],\n          value: '11',\n        },\n        {\n          label: '河北',\n          children: [\n            {\n              label: '石家庄',\n              value: '188',\n            },\n            {\n              label: '唐山',\n              value: '181',\n            },\n          ],\n          value: '18',\n        },\n      ],\n    });\n    expect(instance.getData().currentValue).toStrictEqual(['18', '188']);\n    expect(instance.getData().columns).toStrictEqual([\n      [\n        { value: '11', label: '北京' },\n        { value: '18', label: '河北' },\n      ],\n      [\n        { value: '188', label: '石家庄' },\n        { value: '181', label: '唐山' },\n      ],\n    ]);\n  });\n});\ndescribe('cascaderPicker onFormat', () => {\n  it('defaultFormat', async () => {\n    const value = ['11', '110'];\n    const { instance } = createCascaderPicker({\n      options: cityList,\n      value,\n    });\n    expect(instance.getData().formattedValueText).toBe('北京北京');\n  });\n\n  it('onFormat', () => {\n    const value = ['11', '110'];\n    const onFormat = (value, options) =>\n      `选择了${options.map((v) => v.label).join('')}`;\n\n    const { instance } = createCascaderPicker({\n      options: cityList,\n      value,\n      onFormat,\n    });\n    expect(instance.getData().formattedValueText).toBe('选择了北京北京');\n  });\n});\n\nit('value 非受控', async () => {\n  const { instance, callMethod } = createCascaderPicker({\n    options: cityList,\n  });\n  expect(instance.getData().currentValue).toEqual([]);\n  expect(instance.getData().formattedValueText).toBe('');\n  await callMethod('onChange', ['18', '110']);\n  expect(instance.getData().currentValue).toEqual(['18', '188']);\n  expect(instance.getData().formattedValueText).toBe('');\n  await callMethod('onOk');\n  expect(instance.getData().formattedValueText).toBe('河北石家庄');\n  instance.setProps({ value: [] });\n  expect(instance.getData().currentValue).toEqual(['11', '110']);\n  expect(instance.getData().formattedValueText).toBe('');\n});\n\ndescribe('value 受控模式', () => {\n  it('value 受控', async () => {\n    const value = ['11', '110'];\n    const { instance, callMethod } = createCascaderPicker({\n      options: cityList,\n      value,\n    });\n    expect(instance.getData().currentValue).toEqual(['11', '110']);\n    expect(instance.getData().formattedValueText).toBe('北京北京');\n    await callMethod('onChange', ['18', '110']);\n    expect(instance.getData().currentValue).toEqual(['18', '188']);\n    expect(instance.getData().formattedValueText).toBe('北京北京');\n    await callMethod('onOk');\n    expect(instance.getData().formattedValueText).toBe('北京北京');\n    instance.setProps({ value: [] });\n    expect(instance.getData().currentValue).toEqual(['11', '110']);\n    expect(instance.getData().formattedValueText).toBe('');\n  });\n\n  it('测试 default value', async () => {\n    const value = ['18', '110'];\n    // 仅有初始化的时候看 defaultValue\n    const { instance } = createCascaderPicker({\n      options: cityList,\n      defaultValue: value,\n    });\n    expect(instance.getData().currentValue).toStrictEqual(['18', '110']);\n    expect(instance.getData().columns).toStrictEqual([\n      [\n        { value: '11', label: '北京' },\n        { value: '18', label: '河北' },\n      ],\n      [\n        { value: '188', label: '石家庄' },\n        { value: '181', label: '唐山' },\n        {\n          label: '秦皇岛',\n          value: '182',\n        },\n      ],\n    ]);\n    instance.setProps({ defaultValue: ['11', '110'] });\n\n    expect(instance.getData().formattedValueText).toBe('');\n    expect(instance.getData().currentValue).toStrictEqual(['18', '110']);\n    instance.setProps({ value: ['11', '110'] });\n    expect(instance.getData().currentValue).toStrictEqual(['11', '110']);\n    expect(instance.getData().formattedValueText).toBe('北京北京');\n  });\n});\ndescribe('visible 受控模式', () => {\n  it('visible 优先级大于 defaultVisible', async () => {\n    const { instance, onVisibleChange, callVisibleChange } = createCascaderPicker({\n      options: cityList,\n      visible: false,\n      defaultVisible: true,\n    });\n    expect(instance.getData().visible).toEqual(false);\n    await callVisibleChange(true);\n    expect(instance.getData().visible).toEqual(false);\n    expect(onVisibleChange).toBeCalledWith(true, fmtEvent({}));\n  });\n  it('visible 受控', async () => {\n    const { instance } = createCascaderPicker({\n      options: cityList,\n      visible: false,\n    });\n    expect(instance.getData().visible).toEqual(false);\n    instance.setProps({\n      visible: true,\n    });\n    await sleep(100);\n    expect(instance.getData().visible).toEqual(true);\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Picker/CascaderPicker/__tests__/utils.ts",
    "content": "import { getInstance, sleep } from 'tests/utils';\nimport { vi } from 'vitest';\nimport { ICascaderProps } from 'compiled-alipay/Picker/CascaderPicker/props';\n\nexport function createCascaderPicker(\n  props: Partial<ICascaderProps & Record<string, any>> = {}\n) {\n  const onCancel = vi.fn();\n  const onVisibleChange = vi.fn();\n  const onChange = vi.fn();\n  const onOk = vi.fn();\n\n  const my = {\n    canIUse() {\n      return true;\n    },\n  };\n  const instance = getInstance(\n    'Picker/CascaderPicker',\n    {\n      onChange,\n      onCancel,\n      onVisibleChange,\n      onOk,\n      ...props,\n    },\n    my\n  );\n  async function callVisibleChange(visible) {\n    instance.callMethod('onVisibleChange', visible);\n    await sleep(100);\n  }\n\n  return {\n    callVisibleChange,\n    onCancel,\n    onVisibleChange,\n    onChange,\n    onOk,\n    instance,\n    callMethod: async (name, ...args) => {\n      const res = instance.callMethod(name, ...args);\n      await sleep(10);\n      return res;\n    },\n  };\n}\nexport const cityList = [\n  {\n    label: '北京',\n    children: [\n      {\n        label: '北京',\n        value: '110',\n      },\n    ],\n    value: '11',\n  },\n  {\n    label: '河北',\n    children: [\n      {\n        label: '石家庄',\n        value: '188',\n      },\n      {\n        label: '唐山',\n        value: '181',\n      },\n      {\n        label: '秦皇岛',\n        value: '182',\n      },\n    ],\n    value: '18',\n  },\n];\n"
  },
  {
    "path": "tests/alipay/Picker/__tests__/index.test.ts",
    "content": "import fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport { sleep } from 'tests/utils';\nimport { describe, expect, it, vi } from 'vitest';\nimport { createPicker } from './utils';\n\ndescribe('picker onVisibleChange', () => {\n  it('onOpen', () => {\n    const { instance, onVisibleChange } = createPicker({});\n    instance.callMethod('onOpen');\n    expect(onVisibleChange).toBeCalledWith(true, fmtEvent({}));\n  });\n\n  it('onMaskDismiss', async () => {\n    const { instance, onVisibleChange, onCancel } = createPicker({});\n    instance.callMethod('onMaskDismiss');\n    expect(onVisibleChange).toBeCalledWith(false, fmtEvent({}));\n    expect(onCancel).toBeCalled();\n    expect(onCancel.mock.calls[0][0].detail).toEqual({ type: 'mask' });\n\n    instance.callMethod('onOpen');\n    await sleep(20);\n    expect(instance.getData().visible).toBeTruthy();\n    instance.setProps({ maskClosable: false });\n    instance.callMethod('onMaskDismiss');\n    await sleep(20);\n    expect(instance.getData().visible).toBeTruthy();\n  });\n\n  it('onCancel', () => {\n    const { instance, onVisibleChange, onCancel } = createPicker({});\n    instance.callMethod('onCancel');\n    expect(onVisibleChange).toBeCalledWith(false, fmtEvent({}));\n    expect(onCancel).toBeCalled();\n    expect(onCancel.mock.calls[0][0].detail).toEqual({ type: 'cancel' });\n  });\n});\n\ndescribe('picker select', () => {\n  it('singleOptions', () => {\n    const options = ['北京', '上海', '深圳', '广州'];\n    const { instance, onChange, onOk } = createPicker({\n      options,\n    });\n    expect(instance.getData().columns).toStrictEqual([options]);\n    instance.callMethod('onChange', { detail: { value: [1] } });\n    expect(onChange).toBeCalledWith(\n      '上海',\n      '上海',\n      fmtEvent({}, { detail: { value: [1] } })\n    );\n    instance.callMethod('onOk');\n    expect(onOk).toBeCalledWith('上海', '上海', fmtEvent({}));\n  });\n\n  it('multiOptions', async () => {\n    const options = [\n      [\n        { label: '周一', value: 'Mon' },\n        { label: '周二', value: 'Tues' },\n        { label: '周三', value: 'Wed' },\n        { label: '周四', value: 'Thur' },\n        { label: '周五', value: 'Fri' },\n      ],\n      [\n        { label: '上午', value: 'am' },\n        { label: '下午', value: 'pm' },\n      ],\n    ];\n    const { instance, onChange, onOk } = createPicker({ options });\n    expect(instance.getData().columns).toStrictEqual(options);\n    instance.callMethod('onChange', { detail: { value: [1, 0] } });\n    expect(onChange).toBeCalledWith(\n      ['Tues', 'am'],\n      [\n        { value: 'Tues', label: '周二' },\n        { value: 'am', label: '上午' },\n      ],\n      fmtEvent({}, { detail: { value: [1, 0] } })\n    );\n    instance.callMethod('onOk');\n    expect(onOk).toBeCalledWith(\n      ['Tues', 'am'],\n      [\n        { value: 'Tues', label: '周二' },\n        { value: 'am', label: '上午' },\n      ],\n      fmtEvent({})\n    );\n  });\n});\ndescribe('picker value', () => {\n  it('props value', () => {\n    const options = ['北京', '上海', '深圳', '广州'];\n    const value = '上海';\n    const { instance, onOk } = createPicker({\n      options,\n      value,\n    });\n    instance.callMethod('onOk');\n    expect(onOk).toBeCalledWith('上海', '上海', fmtEvent({}));\n  });\n  it('update value', () => {\n    const options = ['北京', '上海', '深圳', '广州'];\n    const { instance, onOk } = createPicker({\n      options,\n    });\n    instance.setProps({ value: '上海' });\n    instance.callMethod('onOk');\n    expect(onOk).toBeCalledWith('上海', '上海', fmtEvent({}));\n  });\n  it('empty value', () => {\n    const options = ['北京', '上海', '深圳', '广州'];\n    const value = '';\n    const { instance, onOk } = createPicker({\n      options,\n      value,\n    });\n    instance.callMethod('onOk');\n    expect(onOk).toBeCalledWith('北京', '北京', fmtEvent({}));\n  });\n});\ndescribe('picker updateColumns', () => {\n  it('updateColumns', () => {\n    const options = ['北京', '上海', '深圳', '广州'];\n    const value = '上海';\n    const { instance, onOk } = createPicker({\n      options,\n      value,\n    });\n    instance.setProps({ options: ['北京', '深圳', '广州'] });\n    expect(instance.getData().selectedIndex).toStrictEqual([0]);\n    instance.callMethod('onOk');\n    expect(onOk).toBeCalledWith('北京', '北京', fmtEvent({}));\n  });\n});\n\ndescribe('picker onFormat', () => {\n  it('onFormat', () => {\n    const options = ['北京', '上海', '深圳', '广州'];\n    const value = '上海';\n    const onFormat = (value) => `选择了${value}`;\n    const { instance } = createPicker({\n      options,\n      onFormat,\n      value,\n    });\n    expect(instance.getData().formatValue).toBe('选择了上海');\n  });\n});\n\nit('测试 format 事件', async () => {\n  const { instance, onCancel } = createPicker({\n    'data-test': 1,\n  });\n  instance.callMethod('onCancel');\n  expect(onCancel.mock.calls[0][0].currentTarget.dataset).toEqual({ test: 1 });\n  instance.setProps({ 'data-test': 2 });\n  instance.callMethod('onCancel');\n  expect(onCancel.mock.calls[1][0].currentTarget.dataset).toEqual({ test: 2 });\n});\n\nit('formattedValueText 优先级大于 onFormat', async () => {\n  const { instance } = createPicker({\n    formattedValueText: '1',\n    onFormat: () => '3',\n  });\n  expect(instance.getData().formatValue).toEqual('1');\n  instance.setProps({ formattedValueText: '2' });\n  expect(instance.getData().formatValue).toEqual('2');\n});\n\nit('picker value component2', () => {\n  const options = [['北京', '上海', '深圳', '广州']];\n  const value = ['上海'];\n  const { instance } = createPicker({\n    options,\n    value,\n  });\n  expect(instance.getData().columns).toStrictEqual(options);\n});\n\nit('模拟 picker 打开后关闭，需要调用 onFormat', async () => {\n  const options = [['北京', '上海', '深圳', '广州']];\n  const internalState = {\n    value: ['上海'],\n  };\n  const onFormat = vi.fn();\n  const { instance, callMethod, onChange, onOk } = createPicker({\n    options,\n    value: internalState.value,\n    onFormat,\n  });\n  onFormat.mockImplementation(() => internalState.value.join('-'));\n  onChange.mockImplementation((val) => {\n    instance.setProps({ value: val });\n  });\n  onOk.mockImplementation((val) => {\n    internalState.value = val;\n  });\n  await callMethod('onChange', { detail: { value: [0] } });\n  expect(instance.getData().selectedIndex).toStrictEqual([0]);\n  expect(instance.getData().formatValue).toEqual('上海');\n  await callMethod('onOk');\n  expect(internalState.value).toEqual(['北京']);\n});\n\nit('假设在滚动的时候, options 变化', async () => {\n  const options = [['北京', '上海', '深圳', '广州']];\n  const onFormat = vi.fn();\n  const { instance, callMethod, onOk } = createPicker({\n    options,\n    onFormat,\n  });\n\n  await callMethod('onChange', { detail: { value: [1] } });\n  instance.setProps({ options: [['上海', '深圳', '广州']] });\n  expect(instance.getData().selectedIndex).toStrictEqual([0]);\n  await callMethod('onOk');\n  expect(onOk.mock.calls[0][0]).toEqual(['上海']);\n});\n\nit('假设在滚动的时候, value 变化', async () => {\n  const options = [['北京', '上海', '深圳', '广州']];\n  const onFormat = vi.fn();\n  const { instance, callMethod, onOk } = createPicker({\n    options,\n    onFormat,\n  });\n\n  await callMethod('onChange', { detail: { value: [1] } });\n  instance.setProps({ value: ['深圳'] });\n  expect(instance.getData().selectedIndex).toStrictEqual([2]);\n  await callMethod('onOk');\n  expect(onOk.mock.calls[0][0]).toEqual(['深圳']);\n});\n\nit('多次开启关闭, visible 状态应该正确', async () => {\n  const { instance, callMethod } = createPicker();\n  await callMethod('onOpen');\n  expect(instance.getData().visible).toBe(true);\n  await callMethod('onOk');\n  expect(instance.getData().visible).toBe(false);\n  await callMethod('onOpen');\n  expect(instance.getData().visible).toBe(true);\n  await callMethod('onOk');\n  expect(instance.getData().visible).toBe(false);\n});\n\nit('如果 disabled, 则无法打开', async () => {\n  const { instance, callMethod } = createPicker({ disabled: true });\n  await callMethod('onOpen');\n  expect(instance.getData().visible).toBe(undefined);\n});\n\ndescribe('非受控模式', () => {\n  it('测试非受控模式', async () => {\n    const options = [['北京', '上海', '深圳', '广州']];\n    const { instance, callMethod } = createPicker({\n      options,\n    });\n    await callMethod('onOpen');\n    expect(instance.getData().visible).toBe(true);\n    await callMethod('onChange', { detail: { value: [1] } });\n    expect(instance.getData().selectedIndex).toStrictEqual([1]);\n    expect(instance.getData().mixin.value).toStrictEqual([]);\n    await callMethod('onOk');\n    expect(instance.getData().visible).toBe(false);\n    expect(instance.getData().mixin.value).toStrictEqual(['上海']);\n  });\n\n  it('测试 defaultVisible 与 defaultValue', async () => {\n    const options = [['北京', '上海', '深圳', '广州']];\n    const { instance, callMethod, onOk } = createPicker({\n      options,\n      defaultValue: ['上海'],\n      defaultVisible: true,\n      'data-1': 2,\n    });\n    expect(instance.getData().visible).toBe(true);\n    expect(instance.getData().selectedIndex).toEqual([1]);\n    await callMethod('onOk');\n    expect(instance.getData().visible).toBe(false);\n    expect(onOk).toBeCalledWith(\n      ['上海'],\n      ['上海'],\n      fmtEvent({\n        'data-1': 2,\n      })\n    );\n  });\n});\n\ndescribe('visible 受控模式', () => {\n  it('value 优先级大于 defaultValue', async () => {\n    const options = [['北京', '上海', '深圳', '广州']];\n    const { instance, callMethod, onVisibleChange } = createPicker({\n      options,\n      visible: false,\n      defaultVisible: true,\n    });\n    expect(instance.getData().visible).toEqual(false);\n    await callMethod('onOpen');\n    expect(instance.getData().visible).toEqual(true);\n    expect(onVisibleChange).toBeCalledWith(true, fmtEvent({}));\n  });\n});\n\ndescribe('value 受控模式', async () => {\n  it('value 优先级大于 defaultValue', () => {\n    const options = [['北京', '上海', '深圳', '广州']];\n    const { instance } = createPicker({\n      options,\n      defaultValue: ['上海'],\n      value: ['深圳'],\n    });\n    expect(instance.getData().selectedIndex).toEqual([2]);\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Picker/__tests__/utils.ts",
    "content": "import { getInstance, sleep } from 'tests/utils';\nimport { IPickerProps } from '../../../../src/Picker/props';\nimport { vi } from 'vitest';\n\nexport function createPicker(\n  props: Partial<IPickerProps & Record<string, any>> = {}\n) {\n  const onCancel = vi.fn();\n  const onVisibleChange = vi.fn();\n  const onChange = vi.fn();\n  const onOk = vi.fn();\n\n  const my = {\n    canIUse() {\n      return true;\n    },\n  };\n  const instance = getInstance(\n    'Picker',\n    {\n      onChange,\n      onCancel,\n      onVisibleChange,\n      onOk,\n      ...props,\n    },\n    my\n  );\n\n  return {\n    instance,\n    onCancel,\n    onVisibleChange,\n    onChange,\n    onOk,\n    callMethod: async (name, ...args) => {\n      instance.callMethod(name, ...args);\n      await sleep(10);\n    },\n  };\n}\n"
  },
  {
    "path": "tests/alipay/Popover/__tests__/index.test.ts",
    "content": "import { getInstance, sleep } from 'tests/utils';\nimport { describe, it, expect, vi } from 'vitest';\n\ndescribe('popover', () => {\n  const my = {\n    canIUse() {\n      return false;\n    },\n    getSystemInfo({ success }) {\n      success({\n        windowWidth: 600,\n        windowHeight: 1000,\n      });\n    },\n    createSelectorQuery() {\n      return {\n        select(selector) {\n          return {\n            boundingClientRect() {\n              return {\n                exec(callback) {\n                  if (selector.startsWith('#ant-popover-children-')) {\n                    if (selector.indexOf('*') < 0) {\n                      callback([\n                        {\n                          left: 100,\n                          top: 100,\n                          bottom: 200,\n                          right: 200,\n                          width: 100,\n                          height: 100,\n                        },\n                      ]);\n                    } else {\n                      callback([\n                        {\n                          left: 100,\n                          top: 100,\n                          bottom: 200,\n                          right: 200,\n                          width: 100,\n                          height: 100,\n                        },\n                      ]);\n                    }\n                  } else {\n                    callback([\n                      {\n                        width: 20,\n                        height: 20,\n                      },\n                    ]);\n                  }\n                },\n              };\n            },\n          };\n        },\n      };\n    },\n  };\n\n  it('popover top', async () => {\n    const instance = getInstance(\n      'Popover',\n      {\n        defaultVisible: true,\n      },\n      my\n    );\n    await sleep(50);\n    expect(instance.getData().adjustedPlacement).toBe('top');\n    const placements = [\n      'bottom',\n      'left',\n      'right',\n      'top-left',\n      'top-right',\n      'bottom-left',\n      'bottom-right',\n      'left-top',\n      'left-bottom',\n      'right-top',\n      'right-bottom',\n    ];\n    for (let i = 0; i < placements.length; i++) {\n      const placement = placements[i];\n      instance.setProps({\n        placement,\n      });\n      await sleep(50);\n      expect(instance.getData().adjustedPlacement).toBe(placement);\n    }\n  });\n\n  it('visible 优先级大于 defaultVisible', async () => {\n    const instance = getInstance(\n      'Popover',\n      {\n        visible: false,\n        defaultVisible: true,\n      },\n      my\n    );\n    await sleep(20);\n    expect(instance.getData().adjustedPlacement).toBe('');\n  });\n\n  describe('trigger', () => {\n    it('测试受控模式', async () => {\n      const mock = vi.fn();\n      const instance = getInstance(\n        'Popover',\n        {\n          visible: false,\n          onVisibleChange: mock,\n        },\n        my\n      );\n      await sleep(20);\n      expect(instance.getData().adjustedPlacement).toBe('');\n      instance.callMethod('onVisibleChange', { target: {} });\n      await sleep(20);\n      expect(instance.getData().mixin.value).toEqual(false);\n      expect(mock.mock.calls.length).toBe(1);\n      expect(mock.mock.calls[0][0]).toBe(true);\n      instance.setProps({ visible: true });\n      await sleep(20);\n      expect(instance.getData().mixin.value).toEqual(true);\n    });\n\n    it('测试非受控模式', async () => {\n      const mock = vi.fn();\n      const instance = getInstance(\n        'Popover',\n        {\n          defaultVisible: true,\n          onVisibleChange: mock,\n        },\n        my\n      );\n      await sleep(20);\n      expect(instance.getData().mixin.value).toEqual(true);\n      instance.callMethod('onVisibleChange', { target: {} });\n      await sleep(20);\n      expect(instance.getData().mixin.value).toEqual(false);\n      expect(mock.mock.calls.length).toBe(1);\n      expect(mock.mock.calls[0][0]).toBe(false);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Popup/index.test.ts",
    "content": "import { getInstance, sleep } from 'tests/utils';\nimport { describe, expect, it, vi } from 'vitest';\n\nfunction createPopupInstance(props: any, SDKVersion?: string) {\n  const my = {\n    SDKVersion: SDKVersion || '2.0.0',\n  };\n  return getInstance('Popup', props, my);\n}\n\ndescribe('Popup', () => {\n  it('基础库 2.0', () => {\n    const instance = createPopupInstance({});\n    expect(instance.getData().isOldVersion).toBe(false);\n  });\n  it('基础库 1.0', () => {\n    const instance = createPopupInstance({}, '1.0.0');\n    expect(instance.getData().isOldVersion).toBe(true);\n  });\n\n  it('测试 onAnimationEnd 逻辑', async () => {\n    const instance = createPopupInstance({\n      visible: true,\n    });\n    instance.setProps({\n      visible: false,\n    });\n    await sleep(10);\n    expect(instance.getData().closing).toBe(true);\n    instance.callMethod('onAnimationEnd');\n    await sleep(20);\n    expect(instance.getData().closing).toBe(false);\n  });\n\n  it('测试 onTapMask', async () => {\n    const onClose = vi.fn();\n    const instance = createPopupInstance({\n      visible: true,\n      onClose,\n    });\n    instance.callMethod('onTapMask');\n    expect(onClose.mock.calls.length).toBe(1);\n    instance.setProps({\n      visible: false,\n    });\n    await sleep(10);\n    expect(instance.getData().closing).toBe(true);\n    instance.callMethod('onTapMask');\n    expect(onClose.mock.calls.length).toBe(1);\n    instance.callMethod('onAnimationEnd');\n    await sleep(20);\n    expect(instance.getData().closing).toBe(false);\n  });\n\n  it('测试 animation: false', async () => {\n    const onClose = vi.fn();\n    const instance = createPopupInstance({\n      visible: true,\n      animation: false,\n      onClose,\n    });\n    instance.setProps({\n      visible: false,\n    });\n    expect(onClose.mock.calls.length).toBe(0);\n    expect(instance.getData().closing).toBe(false);\n    instance.callMethod('onTapMask');\n    expect(onClose.mock.calls.length).toBe(1);\n  });\n\n  it('测试 onAfterShow 与 onAfterClose', async () => {\n    const onAfterShow = vi.fn();\n    const onAfterClose = vi.fn();\n    const instance = createPopupInstance({\n      visible: true,\n      onAfterShow,\n      onAfterClose,\n    });\n\n    instance.callMethod('onAnimationEnd');\n    expect(onAfterShow.mock.calls.length).toBe(1);\n\n    instance.setProps({\n      visible: false,\n    });\n    instance.callMethod('onAnimationEnd');\n    expect(onAfterClose.mock.calls.length).toBe(1);\n  });\n\n  it('测试 onAfterShow 与 onAfterClose: animation 为 false 的情况', async () => {\n    const onAfterShow = vi.fn();\n    const onAfterClose = vi.fn();\n    const instance = createPopupInstance({\n      visible: true,\n      animation: false,\n      onAfterShow,\n      onAfterClose,\n    });\n\n    instance.setProps({\n      visible: false,\n    });\n\n    expect(onAfterClose.mock.calls.length).toBe(1);\n\n    instance.setProps({\n      visible: true,\n    });\n    expect(onAfterShow.mock.calls.length).toBe(1);\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Progress/index.spec.ts",
    "content": "/* eslint-disable prefer-rest-params */\nimport { getInstance, sleep } from 'tests/utils';\nimport { expect, it } from 'vitest';\nimport { IProgressBarProps } from '../../../src/Progress/props';\n\nclass MockCanvas {\n  public commands: Array<[string, any[]]> = [];\n  constructor(public id: string) {\n    this.fakeCommand('clearRect');\n    this.fakeCommand('beginPath');\n    this.fakeCommand('setLineCap');\n    this.fakeCommand('arc');\n    this.fakeCommand('stroke');\n    this.fakeCommand('draw');\n  }\n\n  set imageSmoothingEnabled(v: boolean) {\n    this.commands.push(['imageSmoothingEnabled', [v]]);\n  }\n  set lineWidth(width: number) {\n    this.commands.push(['lineWidth', [width]]);\n  }\n  set strokeStyle(color: string) {\n    this.commands.push(['strokeStyle', [color]]);\n  }\n  set imageSmoothingQuality(color: string) {\n    this.commands.push(['imageSmoothingQuality', [color]]);\n  }\n  private fakeCommand(funcName) {\n    this[funcName] = (...args: any[]) => {\n      this.commands.push([funcName, args]);\n    };\n  }\n}\n\nfunction createProgress(props: Partial<IProgressBarProps>) {\n  const canvasMap = new Map<string, MockCanvas>();\n  const my = {\n    canIUse() {\n      return true;\n    },\n    getSystemInfo({ success }) {\n      success({\n        pixelRatio: 2,\n      });\n    },\n    createCanvasContext(id: string) {\n      if (!canvasMap.has(id)) {\n        canvasMap.set(id, new MockCanvas(id));\n      }\n      return canvasMap.get(id);\n    },\n  };\n  const instance = getInstance(\n    'Progress',\n    {\n      ...props,\n    },\n    my\n  );\n\n  return { instance, canvasMap };\n}\n\nit('测试默认值', () => {\n  const { instance } = createProgress({});\n\n  const { percent, type, speed, width, strokeWidth, animation } =\n    instance.getConfig().props;\n  expect({\n    percent,\n    type,\n    speed,\n    width,\n    strokeWidth,\n    animation,\n  }).toMatchFileSnapshot('snapshot/alipay_config_props.txt');\n\n  // 默认动画开启\n  expect(animation).toEqual(true);\n});\n\nit('测试 lint', () => {\n  const { instance } = createProgress({\n    // 测试异常情况\n    percent: 'aaa',\n  });\n  instance.setProps({\n    percent: 50,\n  });\n  expect(instance.getData().curProgress).toBe(50);\n});\n\nit('测试默认绘图', async () => {\n  const { instance, canvasMap } = createProgress({\n    type: 'circle',\n  });\n  instance.setProps({\n    percent: 50,\n  });\n  await sleep(600);\n  expect(instance.getData().curProgress).toBe(50);\n  expect(canvasMap.size).toBe(1);\n  expect(\n    JSON.stringify(Array.from(canvasMap.values())[0].commands, null, 2)\n  ).toMatchFileSnapshot('snap.json');\n  expect(instance.getData().canvasWidth).toBe(200);\n});\n\nit('测试 speed strokeColor trailColor', async () => {\n  const { instance, canvasMap } = createProgress({\n    type: 'circle',\n  });\n  instance.setProps({\n    percent: 50,\n    speed: 60,\n    strokeColor: 'red',\n    trailColor: 'blue',\n    strokeWidth: '8',\n  });\n  await sleep(600);\n  expect(instance.getData().curProgress).toBe(50);\n  expect(canvasMap.size).toBe(1);\n  expect(\n    JSON.stringify(Array.from(canvasMap.values())[0].commands, null, 2)\n  ).toMatchFileSnapshot('snap-speed-12.json');\n  expect(instance.getData().canvasWidth).toBe(200);\n});\n\nit('测试 speed strokeColor trailColor', async () => {\n  const { instance, canvasMap } = createProgress({\n    type: 'circle',\n    percent: 50,\n  });\n  await sleep(600);\n  instance.setProps({\n    percent: 20,\n  });\n  await sleep(600);\n  expect(instance.getData().curProgress).toBe(20);\n  expect(canvasMap.size).toBe(1);\n  expect(\n    JSON.stringify(Array.from(canvasMap.values())[0].commands, null, 2)\n  ).toMatchFileSnapshot('snap-speed-0-50-20.json');\n  expect(instance.getData().canvasWidth).toBe(200);\n});\n"
  },
  {
    "path": "tests/alipay/Progress/snap-speed-0-50-20.json",
    "content": "[\n  [\n    \"imageSmoothingEnabled\",\n    [\n      true\n    ]\n  ],\n  [\n    \"imageSmoothingQuality\",\n    [\n      \"high\"\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -1.4660765716752369,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -1.361356816555577,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -1.2566370614359172,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -1.1519173063162575,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -1.0471975511965979,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -0.9424777960769379,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -0.8377580409572781,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -0.7330382858376184,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -0.6283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -0.5235987755982989,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -0.41887902047863923,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -0.3141592653589793,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -0.2094395102393194,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -0.1047197551196597,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.1047197551196597,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.2094395102393194,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.3141592653589793,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.418879020478639,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.5235987755982987,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.6283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.7330382858376181,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.8377580409572785,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.9424777960769379,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      1.0471975511965979,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      1.1519173063162578,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      1.2566370614359172,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      1.3613568165555772,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      1.4660765716752366,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      1.5707963267948966,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      1.4660765716752366,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      1.3613568165555772,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      1.2566370614359172,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      1.1519173063162578,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      1.0471975511965979,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.9424777960769379,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.8377580409572785,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.7330382858376181,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.6283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.5235987755982987,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.418879020478639,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.3141592653589793,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.2094395102393194,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.1047197551196597,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -0.1047197551196597,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -0.2094395102393194,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -0.3141592653589793,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ]\n]"
  },
  {
    "path": "tests/alipay/Progress/snap-speed-12.json",
    "content": "[\n  [\n    \"imageSmoothingEnabled\",\n    [\n      true\n    ]\n  ],\n  [\n    \"imageSmoothingQuality\",\n    [\n      \"high\"\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"blue\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"red\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -0.5235987755982989,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"blue\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"red\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.5235987755982987,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"blue\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"red\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      1.5707963267948966,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ]\n]"
  },
  {
    "path": "tests/alipay/Progress/snap.json",
    "content": "[\n  [\n    \"imageSmoothingEnabled\",\n    [\n      true\n    ]\n  ],\n  [\n    \"imageSmoothingQuality\",\n    [\n      \"high\"\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -1.4660765716752369,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -1.361356816555577,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -1.2566370614359172,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -1.1519173063162575,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -1.0471975511965979,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -0.9424777960769379,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -0.8377580409572781,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -0.7330382858376184,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -0.6283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -0.5235987755982989,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -0.41887902047863923,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -0.3141592653589793,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -0.2094395102393194,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      -0.1047197551196597,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.1047197551196597,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.2094395102393194,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.3141592653589793,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.418879020478639,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.5235987755982987,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.6283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.7330382858376181,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.8377580409572785,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      0.9424777960769379,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      1.0471975511965979,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      1.1519173063162578,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      1.2566370614359172,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      1.3613568165555772,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      1.4660765716752366,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ],\n  [\n    \"clearRect\",\n    [\n      0,\n      0,\n      200,\n      200\n    ]\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#F5F5F5\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      0,\n      6.283185307179586,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"beginPath\",\n    []\n  ],\n  [\n    \"strokeStyle\",\n    [\n      \"#1677ff\"\n    ]\n  ],\n  [\n    \"lineWidth\",\n    [\n      8\n    ]\n  ],\n  [\n    \"setLineCap\",\n    [\n      \"round\"\n    ]\n  ],\n  [\n    \"arc\",\n    [\n      100,\n      100,\n      92,\n      -1.5707963267948966,\n      1.5707963267948966,\n      false\n    ]\n  ],\n  [\n    \"stroke\",\n    []\n  ],\n  [\n    \"draw\",\n    [\n      true\n    ]\n  ]\n]"
  },
  {
    "path": "tests/alipay/Progress/snapshot/alipay_config_props.txt",
    "content": "{\n  \"animation\": true,\n  \"percent\": 0,\n  \"speed\": 6,\n  \"strokeWidth\": 8,\n  \"type\": \"line\",\n  \"width\": 100,\n}\n"
  },
  {
    "path": "tests/alipay/Radio/RadioGroup/index.test.ts",
    "content": "import fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport { describe, expect, it } from 'vitest';\nimport { createRadioGroup } from './utils';\n\ndescribe('Radio', () => {\n  it('测试 defaultValue', async () => {\n    const { instance } = createRadioGroup({\n      defaultValue: '1',\n    });\n    expect(instance.getData().mixin.value).toEqual('1');\n  });\n\n  it('受控模式', async () => {\n    const { instance } = createRadioGroup({\n      value: '1',\n      defaultValue: '2',\n    });\n    expect(instance.getData().mixin.value).toEqual('1');\n  });\n\n  it('受控模式', async () => {\n    const { instance, onChange, callMethod } = createRadioGroup({\n      value: '1',\n      defaultValue: '2',\n    });\n    await callMethod(\n      'onChange',\n      {},\n      fmtEvent({\n        'data-index': 2,\n      })\n    );\n    expect(onChange.mock.lastCall).toEqual(['3', fmtEvent({})]);\n    expect(instance.getData().mixin.value).toEqual('1');\n  });\n\n  it('非受控模式', async () => {\n    const { instance, onChange, callMethod } = createRadioGroup({\n      defaultValue: '2',\n    });\n    expect(instance.getData().mixin.value).toEqual('2');\n    await callMethod(\n      'onChange',\n      {},\n      fmtEvent({\n        'data-index': 2,\n      })\n    );\n    expect(onChange.mock.lastCall).toEqual(['3', fmtEvent({})]);\n    expect(instance.getData().mixin.value).toEqual('3');\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Radio/RadioGroup/utils.ts",
    "content": "import { IRadioGroupProps } from 'compiled-alipay/Radio/RadioGroup/props';\nimport { getInstance, sleep } from 'tests/utils';\nimport { vi } from 'vitest';\n\nexport const defaultOptions: IRadioGroupProps['options'] = [\n  {\n    label: '选项一',\n    value: '1',\n  },\n  {\n    label: '选项二',\n    value: '2',\n  },\n  {\n    label: '选项三',\n    value: '3',\n  },\n];\n\nexport function createRadioGroup(props: Partial<IRadioGroupProps>) {\n  const onChange = vi.fn();\n\n  const my = {};\n  const instance = getInstance(\n    'Radio/RadioGroup',\n    {\n      onChange,\n      options: defaultOptions,\n      ...props,\n    },\n    my\n  );\n\n  return {\n    onChange,\n    instance,\n    callMethod: async (name, ...args) => {\n      const res = instance.callMethod(name, ...args);\n      await sleep(10);\n      return res;\n    },\n  };\n}\n"
  },
  {
    "path": "tests/alipay/Radio/index.test.ts",
    "content": "import fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport { describe, expect, it } from 'vitest';\nimport { createRadio } from './utils';\n\ndescribe('Radio', () => {\n  it('测试 defaultChecked', async () => {\n    const { instance } = createRadio({\n      defaultChecked: true,\n    });\n    expect(instance.getData().mixin.value).toEqual(true);\n    instance.setProps({ checked: false });\n    expect(instance.getData().mixin.value).toEqual(false);\n  });\n\n  it('受控模式', async () => {\n    const { instance, callMethod } = createRadio({\n      checked: false,\n      defaultChecked: true,\n    });\n    expect(instance.getData().mixin.value).toEqual(false);\n    await callMethod('onChange', { detail: { value: false } });\n    expect(instance.getData().mixin.value).toEqual(false);\n  });\n\n  it('onChange 事件', async () => {\n    const { instance, onChange, callMethod } = createRadio({\n      defaultChecked: true,\n    });\n    await callMethod('onChange', { detail: { value: false } });\n    expect(instance.getData().mixin.value).toEqual(false);\n    expect(onChange.mock.lastCall).toEqual([\n      false,\n      fmtEvent({}, { detail: { value: false } }),\n    ]);\n    await callMethod('onChange', { detail: { value: true } });\n    expect(onChange.mock.lastCall).toEqual([\n      true,\n      fmtEvent({}, { detail: { value: true } }),\n    ]);\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Radio/utils.ts",
    "content": "import { IRadioProps } from 'compiled-alipay/Radio/props';\nimport { getInstance, sleep } from 'tests/utils';\nimport { vi } from 'vitest';\n\nexport function createRadio(props: IRadioProps) {\n  const onChange = vi.fn();\n\n  const my = {};\n  const instance = getInstance(\n    'Radio',\n    {\n      onChange,\n      ...props,\n    },\n    my\n  );\n\n  return {\n    onChange,\n    instance,\n    callMethod: async (name, ...args) => {\n      const res = instance.callMethod(name, ...args);\n      await sleep(10);\n      return res;\n    },\n  };\n}\n"
  },
  {
    "path": "tests/alipay/RareWordsKeyboard/__tests__/index.test.ts",
    "content": "import fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport { getInstance, sleep } from 'tests/utils';\nimport { describe, it, expect, vi } from 'vitest';\nimport { createSelectorQueryFactory } from 'tests/selector-query';\n\ndescribe('rare-words-keyboard', () => {\n  const my = {\n    createSelectorQuery: createSelectorQueryFactory((id) => {\n      return {\n        '.ant-rare-words-keyboard-match_words_hidden': {\n          id: '',\n          dataset: {},\n          left: -9999,\n          right: -9962.5,\n          top: -9246,\n          bottom: -9226.8125,\n          width: 36.5,\n          height: 19.1875,\n        },\n        '.ant-rare-words-keyboard-match_words_inner': {\n          id: '',\n          dataset: {},\n          left: 4,\n          right: 370,\n          top: 763,\n          bottom: 791,\n          width: 366,\n          height: 28,\n        },\n      }[id];\n    }),\n  };\n  it('rare-words-keyboard maxDisplayNum', async () => {\n    const instance = getInstance(\n      'RareWordsKeyboard',\n      {\n        visible: true,\n        showMask: true,\n      },\n      my\n    );\n    await new Promise((r) => setTimeout(r, 20));\n    expect(instance.getData().maxDisplayNum).toBe(10);\n  });\n\n  it('rare-words-keyboard showErrorPage', async () => {\n    const onError = vi.fn();\n    const instance = getInstance(\n      'RareWordsKeyboard',\n      {\n        visible: true,\n        showMask: true,\n        onError,\n      },\n      {\n        ...my,\n        loadFontFace() {\n          throw new Error('not support');\n        },\n      }\n    );\n\n    await new Promise((r) => setTimeout(r, 20));\n    expect(instance.getData().showErrorPage).toBe(true);\n    expect(onError).toBeCalled();\n  });\n\n  it('rare-words-keyboard onClose', () => {\n    const onClose = vi.fn();\n    const instance = getInstance(\n      'RareWordsKeyboard',\n      {\n        visible: true,\n        showMask: true,\n        onClose,\n      },\n      my\n    );\n    instance.callMethod('handleHide');\n    expect(onClose).toBeCalled();\n  });\n\n  it('rare-words-keyboard onChange', () => {\n    const onChange = vi.fn();\n    const onClose = vi.fn();\n    const instance = getInstance(\n      'RareWordsKeyboard',\n      {\n        visible: true,\n        showMask: true,\n        onChange,\n        onClose,\n      },\n      my\n    );\n    instance.callMethod('handleWordClick', fmtEvent({ 'data-value': '䶮' }));\n    expect(onChange).toBeCalledWith('䶮', fmtEvent({}));\n    expect(onClose).toBeCalled();\n  });\n\n  it('rare-words-keyboard inputValue', async () => {\n    const instance = getInstance(\n      'RareWordsKeyboard',\n      {\n        visible: true,\n        showMask: true,\n      },\n      {\n        ...my,\n        loadFontFace: (option) => {\n          option.success();\n        },\n      }\n    );\n    await sleep(20);\n    instance.callMethod('handleKeyClick', fmtEvent({ 'data-value': 'Y' }));\n    await sleep(0);\n\n    expect(instance.getData().inputValue[0]).toBe('Y');\n    instance.callMethod('handleDelete');\n    await sleep(0);\n    expect(instance.getData().inputValue[0]).toBe(undefined);\n  });\n\n  it('测试重试的情况', async () => {\n    const loadFontFaceRequests = [];\n    const instance = getInstance(\n      'RareWordsKeyboard',\n      {\n        visible: true,\n        showMask: true,\n      },\n      {\n        ...my,\n        loadFontFace: (option) => {\n          loadFontFaceRequests.push(option);\n        },\n      }\n    );\n    instance.getData().loading = true;\n    instance.getData().showMoreWords = true;\n    loadFontFaceRequests[loadFontFaceRequests.length - 1].fail(\n      new Error('fail')\n    );\n    await new Promise((r) => setTimeout(r, 20));\n    expect(instance.getData().loading).toBe(false);\n    expect(instance.getData().showErrorPage).toBe(true);\n\n    instance.callMethod('handleRetry');\n\n    await new Promise((r) => setTimeout(r, 20));\n    expect(instance.getData().loading).toBe(true);\n    expect(instance.getData().showErrorPage).toBe(true);\n\n    loadFontFaceRequests[loadFontFaceRequests.length - 1].success();\n\n    await new Promise((r) => setTimeout(r, 20));\n    expect(instance.getData().loading).toBe(false);\n    expect(instance.getData().showErrorPage).toBe(false);\n  });\n\n  it('test hanleLookMore', async () => {\n    const instance = getInstance(\n      'RareWordsKeyboard',\n      {\n        visible: true,\n        showMask: true,\n      },\n      {\n        ...my,\n        loadFontFace: (option) => {\n          option.success();\n        },\n      }\n    );\n    await sleep(20);\n    instance.callMethod('handleKeyClick', fmtEvent({ 'data-value': 'T' }));\n    await sleep(20);\n    instance.callMethod('handleKeyClick', fmtEvent({ 'data-value': 'U' }));\n    await sleep(20);\n    instance.callMethod('hanleLookMore');\n    await sleep(20);\n    expect(instance.getData().showMoreWords).toBe(true);\n    expect(instance.getData().displayStr).toBe('TU');\n    expect(\n      instance.getData().matchWordsList.map((o) => o.charId)\n    ).toMatchFileSnapshot('tu.txt');\n    instance.callMethod('hanleLookMore');\n    await sleep(20);\n    expect(instance.getData().showMoreWords).toBe(false);\n    await sleep(20);\n    instance.callMethod('handleKeyClick', fmtEvent({ 'data-value': 'I' }));\n    await sleep(20);\n    expect(instance.getData().matchWordsList.length).toEqual(4);\n    await sleep(20);\n    instance.callMethod('hanleLookMore');\n    await sleep(20);\n    expect(instance.getData().matchWordsList.length).toEqual(0);\n    expect(instance.getData().inputValue).toEqual([]);\n  });\n\n  it('test handleDelete', async () => {\n    const instance = getInstance(\n      'RareWordsKeyboard',\n      {\n        visible: true,\n        showMask: true,\n      },\n      {\n        ...my,\n        loadFontFace: (option) => {\n          option.success();\n        },\n      }\n    );\n    await sleep(20);\n    instance.callMethod('handleKeyClick', fmtEvent({ 'data-value': 'T' }));\n    await sleep(20);\n    instance.callMethod('handleKeyClick', fmtEvent({ 'data-value': 'T' }));\n    await sleep(20);\n    expect(instance.getData().inputValue).toEqual(['T', 'T']);\n    instance.callMethod('handleDelete');\n    await sleep(20);\n    instance.callMethod('handleDelete');\n    instance.callMethod('handleDelete');\n    await sleep(20);\n    expect(instance.getData().inputValue).toEqual([]);\n  });\n});\n"
  },
  {
    "path": "tests/alipay/RareWordsKeyboard/__tests__/tu.txt",
    "content": "[\n  \"c04da763\",\n  \"7b86b31c\",\n  \"6d0a624d\",\n  \"00267b\",\n  \"c2782b53\",\n  \"d1235811\",\n  \"5914d3c0\",\n  \"691a3eb7\",\n  \"5ca75601\",\n  \"0203f5bc\",\n  \"b74cec\",\n  \"e0c603\",\n  \"933e6916\",\n  \"f255c200\",\n  \"9526caad\",\n  \"110fa7fb\",\n  \"7387413e\",\n  \"4ecb629c\",\n  \"f79f9e32\",\n  \"da84b1c6\",\n  \"24b5380f\",\n  \"5da5645b\",\n  \"28ba7a62\",\n  \"ba5467f5\",\n  \"d11fd3b1\",\n  \"a6454840\",\n  \"13c342c7\",\n  \"baf4f381\",\n  \"0e18ad32\",\n  \"708c99ea\",\n  \"6375d2f9\",\n  \"7830fd00\",\n]"
  },
  {
    "path": "tests/alipay/Rate/index.test.ts",
    "content": "import { describe, expect, it } from 'vitest';\nimport { testRate } from './utils';\n\nfunction getValueFromDate(instance) {\n  const { displayValue, mixin } = instance.getData();\n  return displayValue !== null ? displayValue : mixin.value;\n}\n\ndescribe('Radio', () => {\n  it('默认为 null', async () => {\n    const { instance } = testRate({});\n    expect(getValueFromDate(instance)).toBe(null);\n  });\n\n  it('测试点击', async () => {\n    const { instance, startTap } = testRate({});\n    await startTap(20);\n    expect(getValueFromDate(instance)).toBe(1);\n    await startTap(25);\n    expect(getValueFromDate(instance)).toBe(2);\n  });\n\n  it('支持 allowHalf', async () => {\n    const { instance, startTap } = testRate({\n      allowHalf: true,\n    });\n    await startTap(20);\n    expect(getValueFromDate(instance)).toBe(1);\n    await startTap(25);\n    expect(getValueFromDate(instance)).toBe(1.5);\n  });\n\n  it('支持 allowClear, 再次点击后清除', async () => {\n    const { instance, startTap } = testRate({\n      allowHalf: true,\n    });\n    await startTap(20);\n    expect(getValueFromDate(instance)).toBe(1);\n    await startTap(20);\n    expect(getValueFromDate(instance)).toBe(0);\n  });\n\n  it('支持 readonly', async () => {\n    const { instance, startTap } = testRate({\n      readonly: true,\n    });\n    await startTap(20);\n    expect(getValueFromDate(instance)).toBe(null);\n  });\n\n  it('测试 defaultValue', async () => {\n    const { instance, startTap } = testRate({\n      defaultValue: 2,\n    });\n    expect(getValueFromDate(instance)).toBe(2);\n    await startTap(20);\n    expect(getValueFromDate(instance)).toBe(1);\n  });\n\n  it('非受控模式 starMoveEnd 后恢复之前状态', async () => {\n    const { instance, starMove, starMoveEnd } = testRate({\n      defaultValue: 2,\n    });\n    expect(getValueFromDate(instance)).toBe(2);\n    await starMove(20);\n    expect(getValueFromDate(instance)).toBe(1);\n    await starMoveEnd();\n    expect(getValueFromDate(instance)).toBe(1);\n  });\n\n  it('测试 readonly', async () => {\n    const { instance, starMove, starMoveEnd } = testRate({\n      defaultValue: 2,\n      readonly: true,\n    });\n    expect(getValueFromDate(instance)).toBe(2);\n    await starMove(20);\n    expect(getValueFromDate(instance)).toBe(2);\n    await starMoveEnd();\n    expect(getValueFromDate(instance)).toBe(2);\n  });\n\n  it('测试 starMoveEnd', async () => {\n    const { instance, starMoveEnd } = testRate({\n      defaultValue: 2,\n    });\n    await starMoveEnd();\n    expect(getValueFromDate(instance)).toBe(2);\n  });\n});\n\ndescribe('受控模式', () => {\n  it('starMoveEnd 后恢复之前状态', async () => {\n    const { instance, starMove, starMoveEnd } = testRate({\n      value: 2,\n    });\n    expect(getValueFromDate(instance)).toBe(2);\n    await starMove(20);\n    expect(getValueFromDate(instance)).toBe(1);\n    await starMove(50);\n    expect(getValueFromDate(instance)).toBe(3);\n    await starMoveEnd();\n    expect(getValueFromDate(instance)).toBe(2);\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Rate/utils.ts",
    "content": "import { IRateProps } from 'compiled-alipay/Rate/props';\nimport { createSelectorQueryFactory } from 'tests/selector-query';\nimport { getInstance, sleep } from 'tests/utils';\nimport { vi } from 'vitest';\n\nexport function testRate(props: Partial<IRateProps>) {\n  const onChange = vi.fn();\n  const selectorMock = vi.fn().mockImplementation(async () => {\n    return {\n      left: 0,\n      width: 116,\n    };\n  });\n\n  const my = {\n    canIUse() {\n      return true;\n    },\n    createSelectorQuery: createSelectorQueryFactory(selectorMock),\n  };\n  const instance = getInstance(\n    'Rate',\n    {\n      ...(props ?? {}),\n      onChange,\n    },\n    my\n  );\n\n  async function startTap(value: number) {\n    instance.callMethod('handleStarTap', {\n      detail: {\n        clientX: value,\n      },\n    });\n    await sleep(20);\n  }\n  async function starMove(value: number) {\n    instance.callMethod('handleStarMove', {\n      touches: [\n        {\n          clientX: value,\n        },\n      ],\n    });\n    await sleep(20);\n  }\n  async function starMoveEnd() {\n    instance.callMethod('handleStarMoveEnd', {});\n    await sleep(20);\n  }\n  return {\n    instance,\n    selectorMock,\n    onChange,\n    startTap,\n    starMove,\n    starMoveEnd,\n  };\n}\n"
  },
  {
    "path": "tests/alipay/Result/index.test.ts",
    "content": "import { getInstance } from 'tests/utils';\nimport { describe, it, expect } from 'vitest';\n\ndescribe('Result config', () => {\n  it('Result config', () => {\n    const instance = getInstance('Result', {});\n    expect(instance.getConfig()).toMatchFileSnapshot(\n      'snapshot/result_alipay_config.txt'\n    );\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Result/snapshot/result_alipay_config.txt",
    "content": "{\n  \"data\": undefined,\n  \"methods\": undefined,\n  \"mixins\": [],\n  \"props\": {\n    \"image\": \"\",\n    \"message\": \"\",\n    \"title\": \"\",\n  },\n}\n"
  },
  {
    "path": "tests/alipay/Selector/index.test.ts",
    "content": "import fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport { describe, expect, it } from 'vitest';\nimport { createSelector } from './utils';\n\ndescribe('Selector Test', () => {\n  describe('多选', () => {\n    it('如果当前小于 minSelectedCount, 允许选择新的项', async () => {\n      const { instance, selectByValue } = createSelector({\n        multiple: true,\n        minSelectedCount: 1,\n      });\n      await selectByValue(1);\n      expect(instance.getData().mixin.value).toEqual([1]);\n      await selectByValue(2);\n      expect(instance.getData().mixin.value).toEqual([1, 2]);\n    });\n\n    it('如果当前小于等于 minSelectedCount, 不允许反选', async () => {\n      const { instance, selectByValue } = createSelector({\n        defaultValue: [1, 2],\n        multiple: true,\n        minSelectedCount: 1,\n      });\n      await selectByValue(1);\n      expect(instance.getData().mixin.value).toEqual([2]);\n\n      // 此时不能小于 1\n      await selectByValue(2);\n      expect(instance.getData().mixin.value).toEqual([2]);\n    });\n\n    it('如果当前大于等于 maxSelectedCount, 允许反选', async () => {\n      const { instance, selectByValue } = createSelector({\n        defaultValue: [1, 2],\n        multiple: true,\n        maxSelectedCount: 1,\n      });\n      await selectByValue(2);\n      expect(instance.getData().mixin.value).toEqual([1]);\n      await selectByValue(2);\n      expect(instance.getData().mixin.value).toEqual([1]);\n      await selectByValue(1);\n      expect(instance.getData().mixin.value).toEqual([]);\n    });\n\n    it('如果当前小于等于 maxSelectedCount, 不允许选择', async () => {\n      const { instance, selectByValue } = createSelector({\n        defaultValue: [1, 2],\n        multiple: true,\n        maxSelectedCount: 1,\n      });\n      await selectByValue(3);\n      expect(instance.getData().mixin.value).toEqual([1, 2]);\n    });\n\n    it('测试 onSelectMax', async () => {\n      const { selectByValue, onSelectMax } = createSelector({\n        defaultValue: [1, 2],\n        multiple: true,\n        maxSelectedCount: 2,\n      });\n      await selectByValue(3);\n      expect(onSelectMax.mock.lastCall).toEqual([\n        3,\n        { text: '3', value: 3 },\n        fmtEvent({}),\n      ]);\n    });\n  });\n\n  describe('单选', () => {\n    it('如果当前小于 minSelectedCount, 允许选择新的项', async () => {\n      const { instance, selectByValue } = createSelector({\n        minSelectedCount: 1,\n      });\n      await selectByValue(1);\n      expect(instance.getData().mixin.value).toEqual(1);\n      await selectByValue(2);\n      expect(instance.getData().mixin.value).toEqual(2);\n    });\n\n    it('如果当前小于等于 minSelectedCount, 不允许反选', async () => {\n      const { instance, selectByValue } = createSelector({\n        minSelectedCount: 1,\n      });\n      await selectByValue(1);\n      expect(instance.getData().mixin.value).toEqual(1);\n      await selectByValue(1);\n      expect(instance.getData().mixin.value).toEqual(1);\n    });\n\n    it('测试 disabled', async () => {\n      const { instance, selectByValue } = createSelector({\n        defaultValue: 1,\n        disabled: true,\n      });\n      expect(instance.getData().mixin.value).toEqual(1);\n      await selectByValue(2);\n      expect(instance.getData().mixin.value).toEqual(1);\n    });\n  });\n\n  it('onChange 事件 单选', async () => {\n    const { instance, selectByValue, onChange } = createSelector({\n      defaultValue: 1,\n    });\n    expect(instance.getData().mixin.value).toEqual(1);\n    await selectByValue(2);\n    expect(onChange.mock.lastCall).toEqual([\n      2,\n      { text: '2', value: 2 },\n      fmtEvent({}),\n    ]);\n    expect(instance.getData().mixin.value).toEqual(2);\n    await selectByValue(2);\n    expect(onChange.mock.lastCall).toEqual([\n      undefined,\n      undefined,\n      fmtEvent({}),\n    ]);\n    expect(instance.getData().mixin.value).toEqual(undefined);\n  });\n\n  it('onChange 事件 多选', async () => {\n    const { instance, selectByValue, onChange } = createSelector({\n      multiple: true,\n      defaultValue: [1, 2],\n    });\n    expect(instance.getData().mixin.value).toEqual([1, 2]);\n    await selectByValue(2);\n    expect(onChange.mock.lastCall).toEqual([\n      [1],\n      [{ text: '1', value: 1 }],\n      fmtEvent({}),\n    ]);\n    expect(instance.getData().mixin.value).toEqual([1]);\n    await selectByValue(3);\n    expect(onChange.mock.lastCall).toEqual([\n      [1, 3],\n      [\n        { text: '1', value: 1 },\n        { text: '3', value: 3 },\n      ],\n      fmtEvent({}),\n    ]);\n  });\n});\n\ndescribe('受控模式', () => {\n  it('单选', async () => {\n    const { instance, selectByValue, onChange } = createSelector({\n      value: 1,\n    });\n    expect(instance.getData().mixin.value).toEqual(1);\n    await selectByValue(2);\n    expect(onChange.mock.lastCall).toEqual([\n      2,\n      { text: '2', value: 2 },\n      fmtEvent({}),\n    ]);\n    expect(instance.getData().mixin.value).toEqual(1);\n    await selectByValue(1);\n    expect(onChange.mock.lastCall).toEqual([\n      undefined,\n      undefined,\n      fmtEvent({}),\n    ]);\n  });\n\n  it('多选', async () => {\n    const { instance, selectByValue, onChange } = createSelector({\n      multiple: true,\n      value: [1, 2],\n    });\n    expect(instance.getData().mixin.value).toEqual([1, 2]);\n    await selectByValue(2);\n    expect(onChange.mock.lastCall).toEqual([\n      [1],\n      [{ text: '1', value: 1 }],\n      fmtEvent({}),\n    ]);\n    expect(instance.getData().mixin.value).toEqual([1, 2]);\n    await selectByValue(3);\n    expect(onChange.mock.lastCall).toEqual([\n      [1, 2, 3],\n      [\n        { text: '1', value: 1 },\n        { text: '2', value: 2 },\n        { text: '3', value: 3 },\n      ],\n      fmtEvent({}),\n    ]);\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Selector/utils.ts",
    "content": "import { getInstance, sleep } from 'tests/utils';\nimport { vi } from 'vitest';\nimport {\n  ISelectorItem,\n  ISelectorProps,\n} from '../../../compiled/alipay/src/Selector/props';\n\nexport const options: ISelectorItem[] = [\n  {\n    text: '1',\n    value: 1,\n  },\n  {\n    text: '2',\n    value: 2,\n  },\n  {\n    text: '3',\n    value: 3,\n  },\n  {\n    text: 'disabled',\n    value: 'disabled',\n    disabled: true,\n  },\n];\n\nexport function createSelector(props: Partial<ISelectorProps>) {\n  const onChange = vi.fn();\n  const onSelectMax = vi.fn();\n  const onSelectMin = vi.fn();\n\n  const componentProps: Partial<ISelectorProps> = {\n    options,\n    onChange,\n    onSelectMin,\n    onSelectMax,\n    ...props,\n  };\n\n  const instance = getInstance('Selector', componentProps);\n\n  async function selectByValue(value: string | number) {\n    const selectItem = componentProps.options?.find((v) => v.value === value);\n    if (!selectItem) {\n      throw new Error(`找不到 value 为 ${value} 的选项`);\n    }\n    instance.callMethod('onChange', {\n      currentTarget: {\n        dataset: {\n          disabled: selectItem.disabled,\n          value: selectItem.value,\n        },\n      },\n    });\n    await sleep(10);\n  }\n  return {\n    instance,\n    onChange,\n    onSelectMin,\n    onSelectMax,\n    selectByValue,\n  };\n}\n"
  },
  {
    "path": "tests/alipay/Slider/__tests__/index.test.ts",
    "content": "import { createSelectorQueryFactory, MockSelect } from 'tests/selector-query';\nimport { getInstance, sleep, TestInstance } from 'tests/utils';\nimport { describe, expect, it, vi } from 'vitest';\n\nfunction testSlider(props, mock?: MockSelect): TestInstance {\n  const my = {\n    canIUse() {\n      return true;\n    },\n    createSelectorQuery: createSelectorQueryFactory(mock),\n  };\n  const instance = getInstance('Slider', props, my);\n  return instance;\n}\n\nasync function callStep(\n  instance: TestInstance,\n  start: number,\n  end: number,\n  step: number\n) {\n  const dataList = [];\n\n  for (let i = start; i <= end; i = i + step) {\n    let command = 'handleTrackTouchMove';\n    if (i === start) {\n      command = 'handleTrackTouchStart';\n    } else if (i === end) {\n      command = 'handleTrackTouchEnd';\n    }\n    await touchEvent(instance, command, i);\n    dataList.push(instance.getData().mixin.value);\n  }\n  return dataList;\n}\n\nconst selectorMock = vi.fn().mockImplementation(async () => {\n  return {\n    left: 0,\n    width: 100,\n  };\n});\n\nasync function touchEvent(\n  instance: TestInstance,\n  event: string,\n  pageX: number,\n  id = ''\n) {\n  instance.callMethod(event, {\n    currentTarget: {\n      id,\n    },\n    changedTouches: [\n      {\n        pageX: pageX,\n      },\n    ],\n  });\n  await sleep(20);\n}\n\ndescribe('单滑块', () => {\n  it('测试滚动到末尾', async () => {\n    const instance = testSlider(\n      {\n        min: 0,\n        max: 50,\n      },\n      selectorMock\n    );\n    await touchEvent(instance, 'handleTrackTouchStart', -10);\n    expect(instance.getData().mixin.value).toBe(0);\n    await touchEvent(instance, 'handleTrackTouchEnd', 30);\n    expect(instance.getData().mixin.value).toBe(15);\n    await touchEvent(instance, 'handleTrackTouchEnd', 110);\n    expect(instance.getData().mixin.value).toBe(50);\n  });\n\n  it('测试 step 为 0.5', async () => {\n    const instance = testSlider(\n      {\n        min: 0,\n        max: 4,\n        step: 0.5,\n        showTicks: true,\n      },\n      selectorMock\n    );\n    const dataList = await callStep(instance, -10, 100, 10);\n    expect(dataList).toEqual([0, 0, 0.5, 1, 1, 1.5, 2, 2.5, 3, 3, 3.5, 4]);\n  });\n});\n\ndescribe('双滑块', () => {\n  it('测试双滑块滑动', async () => {\n    const instance = testSlider(\n      {\n        min: 0,\n        max: 10,\n        defaultValue: [1, 5],\n        range: true,\n        step: 1,\n      },\n      selectorMock\n    );\n    const dataList = await callStep(instance, -10, 100, 10);\n    expect(dataList).toEqual([\n      [0, 5],\n      [0, 5],\n      [1, 5],\n      [2, 5],\n      [3, 5],\n      [4, 5],\n      [4, 5],\n      [4, 6],\n      [4, 7],\n      [4, 8],\n      [4, 9],\n      [4, 10],\n    ]);\n  });\n\n  it('测试默认值', async () => {\n    const instance = testSlider(\n      {\n        range: true,\n        min: 0,\n        max: 4,\n      },\n      selectorMock\n    );\n    expect(instance.getData().mixin.value).toEqual([0, 0]);\n  });\n});\n\nit('测试 tickList', async () => {\n  const instance = testSlider({\n    checked: false,\n    min: 2,\n    max: 3,\n    step: 0.5,\n    showTicks: true,\n  });\n  await sleep(20);\n  expect(instance.getData().tickList).toMatchInlineSnapshot(`\n    [\n      {\n        \"left\": 0,\n        \"value\": 2,\n      },\n      {\n        \"left\": 50,\n        \"value\": 2.5,\n      },\n      {\n        \"left\": 100,\n        \"value\": 3,\n      },\n    ]\n  `);\n});\n\nit('测试 disabled', async () => {\n  const instance = testSlider(\n    {\n      min: 0,\n      max: 50,\n      disabled: true,\n    },\n    selectorMock\n  );\n  await touchEvent(instance, 'handleTrackTouchStart', 50);\n  expect(instance.getData().mixin.value).toBe(0);\n  instance.setProps({\n    disabled: false,\n  });\n  await touchEvent(instance, 'handleTrackTouchStart', 50);\n  expect(instance.getData().mixin.value).toBe(25);\n});\n\ndescribe('受控模式测试', () => {\n  it('测试 value 大于 max 的情况', async () => {\n    const instance = testSlider(\n      {\n        value: 5,\n        min: 0,\n        max: 4,\n        showTicks: true,\n      },\n      selectorMock\n    );\n    expect(instance.getData().mixin.value).toBe(4);\n  });\n\n  it('测试 defaultValue 大于 max 的情况', async () => {\n    const instance = testSlider(\n      {\n        defaultValue: 5,\n        min: 0,\n        max: 4,\n        showTicks: true,\n      },\n      selectorMock\n    );\n    expect(instance.getData().mixin.value).toBe(4);\n  });\n\n  it('测试 defaultValue 与 value 优先级', async () => {\n    const instance = testSlider(\n      {\n        value: -1,\n        defaultValue: 5,\n        min: 0,\n        max: 4,\n        showTicks: true,\n      },\n      selectorMock\n    );\n    expect(instance.getData().mixin.value).toBe(0);\n  });\n\n  it('测试 range 的 value 超出范围的情况', async () => {\n    const instance = testSlider(\n      {\n        value: [-1, 5],\n        range: true,\n        min: 0,\n        max: 4,\n      },\n      selectorMock\n    );\n    expect(instance.getData().mixin.value).toEqual([0, 4]);\n  });\n\n  it('测试更新 props', async () => {\n    const instance = testSlider(\n      {\n        value: 2,\n        min: 0,\n        max: 4,\n        step: 0.5,\n        showTicks: true,\n      },\n      selectorMock\n    );\n    await touchEvent(instance, 'handleTrackTouchStart', 0);\n    expect(instance.getData().mixin.value).toBe(2);\n    expect(instance.getData().changingEnd).toBe(true);\n    expect(instance.getData().changingStart).toBe(false);\n    instance.setProps({\n      value: 3,\n    });\n    expect(instance.getData().mixin.value).toBe(3);\n  });\n});\n\ndescribe('事件测试', () => {\n  it('测试 onAfterChange', async () => {\n    const onAfterChange = vi.fn();\n    const instance = testSlider(\n      {\n        onAfterChange,\n      },\n      selectorMock\n    );\n    await touchEvent(instance, 'handleTrackTouchStart', 50);\n    expect(instance.getData().mixin.value).toBe(50);\n    await touchEvent(instance, 'handleTrackTouchEnd', 51);\n    expect(onAfterChange.mock.calls[0][0]).toEqual(51);\n    expect(onAfterChange.mock.calls[0][1]).toMatchInlineSnapshot(`\n      {\n        \"changedTouches\": [\n          {\n            \"pageX\": 51,\n          },\n        ],\n        \"currentTarget\": {\n          \"dataset\": {},\n        },\n        \"target\": {\n          \"dataset\": {},\n          \"targetDataset\": {},\n        },\n      }\n    `);\n  });\n\n  it('数据不变的情况下 onChange 只会调用一次', async () => {\n    const onChange = vi.fn();\n    const instance = testSlider(\n      {\n        min: 0,\n        max: 4,\n        'data-test': 1,\n        onChange,\n      },\n      selectorMock\n    );\n    await touchEvent(instance, 'handleTrackTouchStart', 50);\n    expect(instance.getData().mixin.value).toBe(2);\n    await touchEvent(instance, 'handleTrackTouchMove', 55);\n    await touchEvent(instance, 'handleTrackTouchMove', 60);\n    expect(onChange.mock.lastCall[0]).toEqual(2);\n    expect(onChange.mock.calls.length).toBe(1);\n    await touchEvent(instance, 'handleTrackTouchEnd', 75);\n    expect(onChange.mock.lastCall[0]).toEqual(3);\n    expect(onChange.mock.lastCall[1]).toMatchInlineSnapshot(`\n      {\n        \"currentTarget\": {\n          \"dataset\": {\n            \"test\": 1,\n          },\n        },\n        \"target\": {\n          \"dataset\": {\n            \"test\": 1,\n          },\n          \"targetDataset\": {\n            \"test\": 1,\n          },\n        },\n      }\n    `);\n    expect(onChange.mock.calls.length).toBe(2);\n  });\n\n  it('测试忽略比较旧的事件', async () => {\n    const selectorMock = vi.fn().mockImplementation(async (id) => {\n      if (id === '#2') {\n        await sleep(100);\n      }\n      return {\n        left: 0,\n        width: 100,\n      };\n    });\n    const instance = testSlider({}, selectorMock);\n    await touchEvent(instance, 'handleTrackTouchStart', 50, '1');\n    await touchEvent(instance, 'handleTrackTouchMove', 55, '2');\n    await touchEvent(instance, 'handleTrackTouchEnd', 60, '3');\n    await sleep(300);\n    expect(instance.getData().mixin.value).toBe(60);\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Stepper/__tests__/index.test.ts",
    "content": "import { getInstance, sleep } from 'tests/utils';\nimport fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport { getPrecision, getValidNumber } from 'compiled-alipay/Stepper/utils';\nimport { describe, it, expect, vi } from 'vitest';\n\ndescribe('stepper', () => {\n  const my = {\n    canIUse() {\n      return true;\n    },\n  };\n\n  it('getPrecision', () => {\n    expect(getPrecision(1)).toBe(0);\n    expect(getPrecision(1.2)).toBe(1);\n    expect(getPrecision(-1)).toBe(0);\n    expect(getPrecision(-1.2)).toBe(1);\n    expect(getPrecision(1e-2)).toBe(2);\n    expect(getPrecision(-1e-2)).toBe(2);\n    expect(getPrecision(-1e-12)).toBe(12);\n  });\n\n  it('getValidNumber', async () => {\n    expect(getValidNumber(undefined, undefined, undefined, 1, 1)).toEqual({\n      valid: true,\n      value: '',\n    });\n    expect(getValidNumber(undefined, -Infinity, Infinity, 1, 1)).toEqual({\n      valid: true,\n      value: '',\n    });\n    expect(getValidNumber(null, -Infinity, Infinity, 1, 1)).toEqual({\n      valid: true,\n      value: '',\n    });\n    expect(getValidNumber('', -Infinity, Infinity, 1, 1)).toEqual({\n      valid: true,\n      value: '',\n    });\n    expect(getValidNumber('0', -Infinity, Infinity, 1, 0)).toEqual({\n      valid: true,\n      value: '0',\n    });\n    expect(getValidNumber(0, -Infinity, Infinity, 1, 0)).toEqual({\n      valid: true,\n      value: '0',\n    });\n    expect(getValidNumber(1, -Infinity, Infinity, 1, 0)).toEqual({\n      valid: true,\n      value: '1',\n    });\n    expect(getValidNumber(1, 2, Infinity, 1, 0)).toEqual({\n      valid: true,\n      value: '2',\n    });\n    expect(getValidNumber(2, -Infinity, 1, 1, 0)).toEqual({\n      valid: true,\n      value: '1',\n    });\n    expect(getValidNumber(1, -Infinity, Infinity, 1, 1)).toEqual({\n      valid: true,\n      value: '1.0',\n    });\n  });\n\n  function testMixinValue(props, expectValue) {\n    const instance = getInstance('Stepper', props, my);\n    expect(instance.getData().mixin.value).toBe(expectValue);\n  }\n\n  it('stepper defaultValue', async () => {\n    [\n      {\n        props: {\n          defaultValue: 1.02,\n        },\n        expectValue: '1.02',\n      },\n      {\n        props: {\n          defaultValue: null,\n        },\n        expectValue: '',\n      },\n      {\n        props: {\n          defaultValue: 'not_a_number',\n        },\n        expectValue: undefined,\n      },\n      {\n        props: {\n          defaultValue: '10.0',\n        },\n        expectValue: '10',\n      },\n      {\n        props: {\n          value: null,\n        },\n        expectValue: '',\n      },\n      {\n        props: {\n          value: {},\n        },\n        expectValue: undefined,\n      },\n    ].forEach(({ props, expectValue }) => {\n      testMixinValue(props, expectValue);\n    });\n  });\n\n  it('stepper defaultValue with step', async () => {\n    const instance = getInstance(\n      'Stepper',\n      {\n        defaultValue: 0,\n        step: 0.1,\n      },\n      my\n    );\n    expect(instance.getData().mixin.value).toBe('0.0');\n  });\n\n  it('stepper defaultValue with precision', async () => {\n    const instance1 = getInstance(\n      'Stepper',\n      {\n        defaultValue: 1.02,\n        precision: 1,\n      },\n      my\n    );\n    expect(instance1.getData().mixin.value).toBe('1.0');\n\n    const instance2 = getInstance(\n      'Stepper',\n      {\n        defaultValue: 1.05,\n        precision: 1,\n      },\n      my\n    );\n    expect(instance2.getData().mixin.value).toBe('1.1');\n  });\n\n  it('stepper add', async () => {\n    const instance1 = getInstance(\n      'Stepper',\n      {\n        defaultValue: 0.9,\n        step: 0.1,\n      },\n      my\n    );\n    instance1.callMethod(\n      'onTap',\n      fmtEvent({\n        'data-mode': 'add',\n      })\n    );\n    await sleep(20);\n    expect(instance1.getData().mixin.value).toBe('1.0');\n\n    const instance2 = getInstance(\n      'Stepper',\n      {\n        defaultValue: 0.9,\n        step: 0.12,\n      },\n      my\n    );\n    instance2.callMethod(\n      'onTap',\n      fmtEvent({\n        'data-mode': 'add',\n      })\n    );\n    await sleep(10);\n    expect(instance2.getData().mixin.value).toBe('1.02');\n  });\n\n  it('stepper minus', async () => {\n    const instance1 = getInstance(\n      'Stepper',\n      {\n        defaultValue: 0.1,\n        step: 0.1,\n      },\n      my\n    );\n    instance1.callMethod(\n      'onTap',\n      fmtEvent({\n        'data-mode': 'minus',\n      })\n    );\n    await sleep(10);\n    expect(instance1.getData().mixin.value).toBe('0.0');\n\n    const instance2 = getInstance(\n      'Stepper',\n      {\n        defaultValue: 0.2,\n        step: 0.1,\n        onChange(value: number | null) {\n          expect(value).toBe(0.3);\n        },\n      },\n      my\n    );\n    instance2.callMethod(\n      'onTap',\n      fmtEvent({\n        'data-mode': 'add',\n      })\n    );\n    await sleep(10);\n    expect(instance2.getData().mixin.value).toBe('0.3');\n  });\n\n  it('stepper add with precision', async () => {\n    const instance = getInstance(\n      'Stepper',\n      {\n        defaultValue: 1.02,\n        step: 0.1,\n        precision: 1,\n      },\n      my\n    );\n    instance.callMethod(\n      'onTap',\n      fmtEvent({\n        'data-mode': 'add',\n      })\n    );\n    await sleep(10);\n    expect(instance.getData().mixin.value).toBe('1.1');\n  });\n\n  it('stepper minus with precision', async () => {\n    const instance = getInstance(\n      'Stepper',\n      {\n        defaultValue: 1.02,\n        step: 0.1,\n        precision: 1,\n      },\n      my\n    );\n    instance.callMethod(\n      'onTap',\n      fmtEvent({\n        'data-mode': 'minus',\n      })\n    );\n    await sleep(10);\n    expect(instance.getData().mixin.value).toBe('0.9');\n  });\n\n  it('stepper controlled', async () => {\n    let onChangeValue: number | null;\n    const instance = getInstance(\n      'Stepper',\n      {\n        value: 1.02,\n        step: 0.1,\n        precision: 1,\n        onChange(value: number | null) {\n          onChangeValue = value;\n        },\n      },\n      my\n    );\n\n    expect(instance.getData().mixin.value).toBe('1.0');\n    instance.callMethod(\n      'onTap',\n      fmtEvent({\n        'data-mode': 'minus',\n      })\n    );\n    expect(onChangeValue).toBe(0.9);\n\n    expect(instance.getData().mixin.value).toBe('1.0');\n    instance.setProps({\n      value: 0.9,\n    });\n    expect(instance.getData().mixin.value).toBe('0.9');\n    instance.callMethod(\n      'onTap',\n      fmtEvent({\n        'data-mode': 'add',\n      })\n    );\n    expect(onChangeValue).toBe(1);\n    expect(instance.getData().mixin.value).toBe('0.9');\n    instance.setProps({\n      value: 1,\n    });\n    expect(instance.getData().mixin.value).toBe('1.0');\n\n    instance.setProps({\n      value: '1.12',\n    });\n    expect(instance.getData().mixin.value).toBe('1.1');\n\n    instance.setProps({\n      value: 'invalid',\n    });\n    expect(instance.getData().mixin.value).toBe('1.1');\n  });\n\n  it('stepper mix max', async () => {\n    const instance = getInstance(\n      'Stepper',\n      {\n        defaultValue: 0.1,\n        step: 0.1,\n        min: 0,\n        max: 0.2,\n      },\n      my\n    );\n    instance.callMethod(\n      'onTap',\n      fmtEvent({\n        'data-mode': 'minus',\n      })\n    );\n    await sleep(20);\n    expect(instance.getData().mixin.value).toBe('0.0');\n    instance.callMethod(\n      'onTap',\n      fmtEvent({\n        'data-mode': 'minus',\n      })\n    );\n    expect(instance.getData().mixin.value).toBe('0.0');\n    instance.callMethod(\n      'onTap',\n      fmtEvent({\n        'data-mode': 'add',\n      })\n    );\n    await sleep(10);\n    expect(instance.getData().mixin.value).toBe('0.1');\n    instance.callMethod(\n      'onTap',\n      fmtEvent({\n        'data-mode': 'add',\n      })\n    );\n    await sleep(10);\n    expect(instance.getData().mixin.value).toBe('0.2');\n    instance.callMethod(\n      'onTap',\n      fmtEvent({\n        'data-mode': 'add',\n      })\n    );\n    expect(instance.getData().mixin.value).toBe('0.2');\n  });\n\n  it('stepper onChange, onFocus, onConfirm, onBlur', async () => {\n    let onFoucsValue: number | null;\n    let onChangeValue: number | null;\n    let onConfirmValue: number;\n    let onBlurValue: number | null;\n    const instance = getInstance(\n      'Stepper',\n      {\n        defaultValue: 0.1,\n        step: 0.1,\n        onFocus(value: number | null) {\n          onFoucsValue = value;\n        },\n        onChange(value: number | null) {\n          onChangeValue = value;\n        },\n        onConfirm(value: number | null) {\n          onConfirmValue = value;\n        },\n        onBlur(value: number | null) {\n          onBlurValue = value;\n        },\n      },\n      my\n    );\n    instance.callMethod(\n      'onTap',\n      fmtEvent({\n        'data-mode': 'minus',\n      })\n    );\n    expect(onChangeValue).toBe(0);\n    await sleep(10);\n    expect(instance.getData().mixin.value).toBe('0.0');\n    instance.callMethod(\n      'onTap',\n      fmtEvent({\n        'data-mode': 'add',\n      })\n    );\n    await sleep(10);\n    expect(instance.getData().mixin.value).toBe('0.1');\n    expect(onChangeValue).toBe(0.1);\n    instance.callMethod('onChange', '.');\n    expect(onChangeValue).toBe(0.1);\n    instance.callMethod('onChange', '');\n    expect(onChangeValue).toBe(null);\n    await sleep(10);\n    instance.callMethod('onFocus');\n    expect(onFoucsValue).toBe(null);\n    instance.callMethod('onBlur');\n    expect(onBlurValue).toBe(null);\n    instance.callMethod('onConfirm');\n    expect(onConfirmValue).toBe(null);\n\n    instance.callMethod('onChange', '1');\n    await sleep(10);\n    instance.callMethod('onFocus');\n    expect(onFoucsValue).toBe(1);\n    instance.callMethod('onBlur');\n    expect(onBlurValue).toBe(1);\n    instance.callMethod('onConfirm');\n    expect(onConfirmValue).toBe(1);\n\n    const instance2 = getInstance(\n      'Stepper',\n      {\n        value: 0.1,\n        step: 0.1,\n        onBlur(value: number | null) {\n          onBlurValue = value;\n        },\n      },\n      my\n    );\n\n    instance2.setProps({\n      value: 1,\n    });\n    instance2.callMethod('onBlur');\n    expect(instance2.getData().mixin.value).toBe('1.0');\n    expect(onBlurValue).toBe(1);\n  });\n\n  it('测试 onChange 格式化数据', async () => {\n    const instance = getInstance(\n      'Stepper',\n      {\n        defaultValue: 0.1,\n        step: 0.1,\n      },\n      my\n    );\n\n    instance.callMethod('onChange', '1.00');\n    await sleep(10);\n    expect(instance.getData().mixin.value).toBe('1.0');\n    instance.callMethod('onChange', '1.000');\n    expect(instance.getData().mixin.value).toBe('1.0');\n  });\n\n  it('测试 disabled', async () => {\n    const instance = getInstance(\n      'Stepper',\n      {\n        defaultValue: 0.1,\n      },\n      my\n    );\n\n    instance.callMethod(\n      'onTap',\n      fmtEvent({\n        'data-mode': 'add',\n      })\n    );\n    await sleep(10);\n    expect(instance.getData().mixin.value).toBe('1.1');\n    instance.setProps({ disabled: true });\n    instance.callMethod(\n      'onTap',\n      fmtEvent({\n        'data-mode': 'add',\n      })\n    );\n    expect(instance.getData().mixin.value).toBe('1.1');\n    instance.setProps({ disabled: false });\n    await instance.callMethod(\n      'onTap',\n      fmtEvent({\n        'data-mode': 'add',\n      })\n    );\n    await sleep(20);\n    expect(instance.getData().mixin.value).toBe('2.1');\n  });\n\n  it('测试 onChange 变化', async () => {\n    const onChange = vi.fn();\n    const instance = getInstance(\n      'Stepper',\n      {\n        defaultValue: 0.1,\n        onChange,\n      },\n      my\n    );\n    instance.callMethod('onChange', '1.00');\n    expect(onChange.mock.calls.length).toBe(1);\n    expect(onChange.mock.calls[0][0]).toBe(1);\n  });\n\n  it('测试 onChange 变化', async () => {\n    const onChange = vi.fn();\n    const instance = getInstance(\n      'Stepper',\n      {\n        defaultValue: 0.1,\n        onChange,\n      },\n      my\n    );\n    instance.callMethod('onChange', '1.00');\n    expect(onChange.mock.calls.length).toBe(1);\n    expect(onChange.mock.calls[0][0]).toBe(1);\n  });\n});\n"
  },
  {
    "path": "tests/alipay/SwipeAction/index.spec.ts",
    "content": "import { getInstance, sleep } from 'tests/utils';\nimport { describe, expect, it, Mock, vi } from 'vitest';\nimport { ISwipeActionProps } from '../../../src/SwipeAction/props';\nimport { SelectorQuery } from '../../selector-query';\nimport _ from 'lodash';\n\nconst createSwipeAction = (\n  options: Partial<ISwipeActionProps>,\n  handleQuery: Mock,\n  myProps: Record<string, any> = {}\n) => {\n  const selector = SelectorQuery.create(handleQuery);\n  const my = {\n    SDKVersion: '2.1.0',\n    canIUse() {\n      return true;\n    },\n    createSelectorQuery() {\n      return selector;\n    },\n    ...myProps,\n  };\n  const onSwipeStart = vi.fn();\n  const onSwipeEnd = vi.fn();\n  const onButtonTap = vi.fn();\n  const rightButtons = [\n    {\n      text: 'one',\n      width: 100,\n    },\n    {\n      text: 'two',\n      width: 200,\n    },\n    {\n      text: 'three',\n    },\n  ];\n  const leftButtons = [\n    {\n      text: 'l1',\n      width: 100,\n    },\n  ];\n  const instance = getInstance(\n    'SwipeAction',\n    {\n      rightButtons,\n      leftButtons,\n      onSwipeStart,\n      onSwipeEnd,\n      onButtonTap,\n      ...options,\n    },\n    my\n  );\n  return {\n    instance,\n    onSwipeStart,\n    onSwipeEnd,\n    onButtonTap,\n    leftButtons,\n    rightButtons,\n  };\n};\n\ndescribe('modal onClose', () => {\n  const handleQuery = vi.fn();\n  it('测试 _leftButtons 与 _leftButtons', async () => {\n    const { instance } = createSwipeAction({}, handleQuery);\n    await sleep(50);\n    expect(\n      _.pick(\n        instance.getData(),\n        '_rightButtons',\n        '_leftButtons',\n        'leftWidth',\n        'rightWidth'\n      )\n    ).toEqual({\n      'leftWidth': 100,\n      'rightWidth': 450,\n      '_leftButtons': [\n        {\n          'text': 'l1',\n          'width': 100,\n        },\n      ],\n      '_rightButtons': [\n        {\n          'text': 'one',\n          'width': 100,\n        },\n        {\n          'text': 'two',\n          'width': 200,\n        },\n        {\n          'text': 'three',\n          'width': 150,\n        },\n      ],\n    });\n  });\n\n  it('测试 defaultSwiped', async () => {\n    handleQuery.mockImplementation((id) => {\n      return {\n        width: {\n          '.ant-swipe-action-movable-right-1': 450,\n        }[id],\n      };\n    });\n    const { instance } = createSwipeAction(\n      {\n        defaultSwiped: 'right',\n        leftButtons: [],\n      },\n      handleQuery\n    );\n    await sleep(50);\n    expect(_.pick(instance.getData(), 'swipeX', 'swipedR', 'swipedL')).toEqual({\n      'swipeX': -450.01,\n      'swipedL': false,\n      'swipedR': true,\n    });\n  });\n  it('测试 defaultSwiped left', async () => {\n    handleQuery.mockImplementation((id) => {\n      return {\n        width: {\n          '.ant-swipe-action-movable-left-1': 100,\n        }[id],\n      };\n    });\n    const { instance } = createSwipeAction(\n      {\n        defaultSwiped: 'left',\n        rightButtons: [],\n      },\n      handleQuery\n    );\n    await sleep(50);\n    expect(_.pick(instance.getData(), 'swipeX', 'swipedR', 'swipedL')).toEqual({\n      'swipeX': 100.01,\n      'swipedL': true,\n      'swipedR': false,\n    });\n  });\n\n  it('测试左滑', async () => {\n    const rightButtons = [\n      {\n        text: 'one',\n        width: 100,\n        confirmType: 'tap' as const,\n      },\n      {\n        text: 'two',\n        width: 200,\n      },\n      {\n        text: 'three',\n      },\n    ];\n\n    const { instance, onButtonTap } = createSwipeAction(\n      { rightButtons: rightButtons },\n      handleQuery\n    );\n    await sleep(50);\n    handleQuery.mockImplementation((id) => {\n      return {\n        width: {\n          '.ant-swipe-action-movable-right-1': 450,\n        }[id],\n      };\n    });\n    instance.callMethod('onTouchStart');\n    await sleep(50);\n    instance.callMethod('onChange', { detail: { x: -50 } });\n    await sleep(50);\n    instance.callMethod('onChangeEnd', { detail: { x: -100 } });\n    instance.callMethod('onTouchEnd');\n    await sleep(50);\n    expect(_.pick(instance.getData(), 'swipeX', 'swipedR', 'swipedL')).toEqual({\n      'swipeX': -470.01,\n      'swipedL': false,\n      'swipedR': false,\n    });\n    expect(_.pick(instance.getData(), 'tapTypeR')).toEqual({\n      tapTypeR: '',\n    });\n    instance.callMethod('onItemTap', {\n      currentTarget: {\n        dataset: {\n          item: {\n            item: rightButtons[0],\n            idx: 0,\n          },\n        },\n      },\n    });\n    await sleep(100);\n    expect(onButtonTap).toBeCalledTimes(0);\n    expect(_.pick(instance.getData(), 'tapTypeR')).toEqual({\n      tapTypeR: 'R-0',\n    });\n    instance.callMethod('onItemTap', {\n      currentTarget: {\n        dataset: {\n          item: {\n            item: rightButtons[0],\n            idx: 0,\n          },\n        },\n      },\n    });\n    await sleep(50);\n    expect(_.pick(instance.getData(), 'tapTypeR')).toEqual({\n      tapTypeR: '',\n    });\n    expect(onButtonTap).toBeCalledTimes(1);\n\n    instance.callMethod('onTouchStart');\n    await sleep(50);\n    instance.callMethod('onChange', { detail: { x: -50 } });\n    await sleep(50);\n    instance.callMethod('onChangeEnd', { detail: { x: -100 } });\n    instance.callMethod('onTouchEnd');\n    await sleep(50);\n\n    instance.callMethod('onItemTap', {\n      currentTarget: {\n        dataset: {\n          item: {\n            item: rightButtons[1],\n            idx: 1,\n          },\n        },\n      },\n    });\n    await sleep(50);\n    expect(onButtonTap).toBeCalledTimes(2);\n  });\n\n  it('测试右滑, 双重确认', async () => {\n    const leftButtons = [\n      {\n        text: 'l1',\n        width: 100,\n        confirmType: 'tap' as const,\n      },\n    ];\n    const { instance, onButtonTap } = createSwipeAction(\n      {\n        leftButtons,\n      },\n      handleQuery\n    );\n    await sleep(50);\n    handleQuery.mockImplementation((id) => {\n      return {\n        width: {\n          '.ant-swipe-action-movable-left-1': 100,\n        }[id],\n      };\n    });\n    instance.callMethod('onTouchStart');\n    await sleep(50);\n    instance.callMethod('onChange', { detail: { x: 10 } });\n    await sleep(50);\n    instance.callMethod('onChangeEnd', { detail: { x: 30 } });\n    instance.callMethod('onTouchEnd');\n    await sleep(50);\n    instance.getData();\n    expect(_.pick(instance.getData(), 'swipeX', 'swipedR', 'swipedL')).toEqual({\n      'swipeX': 120.01,\n      'swipedL': false,\n      'swipedR': false,\n    });\n    instance.callMethod('onItemTap', {\n      currentTarget: {\n        dataset: {\n          item: {\n            itemL: leftButtons[0],\n            idx: 0,\n          },\n        },\n      },\n    });\n    await sleep(100);\n    expect(onButtonTap).toBeCalledTimes(0);\n    expect(_.pick(instance.getData(), 'tapTypeL')).toEqual({\n      'tapTypeL': 'L-0',\n    });\n\n    instance.callMethod('onItemTap', {\n      currentTarget: {\n        dataset: {\n          item: {\n            itemL: leftButtons[0],\n            idx: 0,\n          },\n        },\n      },\n    });\n    await sleep(50);\n    expect(_.pick(instance.getData(), 'tapTypeL')).toEqual({\n      'tapTypeL': '',\n    });\n    expect(onButtonTap).toBeCalledTimes(1);\n  });\n\n  it('测试右滑, 滑动确认', async () => {\n    const rightButtons = [\n      {\n        text: 'l1',\n        width: 100,\n        confirmType: 'move' as const,\n      },\n    ];\n    const vibrateShort = vi.fn();\n    const { instance, onButtonTap } = createSwipeAction(\n      {\n        rightButtons,\n      },\n      handleQuery,\n      { vibrateShort }\n    );\n    await sleep(50);\n    handleQuery.mockImplementation((id) => {\n      return {\n        width: {\n          '.ant-swipe-action-movable-right-1': 100,\n        }[id],\n      };\n    });\n    instance.callMethod('onTouchStart');\n    await sleep(10);\n    instance.callMethod('onChange', { detail: { x: -100 } });\n    await sleep(200);\n    instance.callMethod('onChange', { detail: { x: -150 } });\n    instance.callMethod('onChangeEnd', { detail: { x: -150 } });\n    await sleep(50);\n    expect(vibrateShort).toBeCalledTimes(1);\n    expect(onButtonTap).toBeCalledTimes(1);\n  });\n\n  it('测试右滑, 滑动确认', async () => {\n    const leftButtons = [\n      {\n        text: 'l1',\n        width: 100,\n        confirmType: 'move' as const,\n      },\n    ];\n    const vibrateShort = vi.fn();\n    const { instance, onButtonTap } = createSwipeAction(\n      {\n        leftButtons,\n      },\n      handleQuery,\n      { vibrateShort }\n    );\n    await sleep(50);\n    handleQuery.mockImplementation((id) => {\n      return {\n        width: {\n          '.ant-swipe-action-movable-left-1': 100,\n        }[id],\n      };\n    });\n    instance.callMethod('onTouchStart');\n    await sleep(10);\n    instance.callMethod('onChange', { detail: { x: 50 } });\n    await sleep(200);\n    instance.callMethod('onChange', { detail: { x: 150 } });\n    await sleep(200);\n    instance.callMethod('onTouchCancel', { detail: { x: 150 } });\n    await sleep(50);\n    expect(vibrateShort).toBeCalledTimes(1);\n    expect(onButtonTap).toBeCalledTimes(1);\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Switch/__tests__/index.test.ts",
    "content": "import { expect, it, vi } from 'vitest';\nimport { getInstance, sleep } from 'tests/utils';\n\nfunction testSwitch(props) {\n  const my = {\n    canIUse() {\n      return true;\n    },\n  };\n  const instance = getInstance('Switch', props, my);\n  return instance;\n}\n\nit('受控模式', async () => {\n  const onChange = vi.fn();\n  const instance = testSwitch({\n    checked: false,\n    'data-instance-uid': '1',\n    onChange,\n  });\n\n  expect(instance.getData().mixin.value).toEqual(false);\n  instance.callMethod('onChange', {});\n  await sleep(20);\n  expect(onChange.mock.calls.length).toBe(1);\n  expect(onChange.mock.calls[0][0]).toBe(true);\n  expect(onChange.mock.calls[0][1]).toMatchInlineSnapshot(`\n    {\n      \"currentTarget\": {\n        \"dataset\": {\n          \"instance-uid\": \"1\",\n        },\n      },\n      \"target\": {\n        \"dataset\": {\n          \"instance-uid\": \"1\",\n        },\n        \"targetDataset\": {\n          \"instance-uid\": \"1\",\n        },\n      },\n    }\n  `);\n  expect(instance.getData().mixin.value).toEqual(false);\n  instance.setProps({ checked: true });\n  await sleep(20);\n\n  expect(instance.getData().mixin.value).toEqual(true);\n});\n\nit('非受控模式', async () => {\n  const onChange = vi.fn();\n  const instance = testSwitch({\n    onChange,\n  });\n\n  expect(instance.getData().mixin.value).toEqual(false);\n  instance.callMethod('onChange', {});\n  await sleep(20);\n  expect(onChange.mock.calls.length).toBe(1);\n\n  expect(instance.getData().mixin.value).toEqual(true);\n});\n\nit('测试默认值', async () => {\n  const onChange = vi.fn();\n  const instance = testSwitch({\n    onChange,\n    defaultChecked: true,\n  });\n\n  expect(instance.getData().mixin.value).toEqual(true);\n  instance.callMethod('onChange', {});\n  await sleep(20);\n  expect(onChange.mock.calls.length).toBe(1);\n\n  expect(instance.getData().mixin.value).toEqual(false);\n});\n\nit('测试构造函数', async () => {\n  const instance = testSwitch({});\n  expect(instance.getConfig()).toMatchFileSnapshot(\n    'snapshot/alipay_config.txt'\n  );\n});\n"
  },
  {
    "path": "tests/alipay/Switch/__tests__/snapshot/alipay_config.txt",
    "content": "{\n  \"data\": null,\n  \"methods\": {\n    \"onChange\": [Function],\n  },\n  \"mixins\": [\n    {\n      \"data\": {\n        \"mixin\": {\n          \"controlled\": false,\n          \"updated\": false,\n          \"value\": undefined,\n        },\n      },\n      \"deriveDataFromProps\": [Function],\n      \"didMount\": [Function],\n      \"didUpdate\": [Function],\n      \"methods\": {\n        \"getValue\": [Function],\n        \"init\": [Function],\n        \"isControlled\": [Function],\n        \"isEqualValue\": [Function],\n        \"update\": [Function],\n        \"updateControlled\": [Function],\n      },\n      \"onInit\": [Function],\n    },\n  ],\n  \"props\": {\n    \"checkedText\": \"\",\n    \"color\": \"\",\n    \"defaultChecked\": false,\n    \"disabled\": false,\n    \"loading\": false,\n    \"readonly\": false,\n    \"size\": \"medium\",\n    \"uncheckedText\": \"\",\n  },\n}\n"
  },
  {
    "path": "tests/alipay/TabBar/__tests__/index.test.ts",
    "content": "import { getInstance, sleep } from 'tests/utils';\nimport fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport { describe, it, expect, vi } from 'vitest';\n\ndescribe('tabBar onChange', () => {\n  const my = {\n    canIUse() {\n      return false;\n    },\n  };\n  const items = [\n    {\n      text: 'item1',\n    },\n    {\n      text: 'item2',\n    },\n    {\n      text: 'item3',\n    },\n  ];\n  it('tabBar onChange', async () => {\n    const onChange = vi.fn();\n    const instance = getInstance(\n      'TabBar',\n      {\n        onChange,\n        items,\n      },\n      my\n    );\n    instance.callMethod('onChange', fmtEvent({ 'data-index': 2 }));\n    expect(onChange).toBeCalledWith(2, fmtEvent({}));\n    await sleep(20);\n    expect(instance.getData().mixin.value).toBe(2);\n    instance.callMethod('onChange', fmtEvent({ 'data-index': 2 }));\n    expect(onChange).toBeCalledTimes(1);\n  });\n  it('tabBar controlled', () => {\n    const onChange = vi.fn();\n    const instance = getInstance(\n      'TabBar',\n      {\n        onChange,\n        items,\n        current: 0,\n      },\n      my\n    );\n    instance.callMethod('onChange', fmtEvent({ 'data-index': 2 }));\n    expect(onChange).toBeCalledWith(2, fmtEvent({}));\n    expect(instance.getData().mixin.value).toBe(0);\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Tabs/index.test.ts",
    "content": "import { getInstance, sleep } from 'tests/utils';\nimport { describe, it, expect, vi } from 'vitest';\nimport fmtEvent from 'compiled-alipay/_util/fmtEvent';\nimport { createSelectorQueryFactory } from 'tests/selector-query';\n\ndescribe('Tabs', () => {\n  let selectName = '';\n\n  const mockCreateSelectorQuery = {\n    select: vi.fn((selector) => {\n      selectName = selector;\n      return mockCreateSelectorQuery;\n    }),\n    boundingClientRect: vi.fn(() => mockCreateSelectorQuery),\n    exec: vi.fn((callback) => {\n      const rect = {\n        width: 300,\n        height: 300,\n        top: 300,\n        right: 300,\n        bottom: 300,\n        left: 300,\n      };\n      const results = {\n        '#ant-tabs-bar-scroll-view-1': {\n          width: 0,\n          height: 0,\n          top: 0,\n          bottom: 0,\n          left: 0,\n          right: 0,\n        },\n        '#ant-tabs-bar-item-1-2': {\n          width: 900,\n          height: 900,\n          top: 900,\n          right: 900,\n          bottom: 900,\n          left: 900,\n        },\n      };\n      const mockedResult = results[selectName] || rect;\n      callback([mockedResult]);\n    }),\n  };\n\n  const my = {\n    canIUse() {\n      return false;\n    },\n    createSelectorQuery: vi.fn(() => mockCreateSelectorQuery),\n  };\n  const items = [\n    {\n      title: 'tab 1',\n      content: 'tab 1 content',\n    },\n    {\n      title: 'tab 2',\n      content: 'tab 2 content',\n    },\n    {\n      title: 'tab 3',\n      content: 'tab 3 content',\n    },\n  ];\n\n  it('onChange', async () => {\n    const onChange = vi.fn();\n    const instance = getInstance(\n      'Tabs',\n      {\n        onChange,\n        items,\n      },\n      my\n    );\n\n    instance.callMethod('onChange', fmtEvent({ 'data-index': 2 }));\n    expect(onChange).toBeCalledWith(2, fmtEvent({}));\n    await sleep(20);\n    expect(instance.getData().mixin.value).toBe(2);\n    instance.callMethod('onChange', fmtEvent({ 'data-index': 2 }));\n    expect(onChange).toBeCalledTimes(1);\n  });\n\n  it('control mode', async () => {\n    const onChange = vi.fn();\n    const instance = getInstance(\n      'Tabs',\n      {\n        onChange,\n        items,\n        current: 1,\n      },\n      my\n    );\n\n    instance.callMethod('onChange', fmtEvent({ 'data-index': 2 }));\n    expect(onChange).toBeCalledWith(2, fmtEvent({}));\n    await sleep(20);\n    expect(instance.getData().mixin.value).toBe(1);\n  });\n\n  it('horizontal scroll', async () => {\n    const onChange = vi.fn();\n    const instance = getInstance(\n      'Tabs',\n      {\n        onChange,\n        items,\n      },\n      my\n    );\n\n    instance.callMethod('onScroll', { detail: { scrollLeft: 100 } });\n    await sleep(20);\n    expect(instance.getData().leftFade).toBe(true);\n    await sleep(100);\n    expect(instance.getData().scrollLeft).toBe(400);\n\n    instance.setProps({\n      items: [\n        ...items,\n        {\n          title: 'tab 4',\n          content: 'tab 4 content',\n        },\n      ],\n    });\n    await sleep(20);\n    expect(instance.getData().scrollLeft - 400 < 1).toBe(true);\n  });\n\n  it('vertical scroll', async () => {\n    const onChange = vi.fn();\n    const instance = getInstance(\n      'Tabs',\n      {\n        onChange,\n        items,\n        direction: 'vertical',\n      },\n      my\n    );\n\n    instance.callMethod('onScroll', { detail: { scrollTop: 100 } });\n    await sleep(100);\n    expect(instance.getData().scrollTop).toBe(400);\n\n    instance.setProps({\n      items: [\n        ...items,\n        {\n          title: 'tab 4',\n          content: 'tab 4 content',\n        },\n      ],\n    });\n    await sleep(20);\n    expect(instance.getData().scrollTop - 400 < 1).toBe(true);\n  });\n\n  it('scroll', async () => {\n    const onChange = vi.fn();\n    const instance = getInstance(\n      'Tabs',\n      {\n        onChange,\n        items,\n      },\n      {\n        ...my,\n        createSelectorQuery: createSelectorQueryFactory(() => {\n          return null;\n        }),\n      }\n    );\n\n    instance.callMethod('onScroll', { detail: { scrollTop: 100 } });\n    await sleep(200);\n    // 如果正常运行，就说明没有问题\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Toast/index.spec.ts",
    "content": "import { getInstance, sleep } from 'tests/utils';\nimport { describe, expect, it, vi } from 'vitest';\nimport { IToastProps } from '../../../src/Toast/props';\n\nconst createToast = (options: Partial<IToastProps>) => {\n  const my = {\n    canIUse() {\n      return true;\n    },\n  };\n  const onClose = vi.fn();\n  const instance = getInstance(\n    'Toast',\n    {\n      onClose,\n      ...options,\n    },\n    my\n  );\n  return {\n    instance,\n    onClose,\n  };\n};\n\ndescribe('test toast', () => {\n  it('默认 close', () => {\n    const { instance } = createToast({});\n    expect(instance.getData().show).toBe(false);\n  });\n\n  it('测试修改 duration', async () => {\n    const { instance, onClose } = createToast({\n      duration: 100,\n      visible: true,\n    });\n    expect(instance.getData().show).toBe(true);\n    await sleep(200);\n    expect(instance.getData().show).toBe(false);\n    expect(onClose).toBeCalled();\n  });\n\n  it('duration 为 0 时一直显示', async () => {\n    const { instance } = createToast({\n      duration: 0,\n      visible: true,\n    });\n    await sleep(200);\n    expect(instance.getData().show).toBe(true);\n  });\n\n  it('maskCloseable 为 false', async () => {\n    const { instance } = createToast({\n      duration: 0,\n      visible: true,\n    });\n    await instance.callMethod('handleClickMask');\n    await sleep(10);\n    expect(instance.getData().show).toBe(true);\n  });\n\n  it('maskCloseable 为 true', async () => {\n    const { instance, onClose } = createToast({\n      duration: 0,\n      visible: true,\n      showMask: true,\n      maskCloseable: true,\n    });\n    await instance.callMethod('handleClickMask');\n    await sleep(10);\n    expect(instance.getData().show).toBe(false);\n    expect(onClose).toBeCalled();\n  });\n\n  it('测试 Toast', async () => {\n    const { instance, onClose } = createToast({\n      duration: 100,\n    });\n\n    instance.setProps({\n      visible: true,\n    });\n    expect(instance.getData().show).toBe(true);\n    await sleep(300);\n    expect(instance.getData().show).toBe(false);\n    expect(onClose).toBeCalledTimes(1);\n    instance.setProps({\n      visible: false,\n    });\n    expect(onClose).toBeCalledTimes(1);\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Typography/index.spec.ts",
    "content": "import { getInstance, sleep } from 'tests/utils';\nimport { describe, expect, it, vi } from 'vitest';\nimport { ITypographyProps } from '../../../src/Typography/props';\n\nconst createTypography = (options: Partial<ITypographyProps>) => {\n  const my = {\n    canIUse() {\n      return true;\n    },\n    env: {\n      platform: 'iOS',\n    },\n  };\n  const instance = getInstance(\n    'Typography',\n    {\n      ...options,\n    },\n    my\n  );\n  return {\n    instance,\n  };\n};\n\ndescribe('typography', () => {\n  it('typography config', () => {\n    const { instance } = createTypography({});\n    const { data, props } = instance.getConfig();\n    expect({ data, props }).toMatchFileSnapshot(\n      'snapshot/typography_alipay_config.txt'\n    );\n  });\n\n  it('test tap', async () => {\n    const onTap = vi.fn();\n    const catchTap = vi.fn();\n    const onDisabledTap = vi.fn();\n    const { instance } = createTypography({\n      onTap,\n      catchTap,\n      onDisabledTap,\n    });\n\n    await instance.callMethod('onTap');\n    await instance.callMethod('catchTap');\n    await sleep(10);\n\n    expect(catchTap).toBeCalledTimes(1);\n    expect(onTap).toBeCalledTimes(1);\n    expect(onDisabledTap).toBeCalledTimes(0);\n  });\n\n  it('disabled 为 true', async () => {\n    const onTap = vi.fn();\n    const catchTap = vi.fn();\n    const onDisabledTap = vi.fn();\n    const { instance } = createTypography({\n      disabled: true,\n      onTap,\n      catchTap,\n      onDisabledTap,\n    });\n\n    await instance.callMethod('onTap');\n    await sleep(10);\n\n    expect(catchTap).toBeCalledTimes(0);\n    expect(onTap).toBeCalledTimes(0);\n    expect(onDisabledTap).toBeCalledTimes(1);\n  });\n});\n"
  },
  {
    "path": "tests/alipay/Typography/snapshot/typography_alipay_config.txt",
    "content": "{\n  \"data\": {\n    \"phonemodel\": \"\",\n  },\n  \"props\": {\n    \"activeClassName\": \"\",\n    \"className\": \"\",\n    \"disabled\": false,\n    \"fontWeight\": \"normal\",\n    \"icon\": \"\",\n    \"iconPosition\": \"right\",\n    \"lineThrough\": false,\n    \"selectable\": false,\n    \"style\": \"\",\n    \"text\": \"\",\n    \"underline\": false,\n  },\n}\n"
  },
  {
    "path": "tests/alipay/_util/__tests__/compareVersion.spec.ts",
    "content": "import { expect, it } from 'vitest';\nimport { compareVersion } from 'compiled-alipay/_util/compareVersion';\n\nit('test compareVersion', () => {\n  expect(compareVersion('1.0.0', '2.9.9')).toBe(-1);\n  expect(compareVersion('1.0.0', '1.0.1')).toBe(-1);\n  expect(compareVersion('1.0.0', '1.1.0')).toBe(-1);\n  expect(compareVersion('1.0.0', '1.1')).toBe(-1);\n\n  expect(compareVersion('2.9.9', '1.0.0')).toBe(1);\n\n  expect(compareVersion('1.0.0', '1.0.0')).toBe(0);\n});\n"
  },
  {
    "path": "tests/selector-query.spec.ts",
    "content": "import { expect, it } from 'vitest';\nimport { SelectorQuery } from './selector-query';\n\nit('测试 SelectorQuery', async () => {\n  const selector = SelectorQuery.create((select, index) => {\n    return { select, index };\n  });\n\n  selector\n    .select('b')\n    .boundingClientRect()\n    .exec((res) => {\n      expect(res).toMatchInlineSnapshot(`\n        [\n          {\n            \"index\": 0,\n            \"select\": \"b\",\n          },\n        ]\n      `);\n    });\n});\n"
  },
  {
    "path": "tests/selector-query.ts",
    "content": "export type SelectorQueryCommand =\n  | {\n      type: 'boundingClientRect';\n    }\n  | {\n      type: 'select';\n      selector: string;\n    };\n\nexport type MockSelect = (selector: string, index: number) => any;\n\nexport class SelectorQuery {\n  get commands(): SelectorQueryCommand[] {\n    return this._commands;\n  }\n  private constructor(\n    private _commands: SelectorQueryCommand[],\n    public readonly data: MockSelect\n  ) {}\n\n  select(selector) {\n    return SelectorQuery.extends(this, {\n      type: 'select',\n      selector,\n    });\n  }\n  boundingClientRect() {\n    return SelectorQuery.extends(this, {\n      type: 'boundingClientRect',\n    });\n  }\n\n  exec(callback) {\n    (async () => {\n      const result = [];\n      const index = new Map<string, number>();\n      let selector: string | null = null;\n      for (const command of this.commands) {\n        switch (command.type) {\n          case 'boundingClientRect': {\n            if (selector === null) {\n              throw new Error(\n                `createSelectorQuery().boundingClientRect() must be called after createSelectQuery().select()`\n              );\n            }\n            const currentIndex = index.get(selector) || 0;\n            result.push((await this.data(selector, currentIndex)) ?? null);\n            selector = null;\n            index.set(selector, currentIndex + 1);\n            break;\n          }\n          case 'select': {\n            if (selector !== null) {\n              throw new Error(\n                `createSelectorQuery().select(${selector}).select(${command.selector}) is not supported.`\n              );\n            }\n            selector = command.selector;\n            break;\n          }\n          default:\n            break;\n        }\n      }\n      callback(result);\n    })();\n  }\n\n  static extends(selector: SelectorQuery, command: SelectorQueryCommand) {\n    const newCommands = selector.commands.concat(command);\n    return new SelectorQuery(newCommands, selector.data);\n  }\n  static create(data: MockSelect) {\n    return new SelectorQuery([], data);\n  }\n}\n\nexport const createSelectorQueryFactory = (data?: MockSelect) => {\n  const defaultMock = () => {\n    return null;\n  };\n  return () => {\n    return SelectorQuery.create(data || defaultMock);\n  };\n};\n"
  },
  {
    "path": "tests/setup.ts",
    "content": "import { afterAll, vi } from 'vitest';\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n//@ts-ignore\nglobalThis.jest = vi;\n\nglobalThis.componentCoverage = [];\n\nafterAll(() => {\n  globalThis.componentCoverage?.map((o) => {\n    globalThis['__VITEST_COVERAGE__'] = Object.assign(\n      globalThis['__VITEST_COVERAGE__'] ?? {},\n      o['__ANTD_COVERAGE__']\n    );\n  });\n});\n"
  },
  {
    "path": "tests/utils.ts",
    "content": "import esbuild from 'esbuild';\nimport fs from 'fs';\n// @ts-ignore\nimport { createInstrumenter } from 'istanbul-lib-instrument';\nimport os from 'os';\nimport path from 'path';\nimport shallowequal from 'shallowequal';\nimport vm from 'vm';\nimport { SelectorQuery } from './selector-query';\n\ninterface Instance {\n  $id: number;\n  props: Record<string, any>;\n  data: Record<string, any>;\n  methods: Record<string, (this: Instance, ...args: any) => void>;\n  createSelectorQuery: () => SelectorQuery;\n  setData: (\n    data: Record<string, any>,\n    callback?: (this: Instance) => void\n  ) => void;\n  mixins?: Record<string, (this: Instance, ...args: any) => void>[];\n  onInit?: (this: Instance) => void;\n  deriveDataFromProps?: (\n    this: Instance,\n    nextProps: Record<string, any>\n  ) => void;\n  didUpdate?: (\n    this: Instance,\n    prevProps: Record<string, any>,\n    prevData: Record<string, any>\n  ) => void;\n  didMount?: (this: Instance) => void;\n  didUnmount?: (this: Instance) => void;\n}\n\nexport interface TestInstance {\n  ref<T>(): T;\n  componentInstance(): Instance;\n  getData<T = Record<string, any>>(): T;\n  setProps: (props: Record<string, any>) => void;\n  callMethod: (name: string, ...args: any) => any;\n  unMount: () => void;\n  getConfig(): Record<string, any>;\n}\n\nexport function createInstance(\n  config: Instance,\n  props: Record<string, any>,\n  my: any,\n  instanceApi?: any\n) {\n  const component2 =\n    typeof my !== 'undefined' &&\n    typeof (my as any).canIUse === 'function' &&\n    (my as any).canIUse('component2');\n  const onInit = [];\n  const didMount = [];\n  const didUpdate = [];\n  const didUnmount = [];\n  const deriveDataFromProps = [];\n\n  const instance: Instance = {\n    ...(instanceApi ? instanceApi : {}),\n    $id: 1,\n    ...config,\n    ...config.methods,\n    props: {\n      ...config.props,\n      ...props,\n    },\n    data: {\n      ...(typeof config.data === 'function' ? config.data() : config.data),\n    },\n    methods: {\n      ...config.methods,\n    },\n    setData(data: Record<string, any>, callback: (this: Instance) => void) {\n      if (shallowequal(data, instance.data)) {\n        return;\n      }\n      const prevData = {\n        ...instance.data,\n      };\n      Object.assign(instance.data, data);\n      const prevProps = instance.props;\n      if (component2) {\n        deriveDataFromProps.forEach((item) =>\n          item.call(instance, instance.props)\n        );\n      }\n      didUpdate.forEach((item) => item.call(instance, prevProps, prevData));\n      callback && callback.call(instance);\n    },\n  };\n\n  if (instance.mixins) {\n    instance.mixins.forEach((item) => {\n      Object.assign(instance, item.methods);\n      Object.assign(instance.methods, item.methods);\n      if (item.onInit) {\n        onInit.push(item.onInit);\n      }\n      if (item.deriveDataFromProps) {\n        deriveDataFromProps.push(item.deriveDataFromProps);\n      }\n      if (item.didMount) {\n        didMount.push(item.didMount);\n      }\n      if (item.didUpdate) {\n        didUpdate.push(item.didUpdate);\n      }\n      if (item.didUnmount) {\n        didUnmount.push(item.didUnmount);\n      }\n      if (item.data) {\n        instance.data = {\n          ...item.data,\n          ...instance.data,\n        };\n      }\n    });\n  }\n\n  if (instance.onInit) {\n    onInit.push(instance.onInit);\n  }\n  if (instance.deriveDataFromProps) {\n    deriveDataFromProps.push(instance.deriveDataFromProps);\n  }\n  if (instance.didUpdate) {\n    didUpdate.push(instance.didUpdate);\n  }\n  if (instance.didMount) {\n    didMount.push(instance.didMount);\n  }\n  if (instance.didUnmount) {\n    didUnmount.push(instance.didUnmount);\n  }\n\n  if (component2) {\n    onInit.forEach((item) => item.call(instance));\n    deriveDataFromProps.forEach((item) => item.call(instance, instance.props));\n  }\n  didMount.forEach((item) => item.call(instance));\n\n  return {\n    componentInstance() {\n      return instance;\n    },\n    ref() {\n      const refFunc = (instance as any).ref;\n      if (typeof refFunc === 'function') {\n        return refFunc.call(instance);\n      }\n      const ref = Object.keys(instance.methods).reduce((acc: any, key) => {\n        acc[key] = (...args) => instance.methods[key].call(instance, ...args);\n        return acc;\n      }, {});\n\n      return ref;\n    },\n    getData() {\n      return JSON.parse(JSON.stringify(instance.data));\n    },\n    getConfig() {\n      return config;\n    },\n    setProps(props: Record<string, any>) {\n      if (shallowequal(props, instance.props)) {\n        return;\n      }\n      if (component2) {\n        deriveDataFromProps.forEach((item) =>\n          item.call(instance, {\n            ...instance.props,\n            ...props,\n          })\n        );\n      }\n      const prevProps = {\n        ...instance.props,\n      };\n      const prevData = instance.data;\n      Object.assign(instance.props, props);\n      didUpdate.forEach((item) => item.call(instance, prevProps, prevData));\n    },\n    callMethod(name: string, ...args: any) {\n      return instance.methods[name].call(instance, ...args);\n    },\n    unMount() {\n      didUnmount.forEach((item) => item.call(instance));\n    },\n  };\n}\n\nfunction component2Patch(originalMy?: Record<string, any>) {\n  if (typeof originalMy !== 'undefined') {\n    const originalCanIUse = originalMy.canIUse;\n    originalMy.canIUse = function (name: string) {\n      if (name === 'component2') {\n        return true;\n      }\n      return originalCanIUse(name);\n    };\n    return originalMy;\n  }\n  return {\n    canIUse() {\n      return true;\n    },\n  };\n}\n\nfunction getInstance(\n  name: string,\n  props: Record<string, any>,\n  api?: Record<string, any>,\n  instanceApi?: Record<string, any>\n): TestInstance {\n  const sourceCodePath = path.isAbsolute(name)\n    ? name\n    : path.join(__dirname, `../compiled/alipay/src/${name}/index.ts`);\n  const { path: expectFile, code } = compileCode(sourceCodePath);\n  const script = new vm.Script(code, {\n    filename: expectFile,\n  });\n  let result;\n  const cov = {};\n  const context = vm.createContext({\n    my: component2Patch(api),\n    console,\n    COV: cov,\n    require,\n    setTimeout,\n    clearTimeout,\n    Component: (obj) => {\n      result = createInstance(obj, props, component2Patch(api), instanceApi);\n    },\n    updateResult: (res) => {\n      result = res;\n    },\n  });\n\n  globalThis.componentCoverage.push(cov);\n  script.runInContext(context);\n  return result;\n}\n\nexport function runInMiniprogram<T>(\n  filePath: string,\n  api?: Record<string, any>\n): T {\n  const { path: expectFile, code } = compileCode(filePath);\n  const script = new vm.Script(code, {\n    filename: expectFile,\n  });\n  let result;\n  const cov = {};\n  const context = vm.createContext({\n    my: component2Patch(api),\n    console,\n    COV: cov,\n    require,\n    setTimeout,\n    updateResult: (res) => {\n      result = res;\n    },\n  });\n\n  globalThis.componentCoverage.push(cov);\n  script.runInContext(context);\n  return result;\n}\n\ninterface CompileResult {\n  code: string;\n  path: string;\n  map: string;\n}\n\nconst buildCache = new Map<string, CompileResult>();\n\n// 编译打包代码，新增缓存\nfunction compileCode(source: string): CompileResult {\n  const expectFile = path.join(\n    os.tmpdir(),\n    Math.random().toString(36),\n    'out.js'\n  );\n  const expectFileSourcemap = expectFile + '.map';\n  const cache = buildCache.get(source);\n  if (cache) {\n    // 需要把产物里的路径改成新的路径，否则会有覆盖率计算错误的问题\n    const code = cache.code.replace(new RegExp(cache.path, 'g'), expectFile);\n    fs.mkdirSync(path.dirname(expectFile), { recursive: true });\n    return {\n      code,\n      // 仍然使用原来的路径，否则在 vm 运行时，如果报错，会找不到 sourcemap\n      path: cache.path,\n      map: cache.map,\n    };\n  }\n  esbuild.buildSync({\n    entryPoints: [source],\n    bundle: true,\n    outfile: expectFile,\n    sourcemap: true,\n    external: ['fast-deep-equal'],\n  });\n  const instrumenter = createInstrumenter({\n    produceSourceMap: true,\n    autoWrap: false,\n    esModules: true,\n    compact: false,\n    coverageVariable: '__ANTD_COVERAGE__',\n    coverageGlobalScope: 'COV',\n    coverageGlobalScopeFunc: false,\n  });\n  const sourceCode = fs.readFileSync(expectFile, 'utf-8');\n  const code = instrumenter.instrumentSync(\n    sourceCode,\n    expectFile,\n    JSON.parse(fs.readFileSync(expectFileSourcemap, 'utf8'))\n  );\n  const map = JSON.stringify(instrumenter.lastSourceMap());\n\n  fs.writeFileSync(expectFile, code);\n  fs.writeFileSync(expectFileSourcemap, map);\n  buildCache.set(source, {\n    path: expectFile,\n    code,\n    map,\n  });\n  return { code: code, path: expectFile, map };\n}\n\nexport { getInstance };\n\nexport function sleep(_time, ciNotSleepMore?: boolean) {\n  let time = _time;\n  if (os.platform() === 'linux' && !ciNotSleepMore) {\n    time = time * 2;\n  }\n  return new Promise<void>((resolve) => {\n    setTimeout(resolve, time);\n  });\n}\n\nexport async function callMethod(instance, name, value) {\n  instance.callMethod(name, value);\n  await sleep(30);\n}\n\nexport function wrapValue(value: string) {\n  return {\n    detail: {\n      value,\n    },\n  };\n}\n"
  },
  {
    "path": "tsconfig.alipay.demo.json",
    "content": "{\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"target\": \"ES2019\",\n    \"importHelpers\": false\n  }\n}\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES5\",\n    \"module\": \"ES6\",\n    \"skipLibCheck\": true,\n    \"esModuleInterop\": true,\n    \"moduleResolution\": \"node\",\n    \"importHelpers\": true,\n    \"declaration\": true,\n    \"rootDir\": \"./\",\n    \"noImplicitThis\": false,\n    \"jsx\": \"preserve\",\n    \"types\": [\"@mini-types/alipay\", \"node\"],\n    \"paths\": {\n      \"tests/*\": [\"./tests/*\"],\n      \"compiled-alipay/*\": [\"./compiled/alipay/src/*\"],\n      \"tsxml\": [\"./src/tsxml/index.tsx\"]\n    }\n  },\n  \"include\": [\n    \"src/**/*\",\n    \"copilot/**/*\",\n    \"./typings/**/*\",\n    \"demo/**/*\",\n    \"copilot-demo/**/*\",\n    \"tests/**/*\",\n    \"demo/wechat.d.ts\",\n    \"typings.d.ts\",\n  ],\n  \"exclude\": [\"node_modules\", \"tests/**/*\"]\n}\n"
  },
  {
    "path": "tsconfig.wechat.demo.json",
    "content": "{\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"target\": \"ES2019\",\n    \"importHelpers\": false\n  }\n}\n"
  },
  {
    "path": "tsconfig.wechat.json",
    "content": "{\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"importHelpers\": false\n  }\n}\n"
  },
  {
    "path": "typings/wechat.d.ts",
    "content": "declare const wx: any;\ndeclare const Behavior;\n"
  },
  {
    "path": "typings.d.ts",
    "content": "declare module '*.css';\ndeclare module '*.less';\ndeclare const ac: any;\n"
  },
  {
    "path": "vite.config.ts",
    "content": "// vite.config.ts\nimport { defineConfig } from 'vitest/config';\n\nexport default defineConfig({\n  resolve: {\n    alias: {\n      tests: new URL('tests', import.meta.url).pathname,\n      'compiled-alipay': new URL('./compiled/alipay/src', import.meta.url)\n        .pathname,\n    },\n  },\n  test: {\n    watch: true,\n    globals: true,\n    setupFiles: ['./tests/setup.ts'],\n    coverage: {\n      all: false,\n      provider: 'istanbul',\n    },\n  },\n});\n"
  }
]