Bläddra i källkod

fix: cdn资源本地加载

lvkun996 2 år sedan
förälder
incheckning
538db9e8e4

+ 539 - 0
font/demo.css

@@ -0,0 +1,539 @@
+/* Logo 字体 */
+@font-face {
+  font-family: "iconfont logo";
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
+}
+
+.logo {
+  font-family: "iconfont logo";
+  font-size: 160px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+/* tabs */
+.nav-tabs {
+  position: relative;
+}
+
+.nav-tabs .nav-more {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  height: 42px;
+  line-height: 42px;
+  color: #666;
+}
+
+#tabs {
+  border-bottom: 1px solid #eee;
+}
+
+#tabs li {
+  cursor: pointer;
+  width: 100px;
+  height: 40px;
+  line-height: 40px;
+  text-align: center;
+  font-size: 16px;
+  border-bottom: 2px solid transparent;
+  position: relative;
+  z-index: 1;
+  margin-bottom: -1px;
+  color: #666;
+}
+
+
+#tabs .active {
+  border-bottom-color: #f00;
+  color: #222;
+}
+
+.tab-container .content {
+  display: none;
+}
+
+/* 页面布局 */
+.main {
+  padding: 30px 100px;
+  width: 960px;
+  margin: 0 auto;
+}
+
+.main .logo {
+  color: #333;
+  text-align: left;
+  margin-bottom: 30px;
+  line-height: 1;
+  height: 110px;
+  margin-top: -50px;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.main .logo a {
+  font-size: 160px;
+  color: #333;
+}
+
+.helps {
+  margin-top: 40px;
+}
+
+.helps pre {
+  padding: 20px;
+  margin: 10px 0;
+  border: solid 1px #e7e1cd;
+  background-color: #fffdef;
+  overflow: auto;
+}
+
+.icon_lists {
+  width: 100% !important;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.icon_lists li {
+  width: 100px;
+  margin-bottom: 10px;
+  margin-right: 20px;
+  text-align: center;
+  list-style: none !important;
+  cursor: default;
+}
+
+.icon_lists li .code-name {
+  line-height: 1.2;
+}
+
+.icon_lists .icon {
+  display: block;
+  height: 100px;
+  line-height: 100px;
+  font-size: 42px;
+  margin: 10px auto;
+  color: #333;
+  -webkit-transition: font-size 0.25s linear, width 0.25s linear;
+  -moz-transition: font-size 0.25s linear, width 0.25s linear;
+  transition: font-size 0.25s linear, width 0.25s linear;
+}
+
+.icon_lists .icon:hover {
+  font-size: 100px;
+}
+
+.icon_lists .svg-icon {
+  /* 通过设置 font-size 来改变图标大小 */
+  width: 1em;
+  /* 图标和文字相邻时,垂直对齐 */
+  vertical-align: -0.15em;
+  /* 通过设置 color 来改变 SVG 的颜色/fill */
+  fill: currentColor;
+  /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
+      normalize.css 中也包含这行 */
+  overflow: hidden;
+}
+
+.icon_lists li .name,
+.icon_lists li .code-name {
+  color: #666;
+}
+
+/* markdown 样式 */
+.markdown {
+  color: #666;
+  font-size: 14px;
+  line-height: 1.8;
+}
+
+.highlight {
+  line-height: 1.5;
+}
+
+.markdown img {
+  vertical-align: middle;
+  max-width: 100%;
+}
+
+.markdown h1 {
+  color: #404040;
+  font-weight: 500;
+  line-height: 40px;
+  margin-bottom: 24px;
+}
+
+.markdown h2,
+.markdown h3,
+.markdown h4,
+.markdown h5,
+.markdown h6 {
+  color: #404040;
+  margin: 1.6em 0 0.6em 0;
+  font-weight: 500;
+  clear: both;
+}
+
+.markdown h1 {
+  font-size: 28px;
+}
+
+.markdown h2 {
+  font-size: 22px;
+}
+
+.markdown h3 {
+  font-size: 16px;
+}
+
+.markdown h4 {
+  font-size: 14px;
+}
+
+.markdown h5 {
+  font-size: 12px;
+}
+
+.markdown h6 {
+  font-size: 12px;
+}
+
+.markdown hr {
+  height: 1px;
+  border: 0;
+  background: #e9e9e9;
+  margin: 16px 0;
+  clear: both;
+}
+
+.markdown p {
+  margin: 1em 0;
+}
+
+.markdown>p,
+.markdown>blockquote,
+.markdown>.highlight,
+.markdown>ol,
+.markdown>ul {
+  width: 80%;
+}
+
+.markdown ul>li {
+  list-style: circle;
+}
+
+.markdown>ul li,
+.markdown blockquote ul>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown>ul li p,
+.markdown>ol li p {
+  margin: 0.6em 0;
+}
+
+.markdown ol>li {
+  list-style: decimal;
+}
+
+.markdown>ol li,
+.markdown blockquote ol>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown code {
+  margin: 0 3px;
+  padding: 0 5px;
+  background: #eee;
+  border-radius: 3px;
+}
+
+.markdown strong,
+.markdown b {
+  font-weight: 600;
+}
+
+.markdown>table {
+  border-collapse: collapse;
+  border-spacing: 0px;
+  empty-cells: show;
+  border: 1px solid #e9e9e9;
+  width: 95%;
+  margin-bottom: 24px;
+}
+
+.markdown>table th {
+  white-space: nowrap;
+  color: #333;
+  font-weight: 600;
+}
+
+.markdown>table th,
+.markdown>table td {
+  border: 1px solid #e9e9e9;
+  padding: 8px 16px;
+  text-align: left;
+}
+
+.markdown>table th {
+  background: #F7F7F7;
+}
+
+.markdown blockquote {
+  font-size: 90%;
+  color: #999;
+  border-left: 4px solid #e9e9e9;
+  padding-left: 0.8em;
+  margin: 1em 0;
+}
+
+.markdown blockquote p {
+  margin: 0;
+}
+
+.markdown .anchor {
+  opacity: 0;
+  transition: opacity 0.3s ease;
+  margin-left: 8px;
+}
+
+.markdown .waiting {
+  color: #ccc;
+}
+
+.markdown h1:hover .anchor,
+.markdown h2:hover .anchor,
+.markdown h3:hover .anchor,
+.markdown h4:hover .anchor,
+.markdown h5:hover .anchor,
+.markdown h6:hover .anchor {
+  opacity: 1;
+  display: inline-block;
+}
+
+.markdown>br,
+.markdown>p>br {
+  clear: both;
+}
+
+
+.hljs {
+  display: block;
+  background: white;
+  padding: 0.5em;
+  color: #333333;
+  overflow-x: auto;
+}
+
+.hljs-comment,
+.hljs-meta {
+  color: #969896;
+}
+
+.hljs-string,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-strong,
+.hljs-emphasis,
+.hljs-quote {
+  color: #df5000;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+  color: #a71d5d;
+}
+
+.hljs-literal,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-attribute {
+  color: #0086b3;
+}
+
+.hljs-section,
+.hljs-name {
+  color: #63a35c;
+}
+
+.hljs-tag {
+  color: #333333;
+}
+
+.hljs-title,
+.hljs-attr,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo {
+  color: #795da3;
+}
+
+.hljs-addition {
+  color: #55a532;
+  background-color: #eaffea;
+}
+
+.hljs-deletion {
+  color: #bd2c00;
+  background-color: #ffecec;
+}
+
+.hljs-link {
+  text-decoration: underline;
+}
+
+/* 代码高亮 */
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+  color: black;
+  background: none;
+  text-shadow: 0 1px white;
+  font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+  text-align: left;
+  white-space: pre;
+  word-spacing: normal;
+  word-break: normal;
+  word-wrap: normal;
+  line-height: 1.5;
+
+  -moz-tab-size: 4;
+  -o-tab-size: 4;
+  tab-size: 4;
+
+  -webkit-hyphens: none;
+  -moz-hyphens: none;
+  -ms-hyphens: none;
+  hyphens: none;
+}
+
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+@media print {
+
+  code[class*="language-"],
+  pre[class*="language-"] {
+    text-shadow: none;
+  }
+}
+
+/* Code blocks */
+pre[class*="language-"] {
+  padding: 1em;
+  margin: .5em 0;
+  overflow: auto;
+}
+
+:not(pre)>code[class*="language-"],
+pre[class*="language-"] {
+  background: #f5f2f0;
+}
+
+/* Inline code */
+:not(pre)>code[class*="language-"] {
+  padding: .1em;
+  border-radius: .3em;
+  white-space: normal;
+}
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+  color: slategray;
+}
+
+.token.punctuation {
+  color: #999;
+}
+
+.namespace {
+  opacity: .7;
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+  color: #905;
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+  color: #690;
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+  color: #9a6e3a;
+  background: hsla(0, 0%, 100%, .5);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+  color: #07a;
+}
+
+.token.function,
+.token.class-name {
+  color: #DD4A68;
+}
+
+.token.regex,
+.token.important,
+.token.variable {
+  color: #e90;
+}
+
+.token.important,
+.token.bold {
+  font-weight: bold;
+}
+
+.token.italic {
+  font-style: italic;
+}
+
+.token.entity {
+  cursor: help;
+}

+ 234 - 0
font/demo_index.html

@@ -0,0 +1,234 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8"/>
+  <title>iconfont Demo</title>
+  <link rel="shortcut icon" href="//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg" type="image/x-icon"/>
+  <link rel="icon" type="image/svg+xml" href="//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg"/>
+  <link rel="stylesheet" href="https://g.alicdn.com/thx/cube/1.3.2/cube.min.css">
+  <link rel="stylesheet" href="demo.css">
+  <link rel="stylesheet" href="iconfont.css">
+  <script src="iconfont.js"></script>
+  <!-- jQuery -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js"></script>
+  <!-- 代码高亮 -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js"></script>
+  <style>
+    .main .logo {
+      margin-top: 0;
+      height: auto;
+    }
+
+    .main .logo a {
+      display: flex;
+      align-items: center;
+    }
+
+    .main .logo .sub-title {
+      margin-left: 0.5em;
+      font-size: 22px;
+      color: #fff;
+      background: linear-gradient(-45deg, #3967FF, #B500FE);
+      -webkit-background-clip: text;
+      -webkit-text-fill-color: transparent;
+    }
+  </style>
+</head>
+<body>
+  <div class="main">
+    <h1 class="logo"><a href="https://www.iconfont.cn/" title="iconfont 首页" target="_blank">
+      <img width="200" src="https://img.alicdn.com/imgextra/i3/O1CN01Mn65HV1FfSEzR6DKv_!!6000000000514-55-tps-228-59.svg">
+      
+    </a></h1>
+    <div class="nav-tabs">
+      <ul id="tabs" class="dib-box">
+        <li class="dib active"><span>Unicode</span></li>
+        <li class="dib"><span>Font class</span></li>
+        <li class="dib"><span>Symbol</span></li>
+      </ul>
+      
+      <a href="https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=4137940" target="_blank" class="nav-more">查看项目</a>
+      
+    </div>
+    <div class="tab-container">
+      <div class="content unicode" style="display: block;">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe653;</span>
+                <div class="name">moon</div>
+                <div class="code-name">&amp;#xe653;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe697;</span>
+                <div class="name">sun</div>
+                <div class="code-name">&amp;#xe697;</div>
+              </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="unicode-">Unicode 引用</h2>
+          <hr>
+
+          <p>Unicode 是字体在网页端最原始的应用方式,特点是:</p>
+          <ul>
+            <li>支持按字体的方式去动态调整图标大小,颜色等等。</li>
+            <li>默认情况下不支持多色,直接添加多色图标会自动去色。</li>
+          </ul>
+          <blockquote>
+            <p>注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)</p>
+          </blockquote>
+          <p>Unicode 使用步骤如下:</p>
+          <h3 id="-font-face">第一步:拷贝项目下面生成的 <code>@font-face</code></h3>
+<pre><code class="language-css"
+>@font-face {
+  font-family: 'iconfont';
+  src: url('iconfont.woff2?t=1712477310360') format('woff2'),
+       url('iconfont.woff?t=1712477310360') format('woff'),
+       url('iconfont.ttf?t=1712477310360') format('truetype');
+}
+</code></pre>
+          <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
+<pre><code class="language-css"
+>.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3>
+<pre>
+<code class="language-html"
+>&lt;span class="iconfont"&gt;&amp;#x33;&lt;/span&gt;
+</code></pre>
+          <blockquote>
+            <p>"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+          </blockquote>
+          </div>
+      </div>
+      <div class="content font-class">
+        <ul class="icon_lists dib-box">
+          
+          <li class="dib">
+            <span class="icon iconfont icon-moon"></span>
+            <div class="name">
+              moon
+            </div>
+            <div class="code-name">.icon-moon
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-sun"></span>
+            <div class="name">
+              sun
+            </div>
+            <div class="code-name">.icon-sun
+            </div>
+          </li>
+          
+        </ul>
+        <div class="article markdown">
+        <h2 id="font-class-">font-class 引用</h2>
+        <hr>
+
+        <p>font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。</p>
+        <p>与 Unicode 使用方式相比,具有如下特点:</p>
+        <ul>
+          <li>相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。</li>
+          <li>因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。</li>
+        </ul>
+        <p>使用步骤如下:</p>
+        <h3 id="-fontclass-">第一步:引入项目下面生成的 fontclass 代码:</h3>
+<pre><code class="language-html">&lt;link rel="stylesheet" href="./iconfont.css"&gt;
+</code></pre>
+        <h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;span class="iconfont icon-xxx"&gt;&lt;/span&gt;
+</code></pre>
+        <blockquote>
+          <p>"
+            iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+        </blockquote>
+      </div>
+      </div>
+      <div class="content symbol">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-moon"></use>
+                </svg>
+                <div class="name">moon</div>
+                <div class="code-name">#icon-moon</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-sun"></use>
+                </svg>
+                <div class="name">sun</div>
+                <div class="code-name">#icon-sun</div>
+            </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="symbol-">Symbol 引用</h2>
+          <hr>
+
+          <p>这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇<a href="">文章</a>
+            这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:</p>
+          <ul>
+            <li>支持多色图标了,不再受单色限制。</li>
+            <li>通过一些技巧,支持像字体那样,通过 <code>font-size</code>, <code>color</code> 来调整样式。</li>
+            <li>兼容性较差,支持 IE9+,及现代浏览器。</li>
+            <li>浏览器渲染 SVG 的性能一般,还不如 png。</li>
+          </ul>
+          <p>使用步骤如下:</p>
+          <h3 id="-symbol-">第一步:引入项目下面生成的 symbol 代码:</h3>
+<pre><code class="language-html">&lt;script src="./iconfont.js"&gt;&lt;/script&gt;
+</code></pre>
+          <h3 id="-css-">第二步:加入通用 CSS 代码(引入一次就行):</h3>
+<pre><code class="language-html">&lt;style&gt;
+.icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+&lt;/style&gt;
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;svg class="icon" aria-hidden="true"&gt;
+  &lt;use xlink:href="#icon-xxx"&gt;&lt;/use&gt;
+&lt;/svg&gt;
+</code></pre>
+          </div>
+      </div>
+
+    </div>
+  </div>
+  <script>
+  $(document).ready(function () {
+      $('.tab-container .content:first').show()
+
+      $('#tabs li').click(function (e) {
+        var tabContent = $('.tab-container .content')
+        var index = $(this).index()
+
+        if ($(this).hasClass('active')) {
+          return
+        } else {
+          $('#tabs li').removeClass('active')
+          $(this).addClass('active')
+
+          tabContent.hide().eq(index).fadeIn()
+        }
+      })
+    })
+  </script>
+</body>
+</html>

+ 23 - 0
font/iconfont.css

@@ -0,0 +1,23 @@
+@font-face {
+  font-family: "iconfont"; /* Project id 4137940 */
+  src: url('iconfont.woff2?t=1712477310360') format('woff2'),
+       url('iconfont.woff?t=1712477310360') format('woff'),
+       url('iconfont.ttf?t=1712477310360') format('truetype');
+}
+
+.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-moon:before {
+  content: "\e653";
+}
+
+.icon-sun:before {
+  content: "\e697";
+}
+

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
font/iconfont.js


+ 23 - 0
font/iconfont.json

@@ -0,0 +1,23 @@
+{
+  "id": "4137940",
+  "name": "things-ui",
+  "font_family": "iconfont",
+  "css_prefix_text": "icon-",
+  "description": "",
+  "glyphs": [
+    {
+      "icon_id": "7715054",
+      "name": "moon",
+      "font_class": "moon",
+      "unicode": "e653",
+      "unicode_decimal": 58963
+    },
+    {
+      "icon_id": "27956203",
+      "name": "sun",
+      "font_class": "sun",
+      "unicode": "e697",
+      "unicode_decimal": 59031
+    }
+  ]
+}

BIN
font/iconfont.ttf


BIN
font/iconfont.woff


BIN
font/iconfont.woff2


+ 539 - 0
public/demo.css

@@ -0,0 +1,539 @@
+/* Logo 字体 */
+@font-face {
+  font-family: "iconfont logo";
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
+}
+
+.logo {
+  font-family: "iconfont logo";
+  font-size: 160px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+/* tabs */
+.nav-tabs {
+  position: relative;
+}
+
+.nav-tabs .nav-more {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  height: 42px;
+  line-height: 42px;
+  color: #666;
+}
+
+#tabs {
+  border-bottom: 1px solid #eee;
+}
+
+#tabs li {
+  cursor: pointer;
+  width: 100px;
+  height: 40px;
+  line-height: 40px;
+  text-align: center;
+  font-size: 16px;
+  border-bottom: 2px solid transparent;
+  position: relative;
+  z-index: 1;
+  margin-bottom: -1px;
+  color: #666;
+}
+
+
+#tabs .active {
+  border-bottom-color: #f00;
+  color: #222;
+}
+
+.tab-container .content {
+  display: none;
+}
+
+/* 页面布局 */
+.main {
+  padding: 30px 100px;
+  width: 960px;
+  margin: 0 auto;
+}
+
+.main .logo {
+  color: #333;
+  text-align: left;
+  margin-bottom: 30px;
+  line-height: 1;
+  height: 110px;
+  margin-top: -50px;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.main .logo a {
+  font-size: 160px;
+  color: #333;
+}
+
+.helps {
+  margin-top: 40px;
+}
+
+.helps pre {
+  padding: 20px;
+  margin: 10px 0;
+  border: solid 1px #e7e1cd;
+  background-color: #fffdef;
+  overflow: auto;
+}
+
+.icon_lists {
+  width: 100% !important;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.icon_lists li {
+  width: 100px;
+  margin-bottom: 10px;
+  margin-right: 20px;
+  text-align: center;
+  list-style: none !important;
+  cursor: default;
+}
+
+.icon_lists li .code-name {
+  line-height: 1.2;
+}
+
+.icon_lists .icon {
+  display: block;
+  height: 100px;
+  line-height: 100px;
+  font-size: 42px;
+  margin: 10px auto;
+  color: #333;
+  -webkit-transition: font-size 0.25s linear, width 0.25s linear;
+  -moz-transition: font-size 0.25s linear, width 0.25s linear;
+  transition: font-size 0.25s linear, width 0.25s linear;
+}
+
+.icon_lists .icon:hover {
+  font-size: 100px;
+}
+
+.icon_lists .svg-icon {
+  /* 通过设置 font-size 来改变图标大小 */
+  width: 1em;
+  /* 图标和文字相邻时,垂直对齐 */
+  vertical-align: -0.15em;
+  /* 通过设置 color 来改变 SVG 的颜色/fill */
+  fill: currentColor;
+  /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
+      normalize.css 中也包含这行 */
+  overflow: hidden;
+}
+
+.icon_lists li .name,
+.icon_lists li .code-name {
+  color: #666;
+}
+
+/* markdown 样式 */
+.markdown {
+  color: #666;
+  font-size: 14px;
+  line-height: 1.8;
+}
+
+.highlight {
+  line-height: 1.5;
+}
+
+.markdown img {
+  vertical-align: middle;
+  max-width: 100%;
+}
+
+.markdown h1 {
+  color: #404040;
+  font-weight: 500;
+  line-height: 40px;
+  margin-bottom: 24px;
+}
+
+.markdown h2,
+.markdown h3,
+.markdown h4,
+.markdown h5,
+.markdown h6 {
+  color: #404040;
+  margin: 1.6em 0 0.6em 0;
+  font-weight: 500;
+  clear: both;
+}
+
+.markdown h1 {
+  font-size: 28px;
+}
+
+.markdown h2 {
+  font-size: 22px;
+}
+
+.markdown h3 {
+  font-size: 16px;
+}
+
+.markdown h4 {
+  font-size: 14px;
+}
+
+.markdown h5 {
+  font-size: 12px;
+}
+
+.markdown h6 {
+  font-size: 12px;
+}
+
+.markdown hr {
+  height: 1px;
+  border: 0;
+  background: #e9e9e9;
+  margin: 16px 0;
+  clear: both;
+}
+
+.markdown p {
+  margin: 1em 0;
+}
+
+.markdown>p,
+.markdown>blockquote,
+.markdown>.highlight,
+.markdown>ol,
+.markdown>ul {
+  width: 80%;
+}
+
+.markdown ul>li {
+  list-style: circle;
+}
+
+.markdown>ul li,
+.markdown blockquote ul>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown>ul li p,
+.markdown>ol li p {
+  margin: 0.6em 0;
+}
+
+.markdown ol>li {
+  list-style: decimal;
+}
+
+.markdown>ol li,
+.markdown blockquote ol>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown code {
+  margin: 0 3px;
+  padding: 0 5px;
+  background: #eee;
+  border-radius: 3px;
+}
+
+.markdown strong,
+.markdown b {
+  font-weight: 600;
+}
+
+.markdown>table {
+  border-collapse: collapse;
+  border-spacing: 0px;
+  empty-cells: show;
+  border: 1px solid #e9e9e9;
+  width: 95%;
+  margin-bottom: 24px;
+}
+
+.markdown>table th {
+  white-space: nowrap;
+  color: #333;
+  font-weight: 600;
+}
+
+.markdown>table th,
+.markdown>table td {
+  border: 1px solid #e9e9e9;
+  padding: 8px 16px;
+  text-align: left;
+}
+
+.markdown>table th {
+  background: #F7F7F7;
+}
+
+.markdown blockquote {
+  font-size: 90%;
+  color: #999;
+  border-left: 4px solid #e9e9e9;
+  padding-left: 0.8em;
+  margin: 1em 0;
+}
+
+.markdown blockquote p {
+  margin: 0;
+}
+
+.markdown .anchor {
+  opacity: 0;
+  transition: opacity 0.3s ease;
+  margin-left: 8px;
+}
+
+.markdown .waiting {
+  color: #ccc;
+}
+
+.markdown h1:hover .anchor,
+.markdown h2:hover .anchor,
+.markdown h3:hover .anchor,
+.markdown h4:hover .anchor,
+.markdown h5:hover .anchor,
+.markdown h6:hover .anchor {
+  opacity: 1;
+  display: inline-block;
+}
+
+.markdown>br,
+.markdown>p>br {
+  clear: both;
+}
+
+
+.hljs {
+  display: block;
+  background: white;
+  padding: 0.5em;
+  color: #333333;
+  overflow-x: auto;
+}
+
+.hljs-comment,
+.hljs-meta {
+  color: #969896;
+}
+
+.hljs-string,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-strong,
+.hljs-emphasis,
+.hljs-quote {
+  color: #df5000;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+  color: #a71d5d;
+}
+
+.hljs-literal,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-attribute {
+  color: #0086b3;
+}
+
+.hljs-section,
+.hljs-name {
+  color: #63a35c;
+}
+
+.hljs-tag {
+  color: #333333;
+}
+
+.hljs-title,
+.hljs-attr,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo {
+  color: #795da3;
+}
+
+.hljs-addition {
+  color: #55a532;
+  background-color: #eaffea;
+}
+
+.hljs-deletion {
+  color: #bd2c00;
+  background-color: #ffecec;
+}
+
+.hljs-link {
+  text-decoration: underline;
+}
+
+/* 代码高亮 */
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+  color: black;
+  background: none;
+  text-shadow: 0 1px white;
+  font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+  text-align: left;
+  white-space: pre;
+  word-spacing: normal;
+  word-break: normal;
+  word-wrap: normal;
+  line-height: 1.5;
+
+  -moz-tab-size: 4;
+  -o-tab-size: 4;
+  tab-size: 4;
+
+  -webkit-hyphens: none;
+  -moz-hyphens: none;
+  -ms-hyphens: none;
+  hyphens: none;
+}
+
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+@media print {
+
+  code[class*="language-"],
+  pre[class*="language-"] {
+    text-shadow: none;
+  }
+}
+
+/* Code blocks */
+pre[class*="language-"] {
+  padding: 1em;
+  margin: .5em 0;
+  overflow: auto;
+}
+
+:not(pre)>code[class*="language-"],
+pre[class*="language-"] {
+  background: #f5f2f0;
+}
+
+/* Inline code */
+:not(pre)>code[class*="language-"] {
+  padding: .1em;
+  border-radius: .3em;
+  white-space: normal;
+}
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+  color: slategray;
+}
+
+.token.punctuation {
+  color: #999;
+}
+
+.namespace {
+  opacity: .7;
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+  color: #905;
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+  color: #690;
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+  color: #9a6e3a;
+  background: hsla(0, 0%, 100%, .5);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+  color: #07a;
+}
+
+.token.function,
+.token.class-name {
+  color: #DD4A68;
+}
+
+.token.regex,
+.token.important,
+.token.variable {
+  color: #e90;
+}
+
+.token.important,
+.token.bold {
+  font-weight: bold;
+}
+
+.token.italic {
+  font-style: italic;
+}
+
+.token.entity {
+  cursor: help;
+}

+ 234 - 0
public/demo_index.html

@@ -0,0 +1,234 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8"/>
+  <title>iconfont Demo</title>
+  <link rel="shortcut icon" href="//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg" type="image/x-icon"/>
+  <link rel="icon" type="image/svg+xml" href="//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg"/>
+  <link rel="stylesheet" href="https://g.alicdn.com/thx/cube/1.3.2/cube.min.css">
+  <link rel="stylesheet" href="demo.css">
+  <link rel="stylesheet" href="iconfont.css">
+  <script src="iconfont.js"></script>
+  <!-- jQuery -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js"></script>
+  <!-- 代码高亮 -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js"></script>
+  <style>
+    .main .logo {
+      margin-top: 0;
+      height: auto;
+    }
+
+    .main .logo a {
+      display: flex;
+      align-items: center;
+    }
+
+    .main .logo .sub-title {
+      margin-left: 0.5em;
+      font-size: 22px;
+      color: #fff;
+      background: linear-gradient(-45deg, #3967FF, #B500FE);
+      -webkit-background-clip: text;
+      -webkit-text-fill-color: transparent;
+    }
+  </style>
+</head>
+<body>
+  <div class="main">
+    <h1 class="logo"><a href="https://www.iconfont.cn/" title="iconfont 首页" target="_blank">
+      <img width="200" src="https://img.alicdn.com/imgextra/i3/O1CN01Mn65HV1FfSEzR6DKv_!!6000000000514-55-tps-228-59.svg">
+      
+    </a></h1>
+    <div class="nav-tabs">
+      <ul id="tabs" class="dib-box">
+        <li class="dib active"><span>Unicode</span></li>
+        <li class="dib"><span>Font class</span></li>
+        <li class="dib"><span>Symbol</span></li>
+      </ul>
+      
+      <a href="https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=4137940" target="_blank" class="nav-more">查看项目</a>
+      
+    </div>
+    <div class="tab-container">
+      <div class="content unicode" style="display: block;">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe653;</span>
+                <div class="name">moon</div>
+                <div class="code-name">&amp;#xe653;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe697;</span>
+                <div class="name">sun</div>
+                <div class="code-name">&amp;#xe697;</div>
+              </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="unicode-">Unicode 引用</h2>
+          <hr>
+
+          <p>Unicode 是字体在网页端最原始的应用方式,特点是:</p>
+          <ul>
+            <li>支持按字体的方式去动态调整图标大小,颜色等等。</li>
+            <li>默认情况下不支持多色,直接添加多色图标会自动去色。</li>
+          </ul>
+          <blockquote>
+            <p>注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)</p>
+          </blockquote>
+          <p>Unicode 使用步骤如下:</p>
+          <h3 id="-font-face">第一步:拷贝项目下面生成的 <code>@font-face</code></h3>
+<pre><code class="language-css"
+>@font-face {
+  font-family: 'iconfont';
+  src: url('iconfont.woff2?t=1712477310360') format('woff2'),
+       url('iconfont.woff?t=1712477310360') format('woff'),
+       url('iconfont.ttf?t=1712477310360') format('truetype');
+}
+</code></pre>
+          <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
+<pre><code class="language-css"
+>.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3>
+<pre>
+<code class="language-html"
+>&lt;span class="iconfont"&gt;&amp;#x33;&lt;/span&gt;
+</code></pre>
+          <blockquote>
+            <p>"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+          </blockquote>
+          </div>
+      </div>
+      <div class="content font-class">
+        <ul class="icon_lists dib-box">
+          
+          <li class="dib">
+            <span class="icon iconfont icon-moon"></span>
+            <div class="name">
+              moon
+            </div>
+            <div class="code-name">.icon-moon
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-sun"></span>
+            <div class="name">
+              sun
+            </div>
+            <div class="code-name">.icon-sun
+            </div>
+          </li>
+          
+        </ul>
+        <div class="article markdown">
+        <h2 id="font-class-">font-class 引用</h2>
+        <hr>
+
+        <p>font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。</p>
+        <p>与 Unicode 使用方式相比,具有如下特点:</p>
+        <ul>
+          <li>相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。</li>
+          <li>因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。</li>
+        </ul>
+        <p>使用步骤如下:</p>
+        <h3 id="-fontclass-">第一步:引入项目下面生成的 fontclass 代码:</h3>
+<pre><code class="language-html">&lt;link rel="stylesheet" href="./iconfont.css"&gt;
+</code></pre>
+        <h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;span class="iconfont icon-xxx"&gt;&lt;/span&gt;
+</code></pre>
+        <blockquote>
+          <p>"
+            iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+        </blockquote>
+      </div>
+      </div>
+      <div class="content symbol">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-moon"></use>
+                </svg>
+                <div class="name">moon</div>
+                <div class="code-name">#icon-moon</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-sun"></use>
+                </svg>
+                <div class="name">sun</div>
+                <div class="code-name">#icon-sun</div>
+            </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="symbol-">Symbol 引用</h2>
+          <hr>
+
+          <p>这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇<a href="">文章</a>
+            这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:</p>
+          <ul>
+            <li>支持多色图标了,不再受单色限制。</li>
+            <li>通过一些技巧,支持像字体那样,通过 <code>font-size</code>, <code>color</code> 来调整样式。</li>
+            <li>兼容性较差,支持 IE9+,及现代浏览器。</li>
+            <li>浏览器渲染 SVG 的性能一般,还不如 png。</li>
+          </ul>
+          <p>使用步骤如下:</p>
+          <h3 id="-symbol-">第一步:引入项目下面生成的 symbol 代码:</h3>
+<pre><code class="language-html">&lt;script src="./iconfont.js"&gt;&lt;/script&gt;
+</code></pre>
+          <h3 id="-css-">第二步:加入通用 CSS 代码(引入一次就行):</h3>
+<pre><code class="language-html">&lt;style&gt;
+.icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+&lt;/style&gt;
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;svg class="icon" aria-hidden="true"&gt;
+  &lt;use xlink:href="#icon-xxx"&gt;&lt;/use&gt;
+&lt;/svg&gt;
+</code></pre>
+          </div>
+      </div>
+
+    </div>
+  </div>
+  <script>
+  $(document).ready(function () {
+      $('.tab-container .content:first').show()
+
+      $('#tabs li').click(function (e) {
+        var tabContent = $('.tab-container .content')
+        var index = $(this).index()
+
+        if ($(this).hasClass('active')) {
+          return
+        } else {
+          $('#tabs li').removeClass('active')
+          $(this).addClass('active')
+
+          tabContent.hide().eq(index).fadeIn()
+        }
+      })
+    })
+  </script>
+</body>
+</html>

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 11 - 0
public/flv.js


+ 23 - 0
public/iconfont.css

@@ -0,0 +1,23 @@
+@font-face {
+  font-family: "iconfont"; /* Project id 4137940 */
+  src: url('iconfont.woff2?t=1712477310360') format('woff2'),
+       url('iconfont.woff?t=1712477310360') format('woff'),
+       url('iconfont.ttf?t=1712477310360') format('truetype');
+}
+
+.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-moon:before {
+  content: "\e653";
+}
+
+.icon-sun:before {
+  content: "\e697";
+}
+

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
public/iconfont.js


+ 23 - 0
public/iconfont.json

@@ -0,0 +1,23 @@
+{
+  "id": "4137940",
+  "name": "things-ui",
+  "font_family": "iconfont",
+  "css_prefix_text": "icon-",
+  "description": "",
+  "glyphs": [
+    {
+      "icon_id": "7715054",
+      "name": "moon",
+      "font_class": "moon",
+      "unicode": "e653",
+      "unicode_decimal": 58963
+    },
+    {
+      "icon_id": "27956203",
+      "name": "sun",
+      "font_class": "sun",
+      "unicode": "e697",
+      "unicode_decimal": 59031
+    }
+  ]
+}

BIN
public/iconfont.ttf


BIN
public/iconfont.woff


BIN
public/iconfont.woff2


+ 54 - 56
public/index.html

@@ -1,56 +1,54 @@
-<!DOCTYPE html>
-<html lang="">
-  <head>
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport" content="width=device-width,initial-scale=1.0">
-    <link rel="icon" href="./logo.ico">
-    <!-- <link rel="manifest" href="/manifest.json"> -->
-    <title>云联</title>
-    <style type="text/css">
-      .icon {
-         width: 24px; height: 24px;
-         vertical-align: -0.15em;
-         /* fill: red; */
-         overflow: hidden;
-         /* background-color: azure; */
-      }
-      #app {
-
-        /* width: 100vw;
-        height: 100vh;
-        display: flex;
-        justify-content: center;
-        align-items: center;
-        font: 120px 'Italiana', sans-serif;
-        text-transform: lowercase;
-        text-align: center; */
-      }
-  </style>
-  </head>
-  <body>
-
-    <noscript>
-      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
-    </noscript>
-
-    <div id="cloudlink-ui">
-    </div>
-
-    <script>
-
-      // if ('serviceWorker' in navigator && 'PushManager' in window) {
-      //   navigator.serviceWorker.register('/path/to/service-worker.js').then(function(registration) {
-      //     console.log('Service Worker 注册成功:', registration);
-      //   }).catch(function(error) {
-      //     console.error('Service Worker 注册失败:', error);
-      //   });
-      // }
-
-    </script>
-  </body>
-  <!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/flv.js/1.6.2/flv.min.js"></script>\ -->
-  <!-- <script src="https://cdn.bootcdn.net/ajax/libs/flv.js/1.6.2/flv.js"></script> -->
-  <script src="https://cdn.bootcdn.net/ajax/libs/flv.js/1.6.2/flv.min.js"></script>
-  <script src="//at.alicdn.com/t/c/font_4137940_203u8vgindc.js"></script>
-</html>
+<!DOCTYPE html>
+<html lang="">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <link rel="icon" href="./logo.ico">
+    <!-- <link rel="manifest" href="/manifest.json"> -->
+    <title>云联</title>
+    <style type="text/css">
+      .icon {
+         width: 24px; height: 24px;
+         vertical-align: -0.15em;
+         /* fill: red; */
+         overflow: hidden;
+         /* background-color: azure; */
+      }
+      #app {
+
+        /* width: 100vw;
+        height: 100vh;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        font: 120px 'Italiana', sans-serif;
+        text-transform: lowercase;
+        text-align: center; */
+      }
+  </style>
+  </head>
+  <body>
+
+    <noscript>
+      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
+    </noscript>
+
+    <div id="cloudlink-ui">
+    </div>
+
+    <script>
+
+      // if ('serviceWorker' in navigator && 'PushManager' in window) {
+      //   navigator.serviceWorker.register('/path/to/service-worker.js').then(function(registration) {
+      //     console.log('Service Worker 注册成功:', registration);
+      //   }).catch(function(error) {
+      //     console.error('Service Worker 注册失败:', error);
+      //   });
+      // }
+
+    </script>
+  </body>
+  <script src="./iconfont.js"></script>
+  <script src="./flv.js"></script>
+</html>

+ 243 - 243
src/components/MicroComponents/index.tsx

@@ -1,243 +1,243 @@
-import { PropType, defineComponent, ref } from 'vue'
-import { LoadingOutlined, ReloadOutlined, CopyTwoTone, EditOutlined } from '@ant-design/icons-vue'
-import { useCopy } from '@/hooks/dom'
-import { Input, Space, Button } from 'ant-design-vue'
-
-/* 此代码导出一个名为“ReloadIconTsx”的 Vue
-组件,该组件显示一个用于重新加载内容的图标。该组件有两个道具:`loading`(一个布尔值,指示内容当前是否正在加载)和`reload`(单击重新加载图标时调用的函数)。该组件使用 Vue
-中的“defineComponent”函数来定义其行为,并使用“@ant-design/icons-vue”库中的“LoadingOutlined”和“ReloadOutlined”图标来显示适当的图标。该组件还使用
-Ant Design Vue 库中的“a-tooltip”组件在用户将鼠标悬停在图标上时显示工具提示。 */
-
-export const ReloadIconTsx = defineComponent({
-  name: 'reload-icon-tsx',
-  props: {
-    loading: {
-      type: Boolean,
-      default: false
-    },
-    reload: {
-      type: Function,
-      default: () => {}
-    }
-  },
-  setup (props, context) {
-    return () => (
-      <a-tooltip
-        title="刷新"
-      >
-         { props.loading ? <LoadingOutlined /> : <ReloadOutlined onClick={() => props.reload()} /> }
-      </a-tooltip>
-    )
-  }
-})
-
-/**
- * 这是一个 TypeScript React 组件,用于呈现带有可自定义内容和操作插槽的警报。
- * @param props - 包含两个属性的对象:
- * @param context - `setup` 函数中的 `context`
- * 参数是一个对象,它提供对当前组件实例的属性和方法的访问。它包括“attrs”、“emit”、“slots”和“refs”等属性。在此特定代码中,“slots”属性用于访问
- * @returns 呈现具有两列的行的功能组件。第一列的内容由 valueSlot 槽确定,第二列的内容由 operaSlot
- * 槽确定。该组件还接受字符串类型的“value”属性和对象类型的“operaSlot”属性。
- */
-export const AlertTsx = defineComponent({
-  props: {
-    value: {
-      type: String,
-      default: ''
-    }
-  },
-  setup (props, context) {
-    const { slots } = context
-
-    return () => (
-      <a-row
-        justify='space-between'
-        align="middle"
-        style={{
-          backgroundColor: '#e6f7ff',
-          border: '1px solid #91d5ff',
-          minHeight: '40px',
-          padding: '0px 20px '
-        }}
-      >
-        <a-col>{ props.value ? props.value : slots.valueSlot!()}</a-col>
-        <a-col>{slots.operaSlot!()}</a-col>
-      </a-row>
-    )
-  }
-})
-
-/**
- * @description iconfont矢量库 使用的svg的格式 svg导入在public下的index.html里
- */
-export const IconTsx = defineComponent({
-  props: {
-    name: {
-      type: String,
-      required: true
-    }
-  },
-  setup (props, ctx) {
-    return () => (
-      <svg class="icon" aria-hidden="true" style={{ fill: '#fff' }} >
-        <use style={{ fill: '#fff' }} xlinkHref={`#icon-${props.name}`}></use>
-      </svg>
-    )
-  }
-})
-
-export const SelectTsx = defineComponent({
-  name: 'select-tsx',
-  props: {
-    modelValue: {
-      type: Object,
-      required: true,
-      default: () => ({})
-    },
-    request: {
-      type: Function,
-      default: () => {}
-    },
-    keys: {
-      type: Object as PropType<{key: string, name: string, value: string}>,
-      default: () => {}
-    },
-    styles: {
-      type: Object,
-      default: () => {}
-    }
-  },
-  emits: ['update:value'],
-  setup (props, context) {
-    const list = ref<{
-      name: string,
-      value: any,
-      key: string
-    }[]>([])
-
-    props.request().then((r: {
-      name: string,
-      value: any,
-      key: string
-    }[]) => {
-      list.value = r
-    })
-
-    const onInput = (value: string) => context.emit('update:value', value)
-
-    return () => (
-      <a-select style={{ width: '170px', ...props.styles }} value={props.modelValue} allowClear onChange={(value: string) => onInput(value)}>
-       {
-        list.value.map(item => <a-select-option key={item[props.keys.key]} value={item[props.keys.value]}>{item[props.keys.name]}</a-select-option>)
-       }
-      </a-select>
-    )
-  }
-})
-
-export const InputTsx = defineComponent({
-  name: 'input-tsx',
-  props: {
-    modelValue: {
-      type: String,
-      required: true,
-      default: ''
-    },
-    placeholder: {
-      type: String,
-      default: '输入点什么...'
-    },
-    mode: {
-      type: String as PropType<'normal' | 'edit'>,
-      default: 'normal'
-    },
-    value: {
-      type: String,
-      required: true,
-      default: ''
-    },
-    styles: {
-      type: Object,
-      default: () => {}
-    }
-  },
-  emits: ['update:value', 'submit'],
-  setup (props, ctx) {
-    console.log('props.modelValue:', props.value)
-
-    const editing = ref<boolean>(false)
-
-    const onInput = (value: string) => ctx.emit('update:value', value)
-
-    const submitUpdate = () => {
-      ctx.emit('submit')
-      editing.value = false
-    }
-
-    return () => (
-      <span>
-        {
-
-          props.mode === 'normal'
-            ? <Input style={{ minWidth: '170px', ...props.styles }} value={props.value} placeholder={props.placeholder} onChange={(e) => onInput(e.target.value!)} />
-            : <>
-              <Space>
-                {
-                  editing.value ? <Input style={{ minWidth: '170px' }} placeholder={props.placeholder} value={props.modelValue} onChange={(e) => onInput(e.target.value!)} /> : <div style={{ minWidth: '170px' }} >{props.modelValue}</div>
-                }
-                {
-                  editing.value ? <EditOutlined style={{ cursor: 'pointer' }} onClick={() => editing.value = !editing.value} /> : null
-                }
-
-              </Space>
-              {
-                editing.value
-                  ? <Space>
-                <Button type="primary" onClick={() => submitUpdate()}>确定</Button>
-                <Button onClick={() => editing.value = false}>取消</Button>
-              </Space>
-                  : null
-              }
-          </>
-        }
-
-      </span>
-
-    )
-  }
-})
-
-/**
- * @description 文字copy按钮
- */
-export const CopyTsx = defineComponent({
-  name: 'copy-tsx',
-  props: {
-    text: {
-      type: String,
-      required: true
-    }
-  },
-  emits: ['success'],
-  setup (props, ctx) {
-    if (!props.text) {
-      console.warn('缺少必备的参数 text')
-    }
-
-    const onCopy = () => {
-      useCopy(props.text)
-    }
-
-    return () => (
-      <a-tooltip
-        title='复制'
-      >
-        <CopyTwoTone style="font-size: 18px;" onClick={onCopy}/>
-      </a-tooltip>
-    )
-  }
-})
-
-/**
- *
- */
+import { PropType, defineComponent, ref } from 'vue'
+import { LoadingOutlined, ReloadOutlined, CopyTwoTone, EditOutlined } from '@ant-design/icons-vue'
+import { useCopy } from '@/hooks/dom'
+import { Input, Space, Button } from 'ant-design-vue'
+
+/* 此代码导出一个名为“ReloadIconTsx”的 Vue
+组件,该组件显示一个用于重新加载内容的图标。该组件有两个道具:`loading`(一个布尔值,指示内容当前是否正在加载)和`reload`(单击重新加载图标时调用的函数)。该组件使用 Vue
+中的“defineComponent”函数来定义其行为,并使用“@ant-design/icons-vue”库中的“LoadingOutlined”和“ReloadOutlined”图标来显示适当的图标。该组件还使用
+Ant Design Vue 库中的“a-tooltip”组件在用户将鼠标悬停在图标上时显示工具提示。 */
+
+export const ReloadIconTsx = defineComponent({
+  name: 'reload-icon-tsx',
+  props: {
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    reload: {
+      type: Function,
+      default: () => {}
+    }
+  },
+  setup (props, context) {
+    return () => (
+      <a-tooltip
+        title="刷新"
+      >
+         { props.loading ? <LoadingOutlined /> : <ReloadOutlined onClick={() => props.reload()} /> }
+      </a-tooltip>
+    )
+  }
+})
+
+/**
+ * 这是一个 TypeScript React 组件,用于呈现带有可自定义内容和操作插槽的警报。
+ * @param props - 包含两个属性的对象:
+ * @param context - `setup` 函数中的 `context`
+ * 参数是一个对象,它提供对当前组件实例的属性和方法的访问。它包括“attrs”、“emit”、“slots”和“refs”等属性。在此特定代码中,“slots”属性用于访问
+ * @returns 呈现具有两列的行的功能组件。第一列的内容由 valueSlot 槽确定,第二列的内容由 operaSlot
+ * 槽确定。该组件还接受字符串类型的“value”属性和对象类型的“operaSlot”属性。
+ */
+export const AlertTsx = defineComponent({
+  props: {
+    value: {
+      type: String,
+      default: ''
+    }
+  },
+  setup (props, context) {
+    const { slots } = context
+
+    return () => (
+      <a-row
+        justify='space-between'
+        align="middle"
+        style={{
+          backgroundColor: '#e6f7ff',
+          border: '1px solid #91d5ff',
+          minHeight: '40px',
+          padding: '0px 20px '
+        }}
+      >
+        <a-col>{ props.value ? props.value : slots.valueSlot!()}</a-col>
+        <a-col>{slots.operaSlot!()}</a-col>
+      </a-row>
+    )
+  }
+})
+
+/**
+ * @description iconfont矢量库 使用的svg的格式 svg导入在public下的index.html里
+ */
+export const IconTsx = defineComponent({
+  props: {
+    name: {
+      type: String,
+      required: true
+    }
+  },
+  setup (props, ctx) {
+    return () => (
+      <svg class="icon" aria-hidden="true" style={{ fill: '#fff' }} >
+        <use style={{ fill: '#fff' }} xlinkHref={`#icon-${props.name}`}></use>
+      </svg>
+    )
+  }
+})
+
+export const SelectTsx = defineComponent({
+  name: 'select-tsx',
+  props: {
+    modelValue: {
+      type: Object,
+      required: true,
+      default: () => ({})
+    },
+    request: {
+      type: Function,
+      default: () => {}
+    },
+    keys: {
+      type: Object as PropType<{key: string, name: string, value: string}>,
+      default: () => {}
+    },
+    styles: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  emits: ['update:value'],
+  setup (props, context) {
+    const list = ref<{
+      name: string,
+      value: any,
+      key: string
+    }[]>([])
+
+    props.request().then((r: {
+      name: string,
+      value: any,
+      key: string
+    }[]) => {
+      list.value = r
+    })
+
+    const onInput = (value: string) => context.emit('update:value', value)
+
+    return () => (
+      <a-select style={{ width: '170px', ...props.styles }} value={props.modelValue} allowClear onChange={(value: string) => onInput(value)}>
+       {
+        list.value.map(item => <a-select-option key={item[props.keys.key]} value={item[props.keys.value]}>{item[props.keys.name]}</a-select-option>)
+       }
+      </a-select>
+    )
+  }
+})
+
+export const InputTsx = defineComponent({
+  name: 'input-tsx',
+  props: {
+    modelValue: {
+      type: String,
+      required: true,
+      default: ''
+    },
+    placeholder: {
+      type: String,
+      default: '输入点什么...'
+    },
+    mode: {
+      type: String as PropType<'normal' | 'edit'>,
+      default: 'normal'
+    },
+    value: {
+      type: String,
+      required: true,
+      default: ''
+    },
+    styles: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  emits: ['update:value', 'submit'],
+  setup (props, ctx) {
+    console.log('props.modelValue:', props.value)
+
+    const editing = ref<boolean>(false)
+
+    const onInput = (value: string) => ctx.emit('update:value', value)
+
+    const submitUpdate = () => {
+      ctx.emit('submit')
+      editing.value = false
+    }
+
+    return () => (
+      <span>
+        {
+
+          props.mode === 'normal'
+            ? <Input style={{ minWidth: '170px', ...props.styles }} value={props.value} placeholder={props.placeholder} onChange={(e) => onInput(e.target.value!)} />
+            : <>
+              <Space>
+                {
+                  editing.value ? <Input style={{ minWidth: '170px' }} placeholder={props.placeholder} value={props.modelValue} onChange={(e) => onInput(e.target.value!)} /> : <div style={{ minWidth: '170px' }} >{props.modelValue}</div>
+                }
+                {
+                  editing.value ? <EditOutlined style={{ cursor: 'pointer' }} onClick={() => editing.value = !editing.value} /> : null
+                }
+
+              </Space>
+              {
+                editing.value
+                  ? <Space>
+                <Button type="primary" onClick={() => submitUpdate()}>确定</Button>
+                <Button onClick={() => editing.value = false}>取消</Button>
+              </Space>
+                  : null
+              }
+          </>
+        }
+
+      </span>
+
+    )
+  }
+})
+
+/**
+ * @description 文字copy按钮
+ */
+export const CopyTsx = defineComponent({
+  name: 'copy-tsx',
+  props: {
+    text: {
+      type: String,
+      required: true
+    }
+  },
+  emits: ['success'],
+  setup (props, ctx) {
+    if (!props.text) {
+      console.warn('缺少必备的参数 text')
+    }
+
+    const onCopy = () => {
+      useCopy(props.text)
+    }
+
+    return () => (
+      <a-tooltip
+        title='复制'
+      >
+        <CopyTwoTone style="font-size: 18px;" onClick={onCopy}/>
+      </a-tooltip>
+    )
+  }
+})
+
+/**
+ *
+ */

+ 136 - 136
src/layout/navbar.vue

@@ -1,136 +1,136 @@
-<template>
-   <a-layout-header class="header-mobile" v-if="isMobile" :style="{backgroundColor: headerBgColor}">
-      <a-row>
-        <a-col :span="6" >
-          <search />
-        </a-col>
-        <a-col :span="6" class="df-center">
-          <a-button type="text" @click="changeTheme" > <IconTsx :name="iconName" /></a-button>
-        </a-col>
-        <a-col :span="6" class="df-center"  >
-          <user />
-        </a-col>
-      </a-row>
-  </a-layout-header>
-  <a-layout-header class="header-pc" v-else :style="{backgroundColor: headerBgColor, height: '54px'}">
-      <a-row style="width: 100%;height: 54px;" justify="start" >
-        <a-col :span="15" style="height: 54px;" >
-        <a-menu
-          mode="horizontal"
-          :style="{ lineHeight: '54px', border: 'none' , marginLeft: '-20px'}"
-          :selectedKeys="selectedKeys"
-        >
-          <a-menu-item
-            v-for="route in appRouter.$state.router.navbar.route"
-            :key="route.path"
-            @click="changeRouter(route)"
-          >
-            {{route.name}}
-          </a-menu-item>
-        </a-menu>
-        </a-col>
-        <a-col :span="9" style="height: 54px;" >
-          <a-row :gutter="[8, 8]" justify="end"  style="height: 54px;" >
-            <a-col  class="df-center" style="height: 54px;" >
-              <search />
-            </a-col>
-            <a-col class="df-center"  style="height: 54px;">
-              <a-tooltip placement="bottom">
-                <template #title>
-                  <span>添加网页到桌面</span>
-                </template>
-                <a-button type="text" @click="addDeskToApp" >  <DesktopOutlined  style="font-size: 22px;" /></a-button>
-              </a-tooltip>
-            </a-col>
-            <a-col class="df-center" style="height: 54px;">
-              <a-button type="text" @click="changeTheme" > <IconTsx :name="iconName" /></a-button>
-            </a-col>
-            <a-col class="df-center"  style="height: 54px;">
-              <user v-if="!AppConfig.userInfoHidden" />
-            </a-col>
-          </a-row>
-        </a-col>
-      </a-row>
-  </a-layout-header>
-</template>
-
-<script lang="ts" setup >
-import { computed, ref } from 'vue'
-import { useAppRouter } from '@/store/router'
-import user from './user.vue'
-import { useRoute, useRouter } from 'vue-router'
-import { IconTsx } from '@/components/MicroComponents/index'
-import { useDesignStore } from '@/store'
-import { useDeviceType } from '@/hooks'
-import search from './components/search/index.vue'
-import { DesktopOutlined } from '@ant-design/icons-vue'
-import { message } from 'ant-design-vue'
-import AppConfig from 'AppConfig'
-import { useIsMicro } from '@/hooks/effect'
-
-const route = useRoute()
-
-const router = useRouter()
-
-const appRouter = useAppRouter()
-
-const selectedKeys = ref<string[]>([route.matched[useIsMicro() ? 1 : 0].path])
-
-const designStore = useDesignStore()
-
-const iconName = computed(() => designStore.theme ? 'sun' : 'moon')
-
-const headerBgColor = computed(() => designStore.theme ? '#141414' : '#fff')
-
-const isMobile = useDeviceType()
-
-const changeTheme = () => designStore.changeModeltheme()
-
-const changeRouter = (route: ROUTER.RoutesProps) => {
-  selectedKeys.value = [route.path]
-  appRouter.changeNavbarRoute(route)
-}
-
-const addDeskToApp = () => {
-  if ('beforeinstallprompt' in window) {
-    // 在支持 PWA 安装的浏览器中,手动触发安装提示
-    window.beforeinstallprompt.prompt()
-    window.beforeinstallprompt.userChoice.then((choiceResult) => {
-      if (choiceResult.outcome === 'accepted') {
-        console.log('用户已接受安装提示')
-      } else {
-        console.log('用户已拒绝安装提示')
-      }
-    })
-  } else {
-    message.error('该浏览器暂不支持此操作')
-  }
-}
-
-</script>
-
-<style lang="less" scoped >
-
-.header-mobile {
-  padding: 0 24px;
-}
-
-.header-pc {
-  width: 100%;
-  position: relative;
-  height: 54px;
-  z-index: 20;
-  // box-shadow: 0 1px 4px rgba(0,21,41,.12);
-
-  overflow: hidden;
-  padding: 0;
-  padding-right: 32px;
-}
-
-.df-center {
-  display: flex;
-  justify-content: center;
-  align-items: center;
-}
-
-</style>
+<template>
+   <a-layout-header class="header-mobile" v-if="isMobile" :style="{backgroundColor: headerBgColor}">
+      <a-row>
+        <a-col :span="6" >
+          <search />
+        </a-col>
+        <a-col :span="6" class="df-center">
+          <a-button type="text" @click="changeTheme" > <IconTsx :name="iconName" /></a-button>
+        </a-col>
+        <a-col :span="6" class="df-center"  >
+          <user />
+        </a-col>
+      </a-row>
+  </a-layout-header>
+  <a-layout-header class="header-pc" v-else :style="{backgroundColor: headerBgColor, height: '54px'}">
+      <a-row style="width: 100%;height: 54px;" justify="start" >
+        <a-col :span="15" style="height: 54px;" >
+        <a-menu
+          mode="horizontal"
+          :style="{ lineHeight: '54px', border: 'none' , marginLeft: '-20px'}"
+          :selectedKeys="selectedKeys"
+        >
+          <a-menu-item
+            v-for="route in appRouter.$state.router.navbar.route"
+            :key="route.path"
+            @click="changeRouter(route)"
+          >
+            {{route.name}}
+          </a-menu-item>
+        </a-menu>
+        </a-col>
+        <a-col :span="9" style="height: 54px;" >
+          <a-row :gutter="[8, 8]" justify="end"  style="height: 54px;" >
+            <a-col  class="df-center" style="height: 54px;" >
+              <search />
+            </a-col>
+            <a-col class="df-center"  style="height: 54px;">
+              <a-tooltip placement="bottom">
+                <template #title>
+                  <span>添加网页到桌面</span>
+                </template>
+                <a-button type="text" @click="addDeskToApp" >  <DesktopOutlined  style="font-size: 22px;" /></a-button>
+              </a-tooltip>
+            </a-col>
+            <a-col class="df-center" style="height: 54px;">
+              <a-button type="text" @click="changeTheme" > <IconTsx :name="iconName" /></a-button>
+            </a-col>
+            <a-col class="df-center"  style="height: 54px;">
+              <user v-if="!AppConfig.userInfoHidden" />
+            </a-col>
+          </a-row>
+        </a-col>
+      </a-row>
+  </a-layout-header>
+</template>
+
+<script lang="ts" setup >
+import { computed, ref } from 'vue'
+import { useAppRouter } from '@/store/router'
+import user from './user.vue'
+import { useRoute, useRouter } from 'vue-router'
+import { IconTsx } from '@/components/MicroComponents/index'
+import { useDesignStore } from '@/store'
+import { useDeviceType } from '@/hooks'
+import search from './components/search/index.vue'
+import { DesktopOutlined } from '@ant-design/icons-vue'
+import { message } from 'ant-design-vue'
+import AppConfig from 'AppConfig'
+import { useIsMicro } from '@/hooks/effect'
+
+const route = useRoute()
+
+const router = useRouter()
+
+const appRouter = useAppRouter()
+
+const selectedKeys = ref<string[]>([route.matched[useIsMicro() ? 1 : 0].path])
+
+const designStore = useDesignStore()
+
+const iconName = computed(() => designStore.theme ? 'sun' : 'moon')
+
+const headerBgColor = computed(() => designStore.theme ? '#141414' : '#fff')
+
+const isMobile = useDeviceType()
+
+const changeTheme = () => designStore.changeModeltheme()
+
+const changeRouter = (route: ROUTER.RoutesProps) => {
+  selectedKeys.value = [route.path]
+  appRouter.changeNavbarRoute(route)
+}
+
+const addDeskToApp = () => {
+  if ('beforeinstallprompt' in window) {
+    // 在支持 PWA 安装的浏览器中,手动触发安装提示
+    window.beforeinstallprompt.prompt()
+    window.beforeinstallprompt.userChoice.then((choiceResult) => {
+      if (choiceResult.outcome === 'accepted') {
+        console.log('用户已接受安装提示')
+      } else {
+        console.log('用户已拒绝安装提示')
+      }
+    })
+  } else {
+    message.error('该浏览器暂不支持此操作')
+  }
+}
+
+</script>
+
+<style lang="less" scoped >
+
+.header-mobile {
+  padding: 0 24px;
+}
+
+.header-pc {
+  width: 100%;
+  position: relative;
+  height: 54px;
+  z-index: 20;
+  // box-shadow: 0 1px 4px rgba(0,21,41,.12);
+
+  overflow: hidden;
+  padding: 0;
+  padding-right: 32px;
+}
+
+.df-center {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+
+</style>

Vissa filer visades inte eftersom för många filer har ändrats