baai-components 1.0.1 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Header/src/config/menus.d.ts +1 -1
- package/dist/components/Header/src/hooks/useHeaderMenu.d.ts +1 -1
- package/dist/index.esm.js +55 -37
- package/dist/index.esm.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +1 -1
|
@@ -26,4 +26,4 @@ export interface NavMenuItem {
|
|
|
26
26
|
* Replace the mock body with a real HTTP call when the backend is ready:
|
|
27
27
|
* return request({ method: 'get', url: '/nav/menus', params: { lang } }).then(res => res.data);
|
|
28
28
|
*/
|
|
29
|
-
export declare const getNavMenuApi: (lang: LocaleTypeEnum) => NavMenuItem[];
|
|
29
|
+
export declare const getNavMenuApi: (lang: LocaleTypeEnum, isMainApp?: boolean) => NavMenuItem[];
|
|
@@ -4,7 +4,7 @@ import { type NavMenuItem, type NavChildItem } from '../config/menus';
|
|
|
4
4
|
import { NavigationFailure } from 'vue-router';
|
|
5
5
|
export declare function useHeaderMenu(currentLocale: Ref<LocaleTypeEnum>, push: (path: any) => Promise<NavigationFailure | void | undefined>,
|
|
6
6
|
/** String shown when user clicks an unavailable item (e.g. t('projects.unopentip')) */
|
|
7
|
-
unopenTip: Ref<string> | string): {
|
|
7
|
+
unopenTip: Ref<string> | string, innerMain?: boolean): {
|
|
8
8
|
menuList: Ref<{
|
|
9
9
|
id: string;
|
|
10
10
|
label: string;
|
package/dist/index.esm.js
CHANGED
|
@@ -460,6 +460,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
460
460
|
onLogout: { type: Function }
|
|
461
461
|
},
|
|
462
462
|
setup(__props) {
|
|
463
|
+
const dropdownVisible = ref(false);
|
|
464
|
+
const handleDropdownVisibleChange = (visible) => {
|
|
465
|
+
dropdownVisible.value = visible;
|
|
466
|
+
};
|
|
463
467
|
const props = __props;
|
|
464
468
|
provide(
|
|
465
469
|
NAV_TEXTS_KEY,
|
|
@@ -473,13 +477,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
473
477
|
class: normalizeClass(["w-full header-wrapper h-64px pl-120 pr-120 py-19 backdrop-blur-[14px] flex items-center justify-between text-#000 fixed left-0 top-0 z-99 bg-transparent overflow-x-scroll", {
|
|
474
478
|
"theme-white": _ctx.isWhiteTheme,
|
|
475
479
|
"theme-scrolled": _ctx.isScrolledTheme,
|
|
476
|
-
"!b-0": unref(matchPath)(_ctx.routePath, "/CommunityMembers")
|
|
480
|
+
"!b-0": unref(matchPath)(_ctx.routePath, "/CommunityMembers"),
|
|
481
|
+
dropdownVisible: dropdownVisible.value
|
|
477
482
|
}])
|
|
478
483
|
}, [
|
|
479
484
|
createElementVNode("div", _hoisted_1, [
|
|
480
485
|
createElementVNode("img", {
|
|
481
486
|
class: "logo",
|
|
482
|
-
src: _ctx.isWhiteTheme ? "https://flagos.ks3-cn-beijing.ksyuncs.com/images/logo.svg" : "https://flagos.ks3-cn-beijing.ksyuncs.com/images/logo-black.svg",
|
|
487
|
+
src: _ctx.isWhiteTheme || dropdownVisible.value ? "https://flagos.ks3-cn-beijing.ksyuncs.com/images/logo.svg" : "https://flagos.ks3-cn-beijing.ksyuncs.com/images/logo-black.svg",
|
|
483
488
|
onClick: _cache[0] || (_cache[0] = (...args) => _ctx.onLogoClick && _ctx.onLogoClick(...args))
|
|
484
489
|
}, null, 8, _hoisted_2),
|
|
485
490
|
createElementVNode("div", _hoisted_3, [
|
|
@@ -491,7 +496,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
491
496
|
menu.dropdownList && menu.id === "learn" ? (openBlock(), createBlock(_component_el_dropdown, {
|
|
492
497
|
key: 0,
|
|
493
498
|
"popper-class": "custom-dropdown-new",
|
|
494
|
-
"show-arrow": false
|
|
499
|
+
"show-arrow": false,
|
|
500
|
+
onVisibleChange: handleDropdownVisibleChange
|
|
495
501
|
}, {
|
|
496
502
|
dropdown: withCtx(() => [
|
|
497
503
|
createVNode(_component_el_dropdown_menu, { class: "flex-row" }, {
|
|
@@ -520,7 +526,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
520
526
|
}, 1024)) : menu.dropdownList && menu.id === "tools" ? (openBlock(), createBlock(_component_el_dropdown, {
|
|
521
527
|
key: 1,
|
|
522
528
|
"popper-class": "custom-dropdown-new",
|
|
523
|
-
"show-arrow": false
|
|
529
|
+
"show-arrow": false,
|
|
530
|
+
onVisibleChange: handleDropdownVisibleChange
|
|
524
531
|
}, {
|
|
525
532
|
dropdown: withCtx(() => [
|
|
526
533
|
createVNode(_component_el_dropdown_menu, null, {
|
|
@@ -548,7 +555,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
548
555
|
}, 1024)) : menu.dropdownGroups && menu.id === "projects" ? (openBlock(), createBlock(_component_el_dropdown, {
|
|
549
556
|
key: 2,
|
|
550
557
|
"popper-class": "custom-dropdown-new",
|
|
551
|
-
"show-arrow": false
|
|
558
|
+
"show-arrow": false,
|
|
559
|
+
onVisibleChange: handleDropdownVisibleChange
|
|
552
560
|
}, {
|
|
553
561
|
dropdown: withCtx(() => [
|
|
554
562
|
createVNode(_component_el_dropdown_menu, { class: "flex gap-20 el-dropdown-menu_out" }, {
|
|
@@ -594,7 +602,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
594
602
|
class: normalizeClass(["flex-center", _ctx.isWhiteTheme ? "text-#ffffff" : "text-#262642"])
|
|
595
603
|
}, [
|
|
596
604
|
createVNode(_sfc_main$1, {
|
|
597
|
-
isWhiteTheme: _ctx.isWhiteTheme,
|
|
605
|
+
isWhiteTheme: _ctx.isWhiteTheme || dropdownVisible.value,
|
|
598
606
|
"current-locale": _ctx.currentLocale,
|
|
599
607
|
onChangeLanguage: _ctx.onChangeLanguage
|
|
600
608
|
}, null, 8, ["isWhiteTheme", "current-locale", "onChangeLanguage"]),
|
|
@@ -604,7 +612,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
604
612
|
})) : createCommentVNode("", true),
|
|
605
613
|
_ctx.userName ? (openBlock(), createBlock(Avatar, {
|
|
606
614
|
key: 1,
|
|
607
|
-
class: normalizeClass(["header_avatar ml-20", _ctx.isWhiteTheme ? "text-#ffffff" : "text-#262642"]),
|
|
615
|
+
class: normalizeClass(["header_avatar ml-20", _ctx.isWhiteTheme || dropdownVisible.value ? "text-#ffffff" : "text-#262642"]),
|
|
608
616
|
"user-nick-name": _ctx.userNickName,
|
|
609
617
|
"current-path": _ctx.routePath,
|
|
610
618
|
logout: _ctx.onLogout
|
|
@@ -614,23 +622,20 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
614
622
|
};
|
|
615
623
|
}
|
|
616
624
|
});
|
|
617
|
-
const
|
|
625
|
+
const Header_vue_vue_type_style_index_0_scoped_f9be6dbf_lang = "";
|
|
618
626
|
const Header_vue_vue_type_style_index_1_lang = "";
|
|
619
|
-
const Header = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-
|
|
620
|
-
const
|
|
627
|
+
const Header = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-f9be6dbf"]]);
|
|
628
|
+
const mainTestHost = ["platform-aiintegration-dev.baai.ac.cn"];
|
|
621
629
|
const mainProdHost = ["flagos.io", "flagos.net", "www.flagos.io", "www.flagos.net"];
|
|
622
|
-
const mainHost = [...mainProdHost, ...
|
|
623
|
-
const
|
|
624
|
-
return mainHost.includes(location.host);
|
|
625
|
-
};
|
|
626
|
-
const buildMenu = (lang) => {
|
|
630
|
+
const mainHost = [...mainProdHost, ...mainTestHost];
|
|
631
|
+
const buildMenu = (lang, innerMain = false) => {
|
|
627
632
|
const isZh = lang === LocaleTypeEnum.Chinese;
|
|
628
633
|
NAV_WIKI_LANG_BY_LOCALE[lang];
|
|
629
634
|
return [
|
|
630
635
|
{
|
|
631
636
|
id: "home",
|
|
632
637
|
label: isZh ? "\u9996\u9875" : "Home",
|
|
633
|
-
path: "/Home"
|
|
638
|
+
path: innerMain ? "/Home" : resolvePath("/Home")
|
|
634
639
|
},
|
|
635
640
|
{
|
|
636
641
|
id: "projects",
|
|
@@ -643,28 +648,28 @@ const buildMenu = (lang) => {
|
|
|
643
648
|
{
|
|
644
649
|
id: "flagscale",
|
|
645
650
|
label: "FlagScale",
|
|
646
|
-
path: "/FlagScale",
|
|
651
|
+
path: innerMain ? `/FlagScale` : resolvePath("/FlagScale"),
|
|
647
652
|
desc: isZh ? "\u7EDF\u4E00\u591A\u82AF\u7247\u3001\u591A\u540E\u7AEF\u7684\u5927\u6A21\u578B\u6846\u67B6\uFF0C\u63D0\u4F9B\u8986\u76D6\u8BAD\u7EC3\u3001\u5FAE\u8C03\u4E0E\u63A8\u7406\u90E8\u7F72\u7684\u5168\u6D41\u7A0B\u80FD\u529B" : "A unified multi-backend large model framework across diverse chips, providing end-to-end capabilities spanning training, fine-tuning, and inference deployment.",
|
|
648
653
|
type: "route"
|
|
649
654
|
},
|
|
650
655
|
{
|
|
651
656
|
id: "flaggems",
|
|
652
657
|
label: "FlagGems",
|
|
653
|
-
path: "/FlagGems",
|
|
658
|
+
path: innerMain ? `/FlagGems` : resolvePath("/FlagGems"),
|
|
654
659
|
desc: isZh ? "\u57FA\u4E8ETriton\u5B9E\u73B0\u7684\u9AD8\u6027\u80FD\u901A\u7528\u7B97\u5B50\u5E93" : "A high-performance general operator library built on Triton.",
|
|
655
660
|
type: "route"
|
|
656
661
|
},
|
|
657
662
|
{
|
|
658
663
|
id: "flagtree",
|
|
659
664
|
label: "FlagTree",
|
|
660
|
-
path: "/FlagTree",
|
|
665
|
+
path: innerMain ? "/FlagTree" : resolvePath("/FlagTree"),
|
|
661
666
|
desc: isZh ? "\u9762\u5411\u591A\u79CD\u786C\u4EF6\u7684\u5F00\u6E90\u3001\u7EDF\u4E00AI\u7F16\u8BD1\u5668" : "An open-source unified AI compiler for diverse hardware.",
|
|
662
667
|
type: "route"
|
|
663
668
|
},
|
|
664
669
|
{
|
|
665
670
|
id: "flagcx",
|
|
666
671
|
label: "FlagCX",
|
|
667
|
-
path: "/FlagCX",
|
|
672
|
+
path: innerMain ? "/FlagCX" : resolvePath("/FlagCX"),
|
|
668
673
|
desc: isZh ? "\u4E00\u6B3E\u4E13\u4E3A\u5927\u89C4\u6A21AI\u7CFB\u7EDF\u8BBE\u8BA1\u7684\u53EF\u6269\u5C55\u3001\u81EA\u9002\u5E94\u9AD8\u6027\u80FD\u8DE8\u82AF\u7247\u901A\u4FE1\u5E93" : "A scalable, adaptive, high-performance cross-chip communication library designed for large-scale AI systems.",
|
|
669
674
|
type: "route"
|
|
670
675
|
}
|
|
@@ -706,14 +711,14 @@ const buildMenu = (lang) => {
|
|
|
706
711
|
{
|
|
707
712
|
id: "skill",
|
|
708
713
|
label: isZh ? "Skill\u5E7F\u573A" : "SkillHub",
|
|
709
|
-
path: resolvePath("/SkillHub"),
|
|
714
|
+
path: resolvePath("/SkillHub", "skillhub"),
|
|
710
715
|
desc: isZh ? "\u4E00\u7AD9\u5F0FAI\u8BA1\u7B97\u6280\u80FD\u5E93" : "One-stop AI computing skills library.",
|
|
711
716
|
type: "route"
|
|
712
717
|
},
|
|
713
718
|
{
|
|
714
719
|
id: "onlinelab",
|
|
715
720
|
label: isZh ? "\u7EBF\u4E0A\u5B9E\u9A8C\u5BA4" : "Online Laboratory",
|
|
716
|
-
path:
|
|
721
|
+
path: innerMain ? "/OnlineLab" : resolvePath("/OnlineLab"),
|
|
717
722
|
desc: isZh ? "\u5F00\u7BB1\u5373\u7528\u7684\u5728\u7EBF\u5B9E\u9A8C\u73AF\u5883" : "Ready-to-use online experiment environment.",
|
|
718
723
|
type: "route"
|
|
719
724
|
},
|
|
@@ -776,36 +781,43 @@ const buildMenu = (lang) => {
|
|
|
776
781
|
{
|
|
777
782
|
id: "events",
|
|
778
783
|
label: isZh ? "\u6D3B\u52A8\u8D5B\u4E8B" : "Event & Competition",
|
|
779
|
-
path:
|
|
784
|
+
path: innerMain ? "/events" : resolvePath("/events")
|
|
780
785
|
},
|
|
781
786
|
{
|
|
782
787
|
id: "onlinelab-top",
|
|
783
788
|
label: isZh ? "\u7EBF\u4E0A\u5B9E\u9A8C\u5BA4" : "Online Laboratory",
|
|
784
|
-
path:
|
|
789
|
+
path: innerMain ? "/OnlineLab" : resolvePath("/OnlineLab")
|
|
785
790
|
}
|
|
786
791
|
];
|
|
787
792
|
};
|
|
788
|
-
const
|
|
789
|
-
if (
|
|
790
|
-
return
|
|
793
|
+
const getSubHostName = () => {
|
|
794
|
+
if (mainHost.includes(location.hostname)) {
|
|
795
|
+
return location.hostname.split(".").slice(1).join(".");
|
|
796
|
+
} else {
|
|
797
|
+
return mainTestHost[0] + "/flag-os";
|
|
798
|
+
}
|
|
799
|
+
};
|
|
800
|
+
const resolvePath = (path, subAppName = "") => {
|
|
801
|
+
if (subAppName) {
|
|
802
|
+
return location.hostname.includes(subAppName) ? path : mainHost.includes(location.hostname) ? `${location.protocol}//${[subAppName, ...getSubHostName().split(".")].join(".")}` : `${location.protocol}//${[subAppName, ...mainTestHost[0].split(".")].join(".")}`;
|
|
791
803
|
} else {
|
|
792
|
-
return `${location.protocol}//${
|
|
804
|
+
return `${location.protocol}//${getSubHostName()}${path}`;
|
|
793
805
|
}
|
|
794
806
|
};
|
|
795
807
|
const resolveMenuPaths = (items) => {
|
|
796
808
|
return items;
|
|
797
809
|
};
|
|
798
|
-
const getNavMenuApi = (lang) => {
|
|
799
|
-
return resolveMenuPaths(buildMenu(lang));
|
|
810
|
+
const getNavMenuApi = (lang, isMainApp2 = false) => {
|
|
811
|
+
return resolveMenuPaths(buildMenu(lang, isMainApp2));
|
|
800
812
|
};
|
|
801
813
|
const openLink = (url) => {
|
|
802
814
|
window.open(url, "_blank");
|
|
803
815
|
};
|
|
804
|
-
function useHeaderMenu(currentLocale, push, unopenTip) {
|
|
816
|
+
function useHeaderMenu(currentLocale, push, unopenTip, innerMain = true) {
|
|
805
817
|
const menuList = ref([]);
|
|
806
818
|
const fetchMenu = (lang) => {
|
|
807
819
|
var _a;
|
|
808
|
-
const data = getNavMenuApi(lang);
|
|
820
|
+
const data = getNavMenuApi(lang, innerMain);
|
|
809
821
|
const activeId = (_a = menuList.value.find((m) => m.active)) == null ? void 0 : _a.id;
|
|
810
822
|
menuList.value = data.map((m) => ({ ...m, active: m.id === activeId }));
|
|
811
823
|
};
|
|
@@ -831,6 +843,7 @@ function useHeaderMenu(currentLocale, push, unopenTip) {
|
|
|
831
843
|
menuList.value[curIdx].active = true;
|
|
832
844
|
};
|
|
833
845
|
const handleJumpPage = (menu, childMenu) => {
|
|
846
|
+
var _a;
|
|
834
847
|
const tip = typeof unopenTip === "string" ? unopenTip : unopenTip.value;
|
|
835
848
|
if (["tools", "projects", "learn"].includes(menu.id)) {
|
|
836
849
|
if (!childMenu)
|
|
@@ -841,12 +854,17 @@ function useHeaderMenu(currentLocale, push, unopenTip) {
|
|
|
841
854
|
return push(childMenu.path);
|
|
842
855
|
if (childMenu.type === "unopen")
|
|
843
856
|
return ElMessage.warning(tip);
|
|
844
|
-
}
|
|
845
|
-
if (menu.id === "docs")
|
|
857
|
+
} else if (menu.id === "docs")
|
|
846
858
|
return openLink("https://docs.flagos.io/");
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
859
|
+
else {
|
|
860
|
+
if ((_a = menu.path) == null ? void 0 : _a.startsWith("http")) {
|
|
861
|
+
openLink(menu.path);
|
|
862
|
+
} else {
|
|
863
|
+
menuList.value.forEach((item) => item.active = false);
|
|
864
|
+
menu.active = true;
|
|
865
|
+
push(menu.path);
|
|
866
|
+
}
|
|
867
|
+
}
|
|
850
868
|
};
|
|
851
869
|
return { menuList, syncActiveMenu, handleJumpPage };
|
|
852
870
|
}
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/components/Table/index.vue","../src/components/Button/index.vue","../src/components/Header/src/constants/locale.ts","../src/components/Header/src/config/texts.ts","../src/Icon/Down.vue","../src/Icon/Header.vue","../src/components/Header/src/Avatar.vue","../src/components/Header/src/Login.vue","../src/components/Header/src/config/locale.ts","../src/components/Header/src/Locale.vue","../src/components/Header/src/utils/path.ts","../src/components/Header/src/Header.vue","../src/components/Header/src/config/menus.ts","../src/components/Header/src/utils/openLink.ts","../src/components/Header/src/hooks/useHeaderMenu.ts","../src/components/Header/src/hooks/useHeaderTheme.ts","../src/index.ts"],"sourcesContent":["<template>\n <div class=\"w-full overflow-auto\">\n <table class=\"w-full border-collapse table-fixed\">\n <thead>\n <tr>\n <th \n v-for=\"column in columns\" \n :key=\"column.key\" \n :style=\"{ width: column.width }\"\n class=\"p-3 text-left bg-gray-100 text-gray-700 font-medium text-sm border-b border-gray-200\"\n >\n {{ column.title }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr \n v-for=\"(row, rowIndex) in data\" \n :key=\"rowKey ? row[rowKey] : rowIndex\"\n class=\"hover:bg-gray-50\"\n >\n <td \n v-for=\"column in columns\" \n :key=\"column.key\"\n class=\"p-3 text-left border-b border-gray-200 text-sm\"\n >\n <slot :name=\"column.key\" :row=\"row\" :index=\"rowIndex\">\n {{ row[column.key] }}\n </slot>\n </td>\n </tr>\n <tr v-if=\"!data || data.length === 0\">\n <td \n :colspan=\"columns.length\" \n class=\"p-8 text-center text-gray-500\"\n >\n <slot name=\"empty\">暂无数据</slot>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, PropType } from 'vue';\n\nexport interface TableColumn {\n key: string;\n title: string;\n width?: string;\n}\n\nexport default defineComponent({\n name: 'MyTable',\n props: {\n columns: {\n type: Array as PropType<TableColumn[]>,\n required: true\n },\n data: {\n type: Array as PropType<Record<string, any>[]>,\n default: () => []\n },\n rowKey: {\n type: String,\n default: ''\n }\n }\n});\n</script> ","<template>\n <button\n class=\"inline-flex justify-center items-center h-8 px-4 py-2 rounded-md text-sm font-medium transition-colors duration-200 focus:outline-none\"\n :class=\"[\n typeClasses,\n {\n 'opacity-50 cursor-not-allowed': disabled,\n 'relative': loading\n }\n ]\"\n :disabled=\"disabled || loading\"\n @click=\"handleClick\"\n >\n <span v-if=\"loading\" class=\"mr-2 w-4 h-4 i-svg-spinners-270-ring-with-bg\"></span>\n <slot></slot>\n </button>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, PropType } from 'vue';\n\ntype ButtonType = 'primary' | 'success' | 'warning' | 'danger' | 'info' | 'default';\n\nexport default defineComponent({\n name: 'MyButton',\n props: {\n type: {\n type: String as PropType<ButtonType>,\n default: 'default'\n },\n disabled: {\n type: Boolean,\n default: false\n },\n loading: {\n type: Boolean,\n default: false\n }\n },\n emits: ['click'],\n setup(props, { emit }) {\n // 根据类型计算样式类\n const typeClasses = computed(() => {\n switch (props.type) {\n case 'primary':\n return 'bg-primary hover:bg-blue-500 text-white border-transparent';\n case 'success':\n return 'bg-success hover:bg-green-500 text-white border-transparent';\n case 'warning':\n return 'bg-warning hover:bg-yellow-500 text-white border-transparent';\n case 'danger':\n return 'bg-danger hover:bg-red-500 text-white border-transparent';\n case 'info':\n return 'bg-info hover:bg-gray-500 text-white border-transparent';\n default:\n return 'bg-white hover:bg-gray-100 text-gray-700 border border-gray-300';\n }\n });\n\n const handleClick = (e: MouseEvent) => {\n if (props.disabled || props.loading) return;\n emit('click', e);\n };\n\n return {\n typeClasses,\n handleClick\n };\n }\n});\n</script>\n\n<style>\n.my-button {\n display: inline-flex;\n justify-content: center;\n align-items: center;\n line-height: 1;\n height: 32px;\n white-space: nowrap;\n cursor: pointer;\n color: #606266;\n text-align: center;\n box-sizing: border-box;\n outline: none;\n transition: 0.1s;\n font-weight: 500;\n padding: 8px 15px;\n font-size: 14px;\n border-radius: 4px;\n border: 1px solid #dcdfe6;\n background: #ffffff;\n}\n\n.my-button--primary {\n color: #fff;\n background-color: #409eff;\n border-color: #409eff;\n}\n\n.my-button--success {\n color: #fff;\n background-color: #67c23a;\n border-color: #67c23a;\n}\n\n.my-button--warning {\n color: #fff;\n background-color: #e6a23c;\n border-color: #e6a23c;\n}\n\n.my-button--danger {\n color: #fff;\n background-color: #f56c6c;\n border-color: #f56c6c;\n}\n\n.my-button.is-disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.my-button__loading {\n display: inline-block;\n width: 14px;\n height: 14px;\n border: 2px solid currentColor;\n border-radius: 50%;\n border-right-color: transparent;\n margin-right: 5px;\n animation: rotate 1s linear infinite;\n}\n\n@keyframes rotate {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n</style> ","export enum LocaleTypeEnum {\n English = 'en',\n Chinese = 'zh-CN',\n}\n","import type { InjectionKey, ComputedRef } from 'vue';\nimport { LocaleTypeEnum } from '../constants/locale';\n\nexport interface NavTexts {\n loginText: string;\n logoutText: string;\n}\n\nexport const NAV_TEXTS_KEY: InjectionKey<ComputedRef<NavTexts>> = Symbol('nav-texts');\n\nexport const buildNavTexts = (lang: LocaleTypeEnum): NavTexts => {\n const isZh = lang === LocaleTypeEnum.Chinese;\n return {\n loginText: isZh ? '登录/注册' : 'Log In / Sign Up',\n logoutText: isZh ? '退出登录' : 'Log Out',\n };\n};\n","<template>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g id=\"icon/down\">\n <path id=\"Union\" d=\"M12.1382 5.86191C11.8778 5.60156 11.4557 5.60156 11.1954 5.86191L8.0001 9.05717L4.80484 5.86191C4.54449 5.60156 4.12238 5.60156 3.86203 5.86191C3.60168 6.12226 3.60168 6.54437 3.86203 6.80472L7.29299 10.2357C7.68352 10.6262 8.31668 10.6262 8.70721 10.2357L12.1382 6.80472C12.3985 6.54437 12.3985 6.12226 12.1382 5.86191Z\" fill=\"#2C364B\"/>\n </g>\n </svg>\n</template>","<template>\n <svg width=\"19px\" height=\"20px\" viewBox=\"0 0 19 20\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <title>yonghu-2</title>\n <g id=\"页面-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <g id=\"flagos首页备份-4\" transform=\"translate(-1187, -32)\" fill=\"#FFFFFF\" fill-rule=\"nonzero\">\n <g id=\"yonghu-2\" transform=\"translate(1187, 32)\">\n <path d=\"M4.16667254,6.66658844 C4.16667254,3.9091208 6.40897956,1.66664712 9.1664472,1.66664712 C11.9239148,1.66664712 14.1663885,3.9091208 14.1663885,6.66658844 C14.1663885,9.42388942 11.9239148,11.6665298 9.1664472,11.6665298 C6.40897956,11.6665298 4.16650588,9.42388942 4.16650588,6.66658844 M18.3046733,18.9521109 C17.4853496,15.8829803 15.3253749,13.4830084 12.6130734,12.3621883 C14.5387175,11.192202 15.8330356,9.08056012 15.8330356,6.66642176 C15.832869,2.99079823 12.8420707,0 9.16628054,0 C5.49049035,0 2.4996921,2.99079823 2.4996921,6.66658844 C2.4996921,9.08056012 3.79384359,11.192202 5.72048764,12.3621883 C3.00801947,13.4838418 0.848044811,15.8829803 0.028221107,18.9521109 C-0.0900085115,19.3963877 0.174049854,19.8524478 0.618214182,19.971099 C1.06293982,20.0897021 1.51968816,19.8256771 1.63886887,19.3811059 C2.59002437,15.820481 5.68498805,13.3331769 9.16661386,13.3331769 C12.6482397,13.3331769 15.74387,15.8206477 16.6948589,19.3814392 C16.7515138,19.5951643 16.8909444,19.7775312 17.0823388,19.8882397 C17.2737332,19.9989483 17.5013346,20.0288842 17.7148469,19.9714323 C18.1590942,19.8527834 18.423176,19.3966084 18.30484,18.9522776\" id=\"形状\"></path>\n </g>\n </g>\n </g>\n </svg>\n</template>","<template>\n <el-dropdown popper-class=\"custom-dropdown\" size=\"large\" ref=\"dropdown\" trigger=\"click\" :show-arrow=\"false\" @visible-change=\"onVisibleChange\">\n <div class=\"flex items-center cursor-pointer\">\n <div class=\"w-24 h-24 rounded-50% font-600 flex-center mr-8\">\n <Header/>\n </div>\n\n <span>{{ userNickName }}</span>\n <el-icon\n class=\"el-icon--right !ml-16 transition-all duration-200\"\n :class=\"{\n ' rotate-180': dropdownVisible,\n }\"\n :size=\"16\"\n >\n <Down />\n </el-icon>\n </div>\n\n <template #dropdown>\n <el-dropdown-menu>\n <el-dropdown-item>\n <div class=\"flex items-center w-full text-14 mb-4\" @click=\"logout\">\n {{ navTexts?.logoutText }}\n </div>\n </el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n</template>\n\n<script setup lang=\"ts\">\nimport { inject, ref } from 'vue';\nimport { NAV_TEXTS_KEY } from './config/texts';\nimport Down from '../../../Icon/Down.vue';\nimport Header from '../../../Icon/Header.vue';\n\nconst navTexts = inject(NAV_TEXTS_KEY);\nconst dropdownVisible = ref(false);\nconst onVisibleChange = (visible: boolean) => {\n dropdownVisible.value = visible;\n};\ninterface Props {\n userNickName: string;\n currentPath: string;\n logout: () => void;\n}\n\ndefineProps<Props>();\n</script>\n\n<style scoped lang=\"scss\" >\n.reset-btn {\n border-color: #bec3cd;\n\n :deep(.el-button) {\n color: #3e4a54 !important;\n }\n &:hover {\n :deep(.el-button) {\n color: #3967e9 !important;\n }\n border-color: #3967e9;\n .el-icon {\n fill: #3967e9 !important;\n }\n }\n &:active {\n .el-icon {\n fill: #fff !important;\n }\n :deep(.el-button) {\n color: #fff !important;\n }\n border-color: transparent;\n background: #3967e9;\n }\n}\n</style>\n","<template>\n <el-button type=\"primary\" class=\"!rounded-4\" @click=\"login\">{{ navTexts?.loginText }}</el-button>\n</template>\n<script setup lang=\"ts\">\nimport { inject } from 'vue';\nimport { useRouter } from 'vue-router';\nimport { NAV_TEXTS_KEY } from './config/texts';\n\nconst navTexts = inject(NAV_TEXTS_KEY);\nconst router = useRouter();\n\nconst login = () => {\n router.push({ path: '/login', query: { redirect_url: encodeURIComponent(location.href) } });\n};\n</script>\n","import { LocaleTypeEnum } from '../constants/locale';\n\nexport const NAV_LOCALE_OPTIONS = [\n { value: LocaleTypeEnum.Chinese, label: '中文' },\n { value: LocaleTypeEnum.English, label: 'English' },\n];\n\nexport const NAV_LOCALE_TO_LANG: Record<LocaleTypeEnum, string> = {\n [LocaleTypeEnum.Chinese]: 'cn',\n [LocaleTypeEnum.English]: 'en',\n};\n\nexport const NAV_LANG_TO_LOCALE: Record<string, LocaleTypeEnum> = {\n cn: LocaleTypeEnum.Chinese,\n en: LocaleTypeEnum.English,\n};\n\nexport const NAV_WIKI_LANG_BY_LOCALE: Record<LocaleTypeEnum, string> = {\n [LocaleTypeEnum.Chinese]: 'zh',\n [LocaleTypeEnum.English]: 'en',\n};\n","<template>\n <el-dropdown class=\"cursor-pointer\" trigger=\"click\" popper-class=\"custom-dropdown\" placement=\"bottom\" @visible-change=\"handleChange\">\n <svg width=\"20px\" height=\"20px\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect fill=\"#D8D8D8\" opacity=\"0\" x=\"0\" y=\"0\" width=\"20\" height=\"20\"></rect>\n <path\n :fill=\"isWhite ? '#ffffff' : '#2C364B'\"\n fill-rule=\"nonzero\"\n d=\"M10,0 C4.48583334,0 0,4.48583334 0,10 C0,15.5141667 4.48583334,20 10,20 C15.5141667,20 20,15.5141667 20,10 C20,4.48583334 15.5141667,0 10,0 Z M18.6966667,10.9491667 L18.6925,10.9741667 C18.6575,11.2791667 18.6075,11.5791667 18.5425,11.8741667 L18.5425,11.875 L15.5258333,11.875 C15.657032,10.6284426 15.657032,9.37155738 15.5258333,8.125 L18.5425,8.125 C18.6075,8.42 18.6566667,8.72 18.6925,9.025 C18.6925,9.03333334 18.695,9.04166666 18.6966667,9.05083334 C18.7675,9.68166668 18.7675,10.3183333 18.6966667,10.9491667 L18.6966667,10.9491667 Z M13.34,18.0833333 C14.2783333,16.8683333 14.9891667,15.1491667 15.3516667,13.1241667 L18.1633333,13.1241667 C17.3009588,15.3668017 15.5579816,17.158563 13.34,18.0825 L13.34,18.0833333 Z M18.1625,6.87333334 L15.3516667,6.87333334 C14.9891667,4.84833334 14.2783333,3.13 13.34,1.915 C15.5576659,2.83912386 17.3003173,4.63085972 18.1625,6.87333334 L18.1625,6.87333334 Z M14.2658333,8.12333334 C14.4114344,9.36909341 14.4114344,10.6275733 14.2658333,11.8733333 L10.6241667,11.8733333 L10.6241667,8.12333334 L14.2658333,8.12333334 Z M10.6241667,6.87333334 L10.6241667,1.355 C12.1825,1.825 13.5008333,4.0025 14.07,6.87583334 L10.625,6.87583334 L10.6241667,6.87333334 Z M10.6241667,13.1233333 L14.07,13.1233333 C13.5008333,15.9983333 12.1825,18.175 10.625,18.645 L10.625,13.125 L10.6241667,13.1233333 Z M1.8375,13.1241667 L4.64833334,13.1241667 C5.01083334,15.1491667 5.72166668,16.8683333 6.66,18.0825 C4.44233408,17.1583761 2.69968275,15.3666403 1.8375,13.1241667 L1.8375,13.1241667 Z M6.66,1.91666666 C5.72166666,3.13 5.01083334,4.85 4.64833334,6.875 L1.83666666,6.875 C2.69923303,4.63220345 4.44253606,2.84041679 6.66083334,1.91666666 L6.66,1.91666666 Z M5.73416666,11.875 C5.58856559,10.6292399 5.58856559,9.37076007 5.73416666,8.125 L9.375,8.125 L9.375,11.875 L5.73333334,11.875 L5.73416666,11.875 Z M9.375,13.125 L9.375,18.6458333 C7.81666666,18.1758333 6.49916666,15.9983333 5.93,13.125 L9.375,13.125 Z M9.375,6.875 L5.93,6.875 C6.49916666,4.00166666 7.81666666,1.825 9.375,1.35416666 L9.375,6.875 Z M1.30416666,9.05 C1.30416666,9.04333334 1.30666666,9.03583334 1.3075,9.02833334 C1.34166666,8.725 1.39166666,8.42333334 1.4575,8.125 L4.47416666,8.125 C4.34243809,9.37152952 4.34243809,10.6284705 4.47416666,11.875 L1.4575,11.875 C1.39166666,11.5766667 1.34166666,11.275 1.3075,10.9716667 L1.30416666,10.9491667 C1.23220566,10.3184348 1.23220566,9.68156522 1.30416666,9.05083334 L1.30416666,9.05 Z\"\n />\n </svg>\n <template #dropdown>\n <el-dropdown-menu>\n <el-dropdown-item\n v-for=\"locale in localeOptions\"\n :key=\"locale.value\"\n :class=\"{ 'is-active': locale.value === currentLocale }\"\n @click=\"emitChangeLanguage(locale.value)\"\n >\n <span :class=\"{ 'color-primary': locale.value === currentLocale }\">\n {{ locale.label }}\n </span>\n </el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n</template>\n<script setup lang=\"tsx\">\nimport { ref, computed } from 'vue';\nimport { LocaleTypeEnum } from './constants/locale';\nimport { NAV_LOCALE_OPTIONS } from './config/locale';\n\nconst active = ref(false);\n\nconst handleChange = (val: boolean) => {\n active.value = val;\n};\n\ninterface LocaleOption {\n value: LocaleTypeEnum;\n label: string;\n}\n\ninterface Props {\n isWhiteTheme?: boolean;\n currentLocale: LocaleTypeEnum;\n localeOptions?: LocaleOption[];\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n isWhiteTheme: false,\n localeOptions: () => NAV_LOCALE_OPTIONS,\n});\n\nconst emits = defineEmits<{\n (e: 'change-language', locale: LocaleTypeEnum): void;\n}>();\n\nconst isWhite = computed(() => props.isWhiteTheme);\nconst currentLocale = computed(() => props.currentLocale);\nconst localeOptions = computed(() => props.localeOptions);\n\nconst emitChangeLanguage = (locale: LocaleTypeEnum) => {\n if (locale === currentLocale.value) {\n return;\n }\n emits('change-language', locale);\n};\n</script>\n<style scoped lang=\"scss\"></style>\n","export const matchPath = (path: string, targetPath: string): boolean => {\n if (!path || !targetPath) return false;\n return path.toLowerCase().indexOf(targetPath.toLowerCase()) >= 0;\n};\n\nexport const matchAnyPath = (path: string, targetPaths: string[]): boolean => {\n return targetPaths.some(targetPath => matchPath(path, targetPath));\n};\n","<template>\n <div\n class=\"w-full header-wrapper h-64px pl-120 pr-120 py-19 backdrop-blur-[14px] flex items-center justify-between text-#000 fixed left-0 top-0 z-99 bg-transparent overflow-x-scroll\"\n :class=\"{\n 'theme-white': isWhiteTheme,\n 'theme-scrolled': isScrolledTheme,\n '!b-0': matchPath(routePath, '/CommunityMembers'),\n }\"\n >\n <div class=\"flex-center\">\n <img\n class=\"logo\"\n :src=\"isWhiteTheme ? 'https://flagos.ks3-cn-beijing.ksyuncs.com/images/logo.svg' : 'https://flagos.ks3-cn-beijing.ksyuncs.com/images/logo-black.svg'\"\n @click=\"onLogoClick\"\n />\n <div class=\"flex gap-48 ml-80\">\n <div\n v-for=\"(menu, index) in menuList\"\n :index=\"index\"\n class=\"menu-item cursor-pointer whitespace-nowrap\"\n :class=\"{ active: menu.active }\"\n >\n <el-dropdown\n v-if=\"menu.dropdownList && menu.id === 'learn'\"\n popper-class=\"custom-dropdown-new\"\n :show-arrow=\"false\"\n >\n <span class=\"text-16\">{{ menu.label}}</span>\n <template #dropdown>\n <el-dropdown-menu class=\"flex-row\">\n <el-dropdown-item\n v-for=\"(childMenu, idx) in menu.dropdownList\"\n :key=\"idx\"\n :class=\"{ active: matchPath(routePath, childMenu.path) }\"\n @click=\"onJumpPage(menu, childMenu)\"\n >\n <span class=\"text-14 mb-16 !font-500\">{{ childMenu.label }}</span>\n <span class=\"text-14 whitespace-normal !font-400\">{{ childMenu.desc }}</span>\n </el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n <el-dropdown\n v-else-if=\"menu.dropdownList && menu.id === 'tools'\"\n popper-class=\"custom-dropdown-new\"\n :show-arrow=\"false\"\n >\n <span class=\"text-16\">{{ menu.label }}</span>\n <template #dropdown>\n <el-dropdown-menu>\n <el-dropdown-item v-for=\"(childMenu, idx) in menu.dropdownList\" :key=\"idx\" @click=\"onJumpPage(menu, childMenu)\">\n <span class=\"text-14 mb-16 !font-500\">{{childMenu.label }}</span>\n <span class=\"text-14 whitespace-normal !font-400\">{{ childMenu.desc }}</span>\n </el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n <el-dropdown v-else-if=\"menu.dropdownGroups && menu.id === 'projects'\" popper-class=\"custom-dropdown-new\" :show-arrow=\"false\">\n <span class=\"text-16\">{{ menu.label}}</span>\n <template #dropdown>\n <el-dropdown-menu class=\"flex gap-20 el-dropdown-menu_out\">\n <ul v-for=\"(group, idx) in menu.dropdownGroups\" :key=\"idx\" class=\"flex-1 el-dropdown-menu !w-[50%] !max-h-560px\">\n <span class=\"text-14 text-#bbbbbb leading-22 mb-20\">{{ group.label }}</span>\n <el-dropdown-item\n v-for=\"(childMenu, cidx) in group.list\"\n :key=\"cidx\"\n class=\"el-dropdown-menu__item !w-full\"\n @click=\"onJumpPage(menu, childMenu)\"\n >\n <span class=\"text-14 mb-16 !font-500\">{{ childMenu.label }}</span>\n <span class=\"text-14 whitespace-normal !font-400\">{{ childMenu.desc }}</span>\n </el-dropdown-item>\n </ul>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n <span v-else @click=\"onJumpPage(menu)\">{{ menu.label }}</span>\n </div>\n </div>\n </div>\n <div class=\"flex-center\" :class=\"isWhiteTheme ? 'text-#ffffff' : 'text-#262642'\">\n <Locale :isWhiteTheme=\"isWhiteTheme\" :current-locale=\"currentLocale\" @change-language=\"onChangeLanguage\" />\n <Login v-if=\"!userName\" class=\"ml-20\" />\n <Avatar\n v-if=\"userName\"\n class=\"header_avatar ml-20\"\n :class=\"isWhiteTheme ? 'text-#ffffff' : 'text-#262642'\"\n :user-nick-name=\"userNickName\"\n :current-path=\"routePath\"\n :logout=\"onLogout\"\n />\n </div>\n </div>\n</template>\n<script setup lang=\"ts\">\nimport { computed, provide } from 'vue';\nimport Avatar from './Avatar.vue';\nimport Login from './Login.vue';\nimport Locale from './Locale.vue';\nimport { LocaleTypeEnum } from './constants/locale';\nimport { matchPath } from './utils/path';\nimport type { NavMenuItem, NavChildItem } from './config/menus';\nimport { NAV_TEXTS_KEY, buildNavTexts } from './config/texts';\nimport 'uno.css';\ninterface Props {\n routePath: string;\n menuList: NavMenuItem[];\n isWhiteTheme: boolean;\n isScrolledTheme: boolean;\n currentLocale: LocaleTypeEnum;\n userName?: string;\n userNickName: string;\n onLogoClick: () => void;\n onJumpPage: (menu: NavMenuItem, childMenu?: NavChildItem) => void;\n onChangeLanguage: (locale: LocaleTypeEnum) => void;\n onLogout: () => void;\n}\n\nconst props = defineProps<Props>();\n\nprovide(\n NAV_TEXTS_KEY,\n computed(() => buildNavTexts(props.currentLocale))\n);\n\n</script>\n<style scoped lang=\"scss\">\n.header-wrapper {\n transition: all 0.3s ease;\n border-bottom: 1px solid rgba(0, 0, 0, 0.13);\n &.theme-white {\n color: #fff;\n border: none;\n background: transparent;\n svg {\n color: #fff;\n }\n .menu-item {\n &::before {\n background-color: #fff;\n }\n :deep(.el-dropdown) {\n color: #fff;\n }\n }\n }\n &.theme-scrolled {\n background: #fff;\n color: #262642;\n border-bottom: 1px solid rgba(0, 0, 0, 0.13);\n svg {\n color: #262642;\n }\n .menu-item {\n &::before {\n background-color: #262642;\n }\n :deep(.el-dropdown) {\n color: #262642;\n }\n }\n }\n .logo {\n width: 100px;\n height: 38px;\n cursor: pointer;\n object-fit: contain;\n }\n svg {\n color: #262642;\n }\n .menu-item {\n display: flex;\n align-items: center;\n position: relative;\n font-size: 16px;\n &::before {\n content: '';\n display: block;\n position: absolute;\n left: 0;\n bottom: -2px;\n width: 0;\n height: 2px;\n border-radius: 1px;\n background-color: #262642;\n transition: all 0.3s ease;\n transform-origin: center;\n }\n &.active {\n font-weight: 600;\n &::before {\n width: 100%;\n }\n }\n :deep(.el-dropdown) {\n color: #262642;\n }\n }\n}\n</style>\n<style lang=\"scss\">\n .el-popper.custom-dropdown-new {\n padding: 0 !important;\n width: 100%;\n margin-left: -1px;\n // height: 90%;\n max-width: 100% !important;\n margin-top: 12px;\n // inset: 64px auto auto auto !important;\n box-shadow: none;\n background: #07111E;\n opacity: 0.95;\n .el-dropdown__list {\n width: 100% !important;\n height: 100% !important;\n padding: 56px 120px;\n \n .el-dropdown-menu_out{\n display: flex;\n flex-wrap: wrap;\n max-height: 90% !important;\n flex-direction: row !important;\n column-gap: 20px;\n row-gap: 4px;\n background: transparent !important;\n box-shadow: none !important;\n }\n \n .el-dropdown-menu {\n display: flex;\n max-height: 360px;\n flex-direction: column;\n flex-wrap: wrap;\n column-gap: 20px;\n row-gap: 4px;\n background: transparent !important;\n box-shadow: none !important;\n &.flex-row {\n flex-direction: row !important;\n flex-wrap: nowrap;\n }\n .el-dropdown-menu__item{\n width: calc((100% - 20px * 2) / 3);\n padding: 0 !important;\n min-height: 64px;\n font-family: PingFangSC, PingFang SC;\n font-weight: 600;\n font-size: 14px;\n color: #FFFFFF !important;\n line-height: 22px;\n padding: 20px 16px !important;\n border-radius: 8px;\n border: 1px solid transparent;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n }\n .el-dropdown-menu__item:hover, .el-dropdown-menu__item:focus {\n background: rgba(255,255,255, 0.05);\n border: 1px solid rgba(255,255,255, 0.2);\n \n }\n }\n }\n }\n</style>","import { LocaleTypeEnum } from '../constants/locale';\nimport { NAV_WIKI_LANG_BY_LOCALE } from './locale';\n\n// ---------- Types ----------\n\nexport interface NavChildItem {\n id: string;\n label: string;\n path: string;\n desc?: string;\n type: 'route' | 'link' | 'unopen';\n}\n\nexport interface NavDropdownGroup {\n id: string;\n label: string;\n list: NavChildItem[];\n}\n\nexport interface NavMenuItem {\n id: string;\n label: string;\n path?: string;\n active?: boolean;\n /** flat items (tools / learn) */\n dropdownList?: NavChildItem[];\n /** grouped items (projects) */\n dropdownGroups?: NavDropdownGroup[];\n}\nconst mainDevHost = ['platform-aiintegration-dev.baai.ac.cn']\nconst mainProdHost =['flagos.io', 'flagos.net', 'www.flagos.io', 'www.flagos.net']\nconst mainHost = [...mainProdHost, ...mainDevHost]\n// ---------- Mock data ----------\nconst isMainApp = () => {\n return mainHost.includes(location.host)\n\n}\nconst buildMenu = (lang: LocaleTypeEnum): NavMenuItem[] => {\n const isZh = lang === LocaleTypeEnum.Chinese;\n const wikiLang = NAV_WIKI_LANG_BY_LOCALE[lang];\n\n return [\n {\n id: 'home',\n label: isZh ? '首页' : 'Home',\n path: '/Home',\n },\n {\n id: 'projects',\n label: isZh ? '软件栈' : 'Software Stack',\n dropdownGroups: [\n {\n id: 'coreLib',\n label: isZh ? '开源核心库' : 'Open-Source Core Libraries',\n list: [\n {\n id: 'flagscale',\n label: 'FlagScale',\n path: '/FlagScale',\n desc: isZh\n ? '统一多芯片、多后端的大模型框架,提供覆盖训练、微调与推理部署的全流程能力'\n : 'A unified multi-backend large model framework across diverse chips, providing end-to-end capabilities spanning training, fine-tuning, and inference deployment.',\n type: 'route',\n },\n {\n id: 'flaggems',\n label: 'FlagGems',\n path: '/FlagGems',\n desc: isZh\n ? '基于Triton实现的高性能通用算子库'\n : 'A high-performance general operator library built on Triton.',\n type: 'route',\n },\n {\n id: 'flagtree',\n label: 'FlagTree',\n path: '/FlagTree',\n desc: isZh\n ? '面向多种硬件的开源、统一AI编译器'\n : 'An open-source unified AI compiler for diverse hardware.',\n type: 'route',\n },\n {\n id: 'flagcx',\n label: 'FlagCX',\n path: '/FlagCX',\n desc: isZh\n ? '一款专为大规模AI系统设计的可扩展、自适应高性能跨芯片通信库'\n : 'A scalable, adaptive, high-performance cross-chip communication library designed for large-scale AI systems.',\n type: 'route',\n },\n ],\n },\n {\n id: 'ecosystem',\n label: isZh ? '生态使能项目' : 'FlagOS Ecosystem Enablement Project',\n list: [\n {\n id: 'megatronfl',\n label: 'Megatron-FL',\n path: 'https://github.com/flagos-ai/Megatron-LM-FL',\n desc: isZh\n ? '为Megatron-LM打造的多芯片插件,实现大模型多芯片高效训练'\n : 'A multi-chip plugin for Megatron-LM, enabling efficient large-scale training across diverse chips.',\n type: 'link',\n },\n {\n id: 'vllmpluginfl',\n label: 'vLLM-plugin-FL',\n path: 'https://github.com/flagos-ai/vllm-plugin-FL',\n desc: isZh\n ? '为vLLM打造的多芯片插件,实现大模型多芯片高效推理部署'\n : 'A multi-chip plugin for vLLM, enabling efficient large model inference and deployment across diverse chips.',\n type: 'link',\n },\n {\n id: 'transformerenginefl',\n label: 'TransformerEngine-FL',\n path: 'https://github.com/flagos-ai/TransformerEngine-FL',\n desc: isZh\n ? '为TransformerEngine打造的多芯片插件,实现多种芯片上分布式算子'\n : 'A multi-chip plugin for TransformerEngine, enabling distributed operators across diverse chip architectures.',\n type: 'link',\n },\n ],\n },\n ],\n },\n {\n id: 'tools',\n label: isZh ? '工具' : 'Tools',\n dropdownList: [\n {\n id: 'skill',\n label: isZh ? 'Skill广场' : 'SkillHub',\n path: resolvePath('/SkillHub'),\n desc: isZh ? '一站式AI计算技能库' : 'One-stop AI computing skills library.',\n type: 'route',\n },\n {\n id: 'onlinelab',\n label: isZh ? '线上实验室' : 'Online Laboratory',\n path: isMainApp() ?'/OnlineLab': resolvePath('/OnlineLab'),\n desc: isZh ? '开箱即用的在线实验环境' : 'Ready-to-use online experiment environment.',\n type: 'route',\n },\n {\n id: 'modelplatform',\n label: isZh ? '模型服务平台' : 'MaaS',\n path: '',\n desc: isZh\n ? '全生命周期大模型API服务平台'\n : 'A full-lifecycle API service platform for large models.',\n type: 'unopen',\n },\n {\n id: 'kernelgen',\n label: 'KernelGen',\n path: 'https://kernelgen.flagos.io/',\n desc: isZh\n ? '分钟级构建Kernel,支持多芯片后端'\n : 'Build Kernels in Minutes with Multi-Backend Support.',\n type: 'link',\n },\n {\n id: 'flagrelease',\n label: 'FlagRelease',\n path: '',\n desc: isZh\n ? '一套自动化迁移大模型至不同硬件产品的工具平台'\n : 'An automated tool platform for migrating large model to diverse hardware.',\n type: 'unopen',\n },\n {\n id: 'flagcicd',\n label: 'FlagCICD',\n path: '',\n desc: isZh\n ? '面向 AI 开发的持续集成 / 持续部署工具链'\n : 'A CI/CD toolchain for AI development.',\n type: 'unopen',\n },\n {\n id: 'flagmodelhub',\n label: isZh ? '九鼎AI一体化平台' : 'Jiuding AI Integrated Platform',\n path: '',\n desc: isZh\n ? '整合 FlagOS 全栈能力,提供从模型开发、训练到部署的一站式 AI 工程化平台'\n : 'Jiuding AI Platform.',\n type: 'unopen',\n },\n ],\n },\n {\n id: 'docs',\n label: isZh ? '文档' : 'Docs',\n },\n {\n id: 'learn',\n label: isZh ? '学习' : 'Learn',\n dropdownList: [\n {\n id: 'wiki',\n label: 'Wiki',\n desc: isZh ? '智能文档,边看边问边学': 'AI-powered interactive docs: query and learn in real-time.',\n path: `https://wiki.flagos.io`,\n type: 'link',\n },\n { id: 'professionalcourse', label: isZh ? '专业课' : 'Core Courses', desc: isZh ? '众智FlagOS系列开源课程' : 'The official open-source course series for the FlagOS ecosystem.', path: 'https://flagos.educoder.net/paths', type: 'link' },\n { id: 'course',label: isZh ? '讲座' : 'Tech Talks', desc: isZh ? '大咖分享,业界前沿讲座' : 'Cutting-edge insights and deep dives from industry leaders.', path: '/LearnCenter', type: 'route' },\n ],\n },\n {\n id: 'events',\n label: isZh ? '活动赛事' : 'Event & Competition',\n path: isMainApp() ?'/events': resolvePath('/events'),\n },\n {\n id: 'onlinelab-top',\n label: isZh ? '线上实验室' : 'Online Laboratory',\n path: isMainApp() ?'/OnlineLab': resolvePath('/OnlineLab'),\n },\n ];\n};\nconst resolvePath = (path: string): string => {\n if(mainProdHost.includes(location.hostname)) {\n return `https://${location.hostname}${path}`;\n } else {\n return `${location.protocol}//${path.slice(1).toLocaleLowerCase()}.${mainDevHost[0]}`;\n }\n};\n\nconst resolveMenuPaths = (items: NavMenuItem[]): NavMenuItem[] => {\n return items;\n};\n\n/**\n * Fetch nav menu by lang.\n * Replace the mock body with a real HTTP call when the backend is ready:\n * return request({ method: 'get', url: '/nav/menus', params: { lang } }).then(res => res.data);\n */\nexport const getNavMenuApi = (lang: LocaleTypeEnum): NavMenuItem[] => {\n return resolveMenuPaths(buildMenu(lang));\n};\n","export const openLink = (url: string) => {\n window.open(url, '_blank');\n};\n","import { ref, watch } from 'vue';\nimport type { Ref } from 'vue';\nimport { ElMessage } from 'element-plus';\nimport type { LocaleTypeEnum } from '../constants/locale';\nimport { getNavMenuApi, type NavMenuItem, type NavChildItem } from '../config/menus';\nimport { openLink } from '../utils/openLink';\nimport { matchPath, matchAnyPath } from '../utils/path';\nimport { NavigationFailure } from 'vue-router';\n\nexport function useHeaderMenu(\n currentLocale: Ref<LocaleTypeEnum>,\n push: (path: any) => Promise<NavigationFailure | void | undefined>,\n /** String shown when user clicks an unavailable item (e.g. t('projects.unopentip')) */\n unopenTip: Ref<string> | string\n) {\n const menuList = ref<NavMenuItem[]>([]);\n\n const fetchMenu = (lang: LocaleTypeEnum) => {\n const data = getNavMenuApi(lang);\n // preserve active state across refetch\n const activeId = menuList.value.find(m => m.active)?.id;\n menuList.value = data.map(m => ({ ...m, active: m.id === activeId }));\n };\n\n watch(currentLocale, lang => fetchMenu(lang), { immediate: true });\n\n const syncActiveMenu = (route: any) => {\n menuList.value.forEach(item => (item.active = false));\n const curIdx = menuList.value.findIndex(item => {\n if (item.dropdownList) {\n return item.dropdownList.some(child => matchPath(route?.path, child.path));\n }\n if (item.dropdownGroups) {\n return item.dropdownGroups.some(group =>\n group.list.some(child => matchPath(route?.path, child.path))\n );\n }\n if (matchPath(item.path as string, '/events') && matchAnyPath(route?.path, ['/EventDetail', '/RaceDetail'])) return true;\n if (item.id === 'onlinelab-top' && matchPath(route?.path, '/OnlineLab')) return true;\n return matchPath(route?.path, item.path as string);\n });\n if (curIdx >= 0) menuList.value[curIdx].active = true;\n };\n\n const handleJumpPage = (menu: NavMenuItem, childMenu?: NavChildItem) => {\n const tip = typeof unopenTip === 'string' ? unopenTip : unopenTip.value;\n\n if (['tools', 'projects', 'learn'].includes(menu.id)) {\n if (!childMenu) return;\n if (childMenu.path.startsWith('http')) return openLink(childMenu.path);\n if (childMenu.path) return push(childMenu.path);\n if (childMenu.type === 'unopen') return ElMessage.warning(tip);\n }\n if (menu.id === 'docs') return openLink('https://docs.flagos.io/');\n\n menuList.value.forEach(item => (item.active = false));\n menu.active = true;\n push(childMenu ? childMenu.path : menu.path);\n };\n\n return { menuList, syncActiveMenu, handleJumpPage };\n}\n","import { ref, nextTick, onMounted, onUnmounted } from 'vue';\nimport throttle from 'lodash/throttle';\nimport { matchPath, matchAnyPath } from '../utils/path';\n\nexport function useHeaderTheme(route: any) {\n const lastScrollTop = ref(0);\n const isWhiteTheme = ref(false);\n const isScrolledTheme = ref(false);\n\n const SCROLL_THRESHOLDS = {\n home: { getThreshold: () => window.innerHeight - 80 },\n events: { getThreshold: () => 390 - 80 },\n onlineLab: { getThreshold: () => 180 - 80 },\n };\n\n const updateThemeByScroll = (scrollTop: number, threshold: number) => {\n if (scrollTop > threshold) {\n isWhiteTheme.value = false;\n isScrolledTheme.value = true;\n } else {\n isWhiteTheme.value = true;\n isScrolledTheme.value = false;\n }\n lastScrollTop.value = scrollTop <= 0 ? 0 : scrollTop;\n };\n\n const handleScroll = throttle(() => {\n const scrollTop = window.scrollY || document.documentElement.scrollTop || 0;\n updateThemeByScroll(scrollTop, SCROLL_THRESHOLDS.home.getThreshold());\n }, 200);\n\n const handleEventsScroll = throttle(() => {\n const scrollTop = window.scrollY || document.documentElement.scrollTop || 0;\n const threshold = matchPath(route?.path, '/OnlineLab') ? SCROLL_THRESHOLDS.onlineLab.getThreshold() : SCROLL_THRESHOLDS.events.getThreshold();\n updateThemeByScroll(scrollTop, threshold);\n }, 200);\n\n const bindByRoute = () => {\n window.removeEventListener('scroll', handleScroll);\n window.removeEventListener('scroll', handleEventsScroll);\n\n if (matchPath(route?.path, '/Home')) {\n isWhiteTheme.value = true;\n isScrolledTheme.value = false;\n window.addEventListener('scroll', handleScroll);\n nextTick(() => handleScroll());\n } else if (matchAnyPath(route?.path, ['/events', '/EventDetail', '/RaceDetail', '/OnlineLab'])) {\n isWhiteTheme.value = true;\n isScrolledTheme.value = false;\n window.addEventListener('scroll', handleEventsScroll);\n nextTick(() => handleEventsScroll());\n } else {\n isWhiteTheme.value = false;\n isScrolledTheme.value = false;\n }\n };\n\n onMounted(() => bindByRoute());\n onUnmounted(() => {\n window.removeEventListener('scroll', handleScroll);\n window.removeEventListener('scroll', handleEventsScroll);\n });\n\n return { lastScrollTop, isWhiteTheme, isScrolledTheme, bindByRoute, handleScroll, handleEventsScroll };\n}\n","import type { App } from 'vue';\nimport MyTable from './components/Table/index.vue';\nimport MyButton from './components/Button/index.vue';\nimport Header from './components/Header/src/Header.vue';\nexport * from './components/Header/src/index';\nexport { MyTable, MyButton, Header };\n\n// 插件安装方法\nexport default {\n install(app: App) {\n app.component('MyButton', MyButton);\n app.component('MyTable', MyTable);\n }\n}; "],"names":["_sfc_render","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_Fragment","_renderList","_normalizeStyle","_hoisted_3","_normalizeClass","_createCommentVNode","LocaleTypeEnum"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/components/Table/index.vue","../src/components/Button/index.vue","../src/components/Header/src/constants/locale.ts","../src/components/Header/src/config/texts.ts","../src/Icon/Down.vue","../src/Icon/Header.vue","../src/components/Header/src/Avatar.vue","../src/components/Header/src/Login.vue","../src/components/Header/src/config/locale.ts","../src/components/Header/src/Locale.vue","../src/components/Header/src/utils/path.ts","../src/components/Header/src/Header.vue","../src/components/Header/src/config/menus.ts","../src/components/Header/src/utils/openLink.ts","../src/components/Header/src/hooks/useHeaderMenu.ts","../src/components/Header/src/hooks/useHeaderTheme.ts","../src/index.ts"],"sourcesContent":["<template>\n <div class=\"w-full overflow-auto\">\n <table class=\"w-full border-collapse table-fixed\">\n <thead>\n <tr>\n <th \n v-for=\"column in columns\" \n :key=\"column.key\" \n :style=\"{ width: column.width }\"\n class=\"p-3 text-left bg-gray-100 text-gray-700 font-medium text-sm border-b border-gray-200\"\n >\n {{ column.title }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr \n v-for=\"(row, rowIndex) in data\" \n :key=\"rowKey ? row[rowKey] : rowIndex\"\n class=\"hover:bg-gray-50\"\n >\n <td \n v-for=\"column in columns\" \n :key=\"column.key\"\n class=\"p-3 text-left border-b border-gray-200 text-sm\"\n >\n <slot :name=\"column.key\" :row=\"row\" :index=\"rowIndex\">\n {{ row[column.key] }}\n </slot>\n </td>\n </tr>\n <tr v-if=\"!data || data.length === 0\">\n <td \n :colspan=\"columns.length\" \n class=\"p-8 text-center text-gray-500\"\n >\n <slot name=\"empty\">暂无数据</slot>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, PropType } from 'vue';\n\nexport interface TableColumn {\n key: string;\n title: string;\n width?: string;\n}\n\nexport default defineComponent({\n name: 'MyTable',\n props: {\n columns: {\n type: Array as PropType<TableColumn[]>,\n required: true\n },\n data: {\n type: Array as PropType<Record<string, any>[]>,\n default: () => []\n },\n rowKey: {\n type: String,\n default: ''\n }\n }\n});\n</script> ","<template>\n <button\n class=\"inline-flex justify-center items-center h-8 px-4 py-2 rounded-md text-sm font-medium transition-colors duration-200 focus:outline-none\"\n :class=\"[\n typeClasses,\n {\n 'opacity-50 cursor-not-allowed': disabled,\n 'relative': loading\n }\n ]\"\n :disabled=\"disabled || loading\"\n @click=\"handleClick\"\n >\n <span v-if=\"loading\" class=\"mr-2 w-4 h-4 i-svg-spinners-270-ring-with-bg\"></span>\n <slot></slot>\n </button>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, PropType } from 'vue';\n\ntype ButtonType = 'primary' | 'success' | 'warning' | 'danger' | 'info' | 'default';\n\nexport default defineComponent({\n name: 'MyButton',\n props: {\n type: {\n type: String as PropType<ButtonType>,\n default: 'default'\n },\n disabled: {\n type: Boolean,\n default: false\n },\n loading: {\n type: Boolean,\n default: false\n }\n },\n emits: ['click'],\n setup(props, { emit }) {\n // 根据类型计算样式类\n const typeClasses = computed(() => {\n switch (props.type) {\n case 'primary':\n return 'bg-primary hover:bg-blue-500 text-white border-transparent';\n case 'success':\n return 'bg-success hover:bg-green-500 text-white border-transparent';\n case 'warning':\n return 'bg-warning hover:bg-yellow-500 text-white border-transparent';\n case 'danger':\n return 'bg-danger hover:bg-red-500 text-white border-transparent';\n case 'info':\n return 'bg-info hover:bg-gray-500 text-white border-transparent';\n default:\n return 'bg-white hover:bg-gray-100 text-gray-700 border border-gray-300';\n }\n });\n\n const handleClick = (e: MouseEvent) => {\n if (props.disabled || props.loading) return;\n emit('click', e);\n };\n\n return {\n typeClasses,\n handleClick\n };\n }\n});\n</script>\n\n<style>\n.my-button {\n display: inline-flex;\n justify-content: center;\n align-items: center;\n line-height: 1;\n height: 32px;\n white-space: nowrap;\n cursor: pointer;\n color: #606266;\n text-align: center;\n box-sizing: border-box;\n outline: none;\n transition: 0.1s;\n font-weight: 500;\n padding: 8px 15px;\n font-size: 14px;\n border-radius: 4px;\n border: 1px solid #dcdfe6;\n background: #ffffff;\n}\n\n.my-button--primary {\n color: #fff;\n background-color: #409eff;\n border-color: #409eff;\n}\n\n.my-button--success {\n color: #fff;\n background-color: #67c23a;\n border-color: #67c23a;\n}\n\n.my-button--warning {\n color: #fff;\n background-color: #e6a23c;\n border-color: #e6a23c;\n}\n\n.my-button--danger {\n color: #fff;\n background-color: #f56c6c;\n border-color: #f56c6c;\n}\n\n.my-button.is-disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.my-button__loading {\n display: inline-block;\n width: 14px;\n height: 14px;\n border: 2px solid currentColor;\n border-radius: 50%;\n border-right-color: transparent;\n margin-right: 5px;\n animation: rotate 1s linear infinite;\n}\n\n@keyframes rotate {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n</style> ","export enum LocaleTypeEnum {\n English = 'en',\n Chinese = 'zh-CN',\n}\n","import type { InjectionKey, ComputedRef } from 'vue';\nimport { LocaleTypeEnum } from '../constants/locale';\n\nexport interface NavTexts {\n loginText: string;\n logoutText: string;\n}\n\nexport const NAV_TEXTS_KEY: InjectionKey<ComputedRef<NavTexts>> = Symbol('nav-texts');\n\nexport const buildNavTexts = (lang: LocaleTypeEnum): NavTexts => {\n const isZh = lang === LocaleTypeEnum.Chinese;\n return {\n loginText: isZh ? '登录/注册' : 'Log In / Sign Up',\n logoutText: isZh ? '退出登录' : 'Log Out',\n };\n};\n","<template>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g id=\"icon/down\">\n <path id=\"Union\" d=\"M12.1382 5.86191C11.8778 5.60156 11.4557 5.60156 11.1954 5.86191L8.0001 9.05717L4.80484 5.86191C4.54449 5.60156 4.12238 5.60156 3.86203 5.86191C3.60168 6.12226 3.60168 6.54437 3.86203 6.80472L7.29299 10.2357C7.68352 10.6262 8.31668 10.6262 8.70721 10.2357L12.1382 6.80472C12.3985 6.54437 12.3985 6.12226 12.1382 5.86191Z\" fill=\"#2C364B\"/>\n </g>\n </svg>\n</template>","<template>\n <svg width=\"19px\" height=\"20px\" viewBox=\"0 0 19 20\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <title>yonghu-2</title>\n <g id=\"页面-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <g id=\"flagos首页备份-4\" transform=\"translate(-1187, -32)\" fill=\"#FFFFFF\" fill-rule=\"nonzero\">\n <g id=\"yonghu-2\" transform=\"translate(1187, 32)\">\n <path d=\"M4.16667254,6.66658844 C4.16667254,3.9091208 6.40897956,1.66664712 9.1664472,1.66664712 C11.9239148,1.66664712 14.1663885,3.9091208 14.1663885,6.66658844 C14.1663885,9.42388942 11.9239148,11.6665298 9.1664472,11.6665298 C6.40897956,11.6665298 4.16650588,9.42388942 4.16650588,6.66658844 M18.3046733,18.9521109 C17.4853496,15.8829803 15.3253749,13.4830084 12.6130734,12.3621883 C14.5387175,11.192202 15.8330356,9.08056012 15.8330356,6.66642176 C15.832869,2.99079823 12.8420707,0 9.16628054,0 C5.49049035,0 2.4996921,2.99079823 2.4996921,6.66658844 C2.4996921,9.08056012 3.79384359,11.192202 5.72048764,12.3621883 C3.00801947,13.4838418 0.848044811,15.8829803 0.028221107,18.9521109 C-0.0900085115,19.3963877 0.174049854,19.8524478 0.618214182,19.971099 C1.06293982,20.0897021 1.51968816,19.8256771 1.63886887,19.3811059 C2.59002437,15.820481 5.68498805,13.3331769 9.16661386,13.3331769 C12.6482397,13.3331769 15.74387,15.8206477 16.6948589,19.3814392 C16.7515138,19.5951643 16.8909444,19.7775312 17.0823388,19.8882397 C17.2737332,19.9989483 17.5013346,20.0288842 17.7148469,19.9714323 C18.1590942,19.8527834 18.423176,19.3966084 18.30484,18.9522776\" id=\"形状\"></path>\n </g>\n </g>\n </g>\n </svg>\n</template>","<template>\n <el-dropdown popper-class=\"custom-dropdown\" size=\"large\" ref=\"dropdown\" trigger=\"click\" :show-arrow=\"false\" @visible-change=\"onVisibleChange\">\n <div class=\"flex items-center cursor-pointer\">\n <div class=\"w-24 h-24 rounded-50% font-600 flex-center mr-8\">\n <Header/>\n </div>\n\n <span>{{ userNickName }}</span>\n <el-icon\n class=\"el-icon--right !ml-16 transition-all duration-200\"\n :class=\"{\n ' rotate-180': dropdownVisible,\n }\"\n :size=\"16\"\n >\n <Down />\n </el-icon>\n </div>\n\n <template #dropdown>\n <el-dropdown-menu>\n <el-dropdown-item>\n <div class=\"flex items-center w-full text-14 mb-4\" @click=\"logout\">\n {{ navTexts?.logoutText }}\n </div>\n </el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n</template>\n\n<script setup lang=\"ts\">\nimport { inject, ref } from 'vue';\nimport { NAV_TEXTS_KEY } from './config/texts';\nimport Down from '../../../Icon/Down.vue';\nimport Header from '../../../Icon/Header.vue';\n\nconst navTexts = inject(NAV_TEXTS_KEY);\nconst dropdownVisible = ref(false);\nconst onVisibleChange = (visible: boolean) => {\n dropdownVisible.value = visible;\n};\ninterface Props {\n userNickName: string;\n currentPath: string;\n logout: () => void;\n}\n\ndefineProps<Props>();\n</script>\n\n<style scoped lang=\"scss\" >\n.reset-btn {\n border-color: #bec3cd;\n\n :deep(.el-button) {\n color: #3e4a54 !important;\n }\n &:hover {\n :deep(.el-button) {\n color: #3967e9 !important;\n }\n border-color: #3967e9;\n .el-icon {\n fill: #3967e9 !important;\n }\n }\n &:active {\n .el-icon {\n fill: #fff !important;\n }\n :deep(.el-button) {\n color: #fff !important;\n }\n border-color: transparent;\n background: #3967e9;\n }\n}\n</style>\n","<template>\n <el-button type=\"primary\" class=\"!rounded-4\" @click=\"login\">{{ navTexts?.loginText }}</el-button>\n</template>\n<script setup lang=\"ts\">\nimport { inject } from 'vue';\nimport { useRouter } from 'vue-router';\nimport { NAV_TEXTS_KEY } from './config/texts';\n\nconst navTexts = inject(NAV_TEXTS_KEY);\nconst router = useRouter();\n\nconst login = () => {\n router.push({ path: '/login', query: { redirect_url: encodeURIComponent(location.href) } });\n};\n</script>\n","import { LocaleTypeEnum } from '../constants/locale';\n\nexport const NAV_LOCALE_OPTIONS = [\n { value: LocaleTypeEnum.Chinese, label: '中文' },\n { value: LocaleTypeEnum.English, label: 'English' },\n];\n\nexport const NAV_LOCALE_TO_LANG: Record<LocaleTypeEnum, string> = {\n [LocaleTypeEnum.Chinese]: 'cn',\n [LocaleTypeEnum.English]: 'en',\n};\n\nexport const NAV_LANG_TO_LOCALE: Record<string, LocaleTypeEnum> = {\n cn: LocaleTypeEnum.Chinese,\n en: LocaleTypeEnum.English,\n};\n\nexport const NAV_WIKI_LANG_BY_LOCALE: Record<LocaleTypeEnum, string> = {\n [LocaleTypeEnum.Chinese]: 'zh',\n [LocaleTypeEnum.English]: 'en',\n};\n","<template>\n <el-dropdown class=\"cursor-pointer\" trigger=\"click\" popper-class=\"custom-dropdown\" placement=\"bottom\" @visible-change=\"handleChange\">\n <svg width=\"20px\" height=\"20px\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect fill=\"#D8D8D8\" opacity=\"0\" x=\"0\" y=\"0\" width=\"20\" height=\"20\"></rect>\n <path\n :fill=\"isWhite ? '#ffffff' : '#2C364B'\"\n fill-rule=\"nonzero\"\n d=\"M10,0 C4.48583334,0 0,4.48583334 0,10 C0,15.5141667 4.48583334,20 10,20 C15.5141667,20 20,15.5141667 20,10 C20,4.48583334 15.5141667,0 10,0 Z M18.6966667,10.9491667 L18.6925,10.9741667 C18.6575,11.2791667 18.6075,11.5791667 18.5425,11.8741667 L18.5425,11.875 L15.5258333,11.875 C15.657032,10.6284426 15.657032,9.37155738 15.5258333,8.125 L18.5425,8.125 C18.6075,8.42 18.6566667,8.72 18.6925,9.025 C18.6925,9.03333334 18.695,9.04166666 18.6966667,9.05083334 C18.7675,9.68166668 18.7675,10.3183333 18.6966667,10.9491667 L18.6966667,10.9491667 Z M13.34,18.0833333 C14.2783333,16.8683333 14.9891667,15.1491667 15.3516667,13.1241667 L18.1633333,13.1241667 C17.3009588,15.3668017 15.5579816,17.158563 13.34,18.0825 L13.34,18.0833333 Z M18.1625,6.87333334 L15.3516667,6.87333334 C14.9891667,4.84833334 14.2783333,3.13 13.34,1.915 C15.5576659,2.83912386 17.3003173,4.63085972 18.1625,6.87333334 L18.1625,6.87333334 Z M14.2658333,8.12333334 C14.4114344,9.36909341 14.4114344,10.6275733 14.2658333,11.8733333 L10.6241667,11.8733333 L10.6241667,8.12333334 L14.2658333,8.12333334 Z M10.6241667,6.87333334 L10.6241667,1.355 C12.1825,1.825 13.5008333,4.0025 14.07,6.87583334 L10.625,6.87583334 L10.6241667,6.87333334 Z M10.6241667,13.1233333 L14.07,13.1233333 C13.5008333,15.9983333 12.1825,18.175 10.625,18.645 L10.625,13.125 L10.6241667,13.1233333 Z M1.8375,13.1241667 L4.64833334,13.1241667 C5.01083334,15.1491667 5.72166668,16.8683333 6.66,18.0825 C4.44233408,17.1583761 2.69968275,15.3666403 1.8375,13.1241667 L1.8375,13.1241667 Z M6.66,1.91666666 C5.72166666,3.13 5.01083334,4.85 4.64833334,6.875 L1.83666666,6.875 C2.69923303,4.63220345 4.44253606,2.84041679 6.66083334,1.91666666 L6.66,1.91666666 Z M5.73416666,11.875 C5.58856559,10.6292399 5.58856559,9.37076007 5.73416666,8.125 L9.375,8.125 L9.375,11.875 L5.73333334,11.875 L5.73416666,11.875 Z M9.375,13.125 L9.375,18.6458333 C7.81666666,18.1758333 6.49916666,15.9983333 5.93,13.125 L9.375,13.125 Z M9.375,6.875 L5.93,6.875 C6.49916666,4.00166666 7.81666666,1.825 9.375,1.35416666 L9.375,6.875 Z M1.30416666,9.05 C1.30416666,9.04333334 1.30666666,9.03583334 1.3075,9.02833334 C1.34166666,8.725 1.39166666,8.42333334 1.4575,8.125 L4.47416666,8.125 C4.34243809,9.37152952 4.34243809,10.6284705 4.47416666,11.875 L1.4575,11.875 C1.39166666,11.5766667 1.34166666,11.275 1.3075,10.9716667 L1.30416666,10.9491667 C1.23220566,10.3184348 1.23220566,9.68156522 1.30416666,9.05083334 L1.30416666,9.05 Z\"\n />\n </svg>\n <template #dropdown>\n <el-dropdown-menu>\n <el-dropdown-item\n v-for=\"locale in localeOptions\"\n :key=\"locale.value\"\n :class=\"{ 'is-active': locale.value === currentLocale }\"\n @click=\"emitChangeLanguage(locale.value)\"\n >\n <span :class=\"{ 'color-primary': locale.value === currentLocale }\">\n {{ locale.label }}\n </span>\n </el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n</template>\n<script setup lang=\"tsx\">\nimport { ref, computed } from 'vue';\nimport { LocaleTypeEnum } from './constants/locale';\nimport { NAV_LOCALE_OPTIONS } from './config/locale';\n\nconst active = ref(false);\n\nconst handleChange = (val: boolean) => {\n active.value = val;\n};\n\ninterface LocaleOption {\n value: LocaleTypeEnum;\n label: string;\n}\n\ninterface Props {\n isWhiteTheme?: boolean;\n currentLocale: LocaleTypeEnum;\n localeOptions?: LocaleOption[];\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n isWhiteTheme: false,\n localeOptions: () => NAV_LOCALE_OPTIONS,\n});\n\nconst emits = defineEmits<{\n (e: 'change-language', locale: LocaleTypeEnum): void;\n}>();\n\nconst isWhite = computed(() => props.isWhiteTheme);\nconst currentLocale = computed(() => props.currentLocale);\nconst localeOptions = computed(() => props.localeOptions);\n\nconst emitChangeLanguage = (locale: LocaleTypeEnum) => {\n if (locale === currentLocale.value) {\n return;\n }\n emits('change-language', locale);\n};\n</script>\n<style scoped lang=\"scss\"></style>\n","export const matchPath = (path: string, targetPath: string): boolean => {\n if (!path || !targetPath) return false;\n return path.toLowerCase().indexOf(targetPath.toLowerCase()) >= 0;\n};\n\nexport const matchAnyPath = (path: string, targetPaths: string[]): boolean => {\n return targetPaths.some(targetPath => matchPath(path, targetPath));\n};\n","<template>\n <div\n class=\"w-full header-wrapper h-64px pl-120 pr-120 py-19 backdrop-blur-[14px] flex items-center justify-between text-#000 fixed left-0 top-0 z-99 bg-transparent overflow-x-scroll\"\n :class=\"{\n 'theme-white': isWhiteTheme,\n 'theme-scrolled': isScrolledTheme,\n '!b-0': matchPath(routePath, '/CommunityMembers'),\n dropdownVisible: dropdownVisible,\n }\"\n >\n <div class=\"flex-center\">\n <img\n class=\"logo\"\n :src=\"isWhiteTheme || dropdownVisible ? 'https://flagos.ks3-cn-beijing.ksyuncs.com/images/logo.svg' : 'https://flagos.ks3-cn-beijing.ksyuncs.com/images/logo-black.svg'\"\n @click=\"onLogoClick\"\n />\n <div class=\"flex gap-48 ml-80\">\n <div\n v-for=\"(menu, index) in menuList\"\n :index=\"index\"\n class=\"menu-item cursor-pointer whitespace-nowrap\"\n :class=\"{ active: menu.active }\"\n >\n <el-dropdown\n v-if=\"menu.dropdownList && menu.id === 'learn'\"\n popper-class=\"custom-dropdown-new\"\n :show-arrow=\"false\"\n @visible-change=\"handleDropdownVisibleChange\"\n >\n <span class=\"text-16\">{{ menu.label}}</span>\n <template #dropdown>\n <el-dropdown-menu class=\"flex-row\">\n <el-dropdown-item\n v-for=\"(childMenu, idx) in menu.dropdownList\"\n :key=\"idx\"\n :class=\"{ active: matchPath(routePath, childMenu.path) }\"\n @click=\"onJumpPage(menu, childMenu)\"\n >\n <span class=\"text-14 mb-16 !font-500\">{{ childMenu.label }}</span>\n <span class=\"text-14 whitespace-normal !font-400\">{{ childMenu.desc }}</span>\n </el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n <el-dropdown\n v-else-if=\"menu.dropdownList && menu.id === 'tools'\"\n popper-class=\"custom-dropdown-new\"\n :show-arrow=\"false\"\n @visible-change=\"handleDropdownVisibleChange\"\n >\n <span class=\"text-16\">{{ menu.label }}</span>\n <template #dropdown>\n <el-dropdown-menu>\n <el-dropdown-item v-for=\"(childMenu, idx) in menu.dropdownList\" :key=\"idx\" @click=\"onJumpPage(menu, childMenu)\">\n <span class=\"text-14 mb-16 !font-500\">{{childMenu.label }}</span>\n <span class=\"text-14 whitespace-normal !font-400\">{{ childMenu.desc }}</span>\n </el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n <el-dropdown v-else-if=\"menu.dropdownGroups && menu.id === 'projects'\" popper-class=\"custom-dropdown-new\" :show-arrow=\"false\" @visible-change=\"handleDropdownVisibleChange\">\n <span class=\"text-16\">{{ menu.label}}</span>\n <template #dropdown>\n <el-dropdown-menu class=\"flex gap-20 el-dropdown-menu_out\">\n <ul v-for=\"(group, idx) in menu.dropdownGroups\" :key=\"idx\" class=\"flex-1 el-dropdown-menu !w-[50%] !max-h-560px\">\n <span class=\"text-14 text-#bbbbbb leading-22 mb-20\">{{ group.label }}</span>\n <el-dropdown-item\n v-for=\"(childMenu, cidx) in group.list\"\n :key=\"cidx\"\n class=\"el-dropdown-menu__item !w-full\"\n @click=\"onJumpPage(menu, childMenu)\"\n >\n <span class=\"text-14 mb-16 !font-500\">{{ childMenu.label }}</span>\n <span class=\"text-14 whitespace-normal !font-400\">{{ childMenu.desc }}</span>\n </el-dropdown-item>\n </ul>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n <span v-else @click=\"onJumpPage(menu)\">{{ menu.label }}</span>\n </div>\n </div>\n </div>\n <div class=\"flex-center\" :class=\"isWhiteTheme ? 'text-#ffffff' : 'text-#262642'\">\n <Locale :isWhiteTheme=\"isWhiteTheme || dropdownVisible\" :current-locale=\"currentLocale\" @change-language=\"onChangeLanguage\" />\n <Login v-if=\"!userName\" class=\"ml-20\" />\n <Avatar\n v-if=\"userName\"\n class=\"header_avatar ml-20\"\n :class=\"isWhiteTheme || dropdownVisible ? 'text-#ffffff' : 'text-#262642'\"\n :user-nick-name=\"userNickName\"\n :current-path=\"routePath\"\n :logout=\"onLogout\"\n />\n </div>\n </div>\n</template>\n<script setup lang=\"ts\">\nimport { computed, provide, ref } from 'vue';\nimport Avatar from './Avatar.vue';\nimport Login from './Login.vue';\nimport Locale from './Locale.vue';\nimport { LocaleTypeEnum } from './constants/locale';\nimport { matchPath } from './utils/path';\nimport type { NavMenuItem, NavChildItem } from './config/menus';\nimport { NAV_TEXTS_KEY, buildNavTexts } from './config/texts';\nimport 'uno.css';\ninterface Props {\n routePath: string;\n menuList: NavMenuItem[];\n isWhiteTheme: boolean;\n isScrolledTheme: boolean;\n currentLocale: LocaleTypeEnum;\n userName?: string;\n userNickName: string;\n onLogoClick: () => void;\n onJumpPage: (menu: NavMenuItem, childMenu?: NavChildItem) => void;\n onChangeLanguage: (locale: LocaleTypeEnum) => void;\n onLogout: () => void;\n}\n\nconst dropdownVisible = ref(false)\nconst handleDropdownVisibleChange = (visible: boolean) => {\n dropdownVisible.value = visible\n}\nconst props = defineProps<Props>();\n\nprovide(\n NAV_TEXTS_KEY,\n computed(() => buildNavTexts(props.currentLocale))\n);\n\n</script>\n<style scoped lang=\"scss\">\n.header-wrapper {\n transition: all 0.3s ease;\n border-bottom: 1px solid rgba(0, 0, 0, 0.13);\n &.theme-white {\n color: #fff;\n border: none;\n background: transparent;\n svg {\n color: #fff;\n }\n .menu-item {\n &::before {\n background-color: #fff;\n }\n :deep(.el-dropdown) {\n color: #fff;\n }\n }\n }\n &.theme-scrolled {\n background: #fff;\n color: #262642;\n border-bottom: 1px solid rgba(0, 0, 0, 0.13);\n svg {\n color: #262642;\n }\n .menu-item {\n &::before {\n background-color: #262642;\n }\n :deep(.el-dropdown) {\n color: #262642;\n }\n }\n }\n &.dropdownVisible {\n background: #07111e !important;\n opacity: 0.95 !important;\n color: #fff;\n border: none;\n svg {\n color: #fff;\n }\n .menu-item {\n &::before {\n background-color: #fff;\n }\n :deep(.el-dropdown) {\n color: #fff;\n }\n }\n }\n .logo {\n width: 100px;\n height: 38px;\n cursor: pointer;\n object-fit: contain;\n }\n svg {\n color: #262642;\n }\n .menu-item {\n display: flex;\n align-items: center;\n position: relative;\n font-size: 16px;\n &::before {\n content: '';\n display: block;\n position: absolute;\n left: 0;\n bottom: -2px;\n width: 0;\n height: 2px;\n border-radius: 1px;\n background-color: #262642;\n transition: all 0.3s ease;\n transform-origin: center;\n }\n &.active {\n font-weight: 600;\n &::before {\n width: 100%;\n }\n }\n :deep(.el-dropdown) {\n color: #262642;\n }\n }\n}\n</style>\n<style lang=\"scss\">\n\n .el-popper.custom-dropdown-new {\n border: none !important;\n border-radius: 0 !important;\n padding: 0 !important;\n width: 100%;\n // margin-left: -1px;\n // height: 90%;\n max-width: 100% !important;\n margin-top: 12px;\n // inset: 64px auto auto auto !important;\n box-shadow: none;\n background: #07111E;\n opacity: 0.95;\n .el-dropdown__list {\n width: 100% !important;\n height: 100% !important;\n padding: 56px 120px;\n \n .el-dropdown-menu_out{\n display: flex;\n flex-wrap: wrap;\n max-height: 90% !important;\n flex-direction: row !important;\n column-gap: 20px;\n row-gap: 4px;\n background: transparent !important;\n box-shadow: none !important;\n }\n \n .el-dropdown-menu {\n display: flex;\n max-height: 360px;\n flex-direction: column;\n flex-wrap: wrap;\n column-gap: 20px;\n row-gap: 4px;\n background: transparent !important;\n box-shadow: none !important;\n &.flex-row {\n flex-direction: row !important;\n flex-wrap: nowrap;\n }\n .el-dropdown-menu__item{\n width: calc((100% - 20px * 2) / 3);\n padding: 0 !important;\n min-height: 64px;\n font-family: PingFangSC, PingFang SC;\n font-weight: 600;\n font-size: 14px;\n color: #FFFFFF !important;\n line-height: 22px;\n padding: 20px 16px !important;\n border-radius: 8px;\n border: 1px solid transparent;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n }\n .el-dropdown-menu__item:hover, .el-dropdown-menu__item:focus {\n background: rgba(255,255,255, 0.05);\n border: 1px solid rgba(255,255,255, 0.2);\n \n }\n }\n }\n }\n</style>","import { LocaleTypeEnum } from '../constants/locale';\nimport { NAV_WIKI_LANG_BY_LOCALE } from './locale';\n\n// ---------- Types ----------\n\nexport interface NavChildItem {\n id: string;\n label: string;\n path: string;\n desc?: string;\n type: 'route' | 'link' | 'unopen';\n}\n\nexport interface NavDropdownGroup {\n id: string;\n label: string;\n list: NavChildItem[];\n}\n\nexport interface NavMenuItem {\n id: string;\n label: string;\n path?: string;\n active?: boolean;\n /** flat items (tools / learn) */\n dropdownList?: NavChildItem[];\n /** grouped items (projects) */\n dropdownGroups?: NavDropdownGroup[];\n}\nconst mainTestHost = ['platform-aiintegration-dev.baai.ac.cn']\nconst mainProdHost =['flagos.io', 'flagos.net', 'www.flagos.io', 'www.flagos.net']\nconst mainHost = [...mainProdHost, ...mainTestHost]\n// ---------- Mock data ----------\nconst isMainApp = () => {\n return mainHost.includes(location.host)\n\n}\n// innerMain主站内点击\nconst buildMenu = (lang: LocaleTypeEnum, innerMain =false): NavMenuItem[] => {\n const isZh = lang === LocaleTypeEnum.Chinese;\n const wikiLang = NAV_WIKI_LANG_BY_LOCALE[lang];\n\n return [\n {\n id: 'home',\n label: isZh ? '首页' : 'Home',\n path: innerMain ? '/Home': resolvePath('/Home'),\n },\n {\n id: 'projects',\n label: isZh ? '软件栈' : 'Software Stack',\n dropdownGroups: [\n {\n id: 'coreLib',\n label: isZh ? '开源核心库' : 'Open-Source Core Libraries',\n list: [\n {\n id: 'flagscale',\n label: 'FlagScale',\n path: innerMain ? `/FlagScale`: resolvePath('/FlagScale'),\n desc: isZh\n ? '统一多芯片、多后端的大模型框架,提供覆盖训练、微调与推理部署的全流程能力'\n : 'A unified multi-backend large model framework across diverse chips, providing end-to-end capabilities spanning training, fine-tuning, and inference deployment.',\n type: 'route',\n },\n {\n id: 'flaggems',\n label: 'FlagGems',\n path: innerMain ? `/FlagGems` : resolvePath('/FlagGems'),\n desc: isZh\n ? '基于Triton实现的高性能通用算子库'\n : 'A high-performance general operator library built on Triton.',\n type: 'route',\n },\n {\n id: 'flagtree',\n label: 'FlagTree',\n path: innerMain ? '/FlagTree': resolvePath('/FlagTree'),\n desc: isZh\n ? '面向多种硬件的开源、统一AI编译器'\n : 'An open-source unified AI compiler for diverse hardware.',\n type: 'route',\n },\n {\n id: 'flagcx',\n label: 'FlagCX',\n path: innerMain ? '/FlagCX' : resolvePath('/FlagCX'),\n desc: isZh\n ? '一款专为大规模AI系统设计的可扩展、自适应高性能跨芯片通信库'\n : 'A scalable, adaptive, high-performance cross-chip communication library designed for large-scale AI systems.',\n type: 'route',\n },\n ],\n },\n {\n id: 'ecosystem',\n label: isZh ? '生态使能项目' : 'FlagOS Ecosystem Enablement Project',\n list: [\n {\n id: 'megatronfl',\n label: 'Megatron-FL',\n path: 'https://github.com/flagos-ai/Megatron-LM-FL',\n desc: isZh\n ? '为Megatron-LM打造的多芯片插件,实现大模型多芯片高效训练'\n : 'A multi-chip plugin for Megatron-LM, enabling efficient large-scale training across diverse chips.',\n type: 'link',\n },\n {\n id: 'vllmpluginfl',\n label: 'vLLM-plugin-FL',\n path: 'https://github.com/flagos-ai/vllm-plugin-FL',\n desc: isZh\n ? '为vLLM打造的多芯片插件,实现大模型多芯片高效推理部署'\n : 'A multi-chip plugin for vLLM, enabling efficient large model inference and deployment across diverse chips.',\n type: 'link',\n },\n {\n id: 'transformerenginefl',\n label: 'TransformerEngine-FL',\n path: 'https://github.com/flagos-ai/TransformerEngine-FL',\n desc: isZh\n ? '为TransformerEngine打造的多芯片插件,实现多种芯片上分布式算子'\n : 'A multi-chip plugin for TransformerEngine, enabling distributed operators across diverse chip architectures.',\n type: 'link',\n },\n ],\n },\n ],\n },\n {\n id: 'tools',\n label: isZh ? '工具' : 'Tools',\n dropdownList: [\n {\n id: 'skill',\n label: isZh ? 'Skill广场' : 'SkillHub',\n path: resolvePath('/SkillHub', 'skillhub'),\n desc: isZh ? '一站式AI计算技能库' : 'One-stop AI computing skills library.',\n type: 'route',\n },\n {\n id: 'onlinelab',\n label: isZh ? '线上实验室' : 'Online Laboratory',\n path: innerMain ?'/OnlineLab': resolvePath('/OnlineLab'),\n desc: isZh ? '开箱即用的在线实验环境' : 'Ready-to-use online experiment environment.',\n type: 'route',\n },\n {\n id: 'modelplatform',\n label: isZh ? '模型服务平台' : 'MaaS',\n path: '',\n desc: isZh\n ? '全生命周期大模型API服务平台'\n : 'A full-lifecycle API service platform for large models.',\n type: 'unopen',\n },\n {\n id: 'kernelgen',\n label: 'KernelGen',\n path: 'https://kernelgen.flagos.io/',\n desc: isZh\n ? '分钟级构建Kernel,支持多芯片后端'\n : 'Build Kernels in Minutes with Multi-Backend Support.',\n type: 'link',\n },\n {\n id: 'flagrelease',\n label: 'FlagRelease',\n path: '',\n desc: isZh\n ? '一套自动化迁移大模型至不同硬件产品的工具平台'\n : 'An automated tool platform for migrating large model to diverse hardware.',\n type: 'unopen',\n },\n {\n id: 'flagcicd',\n label: 'FlagCICD',\n path: '',\n desc: isZh\n ? '面向 AI 开发的持续集成 / 持续部署工具链'\n : 'A CI/CD toolchain for AI development.',\n type: 'unopen',\n },\n {\n id: 'flagmodelhub',\n label: isZh ? '九鼎AI一体化平台' : 'Jiuding AI Integrated Platform',\n path: '',\n desc: isZh\n ? '整合 FlagOS 全栈能力,提供从模型开发、训练到部署的一站式 AI 工程化平台'\n : 'Jiuding AI Platform.',\n type: 'unopen',\n },\n ],\n },\n {\n id: 'docs',\n label: isZh ? '文档' : 'Docs',\n },\n {\n id: 'learn',\n label: isZh ? '学习' : 'Learn',\n dropdownList: [\n {\n id: 'wiki',\n label: 'Wiki',\n desc: isZh ? '智能文档,边看边问边学': 'AI-powered interactive docs: query and learn in real-time.',\n path: `https://wiki.flagos.io`,\n type: 'link',\n },\n { id: 'professionalcourse', label: isZh ? '专业课' : 'Core Courses', desc: isZh ? '众智FlagOS系列开源课程' : 'The official open-source course series for the FlagOS ecosystem.', path: 'https://flagos.educoder.net/paths', type: 'link' },\n { id: 'course',label: isZh ? '讲座' : 'Tech Talks', desc: isZh ? '大咖分享,业界前沿讲座' : 'Cutting-edge insights and deep dives from industry leaders.', path: '/LearnCenter', type: 'route' },\n ],\n },\n {\n id: 'events',\n label: isZh ? '活动赛事' : 'Event & Competition',\n path: innerMain ?'/events': resolvePath('/events'),\n },\n {\n id: 'onlinelab-top',\n label: isZh ? '线上实验室' : 'Online Laboratory',\n path: innerMain ?'/OnlineLab': resolvePath('/OnlineLab'),\n },\n ];\n};\nconst getSubHostName = () => {\n if(mainHost.includes(location.hostname)) {\n return location.hostname.split('.').slice(1).join('.')\n } else {\n return mainTestHost[0]+ '/flag-os'\n }\n}\nconst resolvePath = (path: string, subAppName = ''): string => {\n if(subAppName){\n return location.hostname.includes(subAppName) ? path: mainHost.includes(location.hostname) ? `${location.protocol}//${[subAppName, ...getSubHostName().split('.')].join('.')}`: `${location.protocol}//${[subAppName, ...mainTestHost[0].split('.')].join('.')}`;\n } else {\n return `${location.protocol}//${getSubHostName()}${path}`;\n }\n};\n\nconst resolveMenuPaths = (items: NavMenuItem[]): NavMenuItem[] => {\n return items;\n};\n\n/**\n * Fetch nav menu by lang.\n * Replace the mock body with a real HTTP call when the backend is ready:\n * return request({ method: 'get', url: '/nav/menus', params: { lang } }).then(res => res.data);\n */\nexport const getNavMenuApi = (lang: LocaleTypeEnum, isMainApp =false): NavMenuItem[] => {\n return resolveMenuPaths(buildMenu(lang, isMainApp));\n};\n","export const openLink = (url: string) => {\n window.open(url, '_blank');\n};\n","import { ref, watch } from 'vue';\nimport type { Ref } from 'vue';\nimport { ElMessage } from 'element-plus';\nimport type { LocaleTypeEnum } from '../constants/locale';\nimport { getNavMenuApi, type NavMenuItem, type NavChildItem } from '../config/menus';\nimport { openLink } from '../utils/openLink';\nimport { matchPath, matchAnyPath } from '../utils/path';\nimport { NavigationFailure } from 'vue-router';\n\nexport function useHeaderMenu(\n currentLocale: Ref<LocaleTypeEnum>,\n push: (path: any) => Promise<NavigationFailure | void | undefined>,\n /** String shown when user clicks an unavailable item (e.g. t('projects.unopentip')) */\n unopenTip: Ref<string> | string,\n innerMain = true\n) {\n const menuList = ref<NavMenuItem[]>([]);\n\n const fetchMenu = (lang: LocaleTypeEnum) => {\n const data = getNavMenuApi(lang, innerMain);\n // preserve active state across refetch\n const activeId = menuList.value.find(m => m.active)?.id;\n menuList.value = data.map(m => ({ ...m, active: m.id === activeId }));\n };\n\n watch(currentLocale, lang => fetchMenu(lang), { immediate: true });\n\n const syncActiveMenu = (route: any) => {\n menuList.value.forEach(item => (item.active = false));\n const curIdx = menuList.value.findIndex(item => {\n if (item.dropdownList) {\n return item.dropdownList.some(child => matchPath(route?.path, child.path));\n }\n if (item.dropdownGroups) {\n return item.dropdownGroups.some(group =>\n group.list.some(child => matchPath(route?.path, child.path))\n );\n }\n if (matchPath(item.path as string, '/events') && matchAnyPath(route?.path, ['/EventDetail', '/RaceDetail'])) return true;\n if (item.id === 'onlinelab-top' && matchPath(route?.path, '/OnlineLab')) return true;\n return matchPath(route?.path, item.path as string);\n });\n if (curIdx >= 0) menuList.value[curIdx].active = true;\n };\n\n const handleJumpPage = (menu: NavMenuItem, childMenu?: NavChildItem) => {\n const tip = typeof unopenTip === 'string' ? unopenTip : unopenTip.value;\n\n if (['tools', 'projects', 'learn'].includes(menu.id)) {\n if (!childMenu) return;\n if (childMenu.path.startsWith('http')) return openLink(childMenu.path);\n if (childMenu.path) return push(childMenu.path);\n if (childMenu.type === 'unopen') return ElMessage.warning(tip);\n }\n else if (menu.id === 'docs') return openLink('https://docs.flagos.io/');\n else {\n if(menu.path?.startsWith('http')) {\n openLink(menu.path)\n } else {\n menuList.value.forEach(item => (item.active = false));\n menu.active = true;\n push(menu.path);\n }\n }\n \n };\n\n return { menuList, syncActiveMenu, handleJumpPage };\n}\n","import { ref, nextTick, onMounted, onUnmounted } from 'vue';\nimport throttle from 'lodash/throttle';\nimport { matchPath, matchAnyPath } from '../utils/path';\n\nexport function useHeaderTheme(route: any) {\n const lastScrollTop = ref(0);\n const isWhiteTheme = ref(false);\n const isScrolledTheme = ref(false);\n\n const SCROLL_THRESHOLDS = {\n home: { getThreshold: () => window.innerHeight - 80 },\n events: { getThreshold: () => 390 - 80 },\n onlineLab: { getThreshold: () => 180 - 80 },\n };\n\n const updateThemeByScroll = (scrollTop: number, threshold: number) => {\n if (scrollTop > threshold) {\n isWhiteTheme.value = false;\n isScrolledTheme.value = true;\n } else {\n isWhiteTheme.value = true;\n isScrolledTheme.value = false;\n }\n lastScrollTop.value = scrollTop <= 0 ? 0 : scrollTop;\n };\n\n const handleScroll = throttle(() => {\n const scrollTop = window.scrollY || document.documentElement.scrollTop || 0;\n updateThemeByScroll(scrollTop, SCROLL_THRESHOLDS.home.getThreshold());\n }, 200);\n\n const handleEventsScroll = throttle(() => {\n const scrollTop = window.scrollY || document.documentElement.scrollTop || 0;\n const threshold = matchPath(route?.path, '/OnlineLab') ? SCROLL_THRESHOLDS.onlineLab.getThreshold() : SCROLL_THRESHOLDS.events.getThreshold();\n updateThemeByScroll(scrollTop, threshold);\n }, 200);\n\n const bindByRoute = () => {\n window.removeEventListener('scroll', handleScroll);\n window.removeEventListener('scroll', handleEventsScroll);\n\n if (matchPath(route?.path, '/Home')) {\n isWhiteTheme.value = true;\n isScrolledTheme.value = false;\n window.addEventListener('scroll', handleScroll);\n nextTick(() => handleScroll());\n } else if (matchAnyPath(route?.path, ['/events', '/EventDetail', '/RaceDetail', '/OnlineLab'])) {\n isWhiteTheme.value = true;\n isScrolledTheme.value = false;\n window.addEventListener('scroll', handleEventsScroll);\n nextTick(() => handleEventsScroll());\n } else {\n isWhiteTheme.value = false;\n isScrolledTheme.value = false;\n }\n };\n\n onMounted(() => bindByRoute());\n onUnmounted(() => {\n window.removeEventListener('scroll', handleScroll);\n window.removeEventListener('scroll', handleEventsScroll);\n });\n\n return { lastScrollTop, isWhiteTheme, isScrolledTheme, bindByRoute, handleScroll, handleEventsScroll };\n}\n","import type { App } from 'vue';\nimport MyTable from './components/Table/index.vue';\nimport MyButton from './components/Button/index.vue';\nimport Header from './components/Header/src/Header.vue';\nexport * from './components/Header/src/index';\nexport { MyTable, MyButton, Header };\n\n// 插件安装方法\nexport default {\n install(app: App) {\n app.component('MyButton', MyButton);\n app.component('MyTable', MyTable);\n }\n}; "],"names":["_sfc_render","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_Fragment","_renderList","_normalizeStyle","_hoisted_3","_normalizeClass","_createCommentVNode","LocaleTypeEnum","isMainApp"],"mappings":"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"}
|
package/dist/index.umd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("vue"),require("vue-router"),require("element-plus"),require("lodash/throttle")):"function"==typeof define&&define.amd?define(["exports","vue","vue-router","element-plus","lodash/throttle"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).BaaiComponents={},e.Vue,e.VueRouter,e.ElementPlus,e.throttle)}(this,(function(e,t,o,l,n){"use strict";const a=(e=>e&&"object"==typeof e&&"default"in e?e:{default:e})(n),r=t.defineComponent({name:"MyTable",props:{columns:{type:Array,required:!0},data:{type:Array,default:()=>[]},rowKey:{type:String,default:""}}}),i=(e,t)=>{const o=e.__vccOpts||e;for(const[l,n]of t)o[l]=n;return o},s={class:"w-full overflow-auto"},c={class:"w-full border-collapse table-fixed"},d={key:0},p=["colspan"];const u=i(r,[["render",function(e,o,l,n,a,r){return t.openBlock(),t.createElementBlock("div",s,[t.createElementVNode("table",c,[t.createElementVNode("thead",null,[t.createElementVNode("tr",null,[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(e.columns,(e=>(t.openBlock(),t.createElementBlock("th",{key:e.key,style:t.normalizeStyle({width:e.width}),class:"p-3 text-left bg-gray-100 text-gray-700 font-medium text-sm border-b border-gray-200"},t.toDisplayString(e.title),5)))),128))])]),t.createElementVNode("tbody",null,[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(e.data,((o,l)=>(t.openBlock(),t.createElementBlock("tr",{key:e.rowKey?o[e.rowKey]:l,class:"hover:bg-gray-50"},[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(e.columns,(n=>(t.openBlock(),t.createElementBlock("td",{key:n.key,class:"p-3 text-left border-b border-gray-200 text-sm"},[t.renderSlot(e.$slots,n.key,{row:o,index:l},(()=>[t.createTextVNode(t.toDisplayString(o[n.key]),1)]))])))),128))])))),128)),e.data&&0!==e.data.length?t.createCommentVNode("",!0):(t.openBlock(),t.createElementBlock("tr",d,[t.createElementVNode("td",{colspan:e.columns.length,class:"p-8 text-center text-gray-500"},[t.renderSlot(e.$slots,"empty",{},(()=>[o[0]||(o[0]=t.createTextVNode("暂无数据"))]))],8,p)]))])])])}]]),m=t.defineComponent({name:"MyButton",props:{type:{type:String,default:"default"},disabled:{type:Boolean,default:!1},loading:{type:Boolean,default:!1}},emits:["click"],setup:(e,{emit:o})=>({typeClasses:t.computed((()=>{switch(e.type){case"primary":return"bg-primary hover:bg-blue-500 text-white border-transparent";case"success":return"bg-success hover:bg-green-500 text-white border-transparent";case"warning":return"bg-warning hover:bg-yellow-500 text-white border-transparent";case"danger":return"bg-danger hover:bg-red-500 text-white border-transparent";case"info":return"bg-info hover:bg-gray-500 text-white border-transparent";default:return"bg-white hover:bg-gray-100 text-gray-700 border border-gray-300"}})),handleClick:t=>{e.disabled||e.loading||o("click",t)}})}),g=["disabled"],h={key:0,class:"mr-2 w-4 h-4 i-svg-spinners-270-ring-with-bg"};const f=i(m,[["render",function(e,o,l,n,a,r){return t.openBlock(),t.createElementBlock("button",{class:t.normalizeClass(["inline-flex justify-center items-center h-8 px-4 py-2 rounded-md text-sm font-medium transition-colors duration-200 focus:outline-none",[e.typeClasses,{"opacity-50 cursor-not-allowed":e.disabled,relative:e.loading}]]),disabled:e.disabled||e.loading,onClick:o[0]||(o[0]=(...t)=>e.handleClick&&e.handleClick(...t))},[e.loading?(t.openBlock(),t.createElementBlock("span",h)):t.createCommentVNode("",!0),t.renderSlot(e.$slots,"default")],10,g)}]]);var w=(e=>(e.English="en",e.Chinese="zh-CN",e))(w||{});const C=Symbol("nav-texts"),v=e=>{const t=e===w.Chinese;return{loginText:t?"登录/注册":"Log In / Sign Up",logoutText:t?"退出登录":"Log Out"}},k={width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg"};const b=i({},[["render",function(e,o){return t.openBlock(),t.createElementBlock("svg",k,o[0]||(o[0]=[t.createElementVNode("g",{id:"icon/down"},[t.createElementVNode("path",{id:"Union",d:"M12.1382 5.86191C11.8778 5.60156 11.4557 5.60156 11.1954 5.86191L8.0001 9.05717L4.80484 5.86191C4.54449 5.60156 4.12238 5.60156 3.86203 5.86191C3.60168 6.12226 3.60168 6.54437 3.86203 6.80472L7.29299 10.2357C7.68352 10.6262 8.31668 10.6262 8.70721 10.2357L12.1382 6.80472C12.3985 6.54437 12.3985 6.12226 12.1382 5.86191Z",fill:"#2C364B"})],-1)]))}]]),y={width:"19px",height:"20px",viewBox:"0 0 19 20",version:"1.1",xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink"};const L=i({},[["render",function(e,o){return t.openBlock(),t.createElementBlock("svg",y,o[0]||(o[0]=[t.createElementVNode("title",null,"yonghu-2",-1),t.createElementVNode("g",{id:"页面-1",stroke:"none","stroke-width":"1",fill:"none","fill-rule":"evenodd"},[t.createElementVNode("g",{id:"flagos首页备份-4",transform:"translate(-1187, -32)",fill:"#FFFFFF","fill-rule":"nonzero"},[t.createElementVNode("g",{id:"yonghu-2",transform:"translate(1187, 32)"},[t.createElementVNode("path",{d:"M4.16667254,6.66658844 C4.16667254,3.9091208 6.40897956,1.66664712 9.1664472,1.66664712 C11.9239148,1.66664712 14.1663885,3.9091208 14.1663885,6.66658844 C14.1663885,9.42388942 11.9239148,11.6665298 9.1664472,11.6665298 C6.40897956,11.6665298 4.16650588,9.42388942 4.16650588,6.66658844 M18.3046733,18.9521109 C17.4853496,15.8829803 15.3253749,13.4830084 12.6130734,12.3621883 C14.5387175,11.192202 15.8330356,9.08056012 15.8330356,6.66642176 C15.832869,2.99079823 12.8420707,0 9.16628054,0 C5.49049035,0 2.4996921,2.99079823 2.4996921,6.66658844 C2.4996921,9.08056012 3.79384359,11.192202 5.72048764,12.3621883 C3.00801947,13.4838418 0.848044811,15.8829803 0.028221107,18.9521109 C-0.0900085115,19.3963877 0.174049854,19.8524478 0.618214182,19.971099 C1.06293982,20.0897021 1.51968816,19.8256771 1.63886887,19.3811059 C2.59002437,15.820481 5.68498805,13.3331769 9.16661386,13.3331769 C12.6482397,13.3331769 15.74387,15.8206477 16.6948589,19.3814392 C16.7515138,19.5951643 16.8909444,19.7775312 17.0823388,19.8882397 C17.2737332,19.9989483 17.5013346,20.0288842 17.7148469,19.9714323 C18.1590942,19.8527834 18.423176,19.3966084 18.30484,18.9522776",id:"形状"})])])],-1)]))}]]),x={class:"flex items-center cursor-pointer"},E={class:"w-24 h-24 rounded-50% font-600 flex-center mr-8"},B=i(t.defineComponent({__name:"Avatar",props:{userNickName:{},currentPath:{},logout:{type:Function}},setup(e){const o=t.inject(C),l=t.ref(!1),n=e=>{l.value=e};return(e,a)=>{const r=t.resolveComponent("el-icon"),i=t.resolveComponent("el-dropdown-item"),s=t.resolveComponent("el-dropdown-menu"),c=t.resolveComponent("el-dropdown");return t.openBlock(),t.createBlock(c,{"popper-class":"custom-dropdown",size:"large",ref:"dropdown",trigger:"click","show-arrow":!1,onVisibleChange:n},{dropdown:t.withCtx((()=>[t.createVNode(s,null,{default:t.withCtx((()=>[t.createVNode(i,null,{default:t.withCtx((()=>{var l;return[t.createElementVNode("div",{class:"flex items-center w-full text-14 mb-4",onClick:a[0]||(a[0]=(...t)=>e.logout&&e.logout(...t))},t.toDisplayString(null==(l=t.unref(o))?void 0:l.logoutText),1)]})),_:1})])),_:1})])),default:t.withCtx((()=>[t.createElementVNode("div",x,[t.createElementVNode("div",E,[t.createVNode(L)]),t.createElementVNode("span",null,t.toDisplayString(e.userNickName),1),t.createVNode(r,{class:t.normalizeClass(["el-icon--right !ml-16 transition-all duration-200",{" rotate-180":l.value}]),size:16},{default:t.withCtx((()=>[t.createVNode(b)])),_:1},8,["class"])])])),_:1},512)}}}),[["__scopeId","data-v-35cafb1a"]]),N=t.defineComponent({__name:"Login",setup(e){const l=t.inject(C),n=o.useRouter(),a=()=>{n.push({path:"/login",query:{redirect_url:encodeURIComponent(location.href)}})};return(e,o)=>{const n=t.resolveComponent("el-button");return t.openBlock(),t.createBlock(n,{type:"primary",class:"!rounded-4",onClick:a},{default:t.withCtx((()=>{var e;return[t.createTextVNode(t.toDisplayString(null==(e=t.unref(l))?void 0:e.loginText),1)]})),_:1})}}}),V=[{value:w.Chinese,label:"中文"},{value:w.English,label:"English"}],T={[w.Chinese]:"cn",[w.English]:"en"},_={cn:w.Chinese,en:w.English},S={[w.Chinese]:"zh",[w.English]:"en"},A={width:"20px",height:"20px",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg"},M=["fill"],F=t.defineComponent({__name:"Locale",props:{isWhiteTheme:{type:Boolean,default:!1},currentLocale:{},localeOptions:{default:()=>V}},emits:["change-language"],setup(e,{emit:o}){const l=t.ref(!1),n=e=>{l.value=e},a=e,r=o,i=t.computed((()=>a.isWhiteTheme)),s=t.computed((()=>a.currentLocale)),c=t.computed((()=>a.localeOptions));return(e,o)=>{const l=t.resolveComponent("el-dropdown-item"),a=t.resolveComponent("el-dropdown-menu"),d=t.resolveComponent("el-dropdown");return t.openBlock(),t.createBlock(d,{class:"cursor-pointer",trigger:"click","popper-class":"custom-dropdown",placement:"bottom",onVisibleChange:n},{dropdown:t.withCtx((()=>[t.createVNode(a,null,{default:t.withCtx((()=>[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(c.value,(e=>(t.openBlock(),t.createBlock(l,{key:e.value,class:t.normalizeClass({"is-active":e.value===s.value}),onClick:t=>(e=>{e!==s.value&&r("change-language",e)})(e.value)},{default:t.withCtx((()=>[t.createElementVNode("span",{class:t.normalizeClass({"color-primary":e.value===s.value})},t.toDisplayString(e.label),3)])),_:2},1032,["class","onClick"])))),128))])),_:1})])),default:t.withCtx((()=>[(t.openBlock(),t.createElementBlock("svg",A,[o[0]||(o[0]=t.createElementVNode("rect",{fill:"#D8D8D8",opacity:"0",x:"0",y:"0",width:"20",height:"20"},null,-1)),t.createElementVNode("path",{fill:i.value?"#ffffff":"#2C364B","fill-rule":"nonzero",d:"M10,0 C4.48583334,0 0,4.48583334 0,10 C0,15.5141667 4.48583334,20 10,20 C15.5141667,20 20,15.5141667 20,10 C20,4.48583334 15.5141667,0 10,0 Z M18.6966667,10.9491667 L18.6925,10.9741667 C18.6575,11.2791667 18.6075,11.5791667 18.5425,11.8741667 L18.5425,11.875 L15.5258333,11.875 C15.657032,10.6284426 15.657032,9.37155738 15.5258333,8.125 L18.5425,8.125 C18.6075,8.42 18.6566667,8.72 18.6925,9.025 C18.6925,9.03333334 18.695,9.04166666 18.6966667,9.05083334 C18.7675,9.68166668 18.7675,10.3183333 18.6966667,10.9491667 L18.6966667,10.9491667 Z M13.34,18.0833333 C14.2783333,16.8683333 14.9891667,15.1491667 15.3516667,13.1241667 L18.1633333,13.1241667 C17.3009588,15.3668017 15.5579816,17.158563 13.34,18.0825 L13.34,18.0833333 Z M18.1625,6.87333334 L15.3516667,6.87333334 C14.9891667,4.84833334 14.2783333,3.13 13.34,1.915 C15.5576659,2.83912386 17.3003173,4.63085972 18.1625,6.87333334 L18.1625,6.87333334 Z M14.2658333,8.12333334 C14.4114344,9.36909341 14.4114344,10.6275733 14.2658333,11.8733333 L10.6241667,11.8733333 L10.6241667,8.12333334 L14.2658333,8.12333334 Z M10.6241667,6.87333334 L10.6241667,1.355 C12.1825,1.825 13.5008333,4.0025 14.07,6.87583334 L10.625,6.87583334 L10.6241667,6.87333334 Z M10.6241667,13.1233333 L14.07,13.1233333 C13.5008333,15.9983333 12.1825,18.175 10.625,18.645 L10.625,13.125 L10.6241667,13.1233333 Z M1.8375,13.1241667 L4.64833334,13.1241667 C5.01083334,15.1491667 5.72166668,16.8683333 6.66,18.0825 C4.44233408,17.1583761 2.69968275,15.3666403 1.8375,13.1241667 L1.8375,13.1241667 Z M6.66,1.91666666 C5.72166666,3.13 5.01083334,4.85 4.64833334,6.875 L1.83666666,6.875 C2.69923303,4.63220345 4.44253606,2.84041679 6.66083334,1.91666666 L6.66,1.91666666 Z M5.73416666,11.875 C5.58856559,10.6292399 5.58856559,9.37076007 5.73416666,8.125 L9.375,8.125 L9.375,11.875 L5.73333334,11.875 L5.73416666,11.875 Z M9.375,13.125 L9.375,18.6458333 C7.81666666,18.1758333 6.49916666,15.9983333 5.93,13.125 L9.375,13.125 Z M9.375,6.875 L5.93,6.875 C6.49916666,4.00166666 7.81666666,1.825 9.375,1.35416666 L9.375,6.875 Z M1.30416666,9.05 C1.30416666,9.04333334 1.30666666,9.03583334 1.3075,9.02833334 C1.34166666,8.725 1.39166666,8.42333334 1.4575,8.125 L4.47416666,8.125 C4.34243809,9.37152952 4.34243809,10.6284705 4.47416666,11.875 L1.4575,11.875 C1.39166666,11.5766667 1.34166666,11.275 1.3075,10.9716667 L1.30416666,10.9491667 C1.23220566,10.3184348 1.23220566,9.68156522 1.30416666,9.05083334 L1.30416666,9.05 Z"},null,8,M)]))])),_:1})}}}),O=(e,t)=>!(!e||!t)&&e.toLowerCase().indexOf(t.toLowerCase())>=0,D=(e,t)=>t.some((t=>O(e,t))),I={class:"flex-center"},P=["src"],z={class:"flex gap-48 ml-80"},W=["index"],Z={class:"text-16"},j={class:"text-14 mb-16 !font-500"},G={class:"text-14 whitespace-normal !font-400"},H={class:"text-16"},J={class:"text-14 mb-16 !font-500"},K={class:"text-14 whitespace-normal !font-400"},R={class:"text-16"},$={class:"text-14 text-#bbbbbb leading-22 mb-20"},q={class:"text-14 mb-16 !font-500"},U={class:"text-14 whitespace-normal !font-400"},Y=["onClick"],X=i(t.defineComponent({__name:"Header",props:{routePath:{},menuList:{},isWhiteTheme:{type:Boolean},isScrolledTheme:{type:Boolean},currentLocale:{},userName:{},userNickName:{},onLogoClick:{type:Function},onJumpPage:{type:Function},onChangeLanguage:{type:Function},onLogout:{type:Function}},setup(e){const o=e;return t.provide(C,t.computed((()=>v(o.currentLocale)))),(e,o)=>{const l=t.resolveComponent("el-dropdown-item"),n=t.resolveComponent("el-dropdown-menu"),a=t.resolveComponent("el-dropdown");return t.openBlock(),t.createElementBlock("div",{class:t.normalizeClass(["w-full header-wrapper h-64px pl-120 pr-120 py-19 backdrop-blur-[14px] flex items-center justify-between text-#000 fixed left-0 top-0 z-99 bg-transparent overflow-x-scroll",{"theme-white":e.isWhiteTheme,"theme-scrolled":e.isScrolledTheme,"!b-0":t.unref(O)(e.routePath,"/CommunityMembers")}])},[t.createElementVNode("div",I,[t.createElementVNode("img",{class:"logo",src:e.isWhiteTheme?"https://flagos.ks3-cn-beijing.ksyuncs.com/images/logo.svg":"https://flagos.ks3-cn-beijing.ksyuncs.com/images/logo-black.svg",onClick:o[0]||(o[0]=(...t)=>e.onLogoClick&&e.onLogoClick(...t))},null,8,P),t.createElementVNode("div",z,[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(e.menuList,((o,r)=>(t.openBlock(),t.createElementBlock("div",{index:r,class:t.normalizeClass(["menu-item cursor-pointer whitespace-nowrap",{active:o.active}])},[o.dropdownList&&"learn"===o.id?(t.openBlock(),t.createBlock(a,{key:0,"popper-class":"custom-dropdown-new","show-arrow":!1},{dropdown:t.withCtx((()=>[t.createVNode(n,{class:"flex-row"},{default:t.withCtx((()=>[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(o.dropdownList,((n,a)=>(t.openBlock(),t.createBlock(l,{key:a,class:t.normalizeClass({active:t.unref(O)(e.routePath,n.path)}),onClick:t=>e.onJumpPage(o,n)},{default:t.withCtx((()=>[t.createElementVNode("span",j,t.toDisplayString(n.label),1),t.createElementVNode("span",G,t.toDisplayString(n.desc),1)])),_:2},1032,["class","onClick"])))),128))])),_:2},1024)])),default:t.withCtx((()=>[t.createElementVNode("span",Z,t.toDisplayString(o.label),1)])),_:2},1024)):o.dropdownList&&"tools"===o.id?(t.openBlock(),t.createBlock(a,{key:1,"popper-class":"custom-dropdown-new","show-arrow":!1},{dropdown:t.withCtx((()=>[t.createVNode(n,null,{default:t.withCtx((()=>[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(o.dropdownList,((n,a)=>(t.openBlock(),t.createBlock(l,{key:a,onClick:t=>e.onJumpPage(o,n)},{default:t.withCtx((()=>[t.createElementVNode("span",J,t.toDisplayString(n.label),1),t.createElementVNode("span",K,t.toDisplayString(n.desc),1)])),_:2},1032,["onClick"])))),128))])),_:2},1024)])),default:t.withCtx((()=>[t.createElementVNode("span",H,t.toDisplayString(o.label),1)])),_:2},1024)):o.dropdownGroups&&"projects"===o.id?(t.openBlock(),t.createBlock(a,{key:2,"popper-class":"custom-dropdown-new","show-arrow":!1},{dropdown:t.withCtx((()=>[t.createVNode(n,{class:"flex gap-20 el-dropdown-menu_out"},{default:t.withCtx((()=>[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(o.dropdownGroups,((n,a)=>(t.openBlock(),t.createElementBlock("ul",{key:a,class:"flex-1 el-dropdown-menu !w-[50%] !max-h-560px"},[t.createElementVNode("span",$,t.toDisplayString(n.label),1),(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(n.list,((n,a)=>(t.openBlock(),t.createBlock(l,{key:a,class:"el-dropdown-menu__item !w-full",onClick:t=>e.onJumpPage(o,n)},{default:t.withCtx((()=>[t.createElementVNode("span",q,t.toDisplayString(n.label),1),t.createElementVNode("span",U,t.toDisplayString(n.desc),1)])),_:2},1032,["onClick"])))),128))])))),128))])),_:2},1024)])),default:t.withCtx((()=>[t.createElementVNode("span",R,t.toDisplayString(o.label),1)])),_:2},1024)):(t.openBlock(),t.createElementBlock("span",{key:3,onClick:t=>e.onJumpPage(o)},t.toDisplayString(o.label),9,Y))],10,W)))),256))])]),t.createElementVNode("div",{class:t.normalizeClass(["flex-center",e.isWhiteTheme?"text-#ffffff":"text-#262642"])},[t.createVNode(F,{isWhiteTheme:e.isWhiteTheme,"current-locale":e.currentLocale,onChangeLanguage:e.onChangeLanguage},null,8,["isWhiteTheme","current-locale","onChangeLanguage"]),e.userName?t.createCommentVNode("",!0):(t.openBlock(),t.createBlock(N,{key:0,class:"ml-20"})),e.userName?(t.openBlock(),t.createBlock(B,{key:1,class:t.normalizeClass(["header_avatar ml-20",e.isWhiteTheme?"text-#ffffff":"text-#262642"]),"user-nick-name":e.userNickName,"current-path":e.routePath,logout:e.onLogout},null,8,["class","user-nick-name","current-path","logout"])):t.createCommentVNode("",!0)],2)],2)}}}),[["__scopeId","data-v-bfee58b2"]]),Q=["platform-aiintegration-dev.baai.ac.cn"],ee=["flagos.io","flagos.net","www.flagos.io","www.flagos.net"],te=[...ee,...Q],oe=()=>te.includes(location.host),le=e=>ee.includes(location.hostname)?`https://${location.hostname}${e}`:`${location.protocol}//${e.slice(1).toLocaleLowerCase()}.${Q[0]}`,ne=e=>(e=>{const t=e===w.Chinese;return[{id:"home",label:t?"首页":"Home",path:"/Home"},{id:"projects",label:t?"软件栈":"Software Stack",dropdownGroups:[{id:"coreLib",label:t?"开源核心库":"Open-Source Core Libraries",list:[{id:"flagscale",label:"FlagScale",path:"/FlagScale",desc:t?"统一多芯片、多后端的大模型框架,提供覆盖训练、微调与推理部署的全流程能力":"A unified multi-backend large model framework across diverse chips, providing end-to-end capabilities spanning training, fine-tuning, and inference deployment.",type:"route"},{id:"flaggems",label:"FlagGems",path:"/FlagGems",desc:t?"基于Triton实现的高性能通用算子库":"A high-performance general operator library built on Triton.",type:"route"},{id:"flagtree",label:"FlagTree",path:"/FlagTree",desc:t?"面向多种硬件的开源、统一AI编译器":"An open-source unified AI compiler for diverse hardware.",type:"route"},{id:"flagcx",label:"FlagCX",path:"/FlagCX",desc:t?"一款专为大规模AI系统设计的可扩展、自适应高性能跨芯片通信库":"A scalable, adaptive, high-performance cross-chip communication library designed for large-scale AI systems.",type:"route"}]},{id:"ecosystem",label:t?"生态使能项目":"FlagOS Ecosystem Enablement Project",list:[{id:"megatronfl",label:"Megatron-FL",path:"https://github.com/flagos-ai/Megatron-LM-FL",desc:t?"为Megatron-LM打造的多芯片插件,实现大模型多芯片高效训练":"A multi-chip plugin for Megatron-LM, enabling efficient large-scale training across diverse chips.",type:"link"},{id:"vllmpluginfl",label:"vLLM-plugin-FL",path:"https://github.com/flagos-ai/vllm-plugin-FL",desc:t?"为vLLM打造的多芯片插件,实现大模型多芯片高效推理部署":"A multi-chip plugin for vLLM, enabling efficient large model inference and deployment across diverse chips.",type:"link"},{id:"transformerenginefl",label:"TransformerEngine-FL",path:"https://github.com/flagos-ai/TransformerEngine-FL",desc:t?"为TransformerEngine打造的多芯片插件,实现多种芯片上分布式算子":"A multi-chip plugin for TransformerEngine, enabling distributed operators across diverse chip architectures.",type:"link"}]}]},{id:"tools",label:t?"工具":"Tools",dropdownList:[{id:"skill",label:t?"Skill广场":"SkillHub",path:le("/SkillHub"),desc:t?"一站式AI计算技能库":"One-stop AI computing skills library.",type:"route"},{id:"onlinelab",label:t?"线上实验室":"Online Laboratory",path:oe()?"/OnlineLab":le("/OnlineLab"),desc:t?"开箱即用的在线实验环境":"Ready-to-use online experiment environment.",type:"route"},{id:"modelplatform",label:t?"模型服务平台":"MaaS",path:"",desc:t?"全生命周期大模型API服务平台":"A full-lifecycle API service platform for large models.",type:"unopen"},{id:"kernelgen",label:"KernelGen",path:"https://kernelgen.flagos.io/",desc:t?"分钟级构建Kernel,支持多芯片后端":"Build Kernels in Minutes with Multi-Backend Support.",type:"link"},{id:"flagrelease",label:"FlagRelease",path:"",desc:t?"一套自动化迁移大模型至不同硬件产品的工具平台":"An automated tool platform for migrating large model to diverse hardware.",type:"unopen"},{id:"flagcicd",label:"FlagCICD",path:"",desc:t?"面向 AI 开发的持续集成 / 持续部署工具链":"A CI/CD toolchain for AI development.",type:"unopen"},{id:"flagmodelhub",label:t?"九鼎AI一体化平台":"Jiuding AI Integrated Platform",path:"",desc:t?"整合 FlagOS 全栈能力,提供从模型开发、训练到部署的一站式 AI 工程化平台":"Jiuding AI Platform.",type:"unopen"}]},{id:"docs",label:t?"文档":"Docs"},{id:"learn",label:t?"学习":"Learn",dropdownList:[{id:"wiki",label:"Wiki",desc:t?"智能文档,边看边问边学":"AI-powered interactive docs: query and learn in real-time.",path:"https://wiki.flagos.io",type:"link"},{id:"professionalcourse",label:t?"专业课":"Core Courses",desc:t?"众智FlagOS系列开源课程":"The official open-source course series for the FlagOS ecosystem.",path:"https://flagos.educoder.net/paths",type:"link"},{id:"course",label:t?"讲座":"Tech Talks",desc:t?"大咖分享,业界前沿讲座":"Cutting-edge insights and deep dives from industry leaders.",path:"/LearnCenter",type:"route"}]},{id:"events",label:t?"活动赛事":"Event & Competition",path:oe()?"/events":le("/events")},{id:"onlinelab-top",label:t?"线上实验室":"Online Laboratory",path:oe()?"/OnlineLab":le("/OnlineLab")}]})(e),ae=e=>{window.open(e,"_blank")};const re={install(e){e.component("MyButton",f),e.component("MyTable",u)}};e.Header=X,e.LocaleTypeEnum=w,e.MyButton=f,e.MyTable=u,e.NAV_LANG_TO_LOCALE=_,e.NAV_LOCALE_OPTIONS=V,e.NAV_LOCALE_TO_LANG=T,e.NAV_TEXTS_KEY=C,e.NAV_WIKI_LANG_BY_LOCALE=S,e.NavAvatar=B,e.NavHeader=X,e.NavLocale=F,e.NavLogin=N,e.buildNavTexts=v,e.default=re,e.getNavMenuApi=ne,e.matchAnyPath=D,e.matchPath=O,e.useHeaderMenu=function(e,o,n){const a=t.ref([]);return t.watch(e,(e=>(e=>{var t;const o=ne(e),l=null==(t=a.value.find((e=>e.active)))?void 0:t.id;a.value=o.map((e=>({...e,active:e.id===l})))})(e)),{immediate:!0}),{menuList:a,syncActiveMenu:e=>{a.value.forEach((e=>e.active=!1));const t=a.value.findIndex((t=>t.dropdownList?t.dropdownList.some((t=>O(null==e?void 0:e.path,t.path))):t.dropdownGroups?t.dropdownGroups.some((t=>t.list.some((t=>O(null==e?void 0:e.path,t.path))))):!(!O(t.path,"/events")||!D(null==e?void 0:e.path,["/EventDetail","/RaceDetail"]))||(!("onlinelab-top"!==t.id||!O(null==e?void 0:e.path,"/OnlineLab"))||O(null==e?void 0:e.path,t.path))));t>=0&&(a.value[t].active=!0)},handleJumpPage:(e,t)=>{const r="string"==typeof n?n:n.value;if(["tools","projects","learn"].includes(e.id)){if(!t)return;if(t.path.startsWith("http"))return ae(t.path);if(t.path)return o(t.path);if("unopen"===t.type)return l.ElMessage.warning(r)}if("docs"===e.id)return ae("https://docs.flagos.io/");a.value.forEach((e=>e.active=!1)),e.active=!0,o(t?t.path:e.path)}}},e.useHeaderTheme=function(e){const o=t.ref(0),l=t.ref(!1),n=t.ref(!1),r={getThreshold:()=>window.innerHeight-80},i={getThreshold:()=>310},s={getThreshold:()=>100},c=(e,t)=>{e>t?(l.value=!1,n.value=!0):(l.value=!0,n.value=!1),o.value=e<=0?0:e},d=a.default((()=>{const e=window.scrollY||document.documentElement.scrollTop||0;c(e,r.getThreshold())}),200),p=a.default((()=>{const t=window.scrollY||document.documentElement.scrollTop||0,o=O(null==e?void 0:e.path,"/OnlineLab")?s.getThreshold():i.getThreshold();c(t,o)}),200),u=()=>{window.removeEventListener("scroll",d),window.removeEventListener("scroll",p),O(null==e?void 0:e.path,"/Home")?(l.value=!0,n.value=!1,window.addEventListener("scroll",d),t.nextTick((()=>d()))):D(null==e?void 0:e.path,["/events","/EventDetail","/RaceDetail","/OnlineLab"])?(l.value=!0,n.value=!1,window.addEventListener("scroll",p),t.nextTick((()=>p()))):(l.value=!1,n.value=!1)};return t.onMounted((()=>u())),t.onUnmounted((()=>{window.removeEventListener("scroll",d),window.removeEventListener("scroll",p)})),{lastScrollTop:o,isWhiteTheme:l,isScrolledTheme:n,bindByRoute:u,handleScroll:d,handleEventsScroll:p}},Object.defineProperties(e,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("vue"),require("vue-router"),require("element-plus"),require("lodash/throttle")):"function"==typeof define&&define.amd?define(["exports","vue","vue-router","element-plus","lodash/throttle"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).BaaiComponents={},e.Vue,e.VueRouter,e.ElementPlus,e.throttle)}(this,(function(e,t,o,l,n){"use strict";const a=(e=>e&&"object"==typeof e&&"default"in e?e:{default:e})(n),r=t.defineComponent({name:"MyTable",props:{columns:{type:Array,required:!0},data:{type:Array,default:()=>[]},rowKey:{type:String,default:""}}}),i=(e,t)=>{const o=e.__vccOpts||e;for(const[l,n]of t)o[l]=n;return o},s={class:"w-full overflow-auto"},c={class:"w-full border-collapse table-fixed"},d={key:0},p=["colspan"];const u=i(r,[["render",function(e,o,l,n,a,r){return t.openBlock(),t.createElementBlock("div",s,[t.createElementVNode("table",c,[t.createElementVNode("thead",null,[t.createElementVNode("tr",null,[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(e.columns,(e=>(t.openBlock(),t.createElementBlock("th",{key:e.key,style:t.normalizeStyle({width:e.width}),class:"p-3 text-left bg-gray-100 text-gray-700 font-medium text-sm border-b border-gray-200"},t.toDisplayString(e.title),5)))),128))])]),t.createElementVNode("tbody",null,[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(e.data,((o,l)=>(t.openBlock(),t.createElementBlock("tr",{key:e.rowKey?o[e.rowKey]:l,class:"hover:bg-gray-50"},[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(e.columns,(n=>(t.openBlock(),t.createElementBlock("td",{key:n.key,class:"p-3 text-left border-b border-gray-200 text-sm"},[t.renderSlot(e.$slots,n.key,{row:o,index:l},(()=>[t.createTextVNode(t.toDisplayString(o[n.key]),1)]))])))),128))])))),128)),e.data&&0!==e.data.length?t.createCommentVNode("",!0):(t.openBlock(),t.createElementBlock("tr",d,[t.createElementVNode("td",{colspan:e.columns.length,class:"p-8 text-center text-gray-500"},[t.renderSlot(e.$slots,"empty",{},(()=>[o[0]||(o[0]=t.createTextVNode("暂无数据"))]))],8,p)]))])])])}]]),m=t.defineComponent({name:"MyButton",props:{type:{type:String,default:"default"},disabled:{type:Boolean,default:!1},loading:{type:Boolean,default:!1}},emits:["click"],setup:(e,{emit:o})=>({typeClasses:t.computed((()=>{switch(e.type){case"primary":return"bg-primary hover:bg-blue-500 text-white border-transparent";case"success":return"bg-success hover:bg-green-500 text-white border-transparent";case"warning":return"bg-warning hover:bg-yellow-500 text-white border-transparent";case"danger":return"bg-danger hover:bg-red-500 text-white border-transparent";case"info":return"bg-info hover:bg-gray-500 text-white border-transparent";default:return"bg-white hover:bg-gray-100 text-gray-700 border border-gray-300"}})),handleClick:t=>{e.disabled||e.loading||o("click",t)}})}),g=["disabled"],h={key:0,class:"mr-2 w-4 h-4 i-svg-spinners-270-ring-with-bg"};const f=i(m,[["render",function(e,o,l,n,a,r){return t.openBlock(),t.createElementBlock("button",{class:t.normalizeClass(["inline-flex justify-center items-center h-8 px-4 py-2 rounded-md text-sm font-medium transition-colors duration-200 focus:outline-none",[e.typeClasses,{"opacity-50 cursor-not-allowed":e.disabled,relative:e.loading}]]),disabled:e.disabled||e.loading,onClick:o[0]||(o[0]=(...t)=>e.handleClick&&e.handleClick(...t))},[e.loading?(t.openBlock(),t.createElementBlock("span",h)):t.createCommentVNode("",!0),t.renderSlot(e.$slots,"default")],10,g)}]]);var w=(e=>(e.English="en",e.Chinese="zh-CN",e))(w||{});const v=Symbol("nav-texts"),C=e=>{const t=e===w.Chinese;return{loginText:t?"登录/注册":"Log In / Sign Up",logoutText:t?"退出登录":"Log Out"}},b={width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg"};const k=i({},[["render",function(e,o){return t.openBlock(),t.createElementBlock("svg",b,o[0]||(o[0]=[t.createElementVNode("g",{id:"icon/down"},[t.createElementVNode("path",{id:"Union",d:"M12.1382 5.86191C11.8778 5.60156 11.4557 5.60156 11.1954 5.86191L8.0001 9.05717L4.80484 5.86191C4.54449 5.60156 4.12238 5.60156 3.86203 5.86191C3.60168 6.12226 3.60168 6.54437 3.86203 6.80472L7.29299 10.2357C7.68352 10.6262 8.31668 10.6262 8.70721 10.2357L12.1382 6.80472C12.3985 6.54437 12.3985 6.12226 12.1382 5.86191Z",fill:"#2C364B"})],-1)]))}]]),y={width:"19px",height:"20px",viewBox:"0 0 19 20",version:"1.1",xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink"};const L=i({},[["render",function(e,o){return t.openBlock(),t.createElementBlock("svg",y,o[0]||(o[0]=[t.createElementVNode("title",null,"yonghu-2",-1),t.createElementVNode("g",{id:"页面-1",stroke:"none","stroke-width":"1",fill:"none","fill-rule":"evenodd"},[t.createElementVNode("g",{id:"flagos首页备份-4",transform:"translate(-1187, -32)",fill:"#FFFFFF","fill-rule":"nonzero"},[t.createElementVNode("g",{id:"yonghu-2",transform:"translate(1187, 32)"},[t.createElementVNode("path",{d:"M4.16667254,6.66658844 C4.16667254,3.9091208 6.40897956,1.66664712 9.1664472,1.66664712 C11.9239148,1.66664712 14.1663885,3.9091208 14.1663885,6.66658844 C14.1663885,9.42388942 11.9239148,11.6665298 9.1664472,11.6665298 C6.40897956,11.6665298 4.16650588,9.42388942 4.16650588,6.66658844 M18.3046733,18.9521109 C17.4853496,15.8829803 15.3253749,13.4830084 12.6130734,12.3621883 C14.5387175,11.192202 15.8330356,9.08056012 15.8330356,6.66642176 C15.832869,2.99079823 12.8420707,0 9.16628054,0 C5.49049035,0 2.4996921,2.99079823 2.4996921,6.66658844 C2.4996921,9.08056012 3.79384359,11.192202 5.72048764,12.3621883 C3.00801947,13.4838418 0.848044811,15.8829803 0.028221107,18.9521109 C-0.0900085115,19.3963877 0.174049854,19.8524478 0.618214182,19.971099 C1.06293982,20.0897021 1.51968816,19.8256771 1.63886887,19.3811059 C2.59002437,15.820481 5.68498805,13.3331769 9.16661386,13.3331769 C12.6482397,13.3331769 15.74387,15.8206477 16.6948589,19.3814392 C16.7515138,19.5951643 16.8909444,19.7775312 17.0823388,19.8882397 C17.2737332,19.9989483 17.5013346,20.0288842 17.7148469,19.9714323 C18.1590942,19.8527834 18.423176,19.3966084 18.30484,18.9522776",id:"形状"})])])],-1)]))}]]),x={class:"flex items-center cursor-pointer"},E={class:"w-24 h-24 rounded-50% font-600 flex-center mr-8"},B=i(t.defineComponent({__name:"Avatar",props:{userNickName:{},currentPath:{},logout:{type:Function}},setup(e){const o=t.inject(v),l=t.ref(!1),n=e=>{l.value=e};return(e,a)=>{const r=t.resolveComponent("el-icon"),i=t.resolveComponent("el-dropdown-item"),s=t.resolveComponent("el-dropdown-menu"),c=t.resolveComponent("el-dropdown");return t.openBlock(),t.createBlock(c,{"popper-class":"custom-dropdown",size:"large",ref:"dropdown",trigger:"click","show-arrow":!1,onVisibleChange:n},{dropdown:t.withCtx((()=>[t.createVNode(s,null,{default:t.withCtx((()=>[t.createVNode(i,null,{default:t.withCtx((()=>{var l;return[t.createElementVNode("div",{class:"flex items-center w-full text-14 mb-4",onClick:a[0]||(a[0]=(...t)=>e.logout&&e.logout(...t))},t.toDisplayString(null==(l=t.unref(o))?void 0:l.logoutText),1)]})),_:1})])),_:1})])),default:t.withCtx((()=>[t.createElementVNode("div",x,[t.createElementVNode("div",E,[t.createVNode(L)]),t.createElementVNode("span",null,t.toDisplayString(e.userNickName),1),t.createVNode(r,{class:t.normalizeClass(["el-icon--right !ml-16 transition-all duration-200",{" rotate-180":l.value}]),size:16},{default:t.withCtx((()=>[t.createVNode(k)])),_:1},8,["class"])])])),_:1},512)}}}),[["__scopeId","data-v-35cafb1a"]]),N=t.defineComponent({__name:"Login",setup(e){const l=t.inject(v),n=o.useRouter(),a=()=>{n.push({path:"/login",query:{redirect_url:encodeURIComponent(location.href)}})};return(e,o)=>{const n=t.resolveComponent("el-button");return t.openBlock(),t.createBlock(n,{type:"primary",class:"!rounded-4",onClick:a},{default:t.withCtx((()=>{var e;return[t.createTextVNode(t.toDisplayString(null==(e=t.unref(l))?void 0:e.loginText),1)]})),_:1})}}}),V=[{value:w.Chinese,label:"中文"},{value:w.English,label:"English"}],T={[w.Chinese]:"cn",[w.English]:"en"},_={cn:w.Chinese,en:w.English},S={[w.Chinese]:"zh",[w.English]:"en"},A={width:"20px",height:"20px",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg"},F=["fill"],M=t.defineComponent({__name:"Locale",props:{isWhiteTheme:{type:Boolean,default:!1},currentLocale:{},localeOptions:{default:()=>V}},emits:["change-language"],setup(e,{emit:o}){const l=t.ref(!1),n=e=>{l.value=e},a=e,r=o,i=t.computed((()=>a.isWhiteTheme)),s=t.computed((()=>a.currentLocale)),c=t.computed((()=>a.localeOptions));return(e,o)=>{const l=t.resolveComponent("el-dropdown-item"),a=t.resolveComponent("el-dropdown-menu"),d=t.resolveComponent("el-dropdown");return t.openBlock(),t.createBlock(d,{class:"cursor-pointer",trigger:"click","popper-class":"custom-dropdown",placement:"bottom",onVisibleChange:n},{dropdown:t.withCtx((()=>[t.createVNode(a,null,{default:t.withCtx((()=>[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(c.value,(e=>(t.openBlock(),t.createBlock(l,{key:e.value,class:t.normalizeClass({"is-active":e.value===s.value}),onClick:t=>(e=>{e!==s.value&&r("change-language",e)})(e.value)},{default:t.withCtx((()=>[t.createElementVNode("span",{class:t.normalizeClass({"color-primary":e.value===s.value})},t.toDisplayString(e.label),3)])),_:2},1032,["class","onClick"])))),128))])),_:1})])),default:t.withCtx((()=>[(t.openBlock(),t.createElementBlock("svg",A,[o[0]||(o[0]=t.createElementVNode("rect",{fill:"#D8D8D8",opacity:"0",x:"0",y:"0",width:"20",height:"20"},null,-1)),t.createElementVNode("path",{fill:i.value?"#ffffff":"#2C364B","fill-rule":"nonzero",d:"M10,0 C4.48583334,0 0,4.48583334 0,10 C0,15.5141667 4.48583334,20 10,20 C15.5141667,20 20,15.5141667 20,10 C20,4.48583334 15.5141667,0 10,0 Z M18.6966667,10.9491667 L18.6925,10.9741667 C18.6575,11.2791667 18.6075,11.5791667 18.5425,11.8741667 L18.5425,11.875 L15.5258333,11.875 C15.657032,10.6284426 15.657032,9.37155738 15.5258333,8.125 L18.5425,8.125 C18.6075,8.42 18.6566667,8.72 18.6925,9.025 C18.6925,9.03333334 18.695,9.04166666 18.6966667,9.05083334 C18.7675,9.68166668 18.7675,10.3183333 18.6966667,10.9491667 L18.6966667,10.9491667 Z M13.34,18.0833333 C14.2783333,16.8683333 14.9891667,15.1491667 15.3516667,13.1241667 L18.1633333,13.1241667 C17.3009588,15.3668017 15.5579816,17.158563 13.34,18.0825 L13.34,18.0833333 Z M18.1625,6.87333334 L15.3516667,6.87333334 C14.9891667,4.84833334 14.2783333,3.13 13.34,1.915 C15.5576659,2.83912386 17.3003173,4.63085972 18.1625,6.87333334 L18.1625,6.87333334 Z M14.2658333,8.12333334 C14.4114344,9.36909341 14.4114344,10.6275733 14.2658333,11.8733333 L10.6241667,11.8733333 L10.6241667,8.12333334 L14.2658333,8.12333334 Z M10.6241667,6.87333334 L10.6241667,1.355 C12.1825,1.825 13.5008333,4.0025 14.07,6.87583334 L10.625,6.87583334 L10.6241667,6.87333334 Z M10.6241667,13.1233333 L14.07,13.1233333 C13.5008333,15.9983333 12.1825,18.175 10.625,18.645 L10.625,13.125 L10.6241667,13.1233333 Z M1.8375,13.1241667 L4.64833334,13.1241667 C5.01083334,15.1491667 5.72166668,16.8683333 6.66,18.0825 C4.44233408,17.1583761 2.69968275,15.3666403 1.8375,13.1241667 L1.8375,13.1241667 Z M6.66,1.91666666 C5.72166666,3.13 5.01083334,4.85 4.64833334,6.875 L1.83666666,6.875 C2.69923303,4.63220345 4.44253606,2.84041679 6.66083334,1.91666666 L6.66,1.91666666 Z M5.73416666,11.875 C5.58856559,10.6292399 5.58856559,9.37076007 5.73416666,8.125 L9.375,8.125 L9.375,11.875 L5.73333334,11.875 L5.73416666,11.875 Z M9.375,13.125 L9.375,18.6458333 C7.81666666,18.1758333 6.49916666,15.9983333 5.93,13.125 L9.375,13.125 Z M9.375,6.875 L5.93,6.875 C6.49916666,4.00166666 7.81666666,1.825 9.375,1.35416666 L9.375,6.875 Z M1.30416666,9.05 C1.30416666,9.04333334 1.30666666,9.03583334 1.3075,9.02833334 C1.34166666,8.725 1.39166666,8.42333334 1.4575,8.125 L4.47416666,8.125 C4.34243809,9.37152952 4.34243809,10.6284705 4.47416666,11.875 L1.4575,11.875 C1.39166666,11.5766667 1.34166666,11.275 1.3075,10.9716667 L1.30416666,10.9491667 C1.23220566,10.3184348 1.23220566,9.68156522 1.30416666,9.05083334 L1.30416666,9.05 Z"},null,8,F)]))])),_:1})}}}),O=(e,t)=>!(!e||!t)&&e.toLowerCase().indexOf(t.toLowerCase())>=0,D=(e,t)=>t.some((t=>O(e,t))),I={class:"flex-center"},P=["src"],z={class:"flex gap-48 ml-80"},j=["index"],W={class:"text-16"},Z={class:"text-14 mb-16 !font-500"},G={class:"text-14 whitespace-normal !font-400"},H={class:"text-16"},$={class:"text-14 mb-16 !font-500"},J={class:"text-14 whitespace-normal !font-400"},K={class:"text-16"},R={class:"text-14 text-#bbbbbb leading-22 mb-20"},q={class:"text-14 mb-16 !font-500"},U={class:"text-14 whitespace-normal !font-400"},X=["onClick"],Y=i(t.defineComponent({__name:"Header",props:{routePath:{},menuList:{},isWhiteTheme:{type:Boolean},isScrolledTheme:{type:Boolean},currentLocale:{},userName:{},userNickName:{},onLogoClick:{type:Function},onJumpPage:{type:Function},onChangeLanguage:{type:Function},onLogout:{type:Function}},setup(e){const o=t.ref(!1),l=e=>{o.value=e},n=e;return t.provide(v,t.computed((()=>C(n.currentLocale)))),(e,n)=>{const a=t.resolveComponent("el-dropdown-item"),r=t.resolveComponent("el-dropdown-menu"),i=t.resolveComponent("el-dropdown");return t.openBlock(),t.createElementBlock("div",{class:t.normalizeClass(["w-full header-wrapper h-64px pl-120 pr-120 py-19 backdrop-blur-[14px] flex items-center justify-between text-#000 fixed left-0 top-0 z-99 bg-transparent overflow-x-scroll",{"theme-white":e.isWhiteTheme,"theme-scrolled":e.isScrolledTheme,"!b-0":t.unref(O)(e.routePath,"/CommunityMembers"),dropdownVisible:o.value}])},[t.createElementVNode("div",I,[t.createElementVNode("img",{class:"logo",src:e.isWhiteTheme||o.value?"https://flagos.ks3-cn-beijing.ksyuncs.com/images/logo.svg":"https://flagos.ks3-cn-beijing.ksyuncs.com/images/logo-black.svg",onClick:n[0]||(n[0]=(...t)=>e.onLogoClick&&e.onLogoClick(...t))},null,8,P),t.createElementVNode("div",z,[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(e.menuList,((o,n)=>(t.openBlock(),t.createElementBlock("div",{index:n,class:t.normalizeClass(["menu-item cursor-pointer whitespace-nowrap",{active:o.active}])},[o.dropdownList&&"learn"===o.id?(t.openBlock(),t.createBlock(i,{key:0,"popper-class":"custom-dropdown-new","show-arrow":!1,onVisibleChange:l},{dropdown:t.withCtx((()=>[t.createVNode(r,{class:"flex-row"},{default:t.withCtx((()=>[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(o.dropdownList,((l,n)=>(t.openBlock(),t.createBlock(a,{key:n,class:t.normalizeClass({active:t.unref(O)(e.routePath,l.path)}),onClick:t=>e.onJumpPage(o,l)},{default:t.withCtx((()=>[t.createElementVNode("span",Z,t.toDisplayString(l.label),1),t.createElementVNode("span",G,t.toDisplayString(l.desc),1)])),_:2},1032,["class","onClick"])))),128))])),_:2},1024)])),default:t.withCtx((()=>[t.createElementVNode("span",W,t.toDisplayString(o.label),1)])),_:2},1024)):o.dropdownList&&"tools"===o.id?(t.openBlock(),t.createBlock(i,{key:1,"popper-class":"custom-dropdown-new","show-arrow":!1,onVisibleChange:l},{dropdown:t.withCtx((()=>[t.createVNode(r,null,{default:t.withCtx((()=>[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(o.dropdownList,((l,n)=>(t.openBlock(),t.createBlock(a,{key:n,onClick:t=>e.onJumpPage(o,l)},{default:t.withCtx((()=>[t.createElementVNode("span",$,t.toDisplayString(l.label),1),t.createElementVNode("span",J,t.toDisplayString(l.desc),1)])),_:2},1032,["onClick"])))),128))])),_:2},1024)])),default:t.withCtx((()=>[t.createElementVNode("span",H,t.toDisplayString(o.label),1)])),_:2},1024)):o.dropdownGroups&&"projects"===o.id?(t.openBlock(),t.createBlock(i,{key:2,"popper-class":"custom-dropdown-new","show-arrow":!1,onVisibleChange:l},{dropdown:t.withCtx((()=>[t.createVNode(r,{class:"flex gap-20 el-dropdown-menu_out"},{default:t.withCtx((()=>[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(o.dropdownGroups,((l,n)=>(t.openBlock(),t.createElementBlock("ul",{key:n,class:"flex-1 el-dropdown-menu !w-[50%] !max-h-560px"},[t.createElementVNode("span",R,t.toDisplayString(l.label),1),(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(l.list,((l,n)=>(t.openBlock(),t.createBlock(a,{key:n,class:"el-dropdown-menu__item !w-full",onClick:t=>e.onJumpPage(o,l)},{default:t.withCtx((()=>[t.createElementVNode("span",q,t.toDisplayString(l.label),1),t.createElementVNode("span",U,t.toDisplayString(l.desc),1)])),_:2},1032,["onClick"])))),128))])))),128))])),_:2},1024)])),default:t.withCtx((()=>[t.createElementVNode("span",K,t.toDisplayString(o.label),1)])),_:2},1024)):(t.openBlock(),t.createElementBlock("span",{key:3,onClick:t=>e.onJumpPage(o)},t.toDisplayString(o.label),9,X))],10,j)))),256))])]),t.createElementVNode("div",{class:t.normalizeClass(["flex-center",e.isWhiteTheme?"text-#ffffff":"text-#262642"])},[t.createVNode(M,{isWhiteTheme:e.isWhiteTheme||o.value,"current-locale":e.currentLocale,onChangeLanguage:e.onChangeLanguage},null,8,["isWhiteTheme","current-locale","onChangeLanguage"]),e.userName?t.createCommentVNode("",!0):(t.openBlock(),t.createBlock(N,{key:0,class:"ml-20"})),e.userName?(t.openBlock(),t.createBlock(B,{key:1,class:t.normalizeClass(["header_avatar ml-20",e.isWhiteTheme||o.value?"text-#ffffff":"text-#262642"]),"user-nick-name":e.userNickName,"current-path":e.routePath,logout:e.onLogout},null,8,["class","user-nick-name","current-path","logout"])):t.createCommentVNode("",!0)],2)],2)}}}),[["__scopeId","data-v-f9be6dbf"]]),Q=["platform-aiintegration-dev.baai.ac.cn"],ee=["flagos.io","flagos.net","www.flagos.io","www.flagos.net",...Q],te=()=>ee.includes(location.hostname)?location.hostname.split(".").slice(1).join("."):Q[0]+"/flag-os",oe=(e,t="")=>t?location.hostname.includes(t)?e:ee.includes(location.hostname)?`${location.protocol}//${[t,...te().split(".")].join(".")}`:`${location.protocol}//${[t,...Q[0].split(".")].join(".")}`:`${location.protocol}//${te()}${e}`,le=(e,t=!1)=>((e,t=!1)=>{const o=e===w.Chinese;return[{id:"home",label:o?"首页":"Home",path:t?"/Home":oe("/Home")},{id:"projects",label:o?"软件栈":"Software Stack",dropdownGroups:[{id:"coreLib",label:o?"开源核心库":"Open-Source Core Libraries",list:[{id:"flagscale",label:"FlagScale",path:t?"/FlagScale":oe("/FlagScale"),desc:o?"统一多芯片、多后端的大模型框架,提供覆盖训练、微调与推理部署的全流程能力":"A unified multi-backend large model framework across diverse chips, providing end-to-end capabilities spanning training, fine-tuning, and inference deployment.",type:"route"},{id:"flaggems",label:"FlagGems",path:t?"/FlagGems":oe("/FlagGems"),desc:o?"基于Triton实现的高性能通用算子库":"A high-performance general operator library built on Triton.",type:"route"},{id:"flagtree",label:"FlagTree",path:t?"/FlagTree":oe("/FlagTree"),desc:o?"面向多种硬件的开源、统一AI编译器":"An open-source unified AI compiler for diverse hardware.",type:"route"},{id:"flagcx",label:"FlagCX",path:t?"/FlagCX":oe("/FlagCX"),desc:o?"一款专为大规模AI系统设计的可扩展、自适应高性能跨芯片通信库":"A scalable, adaptive, high-performance cross-chip communication library designed for large-scale AI systems.",type:"route"}]},{id:"ecosystem",label:o?"生态使能项目":"FlagOS Ecosystem Enablement Project",list:[{id:"megatronfl",label:"Megatron-FL",path:"https://github.com/flagos-ai/Megatron-LM-FL",desc:o?"为Megatron-LM打造的多芯片插件,实现大模型多芯片高效训练":"A multi-chip plugin for Megatron-LM, enabling efficient large-scale training across diverse chips.",type:"link"},{id:"vllmpluginfl",label:"vLLM-plugin-FL",path:"https://github.com/flagos-ai/vllm-plugin-FL",desc:o?"为vLLM打造的多芯片插件,实现大模型多芯片高效推理部署":"A multi-chip plugin for vLLM, enabling efficient large model inference and deployment across diverse chips.",type:"link"},{id:"transformerenginefl",label:"TransformerEngine-FL",path:"https://github.com/flagos-ai/TransformerEngine-FL",desc:o?"为TransformerEngine打造的多芯片插件,实现多种芯片上分布式算子":"A multi-chip plugin for TransformerEngine, enabling distributed operators across diverse chip architectures.",type:"link"}]}]},{id:"tools",label:o?"工具":"Tools",dropdownList:[{id:"skill",label:o?"Skill广场":"SkillHub",path:oe("/SkillHub","skillhub"),desc:o?"一站式AI计算技能库":"One-stop AI computing skills library.",type:"route"},{id:"onlinelab",label:o?"线上实验室":"Online Laboratory",path:t?"/OnlineLab":oe("/OnlineLab"),desc:o?"开箱即用的在线实验环境":"Ready-to-use online experiment environment.",type:"route"},{id:"modelplatform",label:o?"模型服务平台":"MaaS",path:"",desc:o?"全生命周期大模型API服务平台":"A full-lifecycle API service platform for large models.",type:"unopen"},{id:"kernelgen",label:"KernelGen",path:"https://kernelgen.flagos.io/",desc:o?"分钟级构建Kernel,支持多芯片后端":"Build Kernels in Minutes with Multi-Backend Support.",type:"link"},{id:"flagrelease",label:"FlagRelease",path:"",desc:o?"一套自动化迁移大模型至不同硬件产品的工具平台":"An automated tool platform for migrating large model to diverse hardware.",type:"unopen"},{id:"flagcicd",label:"FlagCICD",path:"",desc:o?"面向 AI 开发的持续集成 / 持续部署工具链":"A CI/CD toolchain for AI development.",type:"unopen"},{id:"flagmodelhub",label:o?"九鼎AI一体化平台":"Jiuding AI Integrated Platform",path:"",desc:o?"整合 FlagOS 全栈能力,提供从模型开发、训练到部署的一站式 AI 工程化平台":"Jiuding AI Platform.",type:"unopen"}]},{id:"docs",label:o?"文档":"Docs"},{id:"learn",label:o?"学习":"Learn",dropdownList:[{id:"wiki",label:"Wiki",desc:o?"智能文档,边看边问边学":"AI-powered interactive docs: query and learn in real-time.",path:"https://wiki.flagos.io",type:"link"},{id:"professionalcourse",label:o?"专业课":"Core Courses",desc:o?"众智FlagOS系列开源课程":"The official open-source course series for the FlagOS ecosystem.",path:"https://flagos.educoder.net/paths",type:"link"},{id:"course",label:o?"讲座":"Tech Talks",desc:o?"大咖分享,业界前沿讲座":"Cutting-edge insights and deep dives from industry leaders.",path:"/LearnCenter",type:"route"}]},{id:"events",label:o?"活动赛事":"Event & Competition",path:t?"/events":oe("/events")},{id:"onlinelab-top",label:o?"线上实验室":"Online Laboratory",path:t?"/OnlineLab":oe("/OnlineLab")}]})(e,t),ne=e=>{window.open(e,"_blank")};const ae={install(e){e.component("MyButton",f),e.component("MyTable",u)}};e.Header=Y,e.LocaleTypeEnum=w,e.MyButton=f,e.MyTable=u,e.NAV_LANG_TO_LOCALE=_,e.NAV_LOCALE_OPTIONS=V,e.NAV_LOCALE_TO_LANG=T,e.NAV_TEXTS_KEY=v,e.NAV_WIKI_LANG_BY_LOCALE=S,e.NavAvatar=B,e.NavHeader=Y,e.NavLocale=M,e.NavLogin=N,e.buildNavTexts=C,e.default=ae,e.getNavMenuApi=le,e.matchAnyPath=D,e.matchPath=O,e.useHeaderMenu=function(e,o,n,a=!0){const r=t.ref([]);return t.watch(e,(e=>(e=>{var t;const o=le(e,a),l=null==(t=r.value.find((e=>e.active)))?void 0:t.id;r.value=o.map((e=>({...e,active:e.id===l})))})(e)),{immediate:!0}),{menuList:r,syncActiveMenu:e=>{r.value.forEach((e=>e.active=!1));const t=r.value.findIndex((t=>t.dropdownList?t.dropdownList.some((t=>O(null==e?void 0:e.path,t.path))):t.dropdownGroups?t.dropdownGroups.some((t=>t.list.some((t=>O(null==e?void 0:e.path,t.path))))):!(!O(t.path,"/events")||!D(null==e?void 0:e.path,["/EventDetail","/RaceDetail"]))||(!("onlinelab-top"!==t.id||!O(null==e?void 0:e.path,"/OnlineLab"))||O(null==e?void 0:e.path,t.path))));t>=0&&(r.value[t].active=!0)},handleJumpPage:(e,t)=>{var a;const i="string"==typeof n?n:n.value;if(["tools","projects","learn"].includes(e.id)){if(!t)return;if(t.path.startsWith("http"))return ne(t.path);if(t.path)return o(t.path);if("unopen"===t.type)return l.ElMessage.warning(i)}else{if("docs"===e.id)return ne("https://docs.flagos.io/");(null==(a=e.path)?void 0:a.startsWith("http"))?ne(e.path):(r.value.forEach((e=>e.active=!1)),e.active=!0,o(e.path))}}}},e.useHeaderTheme=function(e){const o=t.ref(0),l=t.ref(!1),n=t.ref(!1),r={getThreshold:()=>window.innerHeight-80},i={getThreshold:()=>310},s={getThreshold:()=>100},c=(e,t)=>{e>t?(l.value=!1,n.value=!0):(l.value=!0,n.value=!1),o.value=e<=0?0:e},d=a.default((()=>{const e=window.scrollY||document.documentElement.scrollTop||0;c(e,r.getThreshold())}),200),p=a.default((()=>{const t=window.scrollY||document.documentElement.scrollTop||0,o=O(null==e?void 0:e.path,"/OnlineLab")?s.getThreshold():i.getThreshold();c(t,o)}),200),u=()=>{window.removeEventListener("scroll",d),window.removeEventListener("scroll",p),O(null==e?void 0:e.path,"/Home")?(l.value=!0,n.value=!1,window.addEventListener("scroll",d),t.nextTick((()=>d()))):D(null==e?void 0:e.path,["/events","/EventDetail","/RaceDetail","/OnlineLab"])?(l.value=!0,n.value=!1,window.addEventListener("scroll",p),t.nextTick((()=>p()))):(l.value=!1,n.value=!1)};return t.onMounted((()=>u())),t.onUnmounted((()=>{window.removeEventListener("scroll",d),window.removeEventListener("scroll",p)})),{lastScrollTop:o,isWhiteTheme:l,isScrolledTheme:n,bindByRoute:u,handleScroll:d,handleEventsScroll:p}},Object.defineProperties(e,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));
|
|
2
2
|
//# sourceMappingURL=index.umd.js.map
|
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","sources":["../src/components/Table/index.vue","../src/components/Button/index.vue","../src/components/Header/src/constants/locale.ts","../src/components/Header/src/config/texts.ts","../src/Icon/Down.vue","../src/Icon/Header.vue","../src/components/Header/src/Avatar.vue","../src/components/Header/src/Login.vue","../src/components/Header/src/config/locale.ts","../src/components/Header/src/Locale.vue","../src/components/Header/src/utils/path.ts","../src/components/Header/src/Header.vue","../src/components/Header/src/config/menus.ts","../src/components/Header/src/utils/openLink.ts","../src/index.ts","../src/components/Header/src/hooks/useHeaderMenu.ts","../src/components/Header/src/hooks/useHeaderTheme.ts"],"sourcesContent":["<template>\n <div class=\"w-full overflow-auto\">\n <table class=\"w-full border-collapse table-fixed\">\n <thead>\n <tr>\n <th \n v-for=\"column in columns\" \n :key=\"column.key\" \n :style=\"{ width: column.width }\"\n class=\"p-3 text-left bg-gray-100 text-gray-700 font-medium text-sm border-b border-gray-200\"\n >\n {{ column.title }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr \n v-for=\"(row, rowIndex) in data\" \n :key=\"rowKey ? row[rowKey] : rowIndex\"\n class=\"hover:bg-gray-50\"\n >\n <td \n v-for=\"column in columns\" \n :key=\"column.key\"\n class=\"p-3 text-left border-b border-gray-200 text-sm\"\n >\n <slot :name=\"column.key\" :row=\"row\" :index=\"rowIndex\">\n {{ row[column.key] }}\n </slot>\n </td>\n </tr>\n <tr v-if=\"!data || data.length === 0\">\n <td \n :colspan=\"columns.length\" \n class=\"p-8 text-center text-gray-500\"\n >\n <slot name=\"empty\">暂无数据</slot>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, PropType } from 'vue';\n\nexport interface TableColumn {\n key: string;\n title: string;\n width?: string;\n}\n\nexport default defineComponent({\n name: 'MyTable',\n props: {\n columns: {\n type: Array as PropType<TableColumn[]>,\n required: true\n },\n data: {\n type: Array as PropType<Record<string, any>[]>,\n default: () => []\n },\n rowKey: {\n type: String,\n default: ''\n }\n }\n});\n</script> ","<template>\n <button\n class=\"inline-flex justify-center items-center h-8 px-4 py-2 rounded-md text-sm font-medium transition-colors duration-200 focus:outline-none\"\n :class=\"[\n typeClasses,\n {\n 'opacity-50 cursor-not-allowed': disabled,\n 'relative': loading\n }\n ]\"\n :disabled=\"disabled || loading\"\n @click=\"handleClick\"\n >\n <span v-if=\"loading\" class=\"mr-2 w-4 h-4 i-svg-spinners-270-ring-with-bg\"></span>\n <slot></slot>\n </button>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, PropType } from 'vue';\n\ntype ButtonType = 'primary' | 'success' | 'warning' | 'danger' | 'info' | 'default';\n\nexport default defineComponent({\n name: 'MyButton',\n props: {\n type: {\n type: String as PropType<ButtonType>,\n default: 'default'\n },\n disabled: {\n type: Boolean,\n default: false\n },\n loading: {\n type: Boolean,\n default: false\n }\n },\n emits: ['click'],\n setup(props, { emit }) {\n // 根据类型计算样式类\n const typeClasses = computed(() => {\n switch (props.type) {\n case 'primary':\n return 'bg-primary hover:bg-blue-500 text-white border-transparent';\n case 'success':\n return 'bg-success hover:bg-green-500 text-white border-transparent';\n case 'warning':\n return 'bg-warning hover:bg-yellow-500 text-white border-transparent';\n case 'danger':\n return 'bg-danger hover:bg-red-500 text-white border-transparent';\n case 'info':\n return 'bg-info hover:bg-gray-500 text-white border-transparent';\n default:\n return 'bg-white hover:bg-gray-100 text-gray-700 border border-gray-300';\n }\n });\n\n const handleClick = (e: MouseEvent) => {\n if (props.disabled || props.loading) return;\n emit('click', e);\n };\n\n return {\n typeClasses,\n handleClick\n };\n }\n});\n</script>\n\n<style>\n.my-button {\n display: inline-flex;\n justify-content: center;\n align-items: center;\n line-height: 1;\n height: 32px;\n white-space: nowrap;\n cursor: pointer;\n color: #606266;\n text-align: center;\n box-sizing: border-box;\n outline: none;\n transition: 0.1s;\n font-weight: 500;\n padding: 8px 15px;\n font-size: 14px;\n border-radius: 4px;\n border: 1px solid #dcdfe6;\n background: #ffffff;\n}\n\n.my-button--primary {\n color: #fff;\n background-color: #409eff;\n border-color: #409eff;\n}\n\n.my-button--success {\n color: #fff;\n background-color: #67c23a;\n border-color: #67c23a;\n}\n\n.my-button--warning {\n color: #fff;\n background-color: #e6a23c;\n border-color: #e6a23c;\n}\n\n.my-button--danger {\n color: #fff;\n background-color: #f56c6c;\n border-color: #f56c6c;\n}\n\n.my-button.is-disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.my-button__loading {\n display: inline-block;\n width: 14px;\n height: 14px;\n border: 2px solid currentColor;\n border-radius: 50%;\n border-right-color: transparent;\n margin-right: 5px;\n animation: rotate 1s linear infinite;\n}\n\n@keyframes rotate {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n</style> ","export enum LocaleTypeEnum {\n English = 'en',\n Chinese = 'zh-CN',\n}\n","import type { InjectionKey, ComputedRef } from 'vue';\nimport { LocaleTypeEnum } from '../constants/locale';\n\nexport interface NavTexts {\n loginText: string;\n logoutText: string;\n}\n\nexport const NAV_TEXTS_KEY: InjectionKey<ComputedRef<NavTexts>> = Symbol('nav-texts');\n\nexport const buildNavTexts = (lang: LocaleTypeEnum): NavTexts => {\n const isZh = lang === LocaleTypeEnum.Chinese;\n return {\n loginText: isZh ? '登录/注册' : 'Log In / Sign Up',\n logoutText: isZh ? '退出登录' : 'Log Out',\n };\n};\n","<template>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g id=\"icon/down\">\n <path id=\"Union\" d=\"M12.1382 5.86191C11.8778 5.60156 11.4557 5.60156 11.1954 5.86191L8.0001 9.05717L4.80484 5.86191C4.54449 5.60156 4.12238 5.60156 3.86203 5.86191C3.60168 6.12226 3.60168 6.54437 3.86203 6.80472L7.29299 10.2357C7.68352 10.6262 8.31668 10.6262 8.70721 10.2357L12.1382 6.80472C12.3985 6.54437 12.3985 6.12226 12.1382 5.86191Z\" fill=\"#2C364B\"/>\n </g>\n </svg>\n</template>","<template>\n <svg width=\"19px\" height=\"20px\" viewBox=\"0 0 19 20\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <title>yonghu-2</title>\n <g id=\"页面-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <g id=\"flagos首页备份-4\" transform=\"translate(-1187, -32)\" fill=\"#FFFFFF\" fill-rule=\"nonzero\">\n <g id=\"yonghu-2\" transform=\"translate(1187, 32)\">\n <path d=\"M4.16667254,6.66658844 C4.16667254,3.9091208 6.40897956,1.66664712 9.1664472,1.66664712 C11.9239148,1.66664712 14.1663885,3.9091208 14.1663885,6.66658844 C14.1663885,9.42388942 11.9239148,11.6665298 9.1664472,11.6665298 C6.40897956,11.6665298 4.16650588,9.42388942 4.16650588,6.66658844 M18.3046733,18.9521109 C17.4853496,15.8829803 15.3253749,13.4830084 12.6130734,12.3621883 C14.5387175,11.192202 15.8330356,9.08056012 15.8330356,6.66642176 C15.832869,2.99079823 12.8420707,0 9.16628054,0 C5.49049035,0 2.4996921,2.99079823 2.4996921,6.66658844 C2.4996921,9.08056012 3.79384359,11.192202 5.72048764,12.3621883 C3.00801947,13.4838418 0.848044811,15.8829803 0.028221107,18.9521109 C-0.0900085115,19.3963877 0.174049854,19.8524478 0.618214182,19.971099 C1.06293982,20.0897021 1.51968816,19.8256771 1.63886887,19.3811059 C2.59002437,15.820481 5.68498805,13.3331769 9.16661386,13.3331769 C12.6482397,13.3331769 15.74387,15.8206477 16.6948589,19.3814392 C16.7515138,19.5951643 16.8909444,19.7775312 17.0823388,19.8882397 C17.2737332,19.9989483 17.5013346,20.0288842 17.7148469,19.9714323 C18.1590942,19.8527834 18.423176,19.3966084 18.30484,18.9522776\" id=\"形状\"></path>\n </g>\n </g>\n </g>\n </svg>\n</template>","<template>\n <el-dropdown popper-class=\"custom-dropdown\" size=\"large\" ref=\"dropdown\" trigger=\"click\" :show-arrow=\"false\" @visible-change=\"onVisibleChange\">\n <div class=\"flex items-center cursor-pointer\">\n <div class=\"w-24 h-24 rounded-50% font-600 flex-center mr-8\">\n <Header/>\n </div>\n\n <span>{{ userNickName }}</span>\n <el-icon\n class=\"el-icon--right !ml-16 transition-all duration-200\"\n :class=\"{\n ' rotate-180': dropdownVisible,\n }\"\n :size=\"16\"\n >\n <Down />\n </el-icon>\n </div>\n\n <template #dropdown>\n <el-dropdown-menu>\n <el-dropdown-item>\n <div class=\"flex items-center w-full text-14 mb-4\" @click=\"logout\">\n {{ navTexts?.logoutText }}\n </div>\n </el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n</template>\n\n<script setup lang=\"ts\">\nimport { inject, ref } from 'vue';\nimport { NAV_TEXTS_KEY } from './config/texts';\nimport Down from '../../../Icon/Down.vue';\nimport Header from '../../../Icon/Header.vue';\n\nconst navTexts = inject(NAV_TEXTS_KEY);\nconst dropdownVisible = ref(false);\nconst onVisibleChange = (visible: boolean) => {\n dropdownVisible.value = visible;\n};\ninterface Props {\n userNickName: string;\n currentPath: string;\n logout: () => void;\n}\n\ndefineProps<Props>();\n</script>\n\n<style scoped lang=\"scss\" >\n.reset-btn {\n border-color: #bec3cd;\n\n :deep(.el-button) {\n color: #3e4a54 !important;\n }\n &:hover {\n :deep(.el-button) {\n color: #3967e9 !important;\n }\n border-color: #3967e9;\n .el-icon {\n fill: #3967e9 !important;\n }\n }\n &:active {\n .el-icon {\n fill: #fff !important;\n }\n :deep(.el-button) {\n color: #fff !important;\n }\n border-color: transparent;\n background: #3967e9;\n }\n}\n</style>\n","<template>\n <el-button type=\"primary\" class=\"!rounded-4\" @click=\"login\">{{ navTexts?.loginText }}</el-button>\n</template>\n<script setup lang=\"ts\">\nimport { inject } from 'vue';\nimport { useRouter } from 'vue-router';\nimport { NAV_TEXTS_KEY } from './config/texts';\n\nconst navTexts = inject(NAV_TEXTS_KEY);\nconst router = useRouter();\n\nconst login = () => {\n router.push({ path: '/login', query: { redirect_url: encodeURIComponent(location.href) } });\n};\n</script>\n","import { LocaleTypeEnum } from '../constants/locale';\n\nexport const NAV_LOCALE_OPTIONS = [\n { value: LocaleTypeEnum.Chinese, label: '中文' },\n { value: LocaleTypeEnum.English, label: 'English' },\n];\n\nexport const NAV_LOCALE_TO_LANG: Record<LocaleTypeEnum, string> = {\n [LocaleTypeEnum.Chinese]: 'cn',\n [LocaleTypeEnum.English]: 'en',\n};\n\nexport const NAV_LANG_TO_LOCALE: Record<string, LocaleTypeEnum> = {\n cn: LocaleTypeEnum.Chinese,\n en: LocaleTypeEnum.English,\n};\n\nexport const NAV_WIKI_LANG_BY_LOCALE: Record<LocaleTypeEnum, string> = {\n [LocaleTypeEnum.Chinese]: 'zh',\n [LocaleTypeEnum.English]: 'en',\n};\n","<template>\n <el-dropdown class=\"cursor-pointer\" trigger=\"click\" popper-class=\"custom-dropdown\" placement=\"bottom\" @visible-change=\"handleChange\">\n <svg width=\"20px\" height=\"20px\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect fill=\"#D8D8D8\" opacity=\"0\" x=\"0\" y=\"0\" width=\"20\" height=\"20\"></rect>\n <path\n :fill=\"isWhite ? '#ffffff' : '#2C364B'\"\n fill-rule=\"nonzero\"\n d=\"M10,0 C4.48583334,0 0,4.48583334 0,10 C0,15.5141667 4.48583334,20 10,20 C15.5141667,20 20,15.5141667 20,10 C20,4.48583334 15.5141667,0 10,0 Z M18.6966667,10.9491667 L18.6925,10.9741667 C18.6575,11.2791667 18.6075,11.5791667 18.5425,11.8741667 L18.5425,11.875 L15.5258333,11.875 C15.657032,10.6284426 15.657032,9.37155738 15.5258333,8.125 L18.5425,8.125 C18.6075,8.42 18.6566667,8.72 18.6925,9.025 C18.6925,9.03333334 18.695,9.04166666 18.6966667,9.05083334 C18.7675,9.68166668 18.7675,10.3183333 18.6966667,10.9491667 L18.6966667,10.9491667 Z M13.34,18.0833333 C14.2783333,16.8683333 14.9891667,15.1491667 15.3516667,13.1241667 L18.1633333,13.1241667 C17.3009588,15.3668017 15.5579816,17.158563 13.34,18.0825 L13.34,18.0833333 Z M18.1625,6.87333334 L15.3516667,6.87333334 C14.9891667,4.84833334 14.2783333,3.13 13.34,1.915 C15.5576659,2.83912386 17.3003173,4.63085972 18.1625,6.87333334 L18.1625,6.87333334 Z M14.2658333,8.12333334 C14.4114344,9.36909341 14.4114344,10.6275733 14.2658333,11.8733333 L10.6241667,11.8733333 L10.6241667,8.12333334 L14.2658333,8.12333334 Z M10.6241667,6.87333334 L10.6241667,1.355 C12.1825,1.825 13.5008333,4.0025 14.07,6.87583334 L10.625,6.87583334 L10.6241667,6.87333334 Z M10.6241667,13.1233333 L14.07,13.1233333 C13.5008333,15.9983333 12.1825,18.175 10.625,18.645 L10.625,13.125 L10.6241667,13.1233333 Z M1.8375,13.1241667 L4.64833334,13.1241667 C5.01083334,15.1491667 5.72166668,16.8683333 6.66,18.0825 C4.44233408,17.1583761 2.69968275,15.3666403 1.8375,13.1241667 L1.8375,13.1241667 Z M6.66,1.91666666 C5.72166666,3.13 5.01083334,4.85 4.64833334,6.875 L1.83666666,6.875 C2.69923303,4.63220345 4.44253606,2.84041679 6.66083334,1.91666666 L6.66,1.91666666 Z M5.73416666,11.875 C5.58856559,10.6292399 5.58856559,9.37076007 5.73416666,8.125 L9.375,8.125 L9.375,11.875 L5.73333334,11.875 L5.73416666,11.875 Z M9.375,13.125 L9.375,18.6458333 C7.81666666,18.1758333 6.49916666,15.9983333 5.93,13.125 L9.375,13.125 Z M9.375,6.875 L5.93,6.875 C6.49916666,4.00166666 7.81666666,1.825 9.375,1.35416666 L9.375,6.875 Z M1.30416666,9.05 C1.30416666,9.04333334 1.30666666,9.03583334 1.3075,9.02833334 C1.34166666,8.725 1.39166666,8.42333334 1.4575,8.125 L4.47416666,8.125 C4.34243809,9.37152952 4.34243809,10.6284705 4.47416666,11.875 L1.4575,11.875 C1.39166666,11.5766667 1.34166666,11.275 1.3075,10.9716667 L1.30416666,10.9491667 C1.23220566,10.3184348 1.23220566,9.68156522 1.30416666,9.05083334 L1.30416666,9.05 Z\"\n />\n </svg>\n <template #dropdown>\n <el-dropdown-menu>\n <el-dropdown-item\n v-for=\"locale in localeOptions\"\n :key=\"locale.value\"\n :class=\"{ 'is-active': locale.value === currentLocale }\"\n @click=\"emitChangeLanguage(locale.value)\"\n >\n <span :class=\"{ 'color-primary': locale.value === currentLocale }\">\n {{ locale.label }}\n </span>\n </el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n</template>\n<script setup lang=\"tsx\">\nimport { ref, computed } from 'vue';\nimport { LocaleTypeEnum } from './constants/locale';\nimport { NAV_LOCALE_OPTIONS } from './config/locale';\n\nconst active = ref(false);\n\nconst handleChange = (val: boolean) => {\n active.value = val;\n};\n\ninterface LocaleOption {\n value: LocaleTypeEnum;\n label: string;\n}\n\ninterface Props {\n isWhiteTheme?: boolean;\n currentLocale: LocaleTypeEnum;\n localeOptions?: LocaleOption[];\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n isWhiteTheme: false,\n localeOptions: () => NAV_LOCALE_OPTIONS,\n});\n\nconst emits = defineEmits<{\n (e: 'change-language', locale: LocaleTypeEnum): void;\n}>();\n\nconst isWhite = computed(() => props.isWhiteTheme);\nconst currentLocale = computed(() => props.currentLocale);\nconst localeOptions = computed(() => props.localeOptions);\n\nconst emitChangeLanguage = (locale: LocaleTypeEnum) => {\n if (locale === currentLocale.value) {\n return;\n }\n emits('change-language', locale);\n};\n</script>\n<style scoped lang=\"scss\"></style>\n","export const matchPath = (path: string, targetPath: string): boolean => {\n if (!path || !targetPath) return false;\n return path.toLowerCase().indexOf(targetPath.toLowerCase()) >= 0;\n};\n\nexport const matchAnyPath = (path: string, targetPaths: string[]): boolean => {\n return targetPaths.some(targetPath => matchPath(path, targetPath));\n};\n","<template>\n <div\n class=\"w-full header-wrapper h-64px pl-120 pr-120 py-19 backdrop-blur-[14px] flex items-center justify-between text-#000 fixed left-0 top-0 z-99 bg-transparent overflow-x-scroll\"\n :class=\"{\n 'theme-white': isWhiteTheme,\n 'theme-scrolled': isScrolledTheme,\n '!b-0': matchPath(routePath, '/CommunityMembers'),\n }\"\n >\n <div class=\"flex-center\">\n <img\n class=\"logo\"\n :src=\"isWhiteTheme ? 'https://flagos.ks3-cn-beijing.ksyuncs.com/images/logo.svg' : 'https://flagos.ks3-cn-beijing.ksyuncs.com/images/logo-black.svg'\"\n @click=\"onLogoClick\"\n />\n <div class=\"flex gap-48 ml-80\">\n <div\n v-for=\"(menu, index) in menuList\"\n :index=\"index\"\n class=\"menu-item cursor-pointer whitespace-nowrap\"\n :class=\"{ active: menu.active }\"\n >\n <el-dropdown\n v-if=\"menu.dropdownList && menu.id === 'learn'\"\n popper-class=\"custom-dropdown-new\"\n :show-arrow=\"false\"\n >\n <span class=\"text-16\">{{ menu.label}}</span>\n <template #dropdown>\n <el-dropdown-menu class=\"flex-row\">\n <el-dropdown-item\n v-for=\"(childMenu, idx) in menu.dropdownList\"\n :key=\"idx\"\n :class=\"{ active: matchPath(routePath, childMenu.path) }\"\n @click=\"onJumpPage(menu, childMenu)\"\n >\n <span class=\"text-14 mb-16 !font-500\">{{ childMenu.label }}</span>\n <span class=\"text-14 whitespace-normal !font-400\">{{ childMenu.desc }}</span>\n </el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n <el-dropdown\n v-else-if=\"menu.dropdownList && menu.id === 'tools'\"\n popper-class=\"custom-dropdown-new\"\n :show-arrow=\"false\"\n >\n <span class=\"text-16\">{{ menu.label }}</span>\n <template #dropdown>\n <el-dropdown-menu>\n <el-dropdown-item v-for=\"(childMenu, idx) in menu.dropdownList\" :key=\"idx\" @click=\"onJumpPage(menu, childMenu)\">\n <span class=\"text-14 mb-16 !font-500\">{{childMenu.label }}</span>\n <span class=\"text-14 whitespace-normal !font-400\">{{ childMenu.desc }}</span>\n </el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n <el-dropdown v-else-if=\"menu.dropdownGroups && menu.id === 'projects'\" popper-class=\"custom-dropdown-new\" :show-arrow=\"false\">\n <span class=\"text-16\">{{ menu.label}}</span>\n <template #dropdown>\n <el-dropdown-menu class=\"flex gap-20 el-dropdown-menu_out\">\n <ul v-for=\"(group, idx) in menu.dropdownGroups\" :key=\"idx\" class=\"flex-1 el-dropdown-menu !w-[50%] !max-h-560px\">\n <span class=\"text-14 text-#bbbbbb leading-22 mb-20\">{{ group.label }}</span>\n <el-dropdown-item\n v-for=\"(childMenu, cidx) in group.list\"\n :key=\"cidx\"\n class=\"el-dropdown-menu__item !w-full\"\n @click=\"onJumpPage(menu, childMenu)\"\n >\n <span class=\"text-14 mb-16 !font-500\">{{ childMenu.label }}</span>\n <span class=\"text-14 whitespace-normal !font-400\">{{ childMenu.desc }}</span>\n </el-dropdown-item>\n </ul>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n <span v-else @click=\"onJumpPage(menu)\">{{ menu.label }}</span>\n </div>\n </div>\n </div>\n <div class=\"flex-center\" :class=\"isWhiteTheme ? 'text-#ffffff' : 'text-#262642'\">\n <Locale :isWhiteTheme=\"isWhiteTheme\" :current-locale=\"currentLocale\" @change-language=\"onChangeLanguage\" />\n <Login v-if=\"!userName\" class=\"ml-20\" />\n <Avatar\n v-if=\"userName\"\n class=\"header_avatar ml-20\"\n :class=\"isWhiteTheme ? 'text-#ffffff' : 'text-#262642'\"\n :user-nick-name=\"userNickName\"\n :current-path=\"routePath\"\n :logout=\"onLogout\"\n />\n </div>\n </div>\n</template>\n<script setup lang=\"ts\">\nimport { computed, provide } from 'vue';\nimport Avatar from './Avatar.vue';\nimport Login from './Login.vue';\nimport Locale from './Locale.vue';\nimport { LocaleTypeEnum } from './constants/locale';\nimport { matchPath } from './utils/path';\nimport type { NavMenuItem, NavChildItem } from './config/menus';\nimport { NAV_TEXTS_KEY, buildNavTexts } from './config/texts';\nimport 'uno.css';\ninterface Props {\n routePath: string;\n menuList: NavMenuItem[];\n isWhiteTheme: boolean;\n isScrolledTheme: boolean;\n currentLocale: LocaleTypeEnum;\n userName?: string;\n userNickName: string;\n onLogoClick: () => void;\n onJumpPage: (menu: NavMenuItem, childMenu?: NavChildItem) => void;\n onChangeLanguage: (locale: LocaleTypeEnum) => void;\n onLogout: () => void;\n}\n\nconst props = defineProps<Props>();\n\nprovide(\n NAV_TEXTS_KEY,\n computed(() => buildNavTexts(props.currentLocale))\n);\n\n</script>\n<style scoped lang=\"scss\">\n.header-wrapper {\n transition: all 0.3s ease;\n border-bottom: 1px solid rgba(0, 0, 0, 0.13);\n &.theme-white {\n color: #fff;\n border: none;\n background: transparent;\n svg {\n color: #fff;\n }\n .menu-item {\n &::before {\n background-color: #fff;\n }\n :deep(.el-dropdown) {\n color: #fff;\n }\n }\n }\n &.theme-scrolled {\n background: #fff;\n color: #262642;\n border-bottom: 1px solid rgba(0, 0, 0, 0.13);\n svg {\n color: #262642;\n }\n .menu-item {\n &::before {\n background-color: #262642;\n }\n :deep(.el-dropdown) {\n color: #262642;\n }\n }\n }\n .logo {\n width: 100px;\n height: 38px;\n cursor: pointer;\n object-fit: contain;\n }\n svg {\n color: #262642;\n }\n .menu-item {\n display: flex;\n align-items: center;\n position: relative;\n font-size: 16px;\n &::before {\n content: '';\n display: block;\n position: absolute;\n left: 0;\n bottom: -2px;\n width: 0;\n height: 2px;\n border-radius: 1px;\n background-color: #262642;\n transition: all 0.3s ease;\n transform-origin: center;\n }\n &.active {\n font-weight: 600;\n &::before {\n width: 100%;\n }\n }\n :deep(.el-dropdown) {\n color: #262642;\n }\n }\n}\n</style>\n<style lang=\"scss\">\n .el-popper.custom-dropdown-new {\n padding: 0 !important;\n width: 100%;\n margin-left: -1px;\n // height: 90%;\n max-width: 100% !important;\n margin-top: 12px;\n // inset: 64px auto auto auto !important;\n box-shadow: none;\n background: #07111E;\n opacity: 0.95;\n .el-dropdown__list {\n width: 100% !important;\n height: 100% !important;\n padding: 56px 120px;\n \n .el-dropdown-menu_out{\n display: flex;\n flex-wrap: wrap;\n max-height: 90% !important;\n flex-direction: row !important;\n column-gap: 20px;\n row-gap: 4px;\n background: transparent !important;\n box-shadow: none !important;\n }\n \n .el-dropdown-menu {\n display: flex;\n max-height: 360px;\n flex-direction: column;\n flex-wrap: wrap;\n column-gap: 20px;\n row-gap: 4px;\n background: transparent !important;\n box-shadow: none !important;\n &.flex-row {\n flex-direction: row !important;\n flex-wrap: nowrap;\n }\n .el-dropdown-menu__item{\n width: calc((100% - 20px * 2) / 3);\n padding: 0 !important;\n min-height: 64px;\n font-family: PingFangSC, PingFang SC;\n font-weight: 600;\n font-size: 14px;\n color: #FFFFFF !important;\n line-height: 22px;\n padding: 20px 16px !important;\n border-radius: 8px;\n border: 1px solid transparent;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n }\n .el-dropdown-menu__item:hover, .el-dropdown-menu__item:focus {\n background: rgba(255,255,255, 0.05);\n border: 1px solid rgba(255,255,255, 0.2);\n \n }\n }\n }\n }\n</style>","import { LocaleTypeEnum } from '../constants/locale';\nimport { NAV_WIKI_LANG_BY_LOCALE } from './locale';\n\n// ---------- Types ----------\n\nexport interface NavChildItem {\n id: string;\n label: string;\n path: string;\n desc?: string;\n type: 'route' | 'link' | 'unopen';\n}\n\nexport interface NavDropdownGroup {\n id: string;\n label: string;\n list: NavChildItem[];\n}\n\nexport interface NavMenuItem {\n id: string;\n label: string;\n path?: string;\n active?: boolean;\n /** flat items (tools / learn) */\n dropdownList?: NavChildItem[];\n /** grouped items (projects) */\n dropdownGroups?: NavDropdownGroup[];\n}\nconst mainDevHost = ['platform-aiintegration-dev.baai.ac.cn']\nconst mainProdHost =['flagos.io', 'flagos.net', 'www.flagos.io', 'www.flagos.net']\nconst mainHost = [...mainProdHost, ...mainDevHost]\n// ---------- Mock data ----------\nconst isMainApp = () => {\n return mainHost.includes(location.host)\n\n}\nconst buildMenu = (lang: LocaleTypeEnum): NavMenuItem[] => {\n const isZh = lang === LocaleTypeEnum.Chinese;\n const wikiLang = NAV_WIKI_LANG_BY_LOCALE[lang];\n\n return [\n {\n id: 'home',\n label: isZh ? '首页' : 'Home',\n path: '/Home',\n },\n {\n id: 'projects',\n label: isZh ? '软件栈' : 'Software Stack',\n dropdownGroups: [\n {\n id: 'coreLib',\n label: isZh ? '开源核心库' : 'Open-Source Core Libraries',\n list: [\n {\n id: 'flagscale',\n label: 'FlagScale',\n path: '/FlagScale',\n desc: isZh\n ? '统一多芯片、多后端的大模型框架,提供覆盖训练、微调与推理部署的全流程能力'\n : 'A unified multi-backend large model framework across diverse chips, providing end-to-end capabilities spanning training, fine-tuning, and inference deployment.',\n type: 'route',\n },\n {\n id: 'flaggems',\n label: 'FlagGems',\n path: '/FlagGems',\n desc: isZh\n ? '基于Triton实现的高性能通用算子库'\n : 'A high-performance general operator library built on Triton.',\n type: 'route',\n },\n {\n id: 'flagtree',\n label: 'FlagTree',\n path: '/FlagTree',\n desc: isZh\n ? '面向多种硬件的开源、统一AI编译器'\n : 'An open-source unified AI compiler for diverse hardware.',\n type: 'route',\n },\n {\n id: 'flagcx',\n label: 'FlagCX',\n path: '/FlagCX',\n desc: isZh\n ? '一款专为大规模AI系统设计的可扩展、自适应高性能跨芯片通信库'\n : 'A scalable, adaptive, high-performance cross-chip communication library designed for large-scale AI systems.',\n type: 'route',\n },\n ],\n },\n {\n id: 'ecosystem',\n label: isZh ? '生态使能项目' : 'FlagOS Ecosystem Enablement Project',\n list: [\n {\n id: 'megatronfl',\n label: 'Megatron-FL',\n path: 'https://github.com/flagos-ai/Megatron-LM-FL',\n desc: isZh\n ? '为Megatron-LM打造的多芯片插件,实现大模型多芯片高效训练'\n : 'A multi-chip plugin for Megatron-LM, enabling efficient large-scale training across diverse chips.',\n type: 'link',\n },\n {\n id: 'vllmpluginfl',\n label: 'vLLM-plugin-FL',\n path: 'https://github.com/flagos-ai/vllm-plugin-FL',\n desc: isZh\n ? '为vLLM打造的多芯片插件,实现大模型多芯片高效推理部署'\n : 'A multi-chip plugin for vLLM, enabling efficient large model inference and deployment across diverse chips.',\n type: 'link',\n },\n {\n id: 'transformerenginefl',\n label: 'TransformerEngine-FL',\n path: 'https://github.com/flagos-ai/TransformerEngine-FL',\n desc: isZh\n ? '为TransformerEngine打造的多芯片插件,实现多种芯片上分布式算子'\n : 'A multi-chip plugin for TransformerEngine, enabling distributed operators across diverse chip architectures.',\n type: 'link',\n },\n ],\n },\n ],\n },\n {\n id: 'tools',\n label: isZh ? '工具' : 'Tools',\n dropdownList: [\n {\n id: 'skill',\n label: isZh ? 'Skill广场' : 'SkillHub',\n path: resolvePath('/SkillHub'),\n desc: isZh ? '一站式AI计算技能库' : 'One-stop AI computing skills library.',\n type: 'route',\n },\n {\n id: 'onlinelab',\n label: isZh ? '线上实验室' : 'Online Laboratory',\n path: isMainApp() ?'/OnlineLab': resolvePath('/OnlineLab'),\n desc: isZh ? '开箱即用的在线实验环境' : 'Ready-to-use online experiment environment.',\n type: 'route',\n },\n {\n id: 'modelplatform',\n label: isZh ? '模型服务平台' : 'MaaS',\n path: '',\n desc: isZh\n ? '全生命周期大模型API服务平台'\n : 'A full-lifecycle API service platform for large models.',\n type: 'unopen',\n },\n {\n id: 'kernelgen',\n label: 'KernelGen',\n path: 'https://kernelgen.flagos.io/',\n desc: isZh\n ? '分钟级构建Kernel,支持多芯片后端'\n : 'Build Kernels in Minutes with Multi-Backend Support.',\n type: 'link',\n },\n {\n id: 'flagrelease',\n label: 'FlagRelease',\n path: '',\n desc: isZh\n ? '一套自动化迁移大模型至不同硬件产品的工具平台'\n : 'An automated tool platform for migrating large model to diverse hardware.',\n type: 'unopen',\n },\n {\n id: 'flagcicd',\n label: 'FlagCICD',\n path: '',\n desc: isZh\n ? '面向 AI 开发的持续集成 / 持续部署工具链'\n : 'A CI/CD toolchain for AI development.',\n type: 'unopen',\n },\n {\n id: 'flagmodelhub',\n label: isZh ? '九鼎AI一体化平台' : 'Jiuding AI Integrated Platform',\n path: '',\n desc: isZh\n ? '整合 FlagOS 全栈能力,提供从模型开发、训练到部署的一站式 AI 工程化平台'\n : 'Jiuding AI Platform.',\n type: 'unopen',\n },\n ],\n },\n {\n id: 'docs',\n label: isZh ? '文档' : 'Docs',\n },\n {\n id: 'learn',\n label: isZh ? '学习' : 'Learn',\n dropdownList: [\n {\n id: 'wiki',\n label: 'Wiki',\n desc: isZh ? '智能文档,边看边问边学': 'AI-powered interactive docs: query and learn in real-time.',\n path: `https://wiki.flagos.io`,\n type: 'link',\n },\n { id: 'professionalcourse', label: isZh ? '专业课' : 'Core Courses', desc: isZh ? '众智FlagOS系列开源课程' : 'The official open-source course series for the FlagOS ecosystem.', path: 'https://flagos.educoder.net/paths', type: 'link' },\n { id: 'course',label: isZh ? '讲座' : 'Tech Talks', desc: isZh ? '大咖分享,业界前沿讲座' : 'Cutting-edge insights and deep dives from industry leaders.', path: '/LearnCenter', type: 'route' },\n ],\n },\n {\n id: 'events',\n label: isZh ? '活动赛事' : 'Event & Competition',\n path: isMainApp() ?'/events': resolvePath('/events'),\n },\n {\n id: 'onlinelab-top',\n label: isZh ? '线上实验室' : 'Online Laboratory',\n path: isMainApp() ?'/OnlineLab': resolvePath('/OnlineLab'),\n },\n ];\n};\nconst resolvePath = (path: string): string => {\n if(mainProdHost.includes(location.hostname)) {\n return `https://${location.hostname}${path}`;\n } else {\n return `${location.protocol}//${path.slice(1).toLocaleLowerCase()}.${mainDevHost[0]}`;\n }\n};\n\nconst resolveMenuPaths = (items: NavMenuItem[]): NavMenuItem[] => {\n return items;\n};\n\n/**\n * Fetch nav menu by lang.\n * Replace the mock body with a real HTTP call when the backend is ready:\n * return request({ method: 'get', url: '/nav/menus', params: { lang } }).then(res => res.data);\n */\nexport const getNavMenuApi = (lang: LocaleTypeEnum): NavMenuItem[] => {\n return resolveMenuPaths(buildMenu(lang));\n};\n","export const openLink = (url: string) => {\n window.open(url, '_blank');\n};\n","import type { App } from 'vue';\nimport MyTable from './components/Table/index.vue';\nimport MyButton from './components/Button/index.vue';\nimport Header from './components/Header/src/Header.vue';\nexport * from './components/Header/src/index';\nexport { MyTable, MyButton, Header };\n\n// 插件安装方法\nexport default {\n install(app: App) {\n app.component('MyButton', MyButton);\n app.component('MyTable', MyTable);\n }\n}; ","import { ref, watch } from 'vue';\nimport type { Ref } from 'vue';\nimport { ElMessage } from 'element-plus';\nimport type { LocaleTypeEnum } from '../constants/locale';\nimport { getNavMenuApi, type NavMenuItem, type NavChildItem } from '../config/menus';\nimport { openLink } from '../utils/openLink';\nimport { matchPath, matchAnyPath } from '../utils/path';\nimport { NavigationFailure } from 'vue-router';\n\nexport function useHeaderMenu(\n currentLocale: Ref<LocaleTypeEnum>,\n push: (path: any) => Promise<NavigationFailure | void | undefined>,\n /** String shown when user clicks an unavailable item (e.g. t('projects.unopentip')) */\n unopenTip: Ref<string> | string\n) {\n const menuList = ref<NavMenuItem[]>([]);\n\n const fetchMenu = (lang: LocaleTypeEnum) => {\n const data = getNavMenuApi(lang);\n // preserve active state across refetch\n const activeId = menuList.value.find(m => m.active)?.id;\n menuList.value = data.map(m => ({ ...m, active: m.id === activeId }));\n };\n\n watch(currentLocale, lang => fetchMenu(lang), { immediate: true });\n\n const syncActiveMenu = (route: any) => {\n menuList.value.forEach(item => (item.active = false));\n const curIdx = menuList.value.findIndex(item => {\n if (item.dropdownList) {\n return item.dropdownList.some(child => matchPath(route?.path, child.path));\n }\n if (item.dropdownGroups) {\n return item.dropdownGroups.some(group =>\n group.list.some(child => matchPath(route?.path, child.path))\n );\n }\n if (matchPath(item.path as string, '/events') && matchAnyPath(route?.path, ['/EventDetail', '/RaceDetail'])) return true;\n if (item.id === 'onlinelab-top' && matchPath(route?.path, '/OnlineLab')) return true;\n return matchPath(route?.path, item.path as string);\n });\n if (curIdx >= 0) menuList.value[curIdx].active = true;\n };\n\n const handleJumpPage = (menu: NavMenuItem, childMenu?: NavChildItem) => {\n const tip = typeof unopenTip === 'string' ? unopenTip : unopenTip.value;\n\n if (['tools', 'projects', 'learn'].includes(menu.id)) {\n if (!childMenu) return;\n if (childMenu.path.startsWith('http')) return openLink(childMenu.path);\n if (childMenu.path) return push(childMenu.path);\n if (childMenu.type === 'unopen') return ElMessage.warning(tip);\n }\n if (menu.id === 'docs') return openLink('https://docs.flagos.io/');\n\n menuList.value.forEach(item => (item.active = false));\n menu.active = true;\n push(childMenu ? childMenu.path : menu.path);\n };\n\n return { menuList, syncActiveMenu, handleJumpPage };\n}\n","import { ref, nextTick, onMounted, onUnmounted } from 'vue';\nimport throttle from 'lodash/throttle';\nimport { matchPath, matchAnyPath } from '../utils/path';\n\nexport function useHeaderTheme(route: any) {\n const lastScrollTop = ref(0);\n const isWhiteTheme = ref(false);\n const isScrolledTheme = ref(false);\n\n const SCROLL_THRESHOLDS = {\n home: { getThreshold: () => window.innerHeight - 80 },\n events: { getThreshold: () => 390 - 80 },\n onlineLab: { getThreshold: () => 180 - 80 },\n };\n\n const updateThemeByScroll = (scrollTop: number, threshold: number) => {\n if (scrollTop > threshold) {\n isWhiteTheme.value = false;\n isScrolledTheme.value = true;\n } else {\n isWhiteTheme.value = true;\n isScrolledTheme.value = false;\n }\n lastScrollTop.value = scrollTop <= 0 ? 0 : scrollTop;\n };\n\n const handleScroll = throttle(() => {\n const scrollTop = window.scrollY || document.documentElement.scrollTop || 0;\n updateThemeByScroll(scrollTop, SCROLL_THRESHOLDS.home.getThreshold());\n }, 200);\n\n const handleEventsScroll = throttle(() => {\n const scrollTop = window.scrollY || document.documentElement.scrollTop || 0;\n const threshold = matchPath(route?.path, '/OnlineLab') ? SCROLL_THRESHOLDS.onlineLab.getThreshold() : SCROLL_THRESHOLDS.events.getThreshold();\n updateThemeByScroll(scrollTop, threshold);\n }, 200);\n\n const bindByRoute = () => {\n window.removeEventListener('scroll', handleScroll);\n window.removeEventListener('scroll', handleEventsScroll);\n\n if (matchPath(route?.path, '/Home')) {\n isWhiteTheme.value = true;\n isScrolledTheme.value = false;\n window.addEventListener('scroll', handleScroll);\n nextTick(() => handleScroll());\n } else if (matchAnyPath(route?.path, ['/events', '/EventDetail', '/RaceDetail', '/OnlineLab'])) {\n isWhiteTheme.value = true;\n isScrolledTheme.value = false;\n window.addEventListener('scroll', handleEventsScroll);\n nextTick(() => handleEventsScroll());\n } else {\n isWhiteTheme.value = false;\n isScrolledTheme.value = false;\n }\n };\n\n onMounted(() => bindByRoute());\n onUnmounted(() => {\n window.removeEventListener('scroll', handleScroll);\n window.removeEventListener('scroll', handleEventsScroll);\n });\n\n return { lastScrollTop, isWhiteTheme, isScrolledTheme, bindByRoute, handleScroll, handleEventsScroll };\n}\n"],"names":["_sfc_main$7","defineComponent","name","props","columns","type","Array","required","data","default","rowKey","String","_ctx","_cache","$props","$setup","$data","$options","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","createElementVNode","_hoisted_2","_Fragment","Fragment","_renderList","column","openBlock","createElementBlock","key","style","_normalizeStyle","width","class","renderList","row","rowIndex","$slots","length","_hoisted_3","colspan","_sfc_main$6","disabled","Boolean","loading","emits","setup","emit","typeClasses","computed","handleClick","e","_normalizeClass","args","_createCommentVNode","LocaleTypeEnum","NAV_TEXTS_KEY","Symbol","buildNavTexts","lang","isZh","Chinese","loginText","logoutText","height","viewBox","fill","_sfc_render","id","d","version","xmlns","stroke","transform","navTexts","inject","dropdownVisible","ref","onVisibleChange","visible","value","router","useRouter","login","push","path","query","redirect_url","encodeURIComponent","location","href","NAV_LOCALE_OPTIONS","label","English","NAV_LOCALE_TO_LANG","NAV_LANG_TO_LOCALE","cn","en","NAV_WIKI_LANG_BY_LOCALE","active","handleChange","val","__props","__emit","isWhite","isWhiteTheme","currentLocale","localeOptions","locale","matchPath","targetPath","toLowerCase","indexOf","matchAnyPath","targetPaths","some","vue","provide","mainDevHost","mainProdHost","mainHost","isMainApp","includes","host","resolvePath","hostname","protocol","slice","toLocaleLowerCase","getNavMenuApi","dropdownGroups","list","desc","dropdownList","buildMenu","openLink","url","window","open","index","install","app","component","MyButton","MyTable","unopenTip","menuList","activeId","_a","find","m","map","fetchMenu","immediate","syncActiveMenu","route","forEach","item","curIdx","findIndex","child","group","handleJumpPage","menu","childMenu","tip","startsWith","ElMessage","warning","lastScrollTop","isScrolledTheme","SCROLL_THRESHOLDS","getThreshold","innerHeight","updateThemeByScroll","scrollTop","threshold","handleScroll","throttle","scrollY","document","documentElement","handleEventsScroll","bindByRoute","removeEventListener","addEventListener","onUnmounted"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../src/components/Table/index.vue","../src/components/Button/index.vue","../src/components/Header/src/constants/locale.ts","../src/components/Header/src/config/texts.ts","../src/Icon/Down.vue","../src/Icon/Header.vue","../src/components/Header/src/Avatar.vue","../src/components/Header/src/Login.vue","../src/components/Header/src/config/locale.ts","../src/components/Header/src/Locale.vue","../src/components/Header/src/utils/path.ts","../src/components/Header/src/Header.vue","../src/components/Header/src/config/menus.ts","../src/components/Header/src/utils/openLink.ts","../src/index.ts","../src/components/Header/src/hooks/useHeaderMenu.ts","../src/components/Header/src/hooks/useHeaderTheme.ts"],"sourcesContent":["<template>\n <div class=\"w-full overflow-auto\">\n <table class=\"w-full border-collapse table-fixed\">\n <thead>\n <tr>\n <th \n v-for=\"column in columns\" \n :key=\"column.key\" \n :style=\"{ width: column.width }\"\n class=\"p-3 text-left bg-gray-100 text-gray-700 font-medium text-sm border-b border-gray-200\"\n >\n {{ column.title }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr \n v-for=\"(row, rowIndex) in data\" \n :key=\"rowKey ? row[rowKey] : rowIndex\"\n class=\"hover:bg-gray-50\"\n >\n <td \n v-for=\"column in columns\" \n :key=\"column.key\"\n class=\"p-3 text-left border-b border-gray-200 text-sm\"\n >\n <slot :name=\"column.key\" :row=\"row\" :index=\"rowIndex\">\n {{ row[column.key] }}\n </slot>\n </td>\n </tr>\n <tr v-if=\"!data || data.length === 0\">\n <td \n :colspan=\"columns.length\" \n class=\"p-8 text-center text-gray-500\"\n >\n <slot name=\"empty\">暂无数据</slot>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, PropType } from 'vue';\n\nexport interface TableColumn {\n key: string;\n title: string;\n width?: string;\n}\n\nexport default defineComponent({\n name: 'MyTable',\n props: {\n columns: {\n type: Array as PropType<TableColumn[]>,\n required: true\n },\n data: {\n type: Array as PropType<Record<string, any>[]>,\n default: () => []\n },\n rowKey: {\n type: String,\n default: ''\n }\n }\n});\n</script> ","<template>\n <button\n class=\"inline-flex justify-center items-center h-8 px-4 py-2 rounded-md text-sm font-medium transition-colors duration-200 focus:outline-none\"\n :class=\"[\n typeClasses,\n {\n 'opacity-50 cursor-not-allowed': disabled,\n 'relative': loading\n }\n ]\"\n :disabled=\"disabled || loading\"\n @click=\"handleClick\"\n >\n <span v-if=\"loading\" class=\"mr-2 w-4 h-4 i-svg-spinners-270-ring-with-bg\"></span>\n <slot></slot>\n </button>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, PropType } from 'vue';\n\ntype ButtonType = 'primary' | 'success' | 'warning' | 'danger' | 'info' | 'default';\n\nexport default defineComponent({\n name: 'MyButton',\n props: {\n type: {\n type: String as PropType<ButtonType>,\n default: 'default'\n },\n disabled: {\n type: Boolean,\n default: false\n },\n loading: {\n type: Boolean,\n default: false\n }\n },\n emits: ['click'],\n setup(props, { emit }) {\n // 根据类型计算样式类\n const typeClasses = computed(() => {\n switch (props.type) {\n case 'primary':\n return 'bg-primary hover:bg-blue-500 text-white border-transparent';\n case 'success':\n return 'bg-success hover:bg-green-500 text-white border-transparent';\n case 'warning':\n return 'bg-warning hover:bg-yellow-500 text-white border-transparent';\n case 'danger':\n return 'bg-danger hover:bg-red-500 text-white border-transparent';\n case 'info':\n return 'bg-info hover:bg-gray-500 text-white border-transparent';\n default:\n return 'bg-white hover:bg-gray-100 text-gray-700 border border-gray-300';\n }\n });\n\n const handleClick = (e: MouseEvent) => {\n if (props.disabled || props.loading) return;\n emit('click', e);\n };\n\n return {\n typeClasses,\n handleClick\n };\n }\n});\n</script>\n\n<style>\n.my-button {\n display: inline-flex;\n justify-content: center;\n align-items: center;\n line-height: 1;\n height: 32px;\n white-space: nowrap;\n cursor: pointer;\n color: #606266;\n text-align: center;\n box-sizing: border-box;\n outline: none;\n transition: 0.1s;\n font-weight: 500;\n padding: 8px 15px;\n font-size: 14px;\n border-radius: 4px;\n border: 1px solid #dcdfe6;\n background: #ffffff;\n}\n\n.my-button--primary {\n color: #fff;\n background-color: #409eff;\n border-color: #409eff;\n}\n\n.my-button--success {\n color: #fff;\n background-color: #67c23a;\n border-color: #67c23a;\n}\n\n.my-button--warning {\n color: #fff;\n background-color: #e6a23c;\n border-color: #e6a23c;\n}\n\n.my-button--danger {\n color: #fff;\n background-color: #f56c6c;\n border-color: #f56c6c;\n}\n\n.my-button.is-disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.my-button__loading {\n display: inline-block;\n width: 14px;\n height: 14px;\n border: 2px solid currentColor;\n border-radius: 50%;\n border-right-color: transparent;\n margin-right: 5px;\n animation: rotate 1s linear infinite;\n}\n\n@keyframes rotate {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n</style> ","export enum LocaleTypeEnum {\n English = 'en',\n Chinese = 'zh-CN',\n}\n","import type { InjectionKey, ComputedRef } from 'vue';\nimport { LocaleTypeEnum } from '../constants/locale';\n\nexport interface NavTexts {\n loginText: string;\n logoutText: string;\n}\n\nexport const NAV_TEXTS_KEY: InjectionKey<ComputedRef<NavTexts>> = Symbol('nav-texts');\n\nexport const buildNavTexts = (lang: LocaleTypeEnum): NavTexts => {\n const isZh = lang === LocaleTypeEnum.Chinese;\n return {\n loginText: isZh ? '登录/注册' : 'Log In / Sign Up',\n logoutText: isZh ? '退出登录' : 'Log Out',\n };\n};\n","<template>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g id=\"icon/down\">\n <path id=\"Union\" d=\"M12.1382 5.86191C11.8778 5.60156 11.4557 5.60156 11.1954 5.86191L8.0001 9.05717L4.80484 5.86191C4.54449 5.60156 4.12238 5.60156 3.86203 5.86191C3.60168 6.12226 3.60168 6.54437 3.86203 6.80472L7.29299 10.2357C7.68352 10.6262 8.31668 10.6262 8.70721 10.2357L12.1382 6.80472C12.3985 6.54437 12.3985 6.12226 12.1382 5.86191Z\" fill=\"#2C364B\"/>\n </g>\n </svg>\n</template>","<template>\n <svg width=\"19px\" height=\"20px\" viewBox=\"0 0 19 20\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <title>yonghu-2</title>\n <g id=\"页面-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <g id=\"flagos首页备份-4\" transform=\"translate(-1187, -32)\" fill=\"#FFFFFF\" fill-rule=\"nonzero\">\n <g id=\"yonghu-2\" transform=\"translate(1187, 32)\">\n <path d=\"M4.16667254,6.66658844 C4.16667254,3.9091208 6.40897956,1.66664712 9.1664472,1.66664712 C11.9239148,1.66664712 14.1663885,3.9091208 14.1663885,6.66658844 C14.1663885,9.42388942 11.9239148,11.6665298 9.1664472,11.6665298 C6.40897956,11.6665298 4.16650588,9.42388942 4.16650588,6.66658844 M18.3046733,18.9521109 C17.4853496,15.8829803 15.3253749,13.4830084 12.6130734,12.3621883 C14.5387175,11.192202 15.8330356,9.08056012 15.8330356,6.66642176 C15.832869,2.99079823 12.8420707,0 9.16628054,0 C5.49049035,0 2.4996921,2.99079823 2.4996921,6.66658844 C2.4996921,9.08056012 3.79384359,11.192202 5.72048764,12.3621883 C3.00801947,13.4838418 0.848044811,15.8829803 0.028221107,18.9521109 C-0.0900085115,19.3963877 0.174049854,19.8524478 0.618214182,19.971099 C1.06293982,20.0897021 1.51968816,19.8256771 1.63886887,19.3811059 C2.59002437,15.820481 5.68498805,13.3331769 9.16661386,13.3331769 C12.6482397,13.3331769 15.74387,15.8206477 16.6948589,19.3814392 C16.7515138,19.5951643 16.8909444,19.7775312 17.0823388,19.8882397 C17.2737332,19.9989483 17.5013346,20.0288842 17.7148469,19.9714323 C18.1590942,19.8527834 18.423176,19.3966084 18.30484,18.9522776\" id=\"形状\"></path>\n </g>\n </g>\n </g>\n </svg>\n</template>","<template>\n <el-dropdown popper-class=\"custom-dropdown\" size=\"large\" ref=\"dropdown\" trigger=\"click\" :show-arrow=\"false\" @visible-change=\"onVisibleChange\">\n <div class=\"flex items-center cursor-pointer\">\n <div class=\"w-24 h-24 rounded-50% font-600 flex-center mr-8\">\n <Header/>\n </div>\n\n <span>{{ userNickName }}</span>\n <el-icon\n class=\"el-icon--right !ml-16 transition-all duration-200\"\n :class=\"{\n ' rotate-180': dropdownVisible,\n }\"\n :size=\"16\"\n >\n <Down />\n </el-icon>\n </div>\n\n <template #dropdown>\n <el-dropdown-menu>\n <el-dropdown-item>\n <div class=\"flex items-center w-full text-14 mb-4\" @click=\"logout\">\n {{ navTexts?.logoutText }}\n </div>\n </el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n</template>\n\n<script setup lang=\"ts\">\nimport { inject, ref } from 'vue';\nimport { NAV_TEXTS_KEY } from './config/texts';\nimport Down from '../../../Icon/Down.vue';\nimport Header from '../../../Icon/Header.vue';\n\nconst navTexts = inject(NAV_TEXTS_KEY);\nconst dropdownVisible = ref(false);\nconst onVisibleChange = (visible: boolean) => {\n dropdownVisible.value = visible;\n};\ninterface Props {\n userNickName: string;\n currentPath: string;\n logout: () => void;\n}\n\ndefineProps<Props>();\n</script>\n\n<style scoped lang=\"scss\" >\n.reset-btn {\n border-color: #bec3cd;\n\n :deep(.el-button) {\n color: #3e4a54 !important;\n }\n &:hover {\n :deep(.el-button) {\n color: #3967e9 !important;\n }\n border-color: #3967e9;\n .el-icon {\n fill: #3967e9 !important;\n }\n }\n &:active {\n .el-icon {\n fill: #fff !important;\n }\n :deep(.el-button) {\n color: #fff !important;\n }\n border-color: transparent;\n background: #3967e9;\n }\n}\n</style>\n","<template>\n <el-button type=\"primary\" class=\"!rounded-4\" @click=\"login\">{{ navTexts?.loginText }}</el-button>\n</template>\n<script setup lang=\"ts\">\nimport { inject } from 'vue';\nimport { useRouter } from 'vue-router';\nimport { NAV_TEXTS_KEY } from './config/texts';\n\nconst navTexts = inject(NAV_TEXTS_KEY);\nconst router = useRouter();\n\nconst login = () => {\n router.push({ path: '/login', query: { redirect_url: encodeURIComponent(location.href) } });\n};\n</script>\n","import { LocaleTypeEnum } from '../constants/locale';\n\nexport const NAV_LOCALE_OPTIONS = [\n { value: LocaleTypeEnum.Chinese, label: '中文' },\n { value: LocaleTypeEnum.English, label: 'English' },\n];\n\nexport const NAV_LOCALE_TO_LANG: Record<LocaleTypeEnum, string> = {\n [LocaleTypeEnum.Chinese]: 'cn',\n [LocaleTypeEnum.English]: 'en',\n};\n\nexport const NAV_LANG_TO_LOCALE: Record<string, LocaleTypeEnum> = {\n cn: LocaleTypeEnum.Chinese,\n en: LocaleTypeEnum.English,\n};\n\nexport const NAV_WIKI_LANG_BY_LOCALE: Record<LocaleTypeEnum, string> = {\n [LocaleTypeEnum.Chinese]: 'zh',\n [LocaleTypeEnum.English]: 'en',\n};\n","<template>\n <el-dropdown class=\"cursor-pointer\" trigger=\"click\" popper-class=\"custom-dropdown\" placement=\"bottom\" @visible-change=\"handleChange\">\n <svg width=\"20px\" height=\"20px\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect fill=\"#D8D8D8\" opacity=\"0\" x=\"0\" y=\"0\" width=\"20\" height=\"20\"></rect>\n <path\n :fill=\"isWhite ? '#ffffff' : '#2C364B'\"\n fill-rule=\"nonzero\"\n d=\"M10,0 C4.48583334,0 0,4.48583334 0,10 C0,15.5141667 4.48583334,20 10,20 C15.5141667,20 20,15.5141667 20,10 C20,4.48583334 15.5141667,0 10,0 Z M18.6966667,10.9491667 L18.6925,10.9741667 C18.6575,11.2791667 18.6075,11.5791667 18.5425,11.8741667 L18.5425,11.875 L15.5258333,11.875 C15.657032,10.6284426 15.657032,9.37155738 15.5258333,8.125 L18.5425,8.125 C18.6075,8.42 18.6566667,8.72 18.6925,9.025 C18.6925,9.03333334 18.695,9.04166666 18.6966667,9.05083334 C18.7675,9.68166668 18.7675,10.3183333 18.6966667,10.9491667 L18.6966667,10.9491667 Z M13.34,18.0833333 C14.2783333,16.8683333 14.9891667,15.1491667 15.3516667,13.1241667 L18.1633333,13.1241667 C17.3009588,15.3668017 15.5579816,17.158563 13.34,18.0825 L13.34,18.0833333 Z M18.1625,6.87333334 L15.3516667,6.87333334 C14.9891667,4.84833334 14.2783333,3.13 13.34,1.915 C15.5576659,2.83912386 17.3003173,4.63085972 18.1625,6.87333334 L18.1625,6.87333334 Z M14.2658333,8.12333334 C14.4114344,9.36909341 14.4114344,10.6275733 14.2658333,11.8733333 L10.6241667,11.8733333 L10.6241667,8.12333334 L14.2658333,8.12333334 Z M10.6241667,6.87333334 L10.6241667,1.355 C12.1825,1.825 13.5008333,4.0025 14.07,6.87583334 L10.625,6.87583334 L10.6241667,6.87333334 Z M10.6241667,13.1233333 L14.07,13.1233333 C13.5008333,15.9983333 12.1825,18.175 10.625,18.645 L10.625,13.125 L10.6241667,13.1233333 Z M1.8375,13.1241667 L4.64833334,13.1241667 C5.01083334,15.1491667 5.72166668,16.8683333 6.66,18.0825 C4.44233408,17.1583761 2.69968275,15.3666403 1.8375,13.1241667 L1.8375,13.1241667 Z M6.66,1.91666666 C5.72166666,3.13 5.01083334,4.85 4.64833334,6.875 L1.83666666,6.875 C2.69923303,4.63220345 4.44253606,2.84041679 6.66083334,1.91666666 L6.66,1.91666666 Z M5.73416666,11.875 C5.58856559,10.6292399 5.58856559,9.37076007 5.73416666,8.125 L9.375,8.125 L9.375,11.875 L5.73333334,11.875 L5.73416666,11.875 Z M9.375,13.125 L9.375,18.6458333 C7.81666666,18.1758333 6.49916666,15.9983333 5.93,13.125 L9.375,13.125 Z M9.375,6.875 L5.93,6.875 C6.49916666,4.00166666 7.81666666,1.825 9.375,1.35416666 L9.375,6.875 Z M1.30416666,9.05 C1.30416666,9.04333334 1.30666666,9.03583334 1.3075,9.02833334 C1.34166666,8.725 1.39166666,8.42333334 1.4575,8.125 L4.47416666,8.125 C4.34243809,9.37152952 4.34243809,10.6284705 4.47416666,11.875 L1.4575,11.875 C1.39166666,11.5766667 1.34166666,11.275 1.3075,10.9716667 L1.30416666,10.9491667 C1.23220566,10.3184348 1.23220566,9.68156522 1.30416666,9.05083334 L1.30416666,9.05 Z\"\n />\n </svg>\n <template #dropdown>\n <el-dropdown-menu>\n <el-dropdown-item\n v-for=\"locale in localeOptions\"\n :key=\"locale.value\"\n :class=\"{ 'is-active': locale.value === currentLocale }\"\n @click=\"emitChangeLanguage(locale.value)\"\n >\n <span :class=\"{ 'color-primary': locale.value === currentLocale }\">\n {{ locale.label }}\n </span>\n </el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n</template>\n<script setup lang=\"tsx\">\nimport { ref, computed } from 'vue';\nimport { LocaleTypeEnum } from './constants/locale';\nimport { NAV_LOCALE_OPTIONS } from './config/locale';\n\nconst active = ref(false);\n\nconst handleChange = (val: boolean) => {\n active.value = val;\n};\n\ninterface LocaleOption {\n value: LocaleTypeEnum;\n label: string;\n}\n\ninterface Props {\n isWhiteTheme?: boolean;\n currentLocale: LocaleTypeEnum;\n localeOptions?: LocaleOption[];\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n isWhiteTheme: false,\n localeOptions: () => NAV_LOCALE_OPTIONS,\n});\n\nconst emits = defineEmits<{\n (e: 'change-language', locale: LocaleTypeEnum): void;\n}>();\n\nconst isWhite = computed(() => props.isWhiteTheme);\nconst currentLocale = computed(() => props.currentLocale);\nconst localeOptions = computed(() => props.localeOptions);\n\nconst emitChangeLanguage = (locale: LocaleTypeEnum) => {\n if (locale === currentLocale.value) {\n return;\n }\n emits('change-language', locale);\n};\n</script>\n<style scoped lang=\"scss\"></style>\n","export const matchPath = (path: string, targetPath: string): boolean => {\n if (!path || !targetPath) return false;\n return path.toLowerCase().indexOf(targetPath.toLowerCase()) >= 0;\n};\n\nexport const matchAnyPath = (path: string, targetPaths: string[]): boolean => {\n return targetPaths.some(targetPath => matchPath(path, targetPath));\n};\n","<template>\n <div\n class=\"w-full header-wrapper h-64px pl-120 pr-120 py-19 backdrop-blur-[14px] flex items-center justify-between text-#000 fixed left-0 top-0 z-99 bg-transparent overflow-x-scroll\"\n :class=\"{\n 'theme-white': isWhiteTheme,\n 'theme-scrolled': isScrolledTheme,\n '!b-0': matchPath(routePath, '/CommunityMembers'),\n dropdownVisible: dropdownVisible,\n }\"\n >\n <div class=\"flex-center\">\n <img\n class=\"logo\"\n :src=\"isWhiteTheme || dropdownVisible ? 'https://flagos.ks3-cn-beijing.ksyuncs.com/images/logo.svg' : 'https://flagos.ks3-cn-beijing.ksyuncs.com/images/logo-black.svg'\"\n @click=\"onLogoClick\"\n />\n <div class=\"flex gap-48 ml-80\">\n <div\n v-for=\"(menu, index) in menuList\"\n :index=\"index\"\n class=\"menu-item cursor-pointer whitespace-nowrap\"\n :class=\"{ active: menu.active }\"\n >\n <el-dropdown\n v-if=\"menu.dropdownList && menu.id === 'learn'\"\n popper-class=\"custom-dropdown-new\"\n :show-arrow=\"false\"\n @visible-change=\"handleDropdownVisibleChange\"\n >\n <span class=\"text-16\">{{ menu.label}}</span>\n <template #dropdown>\n <el-dropdown-menu class=\"flex-row\">\n <el-dropdown-item\n v-for=\"(childMenu, idx) in menu.dropdownList\"\n :key=\"idx\"\n :class=\"{ active: matchPath(routePath, childMenu.path) }\"\n @click=\"onJumpPage(menu, childMenu)\"\n >\n <span class=\"text-14 mb-16 !font-500\">{{ childMenu.label }}</span>\n <span class=\"text-14 whitespace-normal !font-400\">{{ childMenu.desc }}</span>\n </el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n <el-dropdown\n v-else-if=\"menu.dropdownList && menu.id === 'tools'\"\n popper-class=\"custom-dropdown-new\"\n :show-arrow=\"false\"\n @visible-change=\"handleDropdownVisibleChange\"\n >\n <span class=\"text-16\">{{ menu.label }}</span>\n <template #dropdown>\n <el-dropdown-menu>\n <el-dropdown-item v-for=\"(childMenu, idx) in menu.dropdownList\" :key=\"idx\" @click=\"onJumpPage(menu, childMenu)\">\n <span class=\"text-14 mb-16 !font-500\">{{childMenu.label }}</span>\n <span class=\"text-14 whitespace-normal !font-400\">{{ childMenu.desc }}</span>\n </el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n <el-dropdown v-else-if=\"menu.dropdownGroups && menu.id === 'projects'\" popper-class=\"custom-dropdown-new\" :show-arrow=\"false\" @visible-change=\"handleDropdownVisibleChange\">\n <span class=\"text-16\">{{ menu.label}}</span>\n <template #dropdown>\n <el-dropdown-menu class=\"flex gap-20 el-dropdown-menu_out\">\n <ul v-for=\"(group, idx) in menu.dropdownGroups\" :key=\"idx\" class=\"flex-1 el-dropdown-menu !w-[50%] !max-h-560px\">\n <span class=\"text-14 text-#bbbbbb leading-22 mb-20\">{{ group.label }}</span>\n <el-dropdown-item\n v-for=\"(childMenu, cidx) in group.list\"\n :key=\"cidx\"\n class=\"el-dropdown-menu__item !w-full\"\n @click=\"onJumpPage(menu, childMenu)\"\n >\n <span class=\"text-14 mb-16 !font-500\">{{ childMenu.label }}</span>\n <span class=\"text-14 whitespace-normal !font-400\">{{ childMenu.desc }}</span>\n </el-dropdown-item>\n </ul>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n <span v-else @click=\"onJumpPage(menu)\">{{ menu.label }}</span>\n </div>\n </div>\n </div>\n <div class=\"flex-center\" :class=\"isWhiteTheme ? 'text-#ffffff' : 'text-#262642'\">\n <Locale :isWhiteTheme=\"isWhiteTheme || dropdownVisible\" :current-locale=\"currentLocale\" @change-language=\"onChangeLanguage\" />\n <Login v-if=\"!userName\" class=\"ml-20\" />\n <Avatar\n v-if=\"userName\"\n class=\"header_avatar ml-20\"\n :class=\"isWhiteTheme || dropdownVisible ? 'text-#ffffff' : 'text-#262642'\"\n :user-nick-name=\"userNickName\"\n :current-path=\"routePath\"\n :logout=\"onLogout\"\n />\n </div>\n </div>\n</template>\n<script setup lang=\"ts\">\nimport { computed, provide, ref } from 'vue';\nimport Avatar from './Avatar.vue';\nimport Login from './Login.vue';\nimport Locale from './Locale.vue';\nimport { LocaleTypeEnum } from './constants/locale';\nimport { matchPath } from './utils/path';\nimport type { NavMenuItem, NavChildItem } from './config/menus';\nimport { NAV_TEXTS_KEY, buildNavTexts } from './config/texts';\nimport 'uno.css';\ninterface Props {\n routePath: string;\n menuList: NavMenuItem[];\n isWhiteTheme: boolean;\n isScrolledTheme: boolean;\n currentLocale: LocaleTypeEnum;\n userName?: string;\n userNickName: string;\n onLogoClick: () => void;\n onJumpPage: (menu: NavMenuItem, childMenu?: NavChildItem) => void;\n onChangeLanguage: (locale: LocaleTypeEnum) => void;\n onLogout: () => void;\n}\n\nconst dropdownVisible = ref(false)\nconst handleDropdownVisibleChange = (visible: boolean) => {\n dropdownVisible.value = visible\n}\nconst props = defineProps<Props>();\n\nprovide(\n NAV_TEXTS_KEY,\n computed(() => buildNavTexts(props.currentLocale))\n);\n\n</script>\n<style scoped lang=\"scss\">\n.header-wrapper {\n transition: all 0.3s ease;\n border-bottom: 1px solid rgba(0, 0, 0, 0.13);\n &.theme-white {\n color: #fff;\n border: none;\n background: transparent;\n svg {\n color: #fff;\n }\n .menu-item {\n &::before {\n background-color: #fff;\n }\n :deep(.el-dropdown) {\n color: #fff;\n }\n }\n }\n &.theme-scrolled {\n background: #fff;\n color: #262642;\n border-bottom: 1px solid rgba(0, 0, 0, 0.13);\n svg {\n color: #262642;\n }\n .menu-item {\n &::before {\n background-color: #262642;\n }\n :deep(.el-dropdown) {\n color: #262642;\n }\n }\n }\n &.dropdownVisible {\n background: #07111e !important;\n opacity: 0.95 !important;\n color: #fff;\n border: none;\n svg {\n color: #fff;\n }\n .menu-item {\n &::before {\n background-color: #fff;\n }\n :deep(.el-dropdown) {\n color: #fff;\n }\n }\n }\n .logo {\n width: 100px;\n height: 38px;\n cursor: pointer;\n object-fit: contain;\n }\n svg {\n color: #262642;\n }\n .menu-item {\n display: flex;\n align-items: center;\n position: relative;\n font-size: 16px;\n &::before {\n content: '';\n display: block;\n position: absolute;\n left: 0;\n bottom: -2px;\n width: 0;\n height: 2px;\n border-radius: 1px;\n background-color: #262642;\n transition: all 0.3s ease;\n transform-origin: center;\n }\n &.active {\n font-weight: 600;\n &::before {\n width: 100%;\n }\n }\n :deep(.el-dropdown) {\n color: #262642;\n }\n }\n}\n</style>\n<style lang=\"scss\">\n\n .el-popper.custom-dropdown-new {\n border: none !important;\n border-radius: 0 !important;\n padding: 0 !important;\n width: 100%;\n // margin-left: -1px;\n // height: 90%;\n max-width: 100% !important;\n margin-top: 12px;\n // inset: 64px auto auto auto !important;\n box-shadow: none;\n background: #07111E;\n opacity: 0.95;\n .el-dropdown__list {\n width: 100% !important;\n height: 100% !important;\n padding: 56px 120px;\n \n .el-dropdown-menu_out{\n display: flex;\n flex-wrap: wrap;\n max-height: 90% !important;\n flex-direction: row !important;\n column-gap: 20px;\n row-gap: 4px;\n background: transparent !important;\n box-shadow: none !important;\n }\n \n .el-dropdown-menu {\n display: flex;\n max-height: 360px;\n flex-direction: column;\n flex-wrap: wrap;\n column-gap: 20px;\n row-gap: 4px;\n background: transparent !important;\n box-shadow: none !important;\n &.flex-row {\n flex-direction: row !important;\n flex-wrap: nowrap;\n }\n .el-dropdown-menu__item{\n width: calc((100% - 20px * 2) / 3);\n padding: 0 !important;\n min-height: 64px;\n font-family: PingFangSC, PingFang SC;\n font-weight: 600;\n font-size: 14px;\n color: #FFFFFF !important;\n line-height: 22px;\n padding: 20px 16px !important;\n border-radius: 8px;\n border: 1px solid transparent;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n }\n .el-dropdown-menu__item:hover, .el-dropdown-menu__item:focus {\n background: rgba(255,255,255, 0.05);\n border: 1px solid rgba(255,255,255, 0.2);\n \n }\n }\n }\n }\n</style>","import { LocaleTypeEnum } from '../constants/locale';\nimport { NAV_WIKI_LANG_BY_LOCALE } from './locale';\n\n// ---------- Types ----------\n\nexport interface NavChildItem {\n id: string;\n label: string;\n path: string;\n desc?: string;\n type: 'route' | 'link' | 'unopen';\n}\n\nexport interface NavDropdownGroup {\n id: string;\n label: string;\n list: NavChildItem[];\n}\n\nexport interface NavMenuItem {\n id: string;\n label: string;\n path?: string;\n active?: boolean;\n /** flat items (tools / learn) */\n dropdownList?: NavChildItem[];\n /** grouped items (projects) */\n dropdownGroups?: NavDropdownGroup[];\n}\nconst mainTestHost = ['platform-aiintegration-dev.baai.ac.cn']\nconst mainProdHost =['flagos.io', 'flagos.net', 'www.flagos.io', 'www.flagos.net']\nconst mainHost = [...mainProdHost, ...mainTestHost]\n// ---------- Mock data ----------\nconst isMainApp = () => {\n return mainHost.includes(location.host)\n\n}\n// innerMain主站内点击\nconst buildMenu = (lang: LocaleTypeEnum, innerMain =false): NavMenuItem[] => {\n const isZh = lang === LocaleTypeEnum.Chinese;\n const wikiLang = NAV_WIKI_LANG_BY_LOCALE[lang];\n\n return [\n {\n id: 'home',\n label: isZh ? '首页' : 'Home',\n path: innerMain ? '/Home': resolvePath('/Home'),\n },\n {\n id: 'projects',\n label: isZh ? '软件栈' : 'Software Stack',\n dropdownGroups: [\n {\n id: 'coreLib',\n label: isZh ? '开源核心库' : 'Open-Source Core Libraries',\n list: [\n {\n id: 'flagscale',\n label: 'FlagScale',\n path: innerMain ? `/FlagScale`: resolvePath('/FlagScale'),\n desc: isZh\n ? '统一多芯片、多后端的大模型框架,提供覆盖训练、微调与推理部署的全流程能力'\n : 'A unified multi-backend large model framework across diverse chips, providing end-to-end capabilities spanning training, fine-tuning, and inference deployment.',\n type: 'route',\n },\n {\n id: 'flaggems',\n label: 'FlagGems',\n path: innerMain ? `/FlagGems` : resolvePath('/FlagGems'),\n desc: isZh\n ? '基于Triton实现的高性能通用算子库'\n : 'A high-performance general operator library built on Triton.',\n type: 'route',\n },\n {\n id: 'flagtree',\n label: 'FlagTree',\n path: innerMain ? '/FlagTree': resolvePath('/FlagTree'),\n desc: isZh\n ? '面向多种硬件的开源、统一AI编译器'\n : 'An open-source unified AI compiler for diverse hardware.',\n type: 'route',\n },\n {\n id: 'flagcx',\n label: 'FlagCX',\n path: innerMain ? '/FlagCX' : resolvePath('/FlagCX'),\n desc: isZh\n ? '一款专为大规模AI系统设计的可扩展、自适应高性能跨芯片通信库'\n : 'A scalable, adaptive, high-performance cross-chip communication library designed for large-scale AI systems.',\n type: 'route',\n },\n ],\n },\n {\n id: 'ecosystem',\n label: isZh ? '生态使能项目' : 'FlagOS Ecosystem Enablement Project',\n list: [\n {\n id: 'megatronfl',\n label: 'Megatron-FL',\n path: 'https://github.com/flagos-ai/Megatron-LM-FL',\n desc: isZh\n ? '为Megatron-LM打造的多芯片插件,实现大模型多芯片高效训练'\n : 'A multi-chip plugin for Megatron-LM, enabling efficient large-scale training across diverse chips.',\n type: 'link',\n },\n {\n id: 'vllmpluginfl',\n label: 'vLLM-plugin-FL',\n path: 'https://github.com/flagos-ai/vllm-plugin-FL',\n desc: isZh\n ? '为vLLM打造的多芯片插件,实现大模型多芯片高效推理部署'\n : 'A multi-chip plugin for vLLM, enabling efficient large model inference and deployment across diverse chips.',\n type: 'link',\n },\n {\n id: 'transformerenginefl',\n label: 'TransformerEngine-FL',\n path: 'https://github.com/flagos-ai/TransformerEngine-FL',\n desc: isZh\n ? '为TransformerEngine打造的多芯片插件,实现多种芯片上分布式算子'\n : 'A multi-chip plugin for TransformerEngine, enabling distributed operators across diverse chip architectures.',\n type: 'link',\n },\n ],\n },\n ],\n },\n {\n id: 'tools',\n label: isZh ? '工具' : 'Tools',\n dropdownList: [\n {\n id: 'skill',\n label: isZh ? 'Skill广场' : 'SkillHub',\n path: resolvePath('/SkillHub', 'skillhub'),\n desc: isZh ? '一站式AI计算技能库' : 'One-stop AI computing skills library.',\n type: 'route',\n },\n {\n id: 'onlinelab',\n label: isZh ? '线上实验室' : 'Online Laboratory',\n path: innerMain ?'/OnlineLab': resolvePath('/OnlineLab'),\n desc: isZh ? '开箱即用的在线实验环境' : 'Ready-to-use online experiment environment.',\n type: 'route',\n },\n {\n id: 'modelplatform',\n label: isZh ? '模型服务平台' : 'MaaS',\n path: '',\n desc: isZh\n ? '全生命周期大模型API服务平台'\n : 'A full-lifecycle API service platform for large models.',\n type: 'unopen',\n },\n {\n id: 'kernelgen',\n label: 'KernelGen',\n path: 'https://kernelgen.flagos.io/',\n desc: isZh\n ? '分钟级构建Kernel,支持多芯片后端'\n : 'Build Kernels in Minutes with Multi-Backend Support.',\n type: 'link',\n },\n {\n id: 'flagrelease',\n label: 'FlagRelease',\n path: '',\n desc: isZh\n ? '一套自动化迁移大模型至不同硬件产品的工具平台'\n : 'An automated tool platform for migrating large model to diverse hardware.',\n type: 'unopen',\n },\n {\n id: 'flagcicd',\n label: 'FlagCICD',\n path: '',\n desc: isZh\n ? '面向 AI 开发的持续集成 / 持续部署工具链'\n : 'A CI/CD toolchain for AI development.',\n type: 'unopen',\n },\n {\n id: 'flagmodelhub',\n label: isZh ? '九鼎AI一体化平台' : 'Jiuding AI Integrated Platform',\n path: '',\n desc: isZh\n ? '整合 FlagOS 全栈能力,提供从模型开发、训练到部署的一站式 AI 工程化平台'\n : 'Jiuding AI Platform.',\n type: 'unopen',\n },\n ],\n },\n {\n id: 'docs',\n label: isZh ? '文档' : 'Docs',\n },\n {\n id: 'learn',\n label: isZh ? '学习' : 'Learn',\n dropdownList: [\n {\n id: 'wiki',\n label: 'Wiki',\n desc: isZh ? '智能文档,边看边问边学': 'AI-powered interactive docs: query and learn in real-time.',\n path: `https://wiki.flagos.io`,\n type: 'link',\n },\n { id: 'professionalcourse', label: isZh ? '专业课' : 'Core Courses', desc: isZh ? '众智FlagOS系列开源课程' : 'The official open-source course series for the FlagOS ecosystem.', path: 'https://flagos.educoder.net/paths', type: 'link' },\n { id: 'course',label: isZh ? '讲座' : 'Tech Talks', desc: isZh ? '大咖分享,业界前沿讲座' : 'Cutting-edge insights and deep dives from industry leaders.', path: '/LearnCenter', type: 'route' },\n ],\n },\n {\n id: 'events',\n label: isZh ? '活动赛事' : 'Event & Competition',\n path: innerMain ?'/events': resolvePath('/events'),\n },\n {\n id: 'onlinelab-top',\n label: isZh ? '线上实验室' : 'Online Laboratory',\n path: innerMain ?'/OnlineLab': resolvePath('/OnlineLab'),\n },\n ];\n};\nconst getSubHostName = () => {\n if(mainHost.includes(location.hostname)) {\n return location.hostname.split('.').slice(1).join('.')\n } else {\n return mainTestHost[0]+ '/flag-os'\n }\n}\nconst resolvePath = (path: string, subAppName = ''): string => {\n if(subAppName){\n return location.hostname.includes(subAppName) ? path: mainHost.includes(location.hostname) ? `${location.protocol}//${[subAppName, ...getSubHostName().split('.')].join('.')}`: `${location.protocol}//${[subAppName, ...mainTestHost[0].split('.')].join('.')}`;\n } else {\n return `${location.protocol}//${getSubHostName()}${path}`;\n }\n};\n\nconst resolveMenuPaths = (items: NavMenuItem[]): NavMenuItem[] => {\n return items;\n};\n\n/**\n * Fetch nav menu by lang.\n * Replace the mock body with a real HTTP call when the backend is ready:\n * return request({ method: 'get', url: '/nav/menus', params: { lang } }).then(res => res.data);\n */\nexport const getNavMenuApi = (lang: LocaleTypeEnum, isMainApp =false): NavMenuItem[] => {\n return resolveMenuPaths(buildMenu(lang, isMainApp));\n};\n","export const openLink = (url: string) => {\n window.open(url, '_blank');\n};\n","import type { App } from 'vue';\nimport MyTable from './components/Table/index.vue';\nimport MyButton from './components/Button/index.vue';\nimport Header from './components/Header/src/Header.vue';\nexport * from './components/Header/src/index';\nexport { MyTable, MyButton, Header };\n\n// 插件安装方法\nexport default {\n install(app: App) {\n app.component('MyButton', MyButton);\n app.component('MyTable', MyTable);\n }\n}; ","import { ref, watch } from 'vue';\nimport type { Ref } from 'vue';\nimport { ElMessage } from 'element-plus';\nimport type { LocaleTypeEnum } from '../constants/locale';\nimport { getNavMenuApi, type NavMenuItem, type NavChildItem } from '../config/menus';\nimport { openLink } from '../utils/openLink';\nimport { matchPath, matchAnyPath } from '../utils/path';\nimport { NavigationFailure } from 'vue-router';\n\nexport function useHeaderMenu(\n currentLocale: Ref<LocaleTypeEnum>,\n push: (path: any) => Promise<NavigationFailure | void | undefined>,\n /** String shown when user clicks an unavailable item (e.g. t('projects.unopentip')) */\n unopenTip: Ref<string> | string,\n innerMain = true\n) {\n const menuList = ref<NavMenuItem[]>([]);\n\n const fetchMenu = (lang: LocaleTypeEnum) => {\n const data = getNavMenuApi(lang, innerMain);\n // preserve active state across refetch\n const activeId = menuList.value.find(m => m.active)?.id;\n menuList.value = data.map(m => ({ ...m, active: m.id === activeId }));\n };\n\n watch(currentLocale, lang => fetchMenu(lang), { immediate: true });\n\n const syncActiveMenu = (route: any) => {\n menuList.value.forEach(item => (item.active = false));\n const curIdx = menuList.value.findIndex(item => {\n if (item.dropdownList) {\n return item.dropdownList.some(child => matchPath(route?.path, child.path));\n }\n if (item.dropdownGroups) {\n return item.dropdownGroups.some(group =>\n group.list.some(child => matchPath(route?.path, child.path))\n );\n }\n if (matchPath(item.path as string, '/events') && matchAnyPath(route?.path, ['/EventDetail', '/RaceDetail'])) return true;\n if (item.id === 'onlinelab-top' && matchPath(route?.path, '/OnlineLab')) return true;\n return matchPath(route?.path, item.path as string);\n });\n if (curIdx >= 0) menuList.value[curIdx].active = true;\n };\n\n const handleJumpPage = (menu: NavMenuItem, childMenu?: NavChildItem) => {\n const tip = typeof unopenTip === 'string' ? unopenTip : unopenTip.value;\n\n if (['tools', 'projects', 'learn'].includes(menu.id)) {\n if (!childMenu) return;\n if (childMenu.path.startsWith('http')) return openLink(childMenu.path);\n if (childMenu.path) return push(childMenu.path);\n if (childMenu.type === 'unopen') return ElMessage.warning(tip);\n }\n else if (menu.id === 'docs') return openLink('https://docs.flagos.io/');\n else {\n if(menu.path?.startsWith('http')) {\n openLink(menu.path)\n } else {\n menuList.value.forEach(item => (item.active = false));\n menu.active = true;\n push(menu.path);\n }\n }\n \n };\n\n return { menuList, syncActiveMenu, handleJumpPage };\n}\n","import { ref, nextTick, onMounted, onUnmounted } from 'vue';\nimport throttle from 'lodash/throttle';\nimport { matchPath, matchAnyPath } from '../utils/path';\n\nexport function useHeaderTheme(route: any) {\n const lastScrollTop = ref(0);\n const isWhiteTheme = ref(false);\n const isScrolledTheme = ref(false);\n\n const SCROLL_THRESHOLDS = {\n home: { getThreshold: () => window.innerHeight - 80 },\n events: { getThreshold: () => 390 - 80 },\n onlineLab: { getThreshold: () => 180 - 80 },\n };\n\n const updateThemeByScroll = (scrollTop: number, threshold: number) => {\n if (scrollTop > threshold) {\n isWhiteTheme.value = false;\n isScrolledTheme.value = true;\n } else {\n isWhiteTheme.value = true;\n isScrolledTheme.value = false;\n }\n lastScrollTop.value = scrollTop <= 0 ? 0 : scrollTop;\n };\n\n const handleScroll = throttle(() => {\n const scrollTop = window.scrollY || document.documentElement.scrollTop || 0;\n updateThemeByScroll(scrollTop, SCROLL_THRESHOLDS.home.getThreshold());\n }, 200);\n\n const handleEventsScroll = throttle(() => {\n const scrollTop = window.scrollY || document.documentElement.scrollTop || 0;\n const threshold = matchPath(route?.path, '/OnlineLab') ? SCROLL_THRESHOLDS.onlineLab.getThreshold() : SCROLL_THRESHOLDS.events.getThreshold();\n updateThemeByScroll(scrollTop, threshold);\n }, 200);\n\n const bindByRoute = () => {\n window.removeEventListener('scroll', handleScroll);\n window.removeEventListener('scroll', handleEventsScroll);\n\n if (matchPath(route?.path, '/Home')) {\n isWhiteTheme.value = true;\n isScrolledTheme.value = false;\n window.addEventListener('scroll', handleScroll);\n nextTick(() => handleScroll());\n } else if (matchAnyPath(route?.path, ['/events', '/EventDetail', '/RaceDetail', '/OnlineLab'])) {\n isWhiteTheme.value = true;\n isScrolledTheme.value = false;\n window.addEventListener('scroll', handleEventsScroll);\n nextTick(() => handleEventsScroll());\n } else {\n isWhiteTheme.value = false;\n isScrolledTheme.value = false;\n }\n };\n\n onMounted(() => bindByRoute());\n onUnmounted(() => {\n window.removeEventListener('scroll', handleScroll);\n window.removeEventListener('scroll', handleEventsScroll);\n });\n\n return { lastScrollTop, isWhiteTheme, isScrolledTheme, bindByRoute, handleScroll, handleEventsScroll };\n}\n"],"names":["_sfc_main$7","defineComponent","name","props","columns","type","Array","required","data","default","rowKey","String","_ctx","_cache","$props","$setup","$data","$options","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","createElementVNode","_hoisted_2","_Fragment","Fragment","_renderList","column","openBlock","createElementBlock","key","style","_normalizeStyle","width","class","renderList","row","rowIndex","$slots","length","_hoisted_3","colspan","_sfc_main$6","disabled","Boolean","loading","emits","setup","emit","typeClasses","computed","handleClick","e","_normalizeClass","args","_createCommentVNode","LocaleTypeEnum","NAV_TEXTS_KEY","Symbol","buildNavTexts","lang","isZh","Chinese","loginText","logoutText","height","viewBox","fill","_sfc_render","id","d","version","xmlns","stroke","transform","navTexts","inject","dropdownVisible","ref","onVisibleChange","visible","value","router","useRouter","login","push","path","query","redirect_url","encodeURIComponent","location","href","NAV_LOCALE_OPTIONS","label","English","NAV_LOCALE_TO_LANG","NAV_LANG_TO_LOCALE","cn","en","NAV_WIKI_LANG_BY_LOCALE","active","handleChange","val","__props","__emit","isWhite","isWhiteTheme","currentLocale","localeOptions","locale","matchPath","targetPath","toLowerCase","indexOf","matchAnyPath","targetPaths","some","handleDropdownVisibleChange","vue","provide","mainTestHost","mainHost","getSubHostName","includes","hostname","split","slice","join","resolvePath","subAppName","protocol","getNavMenuApi","isMainApp","innerMain","dropdownGroups","list","desc","dropdownList","buildMenu","openLink","url","window","open","index","install","app","component","MyButton","MyTable","unopenTip","menuList","activeId","_a","find","m","map","fetchMenu","immediate","syncActiveMenu","route","forEach","item","curIdx","findIndex","child","group","handleJumpPage","menu","childMenu","tip","startsWith","ElMessage","warning","lastScrollTop","isScrolledTheme","SCROLL_THRESHOLDS","getThreshold","innerHeight","updateThemeByScroll","scrollTop","threshold","handleScroll","throttle","scrollY","document","documentElement","handleEventsScroll","bindByRoute","removeEventListener","addEventListener","onUnmounted"],"mappings":"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"}
|
package/dist/style.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.my-button{display:inline-flex;justify-content:center;align-items:center;line-height:1;height:32px;white-space:nowrap;cursor:pointer;color:#606266;text-align:center;box-sizing:border-box;outline:none;transition:.1s;font-weight:500;padding:8px 15px;font-size:14px;border-radius:4px;border:1px solid #dcdfe6;background:#ffffff}.my-button--primary{color:#fff;background-color:#409eff;border-color:#409eff}.my-button--success{color:#fff;background-color:#67c23a;border-color:#67c23a}.my-button--warning{color:#fff;background-color:#e6a23c;border-color:#e6a23c}.my-button--danger{color:#fff;background-color:#f56c6c;border-color:#f56c6c}.my-button.is-disabled{cursor:not-allowed;opacity:.5}.my-button__loading{display:inline-block;width:14px;height:14px;border:2px solid currentColor;border-radius:50%;border-right-color:transparent;margin-right:5px;animation:rotate 1s linear infinite}@keyframes rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.reset-btn[data-v-35cafb1a]{border-color:#bec3cd}.reset-btn[data-v-35cafb1a] .el-button{color:#3e4a54!important}.reset-btn[data-v-35cafb1a]:hover .el-button{color:#3967e9!important}.reset-btn[data-v-35cafb1a]:hover{border-color:#3967e9}.reset-btn:hover .el-icon[data-v-35cafb1a]{fill:#3967e9!important}.reset-btn:active .el-icon[data-v-35cafb1a]{fill:#fff!important}.reset-btn[data-v-35cafb1a]:active .el-button{color:#fff!important}.reset-btn[data-v-35cafb1a]:active{border-color:transparent;background:#3967e9}*,:before,:after{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 rgb(0 0 0 / 0);--un-ring-shadow:0 0 rgb(0 0 0 / 0);--un-shadow-inset: ;--un-shadow:0 0 rgb(0 0 0 / 0);--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgb(147 197 253 / .5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }::backdrop{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 rgb(0 0 0 / 0);--un-ring-shadow:0 0 rgb(0 0 0 / 0);--un-shadow-inset: ;--un-shadow:0 0 rgb(0 0 0 / 0);--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgb(147 197 253 / .5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.left-0{left:0}.top-0{top:0}.z-99{z-index:99}.\!ml-16{margin-left:16px!important}.mb-16{margin-bottom:16px}.mb-20{margin-bottom:20px}.mb-4{margin-bottom:4px}.ml-20{margin-left:20px}.ml-80{margin-left:80px}.mr-2{margin-right:2px}.mr-8{margin-right:8px}.block{display:block}.inline-block{display:inline-block}[size~="16"]{width:16px;height:16px}.\!max-h-560px{max-height:560px!important}.\!w-\[50\%\]{width:50%!important}.\!w-full{width:100%!important}.h-24{height:24px}.h-4{height:4px}.h-64px{height:64px}.h-8{height:8px}.w-24{width:24px}.w-4{width:4px}.w-full{width:100%}.flex{display:flex}.inline-flex{display:inline-flex}.flex-1{flex:1 1 0%}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.border-collapse{border-collapse:collapse}.table-fixed{table-layout:fixed}.rotate-180{--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-rotate:180deg;transform:translate(var(--un-translate-x)) translateY(var(--un-translate-y)) translateZ(var(--un-translate-z)) rotate(var(--un-rotate)) rotateX(var(--un-rotate-x)) rotateY(var(--un-rotate-y)) rotate(var(--un-rotate-z)) skew(var(--un-skew-x)) skewY(var(--un-skew-y)) scaleX(var(--un-scale-x)) scaleY(var(--un-scale-y)) scaleZ(var(--un-scale-z))}.transform{transform:translate(var(--un-translate-x)) translateY(var(--un-translate-y)) translateZ(var(--un-translate-z)) rotate(var(--un-rotate)) rotateX(var(--un-rotate-x)) rotateY(var(--un-rotate-y)) rotate(var(--un-rotate-z)) skew(var(--un-skew-x)) skewY(var(--un-skew-y)) scaleX(var(--un-scale-x)) scaleY(var(--un-scale-y)) scaleZ(var(--un-scale-z))}.cursor-pointer{cursor:pointer}.cursor-not-allowed{cursor:not-allowed}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-20{gap:20px}.gap-48{gap:48px}.overflow-auto{overflow:auto}.overflow-x-scroll{overflow-x:scroll}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.\!b-0{border-width:0px!important}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-gray-200{--un-border-opacity:1;border-color:rgb(229 231 235 / var(--un-border-opacity))}.border-gray-300{--un-border-opacity:1;border-color:rgb(209 213 219 / var(--un-border-opacity))}.border-transparent{border-color:transparent}.\!rounded-4{border-radius:4px!important}.rounded-50\%{border-radius:50%}.rounded-md{border-radius:1.5px}.bg-gray-100{--un-bg-opacity:1;background-color:rgb(243 244 246 / var(--un-bg-opacity))}.bg-transparent{background-color:transparent}.bg-white{--un-bg-opacity:1;background-color:rgb(255 255 255 / var(--un-bg-opacity))}.hover\:bg-blue-500:hover{--un-bg-opacity:1;background-color:rgb(59 130 246 / var(--un-bg-opacity))}.hover\:bg-gray-100:hover{--un-bg-opacity:1;background-color:rgb(243 244 246 / var(--un-bg-opacity))}.hover\:bg-gray-50:hover{--un-bg-opacity:1;background-color:rgb(249 250 251 / var(--un-bg-opacity))}.hover\:bg-gray-500:hover{--un-bg-opacity:1;background-color:rgb(107 114 128 / var(--un-bg-opacity))}.hover\:bg-green-500:hover{--un-bg-opacity:1;background-color:rgb(34 197 94 / var(--un-bg-opacity))}.hover\:bg-red-500:hover{--un-bg-opacity:1;background-color:rgb(239 68 68 / var(--un-bg-opacity))}.hover\:bg-yellow-500:hover{--un-bg-opacity:1;background-color:rgb(234 179 8 / var(--un-bg-opacity))}[fill~="#2C364B"]{--un-fill-opacity:1;fill:rgb(44 54 75 / var(--un-fill-opacity))}[fill~="#ffffff"]{--un-fill-opacity:1;fill:rgb(255 255 255 / var(--un-fill-opacity))}[stroke-width~="1"]{stroke-width:1px}[stroke~=none]{stroke:none}.p-3{padding:3px}.p-8{padding:8px}.px-4{padding-left:4px;padding-right:4px}.py-19{padding-top:19px;padding-bottom:19px}.py-2{padding-top:2px;padding-bottom:2px}.pl-120{padding-left:120px}.pr-120{padding-right:120px}.text-center{text-align:center}.text-left{text-align:left}.text-14{font-size:14px}.text-16{font-size:16px}.text-sm{font-size:3.5px;line-height:5px}.text-\#000{--un-text-opacity:1;color:rgb(0 0 0 / var(--un-text-opacity))}.text-\#262642{--un-text-opacity:1;color:rgb(38 38 66 / var(--un-text-opacity))}.text-\#bbbbbb{--un-text-opacity:1;color:rgb(187 187 187 / var(--un-text-opacity))}.text-\#ffffff,.text-white{--un-text-opacity:1;color:rgb(255 255 255 / var(--un-text-opacity))}.text-gray-500{--un-text-opacity:1;color:rgb(107 114 128 / var(--un-text-opacity))}.text-gray-700{--un-text-opacity:1;color:rgb(55 65 81 / var(--un-text-opacity))}.\!font-400{font-weight:400!important}.\!font-500{font-weight:500!important}.font-600{font-weight:600}.font-medium{font-weight:500}.leading-22{line-height:22px}.opacity-50{opacity:.5}.outline{outline-style:solid}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.backdrop-blur-\[14px\]{--un-backdrop-blur:blur(14px);-webkit-backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.ease{transition-timing-function:cubic-bezier(.4,0,.2,1)}.flex-center{display:flex;justify-content:center;align-items:center}.header-wrapper[data-v-bfee58b2]{transition:all .3s ease;border-bottom:1px solid rgba(0,0,0,.13)}.header-wrapper.theme-white[data-v-bfee58b2]{color:#fff;border:none;background:transparent}.header-wrapper.theme-white svg[data-v-bfee58b2]{color:#fff}.header-wrapper.theme-white .menu-item[data-v-bfee58b2]:before{background-color:#fff}.header-wrapper.theme-white .menu-item[data-v-bfee58b2] .el-dropdown{color:#fff}.header-wrapper.theme-scrolled[data-v-bfee58b2]{background:#fff;color:#262642;border-bottom:1px solid rgba(0,0,0,.13)}.header-wrapper.theme-scrolled svg[data-v-bfee58b2]{color:#262642}.header-wrapper.theme-scrolled .menu-item[data-v-bfee58b2]:before{background-color:#262642}.header-wrapper.theme-scrolled .menu-item[data-v-bfee58b2] .el-dropdown{color:#262642}.header-wrapper .logo[data-v-bfee58b2]{width:100px;height:38px;cursor:pointer;object-fit:contain}.header-wrapper svg[data-v-bfee58b2]{color:#262642}.header-wrapper .menu-item[data-v-bfee58b2]{display:flex;align-items:center;position:relative;font-size:16px}.header-wrapper .menu-item[data-v-bfee58b2]:before{content:"";display:block;position:absolute;left:0;bottom:-2px;width:0;height:2px;border-radius:1px;background-color:#262642;transition:all .3s ease;transform-origin:center}.header-wrapper .menu-item.active[data-v-bfee58b2]{font-weight:600}.header-wrapper .menu-item.active[data-v-bfee58b2]:before{width:100%}.header-wrapper .menu-item[data-v-bfee58b2] .el-dropdown{color:#262642}.el-popper.custom-dropdown-new{padding:0!important;width:100%;margin-left:-1px;max-width:100%!important;margin-top:12px;box-shadow:none;background:#07111E;opacity:.95}.el-popper.custom-dropdown-new .el-dropdown__list{width:100%!important;height:100%!important;padding:56px 120px}.el-popper.custom-dropdown-new .el-dropdown__list .el-dropdown-menu_out{display:flex;flex-wrap:wrap;max-height:90%!important;flex-direction:row!important;column-gap:20px;row-gap:4px;background:transparent!important;box-shadow:none!important}.el-popper.custom-dropdown-new .el-dropdown__list .el-dropdown-menu{display:flex;max-height:360px;flex-direction:column;flex-wrap:wrap;column-gap:20px;row-gap:4px;background:transparent!important;box-shadow:none!important}.el-popper.custom-dropdown-new .el-dropdown__list .el-dropdown-menu.flex-row{flex-direction:row!important;flex-wrap:nowrap}.el-popper.custom-dropdown-new .el-dropdown__list .el-dropdown-menu .el-dropdown-menu__item{width:calc((100% - 40px) / 3);min-height:64px;font-family:PingFangSC,PingFang SC;font-weight:600;font-size:14px;color:#fff!important;line-height:22px;padding:20px 16px!important;border-radius:8px;border:1px solid transparent;display:flex;flex-direction:column;align-items:flex-start}.el-popper.custom-dropdown-new .el-dropdown__list .el-dropdown-menu .el-dropdown-menu__item:hover,.el-popper.custom-dropdown-new .el-dropdown__list .el-dropdown-menu .el-dropdown-menu__item:focus{background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.2)}
|
|
1
|
+
.my-button{display:inline-flex;justify-content:center;align-items:center;line-height:1;height:32px;white-space:nowrap;cursor:pointer;color:#606266;text-align:center;box-sizing:border-box;outline:none;transition:.1s;font-weight:500;padding:8px 15px;font-size:14px;border-radius:4px;border:1px solid #dcdfe6;background:#ffffff}.my-button--primary{color:#fff;background-color:#409eff;border-color:#409eff}.my-button--success{color:#fff;background-color:#67c23a;border-color:#67c23a}.my-button--warning{color:#fff;background-color:#e6a23c;border-color:#e6a23c}.my-button--danger{color:#fff;background-color:#f56c6c;border-color:#f56c6c}.my-button.is-disabled{cursor:not-allowed;opacity:.5}.my-button__loading{display:inline-block;width:14px;height:14px;border:2px solid currentColor;border-radius:50%;border-right-color:transparent;margin-right:5px;animation:rotate 1s linear infinite}@keyframes rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.reset-btn[data-v-35cafb1a]{border-color:#bec3cd}.reset-btn[data-v-35cafb1a] .el-button{color:#3e4a54!important}.reset-btn[data-v-35cafb1a]:hover .el-button{color:#3967e9!important}.reset-btn[data-v-35cafb1a]:hover{border-color:#3967e9}.reset-btn:hover .el-icon[data-v-35cafb1a]{fill:#3967e9!important}.reset-btn:active .el-icon[data-v-35cafb1a]{fill:#fff!important}.reset-btn[data-v-35cafb1a]:active .el-button{color:#fff!important}.reset-btn[data-v-35cafb1a]:active{border-color:transparent;background:#3967e9}*,:before,:after{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 rgb(0 0 0 / 0);--un-ring-shadow:0 0 rgb(0 0 0 / 0);--un-shadow-inset: ;--un-shadow:0 0 rgb(0 0 0 / 0);--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgb(147 197 253 / .5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }::backdrop{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 rgb(0 0 0 / 0);--un-ring-shadow:0 0 rgb(0 0 0 / 0);--un-shadow-inset: ;--un-shadow:0 0 rgb(0 0 0 / 0);--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgb(147 197 253 / .5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.left-0{left:0}.top-0{top:0}.z-99{z-index:99}.\!ml-16{margin-left:16px!important}.mb-16{margin-bottom:16px}.mb-20{margin-bottom:20px}.mb-4{margin-bottom:4px}.ml-20{margin-left:20px}.ml-80{margin-left:80px}.mr-2{margin-right:2px}.mr-8{margin-right:8px}.block{display:block}.inline-block{display:inline-block}[size~="16"]{width:16px;height:16px}.\!max-h-560px{max-height:560px!important}.\!w-\[50\%\]{width:50%!important}.\!w-full{width:100%!important}.h-24{height:24px}.h-4{height:4px}.h-64px{height:64px}.h-8{height:8px}.w-24{width:24px}.w-4{width:4px}.w-full{width:100%}.flex{display:flex}.inline-flex{display:inline-flex}.flex-1{flex:1 1 0%}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.border-collapse{border-collapse:collapse}.table-fixed{table-layout:fixed}.rotate-180{--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-rotate:180deg;transform:translate(var(--un-translate-x)) translateY(var(--un-translate-y)) translateZ(var(--un-translate-z)) rotate(var(--un-rotate)) rotateX(var(--un-rotate-x)) rotateY(var(--un-rotate-y)) rotate(var(--un-rotate-z)) skew(var(--un-skew-x)) skewY(var(--un-skew-y)) scaleX(var(--un-scale-x)) scaleY(var(--un-scale-y)) scaleZ(var(--un-scale-z))}.transform{transform:translate(var(--un-translate-x)) translateY(var(--un-translate-y)) translateZ(var(--un-translate-z)) rotate(var(--un-rotate)) rotateX(var(--un-rotate-x)) rotateY(var(--un-rotate-y)) rotate(var(--un-rotate-z)) skew(var(--un-skew-x)) skewY(var(--un-skew-y)) scaleX(var(--un-scale-x)) scaleY(var(--un-scale-y)) scaleZ(var(--un-scale-z))}.cursor-pointer{cursor:pointer}.cursor-not-allowed{cursor:not-allowed}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-20{gap:20px}.gap-48{gap:48px}.overflow-auto{overflow:auto}.overflow-x-scroll{overflow-x:scroll}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.\!b-0{border-width:0px!important}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-gray-200{--un-border-opacity:1;border-color:rgb(229 231 235 / var(--un-border-opacity))}.border-gray-300{--un-border-opacity:1;border-color:rgb(209 213 219 / var(--un-border-opacity))}.border-transparent{border-color:transparent}.\!rounded-4{border-radius:4px!important}.rounded-50\%{border-radius:50%}.rounded-md{border-radius:1.5px}.bg-gray-100{--un-bg-opacity:1;background-color:rgb(243 244 246 / var(--un-bg-opacity))}.bg-transparent{background-color:transparent}.bg-white{--un-bg-opacity:1;background-color:rgb(255 255 255 / var(--un-bg-opacity))}.hover\:bg-blue-500:hover{--un-bg-opacity:1;background-color:rgb(59 130 246 / var(--un-bg-opacity))}.hover\:bg-gray-100:hover{--un-bg-opacity:1;background-color:rgb(243 244 246 / var(--un-bg-opacity))}.hover\:bg-gray-50:hover{--un-bg-opacity:1;background-color:rgb(249 250 251 / var(--un-bg-opacity))}.hover\:bg-gray-500:hover{--un-bg-opacity:1;background-color:rgb(107 114 128 / var(--un-bg-opacity))}.hover\:bg-green-500:hover{--un-bg-opacity:1;background-color:rgb(34 197 94 / var(--un-bg-opacity))}.hover\:bg-red-500:hover{--un-bg-opacity:1;background-color:rgb(239 68 68 / var(--un-bg-opacity))}.hover\:bg-yellow-500:hover{--un-bg-opacity:1;background-color:rgb(234 179 8 / var(--un-bg-opacity))}[fill~="#2C364B"]{--un-fill-opacity:1;fill:rgb(44 54 75 / var(--un-fill-opacity))}[fill~="#ffffff"]{--un-fill-opacity:1;fill:rgb(255 255 255 / var(--un-fill-opacity))}[stroke-width~="1"]{stroke-width:1px}[stroke~=none]{stroke:none}.p-3{padding:3px}.p-8{padding:8px}.px-4{padding-left:4px;padding-right:4px}.py-19{padding-top:19px;padding-bottom:19px}.py-2{padding-top:2px;padding-bottom:2px}.pl-120{padding-left:120px}.pr-120{padding-right:120px}.text-center{text-align:center}.text-left{text-align:left}.text-14{font-size:14px}.text-16{font-size:16px}.text-sm{font-size:3.5px;line-height:5px}.text-\#000{--un-text-opacity:1;color:rgb(0 0 0 / var(--un-text-opacity))}.text-\#262642{--un-text-opacity:1;color:rgb(38 38 66 / var(--un-text-opacity))}.text-\#bbbbbb{--un-text-opacity:1;color:rgb(187 187 187 / var(--un-text-opacity))}.text-\#ffffff,.text-white{--un-text-opacity:1;color:rgb(255 255 255 / var(--un-text-opacity))}.text-gray-500{--un-text-opacity:1;color:rgb(107 114 128 / var(--un-text-opacity))}.text-gray-700{--un-text-opacity:1;color:rgb(55 65 81 / var(--un-text-opacity))}.\!font-400{font-weight:400!important}.\!font-500{font-weight:500!important}.font-600{font-weight:600}.font-medium{font-weight:500}.leading-22{line-height:22px}.opacity-50{opacity:.5}.outline{outline-style:solid}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.backdrop-blur-\[14px\]{--un-backdrop-blur:blur(14px);-webkit-backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.ease{transition-timing-function:cubic-bezier(.4,0,.2,1)}.flex-center{display:flex;justify-content:center;align-items:center}.header-wrapper[data-v-f9be6dbf]{transition:all .3s ease;border-bottom:1px solid rgba(0,0,0,.13)}.header-wrapper.theme-white[data-v-f9be6dbf]{color:#fff;border:none;background:transparent}.header-wrapper.theme-white svg[data-v-f9be6dbf]{color:#fff}.header-wrapper.theme-white .menu-item[data-v-f9be6dbf]:before{background-color:#fff}.header-wrapper.theme-white .menu-item[data-v-f9be6dbf] .el-dropdown{color:#fff}.header-wrapper.theme-scrolled[data-v-f9be6dbf]{background:#fff;color:#262642;border-bottom:1px solid rgba(0,0,0,.13)}.header-wrapper.theme-scrolled svg[data-v-f9be6dbf]{color:#262642}.header-wrapper.theme-scrolled .menu-item[data-v-f9be6dbf]:before{background-color:#262642}.header-wrapper.theme-scrolled .menu-item[data-v-f9be6dbf] .el-dropdown{color:#262642}.header-wrapper.dropdownVisible[data-v-f9be6dbf]{background:#07111e!important;opacity:.95!important;color:#fff;border:none}.header-wrapper.dropdownVisible svg[data-v-f9be6dbf]{color:#fff}.header-wrapper.dropdownVisible .menu-item[data-v-f9be6dbf]:before{background-color:#fff}.header-wrapper.dropdownVisible .menu-item[data-v-f9be6dbf] .el-dropdown{color:#fff}.header-wrapper .logo[data-v-f9be6dbf]{width:100px;height:38px;cursor:pointer;object-fit:contain}.header-wrapper svg[data-v-f9be6dbf]{color:#262642}.header-wrapper .menu-item[data-v-f9be6dbf]{display:flex;align-items:center;position:relative;font-size:16px}.header-wrapper .menu-item[data-v-f9be6dbf]:before{content:"";display:block;position:absolute;left:0;bottom:-2px;width:0;height:2px;border-radius:1px;background-color:#262642;transition:all .3s ease;transform-origin:center}.header-wrapper .menu-item.active[data-v-f9be6dbf]{font-weight:600}.header-wrapper .menu-item.active[data-v-f9be6dbf]:before{width:100%}.header-wrapper .menu-item[data-v-f9be6dbf] .el-dropdown{color:#262642}.el-popper.custom-dropdown-new{border:none!important;border-radius:0!important;padding:0!important;width:100%;max-width:100%!important;margin-top:12px;box-shadow:none;background:#07111E;opacity:.95}.el-popper.custom-dropdown-new .el-dropdown__list{width:100%!important;height:100%!important;padding:56px 120px}.el-popper.custom-dropdown-new .el-dropdown__list .el-dropdown-menu_out{display:flex;flex-wrap:wrap;max-height:90%!important;flex-direction:row!important;column-gap:20px;row-gap:4px;background:transparent!important;box-shadow:none!important}.el-popper.custom-dropdown-new .el-dropdown__list .el-dropdown-menu{display:flex;max-height:360px;flex-direction:column;flex-wrap:wrap;column-gap:20px;row-gap:4px;background:transparent!important;box-shadow:none!important}.el-popper.custom-dropdown-new .el-dropdown__list .el-dropdown-menu.flex-row{flex-direction:row!important;flex-wrap:nowrap}.el-popper.custom-dropdown-new .el-dropdown__list .el-dropdown-menu .el-dropdown-menu__item{width:calc((100% - 40px) / 3);min-height:64px;font-family:PingFangSC,PingFang SC;font-weight:600;font-size:14px;color:#fff!important;line-height:22px;padding:20px 16px!important;border-radius:8px;border:1px solid transparent;display:flex;flex-direction:column;align-items:flex-start}.el-popper.custom-dropdown-new .el-dropdown__list .el-dropdown-menu .el-dropdown-menu__item:hover,.el-popper.custom-dropdown-new .el-dropdown__list .el-dropdown-menu .el-dropdown-menu__item:focus{background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.2)}
|