@lark-apaas/client-toolkit-lite 0.0.1
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/LICENSE +13 -0
- package/README.md +236 -0
- package/dist/css/font-family.css +39 -0
- package/dist/css/index.css +2 -0
- package/dist/css/override.css +18 -0
- package/dist/css/tailwind-theme.css +18 -0
- package/dist/css/theme-layer.css +3 -0
- package/dist/index.cjs +1456 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +415 -0
- package/dist/index.d.ts +415 -0
- package/dist/index.js +1394 -0
- package/dist/index.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/AppContainer/index.tsx","../src/runtime/react-devtools-hook.ts","../src/utils/axiosConfig.ts","../src/utils/getCsrfToken.ts","../src/runtime/index.ts","../src/components/AppContainer/safety.tsx","../src/components/ui/popover.tsx","../src/utils/utils.ts","../src/utils/getAppId.ts","../src/utils/apiPath.ts","../src/hooks/useAppInfo.tsx","../src/utils/getInitialInfo.ts","../src/integrations/getAppInfo.ts","../src/hooks/useCurrentUserProfile.tsx","../src/integrations/getCurrentUserProfile.ts","../src/utils/url.ts","../src/integrations/dataloom.ts","../src/hooks/useIsMobile.ts","../src/hooks/useLogout.ts","../src/components/ui/drawer.tsx","../src/components/QueryProvider/index.tsx","../src/route-components/ActiveLink.tsx","../src/route-components/NavLink.tsx","../src/route-components/UniversalLink.tsx","../src/utils/scopedStorage.ts","../src/utils/copyToClipboard.ts","../src/utils/deviceType.ts","../src/utils/resolveAppUrl.ts","../src/utils/getEnvPath.ts","../src/utils/safeStringify.ts","../src/utils/getAxiosForBackend.ts","../src/constants/img-resources/avatar.ts","../src/constants/img-resources/banner.ts","../src/constants/img-resources/cover.ts"],"sourcesContent":["// Components\nexport { default as AppContainer } from './components/AppContainer';\nexport { default as QueryProvider } from './components/QueryProvider';\n\n// Route Components\nexport { ActiveLink } from './route-components/ActiveLink';\nexport { NavLink } from './route-components/NavLink';\nexport { UniversalLink } from './route-components/UniversalLink';\n\n// Hooks\nexport { useAppInfo } from './hooks/useAppInfo';\nexport { useCurrentUserProfile } from './hooks/useCurrentUserProfile';\nexport { useIsMobile } from './hooks/useIsMobile';\nexport { useLogout } from './hooks/useLogout';\n\n// Utils\nexport { clsxWithTw, isPreview, normalizeBasePath, getWsPath } from './utils/utils';\nexport { getAppId } from './utils/getAppId';\nexport { getCsrfToken } from './utils/getCsrfToken';\nexport { scopedStorage } from './utils/scopedStorage';\nexport { copyToClipboard } from './utils/copyToClipboard';\nexport { isIpad, isMobile, isIOS } from './utils/deviceType';\nexport { resolveAppUrl } from './utils/resolveAppUrl';\nexport { getEnvPath } from './utils/getEnvPath';\nexport { safeStringify } from './utils/safeStringify';\nexport { getAxiosForBackend, axiosForBackend } from './utils/getAxiosForBackend';\nexport { initAxiosConfig } from './utils/axiosConfig';\n\n// Integrations\nexport { getAppInfo } from './integrations/getAppInfo';\nexport { getCurrentUserProfile } from './integrations/getCurrentUserProfile';\nexport { getDataloom } from './integrations/dataloom';\n\n// Types\nexport type { AppInfoPayload } from './types/common';\nexport type { IUserProfile, IJson, IFileAttachment } from './types/udt-types';\n\n// Constants\nexport * as avatarImages from './constants/img-resources/avatar';\nexport * as bannerImages from './constants/img-resources/banner';\nexport * as coverImages from './constants/img-resources/cover';\n","import React from 'react';\n\n// 兼容性:确保 runtime 被加载\n// runtime 内部有防重复机制(__FULLSTACK_RUNTIME_INITIALIZED__),不会重复执行\nimport '../../runtime';\n\nimport Safety from './safety';\nimport QueryProvider from '../QueryProvider';\nimport { useAppInfo } from '../../hooks';\n\ninterface AppContainerProps {\n children: React.ReactNode;\n}\n\nconst AppContainer: React.FC<AppContainerProps> = ({ children }) => {\n useAppInfo();\n\n return (\n <>\n <Safety />\n <QueryProvider>\n {children}\n </QueryProvider>\n </>\n );\n};\n\nexport default AppContainer;\n","/**\n * Inject minimal __REACT_DEVTOOLS_GLOBAL_HOOK__ before React loads.\n * React checks for this hook during module initialization and registers its\n * renderer via hook.inject(). This gives us access to renderer.overrideProps()\n * for live component prop modification in the inspector.\n *\n * Must execute before React's module-level code runs.\n *\n * When react-refresh-runtime runs first (as an rspack runtime module),\n * it may create __REACT_DEVTOOLS_GLOBAL_HOOK__ with an inject() that\n * doesn't populate the renderers Map. We patch the existing hook to\n * ensure renderers are always tracked.\n */\n\nexport {};\n\ndeclare global {\n interface Window {\n __REACT_DEVTOOLS_GLOBAL_HOOK__?: any;\n }\n}\n\nif (typeof window !== 'undefined' && process.env.NODE_ENV !== 'production') {\n if (!window.__REACT_DEVTOOLS_GLOBAL_HOOK__) {\n // No hook yet — create a minimal one\n window.__REACT_DEVTOOLS_GLOBAL_HOOK__ = {\n renderers: new Map(),\n supportsFiber: true,\n inject(renderer: any) {\n const id = this.renderers.size + 1;\n this.renderers.set(id, renderer);\n return id;\n },\n onCommitFiberRoot() {},\n onCommitFiberUnmount() {},\n };\n } else {\n // Hook already exists (react-refresh, React DevTools extension, etc.)\n // Ensure renderers Map and inject() both work correctly.\n const hook = window.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n\n if (!(hook.renderers instanceof Map)) {\n hook.renderers = new Map();\n }\n\n const originalInject =\n typeof hook.inject === 'function' ? hook.inject.bind(hook) : null;\n\n hook.inject = function (renderer: any) {\n const id = originalInject\n ? originalInject(renderer)\n : hook.renderers.size + 1;\n if (id != null && !hook.renderers.has(id)) {\n hook.renderers.set(id, renderer);\n }\n return id;\n };\n }\n}\n","import axios, { type AxiosInstance } from 'axios';\nimport { getCsrfToken } from './getCsrfToken';\n\n/**\n * 精简版 Axios 配置\n * 仅注入 CSRF token 和基础拦截器,不包含 observable/slardar/trace\n */\nexport function initAxiosConfig(axiosInstance?: AxiosInstance): void {\n if (!axiosInstance) {\n axiosInstance = axios;\n }\n // 请求拦截器:注入 CSRF token\n axiosInstance.interceptors.request.use(\n (config) => {\n const csrfToken = getCsrfToken();\n if (csrfToken) {\n config.headers['X-Suda-Csrf-Token'] = csrfToken;\n }\n\n // 注入当前页面路由\n if (typeof window !== 'undefined') {\n config.headers['X-Page-Route'] = window.location.pathname;\n }\n\n return config;\n },\n (error) => Promise.reject(error),\n );\n\n // 响应拦截器:开发环境日志\n axiosInstance.interceptors.response.use(\n (response) => response,\n (error) => {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[axios]', error.config?.method?.toUpperCase(), error.config?.url, error.message);\n }\n return Promise.reject(error);\n },\n );\n}\n","/**\n * 获取cookie中存放的suda-csrf-token值\n * @returns {string | null} - suda-csrf-token的值,如果不存在则返回null\n */\nexport function getCsrfToken() {\n const cookieName = 'suda-csrf-token';\n\n // 从document.cookie中获取所有cookie\n const cookies = document.cookie.split('; ');\n\n // 查找指定name的cookie\n for (const cookie of cookies) {\n const [name, value] = cookie.split('=');\n if (name === cookieName) {\n // 解码cookie值\n return decodeURIComponent(value);\n }\n }\n\n // 如果没有找到,则从window上获取(全栈模式下,window上会有这个值)\n return window.csrfToken ?? null;\n}\n","/**\n * Client Toolkit Lite Runtime\n *\n * 精简版全局初始化逻辑,可通过构建工具自动注入或 AppContainer 导入触发\n *\n * 执行顺序:\n * 1. React DevTools Hook(必须在 React 加载之前)\n * 2. 全局样式\n * 3. Axios 配置(仅 CSRF token 注入)\n *\n * 不包含:Observable、Server Log SSE、Iframe Bridge、Dayjs 插件\n */\n\n// 0. React DevTools Hook(必须在 React 加载之前执行)\nimport './react-devtools-hook';\n\n// 1. Axios 配置(精简版:仅 CSRF + 基础拦截器)\nimport { initAxiosConfig } from '../utils/axiosConfig';\n\n// ============================================\n// 防重复初始化标志位\n// ============================================\n\ndeclare global {\n interface Window {\n __FULLSTACK_RUNTIME_INITIALIZED__?: boolean;\n }\n}\n\nif (!window.__FULLSTACK_RUNTIME_INITIALIZED__) {\n window.__FULLSTACK_RUNTIME_INITIALIZED__ = true;\n\n // ============================================\n // 同步初始化\n // ============================================\n\n initAxiosConfig();\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/popover';\nimport { getCsrfToken } from '../../utils/getCsrfToken';\nimport { getAppId } from '../../utils/getAppId';\nimport { isNewPathEnabled } from '../../utils/apiPath';\nimport { useIsMobile } from '../../hooks';\nimport { X } from 'lucide-react';\nimport { Sheet, SheetContent, SheetTrigger } from '../ui/drawer';\n\nconst Component = () => {\n const HasClosedKey = `miaoda-creatByMiaoda-has-closed-${getAppId()}`;\n const [visible, setVisible] = useState(\n !window.localStorage?.getItem(HasClosedKey)\n );\n const [open, setOpen] = useState(false);\n const isMobile = useIsMobile();\n const [userinfo, setUserinfo] = useState<{\n id: number;\n name: string;\n } | null>(null);\n const [isInternetVisible, setIsInternetVisible] = useState(false);\n const [showBadge, setShowBadge] = useState(true);\n const [badgeLoaded, setBadgeLoaded] = useState(false);\n const timeoutRef = useRef(null);\n\n useEffect(() => {\n const appId = getAppId();\n const csrfHeaders = { 'X-Suda-Csrf-Token': getCsrfToken() };\n\n // 获取租户信息\n const tenantInfoUrl = isNewPathEnabled()\n ? `/app/${appId}/__runtime__/api/v1/studio/tenant_info`\n : `/spark/b/${appId}/tenant_info`;\n fetch(tenantInfoUrl, { headers: csrfHeaders })\n .then(res => res.json())\n .then(data => {\n setUserinfo(data?.data?.tenant_info);\n setIsInternetVisible(data?.data?.is_internet_visible);\n })\n .catch(() => {\n // 静默处理,保持默认值\n });\n\n // 获取发布信息中的 show_badge\n const getPublishedUrl = isNewPathEnabled()\n ? `/app/${appId}/__runtime__/api/v1/studio/get_published`\n : `/spark/b/${appId}/get_published`;\n fetch(getPublishedUrl, { headers: csrfHeaders })\n .then(res => res.json())\n .then(data => {\n const badge = data?.data?.app_info?.show_badge;\n // 默认 true(兼容旧版本未返回该字段的情况)\n setShowBadge(badge !== false);\n })\n .catch(() => {\n // 请求失败时默认显示 badge\n setShowBadge(true);\n })\n .finally(() => {\n setBadgeLoaded(true);\n });\n }, []);\n\n useEffect(() => {\n if (isMobile) {\n const link = document.createElement('link');\n link.rel = 'preload';\n link.as = 'image';\n link.href =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/logo/miaodacover-mobile.png';\n document.head.appendChild(link);\n }\n }, [isMobile]);\n\n if (process.env.NODE_ENV !== 'production') {\n return null;\n }\n\n // 等待 badge 状态加载完成后再决定是否渲染\n if (!badgeLoaded) {\n return null;\n }\n\n // 服务端关闭 Badge 时直接隐藏(优先级高于 localStorage)\n if (!showBadge) {\n return null;\n }\n\n if (!visible) {\n return null;\n }\n\n if (isMobile) {\n return (\n <Sheet open={open} onOpenChange={setOpen}>\n <SheetTrigger asChild>\n <div\n className=\"fixed right-[12px] bottom-[80px] inline-flex items-center gap-x-1 border-solid border-[#ffffff1a] border px-[10px] py-[6px] bg-[#1f2329e5] backdrop-blur-[5px] shadow-[0px_6px_12px_0px_#41444a0a,0px_8px_24px_8px_#41444a0a] rounded-[6px] text-[#ebebeb)] font-['PingFang_SC'] text-xs leading-[20px] tracking-[0px] z-[10000000]\"\n onClick={() => {\n setOpen(true);\n }}\n >\n <img\n src=\"https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/logo/miaodalogo.svg\"\n className=\"shrink-0 w-[16px] h-[16px]\"\n />\n <p className=\"shrink-0 min-w-[28px] m-0! text-[#EBEBEB]\">妙搭</p>\n </div>\n </SheetTrigger>\n <SheetContent\n side=\"bottom\"\n className=\"z-[10000001] border-none bg-transparent outline-0!\"\n >\n <div className=\"flex flex-col bg-white overflow-hidden rounded-t-[16px] relative\">\n <X\n className=\"absolute top-[8px] left-[16px] size-[24px] text-[#2B2F36]\"\n onClick={() => setOpen(false)}\n ></X>\n <img\n src=\"https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/logo/miaodacover-mobile.png\"\n alt=\"\"\n className=\"w-full h-full\"\n onClick={() => {\n window.open('https://miaoda.feishu.cn/landing', '_blank');\n }}\n />\n <div className=\"flex flex-col w-full justify-center items-end gap-y-[16px] border-solid border-[#ffffff0d] border px-[20px] pt-[16px] pb-[48px] shadow-(--shadow-2xs,0px_2px_8px_2px_var(--shadow-2xs-1-color,#1f232905),0px_2px_8px_2px_var(--shadow-2xs-1-color,#1f232905),0px_2px_4px_0px_var(--shadow-2xs-1-color,#1f232905)) rounded-t-[12px] text-[#a6a6a6] font-['PingFang_SC'] text-[12px] leading-[20px] tracking-[0px]\">\n <div className=\"self-stretch shrink-0 flex flex-col items-start gap-y-[4px]\">\n {isInternetVisible && (\n <div className=\"self-stretch shrink-0 flex items-center gap-x-[6px]\">\n <img\n src=\"https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/icon/icon_company_outlined.svg\"\n className=\"shrink-0 w-[14px] h-[14px]\"\n />\n <p className=\"shrink-0 min-w-[96px] m-0! text-[#646A73] text-sm\">\n {userinfo?.name}运营\n </p>\n </div>\n )}\n\n <div className=\"self-stretch shrink-0 flex items-center gap-x-[6px]\">\n <img\n src=\"https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/icon/icon_efficiency-ai_outlined.svg\"\n className=\"shrink-0 w-[14px] h-[14px]\"\n />\n <p className=\"shrink-0 min-w-[163px] m-0! text-[#646A73] text-sm\">\n 包含 AI 生成内容,请注意甄别\n </p>\n </div>\n </div>\n <div className=\"self-stretch shrink-0 flex items-start gap-x-[16px]\">\n <div\n className=\"flex-1 flex rounded-[99px] items-center justify-center border-[0.5px] border-[#D0D3D6] bg-white text-[#1F2329] cursor-pointer text-lg py-[12px]\"\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n setOpen(false);\n setTimeout(() => setVisible(false), 200);\n window.localStorage?.setItem(HasClosedKey, 'true');\n }}\n >\n 不再展示\n </div>\n <div\n className=\"flex-1 flex rounded-[99px] items-center justify-center border-[0.5px] border-black bg-black text-white cursor-pointer text-lg py-[12px]\"\n onClick={() => {\n window.open('https://miaoda.feishu.cn/landing', '_blank');\n }}\n >\n 了解更多\n </div>\n </div>\n </div>\n </div>\n </SheetContent>\n </Sheet>\n );\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <div\n className=\"fixed right-[12px] bottom-[12px] inline-flex items-center gap-x-1 border-solid border-[#ffffff1a] border px-[10px] py-[6px] bg-[#1f2329e5] backdrop-blur-[5px] shadow-[0px_6px_12px_0px_#41444a0a,0px_8px_24px_8px_#41444a0a] rounded-[6px] text-[#ebebeb)] font-['PingFang_SC'] text-xs leading-[20px] tracking-[0px] z-[10000000] cursor-pointer\"\n onMouseEnter={() => {\n clearTimeout(timeoutRef.current);\n setOpen(true);\n }}\n onMouseLeave={() => {\n timeoutRef.current = setTimeout(() => setOpen(false), 100);\n }}\n >\n <img\n src=\"https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/logo/miaodalogo.svg\"\n className=\"shrink-0 w-[16px] h-[16px]\"\n />\n <p className=\"shrink-0 min-w-[60px] m-0! text-[#EBEBEB]\">\n 由妙搭搭建\n </p>\n </div>\n </PopoverTrigger>\n <PopoverContent\n className=\"overflow-hidden p-0 m-0 border-0 rounded-[12px]! w-[286px]\"\n style={{ boxShadow: '0 6px 12px 0 #41444a0a, 0 8px 24px 0 #41444a0a' }}\n side=\"top\"\n align=\"end\"\n sideOffset={8}\n onMouseEnter={() => {\n clearTimeout(timeoutRef.current);\n setOpen(true);\n }}\n onMouseLeave={() => {\n timeoutRef.current = setTimeout(() => setOpen(false), 100);\n }}\n >\n <div className=\"flex flex-col bg-[#1A1A1A]\">\n <img\n src=\"https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/logo/miaodacover.png\"\n alt=\"\"\n className=\"w-[286px] h-[128px] cursor-pointer\"\n onClick={() => {\n window.open('https://miaoda.feishu.cn/landing', '_blank');\n }}\n />\n <div className=\"flex flex-col justify-center items-end gap-y-[12px] border-solid border-[#ffffff0d] border pl-[14px] pr-[15px] pt-[11px] pb-[15px] w-[286px] shadow-(--shadow-2xs,0px_2px_8px_2px_var(--shadow-2xs-1-color,#1f232905),0px_2px_8px_2px_var(--shadow-2xs-1-color,#1f232905),0px_2px_4px_0px_var(--shadow-2xs-1-color,#1f232905)) rounded-t-[12px] text-[#a6a6a6] font-['PingFang_SC'] text-[12px] leading-[20px] tracking-[0px] bg-[#1f2021]\">\n <div className=\"self-stretch shrink-0 flex flex-col items-start gap-y-[4px]\">\n {isInternetVisible && (\n <div className=\"self-stretch shrink-0 flex items-center gap-x-[6px]\">\n <img\n src=\"https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/icon/icon_company_outlined.svg\"\n className=\"shrink-0 w-[12px] h-[12px]\"\n />\n <p className=\"shrink-0 min-w-[96px] m-0! text-[#a6a6a6]\">\n {userinfo?.name}运营\n </p>\n </div>\n )}\n\n <div className=\"self-stretch shrink-0 flex items-center gap-x-[6px]\">\n <img\n src=\"https://lf3-static.bytednsdoc.com/obj/eden-cn/LMfspH/ljhwZthlaukjlkulzlp/icon/icon_efficiency-ai_outlined.svg\"\n className=\"shrink-0 w-[12px] h-[12px]\"\n />\n <p className=\"shrink-0 min-w-[163px] m-0! text-[#a6a6a6]\">\n 包含 AI 生成内容,请注意甄别\n </p>\n </div>\n </div>\n <div className=\"w-full self-stretch shrink-0 flex items-start gap-x-[8px]\">\n <div\n className=\"flex-1 flex rounded-[8px] items-center justify-center h-[34px] border-[0.5px] border-solid border-[#ffffff1c] hover:border-[#ffffff33] bg-[#ffffff08] hover:bg-[#ffffff14] cursor-pointer text-[#ebebeb]\"\n data-custom-element=\"safety-close\"\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n setVisible(false);\n window.localStorage?.setItem(HasClosedKey, 'true');\n }}\n >\n 不再展示\n </div>\n <div\n className=\"flex-1 flex rounded-[8px] items-center justify-center h-[34px] border-[0.5px] border-solid border-[#ffffff1c] hover:border-[#ffffff33] bg-[#ffffff08] hover:bg-[#ffffff14] cursor-pointer text-[#ebebeb]\"\n data-custom-element=\"safety-more\"\n onClick={() => {\n window.open('https://miaoda.feishu.cn/landing', '_blank');\n }}\n >\n 了解更多\n </div>\n </div>\n </div>\n </div>\n </PopoverContent>\n </Popover>\n );\n};\n\nexport default Component;\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\"\n\nimport { clsxWithTw } from '../../utils/utils';\n\nfunction Popover({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />\n}\n\nfunction PopoverTrigger({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />\n}\n\nfunction PopoverContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={clsxWithTw(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n )\n}\n\nfunction PopoverAnchor({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {\n return <PopoverPrimitive.Anchor data-slot=\"popover-anchor\" {...props} />\n}\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * @internal\n * 处理 className 与 tailwind-merge\n */\nexport function clsxWithTw(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n/**\n * @internal\n * 当前是否是预览态\n */\nexport function isPreview() {\n return window.IS_MIAODA_PREVIEW;\n}\n\n/**\n * @internal\n * 标准化基础路径,确保路径格式一致\n * 移除末尾的斜杠,确保路径不以斜杠结尾\n */\nexport function normalizeBasePath(basePath?: string): string {\n if (!basePath || basePath === '/') {\n return '';\n }\n // 移除末尾的斜杠\n return basePath.replace(/\\/+$/, '');\n}\n\n// 获取 ws 路径\nexport function getWsPath(): string {\n const rawBasePath = process.env.CLIENT_BASE_PATH || '/';\n const normalizedBasePath = rawBasePath.startsWith('/')\n ? rawBasePath\n : `/${rawBasePath}`;\n const basePathWithoutTrailingSlash = normalizedBasePath.endsWith('/')\n ? normalizedBasePath.slice(0, -1)\n : normalizedBasePath;\n\n return `${basePathWithoutTrailingSlash}/ws`;\n}\n\n/** 判断是否是沙箱模式 */\nexport function isSparkRuntime() {\n // 兼容全栈模式标记(通过构建方式注入)\n return window._IS_Spark_RUNTIME ?? process.env.runtimeMode === 'fullstack';\n}","/**\n * 获取应用 ID\n */\nexport function getAppId(): string | null {\n const windowAppId = (window as any).appId || null;\n return windowAppId;\n}\n","/**\n * 判断当前是否启用新的路径规范\n * 新路径规范:CLIENT_BASE_PATH 以 /app/:appId 格式开头\n */\nexport function isNewPathEnabled(): boolean {\n const basePath = process.env.CLIENT_BASE_PATH || '/';\n return /^\\/app\\/[^/]/.test(basePath);\n}\n","import { useEffect, useState } from 'react';\nimport { AppInfoPayload } from '../types/common';\nimport { getAppInfo } from '../integrations/getAppInfo';\n\nexport const useAppInfo = () => {\n const [appInfo, setAppInfo] = useState<Partial<AppInfoPayload>>({});\n\n useEffect(() => {\n const updateDomInfo = (info: AppInfoPayload) => {\n if (info.name) {\n document.title = info.name;\n const meta = document.querySelector(\"meta[property='og:title']\") as HTMLMetaElement;\n if (meta) {\n meta.content = info.name;\n }\n }\n if (info.avatar) {\n let link = document.querySelector(\"link[rel~='icon']\") as HTMLLinkElement;\n if (!link) {\n link = document.createElement('link');\n link.rel = 'icon';\n document.head.appendChild(link);\n }\n link.href = info.avatar;\n const meta = document.querySelector(\"meta[property='og:image']\") as HTMLMetaElement;\n if (meta) {\n meta.content = info.avatar;\n }\n }\n if (info.description) {\n const meta = document.querySelector(\"meta[property='og:description']\") as HTMLMetaElement;\n if (meta) {\n meta.content = info.description;\n }\n const metaDom = document.querySelector(\"meta[name='description']\") as HTMLMetaElement;\n if (metaDom) {\n metaDom.content = info.description;\n }\n }\n }\n\n const handleMetaInfoChanged = async (info?: AppInfoPayload, refresh = true) => {\n if (!info) {\n info = await getAppInfo(refresh);\n }\n updateDomInfo(info);\n setAppInfo(prev => ({ ...prev, ...info }));\n };\n handleMetaInfoChanged(undefined, false);\n const onUpdate = (e: Event) => {\n const info = (e as CustomEvent<AppInfoPayload>).detail;\n handleMetaInfoChanged(info);\n };\n window.addEventListener('MiaoDaMetaInfoChanged', onUpdate);\n return () => {\n window.removeEventListener('MiaoDaMetaInfoChanged', onUpdate);\n };\n }, []);\n\n return {\n ...appInfo,\n appName: appInfo.name,\n appLogo: appInfo.avatar,\n };\n};\n","import { getAppId } from './getAppId';\nimport { getCsrfToken } from './getCsrfToken';\nimport { isNewPathEnabled } from './apiPath';\n\ninterface AppRuntimeExtra {\n token?: string;\n url?: string;\n bucket?: BucketConfig;\n}\ninterface AppRuntimePublished {\n app_name?: string;\n css_urls?: string[];\n js_urls?: string[];\n app_avatar?: string;\n app_description?: string;\n}\ninterface BucketConfig {\n default_bucket_id?: string;\n}\n\n/**\n * 从API获取已发布的应用信息(仅全栈沙箱模式下使用)\n */\nasync function getAppPublished(): Promise<\n | {\n app_info?: AppRuntimePublished;\n app_runtime_extra?: AppRuntimeExtra;\n }\n | undefined\n> {\n try {\n // 构建请求头\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Kunlun-Token': window.token,\n 'x-miaoda-token': window.MIAODA_BUILTIN_TTT,\n 'X-Suda-Csrf-Token': getCsrfToken(),\n };\n const appId = getAppId();\n const path = isNewPathEnabled()\n ? `/app/${appId}/__runtime__/api/v1/studio/get_published`\n : `/spark/b/${appId}/get_published`;\n const url = `${window.location.origin}${path}`;\n // 发起fetch请求\n const response = await fetch(url, {\n method: 'GET',\n headers,\n credentials: 'include', // 包含cookies\n });\n\n // 解析响应数据\n const res = await response.json();\n if (res.code === 0 || res.status_code === '0') {\n return res.data;\n }\n console.error('Error fetching published app info:', res);\n } catch (error) {\n console.error('Error fetching published app info:', error);\n }\n return undefined;\n}\n// 存储的公共信息\nlet initialInfo:\n | {\n app_info?: AppRuntimePublished;\n app_runtime_extra?: AppRuntimeExtra;\n }\n | undefined;\n\n// 缓存进行中的 Promise,防止并发调用发起多个重复请求\nlet pendingPromise: Promise<typeof initialInfo> | null = null;\n\n/** 获取应用初始化信息(仅全栈沙箱模式下使用) */\nexport function getInitialInfo(refresh = false): Promise<typeof initialInfo> {\n if (initialInfo && !refresh) {\n return Promise.resolve(initialInfo);\n }\n if (pendingPromise && !refresh) {\n return pendingPromise;\n }\n pendingPromise = getAppPublished()\n .then(info => {\n initialInfo = info;\n if (initialInfo) {\n window._bucket_id =\n initialInfo.app_runtime_extra?.bucket?.default_bucket_id;\n }\n return initialInfo;\n })\n .finally(() => {\n pendingPromise = null;\n });\n return pendingPromise;\n}\n","import { AppInfoPayload } from '../types/common';\nimport { getInitialInfo } from '../utils/getInitialInfo';\nimport { isSparkRuntime } from '../utils/utils';\n\nexport async function getAppInfo(refresh = false): Promise<AppInfoPayload> {\n let appInfo = typeof window !== 'undefined' ? (window as any)._appInfo : undefined;\n if ((!appInfo || refresh) && isSparkRuntime()) {\n const info = (await getInitialInfo(refresh))?.app_info;\n appInfo = {\n name: info?.app_name || '',\n avatar: info?.app_avatar || '',\n description: info?.app_description || '',\n };\n if (appInfo.name) {\n appInfo.name = appInfo.name.trim();\n }\n\n if (typeof window !== 'undefined') {\n (window as any)._appInfo = appInfo;\n }\n }\n return appInfo ?? {};\n}\n","import { useEffect, useState } from 'react';\nimport { IUserProfile } from '../types/udt-types';\nimport { getCurrentUserProfile } from '../integrations/getCurrentUserProfile';\nimport { getDataloom } from '../integrations/dataloom';\nimport { isSparkRuntime } from '../utils/utils';\n\n/**\n * 从 name 数组中获取用户名称\n * 优先选择 language_code 为 2052(简体中文)的数据,如果匹配不到则取第一个\n */\nfunction getNameFromArray(\n nameArray?: Array<{ language_code?: number; text?: string }>,\n): string | undefined {\n if (!nameArray || nameArray.length === 0) {\n return undefined;\n }\n const chineseName = nameArray.find((item) => item.language_code === 2052);\n return chineseName?.text ?? nameArray[0]?.text;\n}\n\nexport interface ICompatibilityUserProfile extends IUserProfile {\n /**\n * @deprecated please use `name`\n */\n userName: string;\n /**\n * @deprecated please use `avatar`\n */\n userAvatar: string;\n}\n\nfunction getCompatibilityUserProfile(): ICompatibilityUserProfile {\n const userInfo = getCurrentUserProfile();\n return {\n ...userInfo,\n // 兼容处理\n userName: userInfo.name,\n userAvatar: userInfo.avatar,\n };\n}\n\nexport const useCurrentUserProfile = () => {\n const [userInfo, setUserInfo] = useState<ICompatibilityUserProfile>(() =>\n getCompatibilityUserProfile(),\n );\n\n // 事件驱动,从 window 上取值\n useEffect(() => {\n let cancelled = false;\n\n const fetchAndSetUserInfo = async () => {\n const dataloom = await getDataloom();\n const result = await dataloom?.service?.session?.getUserInfo();\n if (cancelled) return;\n const info = result?.data?.user_info;\n const userName = getNameFromArray(info?.name);\n const newUserInfo: ICompatibilityUserProfile = {\n user_id: info?.user_id?.toString() ?? '',\n email: info?.email ?? '',\n name: userName ?? '',\n avatar: info?.avatar?.image?.large ?? '',\n userName: userName ?? '',\n userAvatar: info?.avatar?.image?.large ?? '',\n };\n if (process.env.NODE_ENV === 'development') {\n console.log('MiaoDaMetaInfoChanged', newUserInfo);\n }\n setUserInfo(newUserInfo);\n };\n\n let handleMetaInfoChanged: () => void;\n if (isSparkRuntime()) {\n fetchAndSetUserInfo();\n handleMetaInfoChanged = () => { fetchAndSetUserInfo(); };\n } else {\n handleMetaInfoChanged = () => {\n if (process.env.NODE_ENV === 'development') {\n console.log('MiaoDaMetaInfoChanged', getCompatibilityUserProfile());\n }\n setUserInfo(getCompatibilityUserProfile());\n };\n }\n\n window.addEventListener('MiaoDaMetaInfoChanged', handleMetaInfoChanged);\n return () => {\n cancelled = true;\n window.removeEventListener(\n 'MiaoDaMetaInfoChanged',\n handleMetaInfoChanged,\n );\n };\n }, []);\n\n return userInfo;\n};\n","import { IUserProfile } from '../types/udt-types';\n\nexport function getCurrentUserProfile(): IUserProfile {\n return (window as any)._userInfo || {};\n}\n\n/**\n * @deprecated 请使用 getCurrentUserProfile 代替\n */\nexport const getUserInfo = getCurrentUserProfile;\n","\nexport interface UrlParts {\n baseUrl: string;\n workspace: string;\n}\n\n/**\n * @internal\n */\nexport function splitWorkspaceUrl(fullUrl: string): UrlParts {\n try {\n // https://www.suda.com/suda/api/v1/workspaces/:workspace_id\n const url = new URL(fullUrl);\n const pathParts = url.pathname.split('/');\n\n // 找到 workspaces 位置\n const workspacesIndex = pathParts.findIndex(part => part === 'workspaces');\n if (workspacesIndex === -1) {\n throw new Error('Invalid workspace URL format');\n }\n\n const basePathParts = pathParts.slice(0, workspacesIndex);\n const workspace = pathParts[workspacesIndex + 1];\n\n return {\n baseUrl: `${url.origin}${basePathParts.join('/')}`,\n workspace,\n };\n } catch (error) {\n console.error('Error splitting workspace URL:', error);\n }\n return {\n baseUrl: fullUrl,\n // 兜底给一个,不要给空字符串,不然 createClient 都直接挂了,页面会白屏,体感不太好\n workspace: 'workspace',\n };\n}\n","import { splitWorkspaceUrl } from '../utils/url';\nimport { createClient } from '@data-loom/js';\nimport { getAppId } from '../utils/getAppId';\nimport { getInitialInfo } from '../utils/getInitialInfo';\n\nconst createDataLoomClient = (url?: string, pat?: string) => {\n const { baseUrl, workspace } = url ? splitWorkspaceUrl(url) : { baseUrl: '', workspace: '' };\n const appId = getAppId() ?? '';\n return createClient(baseUrl, pat ?? '', workspace, {\n global: {\n enableDataloomLog: process.env.NODE_ENV !== 'production',\n requestRateLimit: process.env.NODE_ENV !== 'production' ? 100 : undefined,\n brandName: 'miaoda',\n appId,\n onError: (error, dataloomInstance) => {\n if (error?.status === 401) {\n if (error?.code === 'k_ident_013001') {\n // apiKey 为空\n dataloomInstance.service.session.redirectToLogin();\n }\n }\n },\n },\n });\n};\n\nlet dataloom: ReturnType<typeof createDataLoomClient> | null = null;\n// 缓存进行中的 Promise,防止并发调用创建多个实例\nlet pendingPromise: Promise<ReturnType<typeof createDataLoomClient>> | null = null;\n\n/** 获取dataloom实例 */\nexport function getDataloom(): Promise<ReturnType<typeof createDataLoomClient>> {\n if (dataloom) {\n return Promise.resolve(dataloom);\n }\n if (pendingPromise) {\n return pendingPromise;\n }\n pendingPromise = getInitialInfo()\n .then(info => {\n const DATALOOM_CLIENT_URL = info?.app_runtime_extra?.url;\n const DATALOOM_PAT = info?.app_runtime_extra?.token;\n dataloom = createDataLoomClient(DATALOOM_CLIENT_URL, DATALOOM_PAT);\n return dataloom;\n })\n .finally(() => {\n pendingPromise = null;\n });\n return pendingPromise;\n}\n","import React from 'react';\nimport { debounce } from 'lodash';\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean>(\n window.innerWidth < MOBILE_BREAKPOINT\n );\n\n React.useEffect(() => {\n const handleResize = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n };\n\n const debouncedHandleResize = debounce(handleResize, 200);\n\n window.addEventListener('resize', debouncedHandleResize);\n\n // Set initial value\n handleResize();\n\n return () => {\n window.removeEventListener('resize', debouncedHandleResize);\n debouncedHandleResize.cancel(); // Cancel any pending execution on unmount\n };\n }, []);\n\n return isMobile;\n}\n","import { useState } from 'react';\nimport { getDataloom } from '../integrations/dataloom';\n\nexport function useLogout() {\n const [isLoading, setIsLoading] = useState(false);\n async function handlerLogout() {\n if (process.env.NODE_ENV !== 'production') {\n console.log('只有生产环境才执行登出');\n return;\n }\n setIsLoading(true);\n try {\n const dataloom = await getDataloom();\n await dataloom.service.session.signOut();\n } catch (error) {\n console.error('登出失败', error);\n } finally {\n setIsLoading(false);\n }\n }\n\n return {\n handlerLogout,\n isLoading,\n };\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\n\n\nimport { clsxWithTw as cn } from '../../utils/utils';\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n side === \"right\" &&\n \"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm\",\n side === \"left\" &&\n \"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm\",\n side === \"top\" &&\n \"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b\",\n side === \"bottom\" &&\n \"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t\",\n className\n )}\n {...props}\n >\n {children}\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-1.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"text-foreground font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","import React from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\n\nlet defaultQueryClient: QueryClient | null = null;\n\nconst getDefaultQueryClient = () => {\n if (!defaultQueryClient) {\n defaultQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n retry: 1,\n refetchOnWindowFocus: false,\n },\n mutations: {\n retry: 1,\n },\n },\n });\n }\n return defaultQueryClient;\n};\n\nexport type QueryProviderProps = {\n children: React.ReactNode;\n client?: QueryClient;\n};\n\nconst QueryProvider: React.FC<QueryProviderProps> = ({ children, client }) => {\n const qc = client ?? getDefaultQueryClient();\n return <QueryClientProvider client={qc}>{children}</QueryClientProvider>;\n};\n\nexport default QueryProvider;\nexport { getDefaultQueryClient };\n\n","import React, { forwardRef, useEffect, useState } from 'react';\nimport { NavLink, type NavLinkProps } from 'react-router-dom';\n\nexport interface ActiveLinkProps extends Omit<NavLinkProps, 'to'> {\n to: string;\n}\n\n/**\n * ActiveLink 组件\n *\n * 替换 react-router-dom 的 NavLink,扩展支持 hash 路由跳转和激活态功能\n *\n * @example\n * // 普通路由跳转\n * <ActiveLink to=\"/dashboard\">Dashboard</ActiveLink>\n *\n * // hash 路由跳转\n * <ActiveLink to=\"#section1\">Section 1</ActiveLink>\n *\n * // 使用函数式 className 显示激活态\n * <ActiveLink\n * to=\"#features\"\n * className={({isActive}) => isActive ? 'active' : ''}\n * >\n * Features\n * </ActiveLink>\n */\n\nexport const ActiveLink = forwardRef<HTMLAnchorElement, ActiveLinkProps>(\n ({ to, onClick, className, style, children, ...rest }, ref) => {\n const [currentHash, setCurrentHash] = useState(() =>\n typeof window !== 'undefined' ? window.location.hash : ''\n );\n\n // 检测是否为 hash 路由\n const isHashRoute = typeof to === 'string' && to.startsWith('#');\n\n // 监听 hash 变化\n useEffect(() => {\n if (!isHashRoute) return;\n\n const handleHashChange = () => {\n setCurrentHash(window.location.hash);\n };\n\n window.addEventListener('hashchange', handleHashChange);\n return () => window.removeEventListener('hashchange', handleHashChange);\n }, [isHashRoute]);\n\n // 计算激活态\n const isActive = isHashRoute && currentHash === to;\n\n // 如果是普通路由,使用 NavLink\n if (!isHashRoute) {\n return (\n <NavLink\n ref={ref}\n to={to}\n onClick={onClick}\n className={className}\n style={style}\n {...rest}\n >\n {children}\n </NavLink>\n );\n }\n\n // 处理 hash 路由点击事件\n const handleHashClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n // 先调用用户自定义的 onClick\n onClick?.(e);\n\n // 如果用户在 onClick 中调用了 preventDefault,则不执行默认行为\n if (e.defaultPrevented) {\n return;\n }\n\n // 阻止默认的锚点跳转行为\n e.preventDefault();\n\n const targetId = to.slice(1); // \"#home\" -> \"home\"\n const targetElement = document.getElementById(targetId);\n\n // 使用 pushState 更新 URL,保留历史记录且避免浏览器默认的瞬间跳转\n history.pushState(null, '', to);\n\n // 立即更新内部状态以确保 UI 及时响应\n setCurrentHash(to);\n\n // 手动触发 hashchange 事件以通知其他组件\n window.dispatchEvent(new Event('hashchange'));\n\n // 平滑滚动到目标元素\n if (targetElement && typeof targetElement.scrollIntoView === 'function') {\n targetElement.scrollIntoView({ behavior: 'smooth' });\n }\n };\n\n // 处理 className(支持函数和字符串)\n const computedClassName =\n typeof className === 'function'\n ? className({ isActive, isPending: false, isTransitioning: false })\n : className;\n\n // 处理 style(支持函数和对象)\n const computedStyle =\n typeof style === 'function'\n ? style({ isActive, isPending: false, isTransitioning: false })\n : style;\n\n // 处理 children(支持函数和 ReactNode)\n const computedChildren =\n typeof children === 'function'\n ? children({ isActive, isPending: false, isTransitioning: false })\n : children;\n\n return (\n <a\n ref={ref}\n href={to}\n onClick={handleHashClick}\n className={computedClassName}\n style={computedStyle}\n {...rest}\n >\n {computedChildren}\n </a>\n );\n }\n);\n\nActiveLink.displayName = 'ActiveLink';\n","import * as React from 'react';\nimport {\n NavLink as OriginalNavLink,\n useLocation,\n useNavigate,\n type NavLinkProps,\n} from 'react-router-dom';\n\n/**\n * Enhanced NavLink component that extends react-router-dom's NavLink\n * with support for hash links (anchor navigation) and smooth scrolling.\n */\nconst NavLink = React.forwardRef<HTMLAnchorElement, NavLinkProps>(\n ({ to, children, className, style, ...props }, ref) => {\n const isHashLink = typeof to === 'string' && to.startsWith('#');\n const location = useLocation();\n const navigate = useNavigate();\n\n if (isHashLink) {\n const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n e.preventDefault();\n const element = document.querySelector(to as string);\n if (element) {\n element.scrollIntoView({ behavior: 'smooth' });\n }\n navigate(to as string);\n };\n\n const isActive = location.hash === to;\n\n const renderProps = {\n isActive,\n isPending: false,\n isTransitioning: false,\n };\n\n const resolvedClassName =\n typeof className === 'function' ? className(renderProps) : className;\n const resolvedStyle =\n typeof style === 'function' ? style(renderProps) : style;\n\n const {\n caseSensitive,\n end,\n replace,\n state,\n preventScrollReset,\n relative,\n viewTransition,\n ...restProps\n } = props;\n\n return (\n <a\n href={to as string}\n onClick={handleClick}\n ref={ref}\n className={resolvedClassName}\n style={resolvedStyle}\n {...restProps}\n >\n {typeof children === 'function' ? children(renderProps) : children}\n </a>\n );\n }\n\n return (\n <OriginalNavLink\n to={to}\n ref={ref}\n className={className}\n style={style}\n onClick={() =>\n (document.getElementById('rootContainer') || window)?.scrollTo({\n top: 0,\n behavior: 'smooth',\n })\n }\n {...props}\n >\n {children}\n </OriginalNavLink>\n );\n },\n);\n\nNavLink.displayName = 'NavLink';\n\nexport { NavLink };\nexport type { NavLinkProps };\n","import React from 'react';\nimport { Link as RouterLink } from 'react-router-dom';\n\nexport interface UniversalLinkProps\n extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> {\n /** 链接目标:内部路由、hash 锚点或外部 URL */\n to: string;\n}\n\n/** 是否为内部路由(非 hash、非外链) */\nfunction isInternalRoute(to: string): boolean {\n return !to.startsWith('#') && !to.startsWith('http://') && !to.startsWith('https://') && !to.startsWith('//');\n}\n\n/** 是否为外部链接 */\nfunction isExternalLink(to: string): boolean {\n return to.startsWith('http://') || to.startsWith('https://') || to.startsWith('//');\n}\n\n/**\n * 统一的链接组件,用于替换原生 <a> 标签\n * - 内部路由(/dashboard)→ react-router Link\n * - Hash 锚点(#section)→ <a>\n * - 外链(https://...)→ <a target=\"_blank\">\n */\nexport const UniversalLink = React.forwardRef<HTMLAnchorElement, UniversalLinkProps>(\n function UniversalLink({ to, ...props }, ref) {\n // 内部路由\n if (isInternalRoute(to)) {\n return <RouterLink to={to} ref={ref} {...props} />;\n }\n\n // Hash 链接 & 外部链接\n return (\n <a\n href={to}\n ref={ref}\n {...props}\n {...(isExternalLink(to) && {\n target: props.target ?? '_blank',\n rel: props.rel ?? 'noopener noreferrer',\n })}\n />\n );\n }\n);\n","import { getAppId } from './getAppId';\n\n/**\n * 获取当前 appId 对应的命名空间前缀\n * 格式:__miaoda_<appId>__:\n * 若 appId 为 null,则使用 __global__\n */\nfunction getPrefix(): string {\n const appId = getAppId();\n const namespace = appId || '__global__';\n return `__miaoda_${namespace}__:`;\n}\n\n/**\n * 获取当前 appId 范围内的所有 key(已去前缀)\n */\nfunction getScopedKeys(): string[] {\n const prefix = getPrefix();\n const keys: string[] = [];\n\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key && key.startsWith(prefix)) {\n keys.push(key.substring(prefix.length));\n }\n }\n\n return keys;\n}\n\n/**\n * 按 appId 隔离的 localStorage 封装\n * API 与原生 localStorage 保持一致\n */\nexport const scopedStorage: Storage = {\n /**\n * 获取指定 key 的值\n */\n getItem(key: string): string | null {\n const prefixedKey = getPrefix() + key;\n return localStorage.getItem(prefixedKey);\n },\n\n /**\n * 设置指定 key 的值\n */\n setItem(key: string, value: string): void {\n const prefixedKey = getPrefix() + key;\n localStorage.setItem(prefixedKey, value);\n },\n\n /**\n * 删除指定 key\n */\n removeItem(key: string): void {\n const prefixedKey = getPrefix() + key;\n localStorage.removeItem(prefixedKey);\n },\n\n /**\n * 清空当前 appId 范围内的所有 key\n * 不影响其他 app 和无前缀的 key\n */\n clear(): void {\n const prefix = getPrefix();\n const keysToRemove: string[] = [];\n\n // 收集需要删除的 key\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key && key.startsWith(prefix)) {\n keysToRemove.push(key);\n }\n }\n\n // 删除收集到的 key\n keysToRemove.forEach(key => localStorage.removeItem(key));\n },\n\n /**\n * 返回当前 appId 范围内第 index 个 key(去前缀后的原始 key)\n */\n key(index: number): string | null {\n const keys = getScopedKeys();\n return keys[index] || null;\n },\n\n /**\n * 返回当前 appId 范围内的 key 数量\n */\n get length(): number {\n return getScopedKeys().length;\n },\n};\n","/**\n * 复制字符串到剪切板\n * @param text 要复制的文本\n * @returns Promise<boolean> 复制是否成功\n */\nexport async function copyToClipboard(text: string): Promise<boolean> {\n try {\n // 优先使用现代的 Clipboard API\n if (navigator.clipboard && window.isSecureContext) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n\n // 降级方案:使用传统的 execCommand 方法\n return fallbackCopyToClipboard(text);\n } catch (error) {\n // 执行navigator.clipboard.writeText失败时,降级方案\n return fallbackCopyToClipboard(text);\n }\n}\n\n/**\n * 降级复制方案(兼容旧浏览器)\n * @param text 要复制的文本\n * @returns boolean 复制是否成功\n */\nfunction fallbackCopyToClipboard(text: string): boolean {\n try {\n // 创建临时的 textarea 元素\n const textArea = document.createElement('textarea');\n textArea.value = text;\n\n // 设置样式,使其不可见\n textArea.style.position = 'fixed';\n textArea.style.left = '-999999px';\n textArea.style.top = '-999999px';\n textArea.setAttribute('readonly', '');\n\n // 添加到 DOM\n document.body.appendChild(textArea);\n\n // 选中文本\n textArea.focus();\n textArea.select();\n\n // 执行复制命令\n const successful = document.execCommand('copy');\n\n // 清理:移除临时元素\n document.body.removeChild(textArea);\n\n return successful;\n } catch (error) {\n console.error('降级复制方案失败:', error);\n return false;\n }\n}\n","export const isIpad = (): boolean => {\n const _isIpad =\n /iPad|Tab|Tablet/i.test(navigator.userAgent) && navigator.maxTouchPoints && navigator.maxTouchPoints > 1;\n\n return Boolean(_isIpad);\n};\n\nexport const isMobile = (): boolean => {\n const isPhone =\n /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i.test(\n navigator.userAgent\n );\n\n return isPhone || isIpad();\n};\n\nexport const isIOS = (): boolean => {\n if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) {\n return true;\n }\n return false;\n};\n","import { normalizeBasePath } from './utils';\n\n/**\n * 确保路径包含 CLIENT_BASE_PATH 前缀\n */\nfunction ensureBasePath(pathname: string, basePath: string): string {\n if (!basePath) return pathname;\n if (pathname.startsWith(basePath)) return pathname;\n return `${basePath}${pathname.startsWith('/') ? '' : '/'}${pathname}`;\n}\n\n/**\n * 解析应用内路径,自动补全 CLIENT_BASE_PATH 前缀,返回完整 URL\n * 适用于生成分享链接、二维码等需要完整 URL 的场景\n *\n * - 相对路径:补全前缀 + 当前域名\n * - 当前域名的完整 URL:修正路径部分,补全前缀\n * - 其他域名的 URL:原样返回,不做处理\n *\n * @param path - 应用内相对路径或完整 URL\n * @returns 完整的 URL 字符串\n *\n * @example\n * // 假设 CLIENT_BASE_PATH = '/app/abc',当前域名为 https://example.com\n *\n * resolveAppUrl('/detail/123')\n * // => 'https://example.com/app/abc/detail/123'\n *\n * resolveAppUrl('https://example.com/detail/123')\n * // => 'https://example.com/app/abc/detail/123'\n *\n * resolveAppUrl('https://example.com/app/abc/detail/123')\n * // => 'https://example.com/app/abc/detail/123' (已有前缀,不重复添加)\n *\n * resolveAppUrl('https://other-site.com/page')\n * // => 'https://other-site.com/page' (非当前域名,原样返回)\n */\nexport function resolveAppUrl(path: string): string {\n const basePath = normalizeBasePath(process.env.CLIENT_BASE_PATH);\n\n // 尝试解析为完整 URL\n try {\n const url = new URL(path);\n // 非当前域名,原样返回\n if (url.origin !== window.location.origin) {\n return path;\n }\n // 当前域名,修正路径\n url.pathname = ensureBasePath(url.pathname, basePath);\n return url.toString();\n } catch {\n // 不是完整 URL,当作相对路径处理\n }\n\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n const resolvedPath = ensureBasePath(normalizedPath, basePath);\n return `${window.location.origin}${resolvedPath}`;\n}\n","/**\n * @internal\n */\nexport function getEnvPath() {\n return window.IS_MIAODA_PREVIEW ? 'feida_preview' : 'feida_runtime';\n}\n","// 安全的 JSON.stringify 实现\nexport function safeStringify(obj: unknown): string {\n const seen = new Set<object>();\n\n try {\n return JSON.stringify(obj, (_key, value) => {\n // 处理循环引用\n if (typeof value === 'object' && value !== null) {\n if (seen.has(value)) {\n return '[Circular]';\n }\n seen.add(value);\n }\n\n // 处理 BigInt\n if (typeof value === 'bigint') {\n return value.toString();\n }\n\n // 处理 Date\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n // 处理 Map\n if (value instanceof Map) {\n return Object.fromEntries(value);\n }\n\n // 处理 Set\n if (value instanceof Set) {\n return Array.from(value);\n }\n\n // 处理 undefined\n if (typeof value === 'undefined') {\n return 'undefined';\n }\n\n // 处理 Symbol\n if (typeof value === 'symbol') {\n return value.toString();\n }\n\n return value;\n });\n } catch {\n return '';\n } finally {\n seen.clear();\n }\n}\n","import axios, { AxiosInstance } from 'axios';\nimport { initAxiosConfig } from './axiosConfig';\n\nlet axiosInstance: AxiosInstance | undefined;\n\n/** 显示 toast 提示(兼容 PC/移动端) */\nfunction showToast(message: string, duration = 3000): Promise<void> {\n return new Promise(resolve => {\n const toast = document.createElement('div');\n\n const iconSvg = `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M8 1.333a6.667 6.667 0 1 1 0 13.334A6.667 6.667 0 0 1 8 1.333ZM8 10a.667.667 0 1 0 0 1.333A.667.667 0 0 0 8 10Zm0-5.333a.667.667 0 0 0-.667.666v3.334a.667.667 0 0 0 1.334 0V5.333A.667.667 0 0 0 8 4.667Z\" fill=\"#ff811a\"/>\n </svg>`;\n\n const iconWrapper = document.createElement('span');\n iconWrapper.innerHTML = iconSvg;\n Object.assign(iconWrapper.style, {\n display: 'flex',\n alignItems: 'center',\n marginRight: '8px',\n flexShrink: '0',\n });\n\n const textWrapper = document.createElement('span');\n textWrapper.textContent = message;\n\n toast.appendChild(iconWrapper);\n toast.appendChild(textWrapper);\n\n Object.assign(toast.style, {\n position: 'fixed',\n top: '20%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n display: 'flex',\n alignItems: 'center',\n padding: '12px 16px',\n backgroundColor: '#fff',\n color: '#1f2329',\n border: '1px solid #dee0e3',\n borderRadius: '6px',\n fontSize: '14px',\n lineHeight: '1.5',\n zIndex: '99999',\n maxWidth: '80vw',\n wordBreak: 'break-word',\n boxShadow: '0 4px 8px rgba(0, 0, 0, 0.03), 0 3px 6px rgba(0, 0, 0, 0.05), 0 6px 18px rgba(0, 0, 0, 0.03)',\n opacity: '0',\n transition: 'opacity 0.3s ease',\n });\n\n document.body.appendChild(toast);\n\n requestAnimationFrame(() => {\n toast.style.opacity = '1';\n });\n\n setTimeout(() => {\n toast.style.opacity = '0';\n setTimeout(() => {\n document.body.removeChild(toast);\n resolve();\n }, 300);\n }, duration);\n });\n}\n\ndeclare module 'axios' {\n export interface AxiosRequestConfig {\n meta?: {\n autoJumpToLogin?: boolean;\n };\n }\n}\n\n/** 获取axios实例 */\nexport function getAxiosForBackend() {\n if (!axiosInstance) {\n axiosInstance = axios.create({\n baseURL: process.env.CLIENT_BASE_PATH || '/',\n });\n axiosInstance.interceptors.response.use(\n null,\n err => {\n if (err.config.meta?.autoJumpToLogin !== false) {\n const loginUrl = err.response?.headers?.['x-login-url'];\n if (loginUrl) {\n showToast('需要登录后才能执行操作,将自动跳转登录页', 3000).then(() => {\n window.location.href = loginUrl;\n });\n }\n }\n return Promise.reject(err);\n });\n initAxiosConfig(axiosInstance);\n }\n return axiosInstance;\n}\n\nexport const axiosForBackend = getAxiosForBackend();\n","// 头像 Avatar 图\nexport const avatarImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/1.jpg';\nexport const avatarImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/2.jpg';\nexport const avatarImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/3.jpg';\nexport const avatarImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/4.jpg';\nexport const avatarImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/5.jpg';\nexport const avatarImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/6.jpg';\nexport const avatarImg7 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/7.jpg';\nexport const avatarImg8 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/8.jpg';\nexport const avatarImg9 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/9.jpg';\nexport const avatarImg10 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/10.jpg';\nexport const avatarImg11 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/avatar/base/11.jpg';\n","// Banner 图 technology 类型\nexport const techBannerImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/technology/1.jpg';\nexport const techBannerImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/technology/2.jpg';\nexport const techBannerImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/technology/3.jpg';\nexport const techBannerImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/technology/4.jpg';\nexport const techBannerImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/technology/5.jpg';\nexport const techBannerImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/technology/6.jpg';\nexport const techBannerImg7 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/technology/7.jpg';\nexport const techBannerImg8 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/technology/8.jpg';\n\n// Banner 图 professional 类型\nexport const professionalBannerImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/professional/1.jpg';\nexport const professionalBannerImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/professional/2.jpg';\nexport const professionalBannerImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/professional/3.jpg';\nexport const professionalBannerImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/professional/4.jpg';\nexport const professionalBannerImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/professional/5.jpg';\nexport const professionalBannerImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/professional/6.jpg';\nexport const professionalBannerImg7 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/professional/7.jpg';\nexport const professionalBannerImg8 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/professional/8.jpg';\n\n// Banner 图 minimalism 类型\nexport const minimalismBannerImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/minimalism/1.jpg';\nexport const minimalismBannerImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/minimalism/2.jpg';\nexport const minimalismBannerImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/minimalism/3.jpg';\nexport const minimalismBannerImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/minimalism/4.jpg';\nexport const minimalismBannerImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/minimalism/5.jpg';\nexport const minimalismBannerImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/minimalism/6.jpg';\nexport const minimalismBannerImg7 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/minimalism/7.jpg';\nexport const minimalismBannerImg8 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/banner/minimalism/8.jpg';\n","// Cover 图 office\nexport const officeCoverImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/office/1.jpg';\nexport const officeCoverImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/office/2.jpg';\nexport const officeCoverImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/office/3.jpg';\nexport const officeCoverImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/office/4.jpg';\nexport const officeCoverImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/office/5.jpg';\nexport const officeCoverImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/office/6.jpg';\n\n// Cover 图 architecture\nexport const architectureCoverImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/architecture/1.jpg';\nexport const architectureCoverImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/architecture/2.jpg';\nexport const architectureCoverImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/architecture/3.jpg';\nexport const architectureCoverImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/architecture/4.jpg';\nexport const architectureCoverImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/architecture/5.jpg';\nexport const architectureCoverImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/architecture/6.jpg';\n\n// Cover 图 appeal-clothing\nexport const appealClothingCoverImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/appeal-clothing/1.jpg';\nexport const appealClothingCoverImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/appeal-clothing/2.jpg';\nexport const appealClothingCoverImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/appeal-clothing/3.jpg';\nexport const appealClothingCoverImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/appeal-clothing/4.jpg';\nexport const appealClothingCoverImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/appeal-clothing/5.jpg';\nexport const appealClothingCoverImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/appeal-clothing/6.jpg';\n\n// Cover 图 scenery\nexport const sceneryCoverImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/scenery/1.jpg';\nexport const sceneryCoverImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/scenery/2.jpg';\nexport const sceneryCoverImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/scenery/3.jpg';\nexport const sceneryCoverImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/scenery/4.jpg';\nexport const sceneryCoverImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/scenery/5.jpg';\nexport const sceneryCoverImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/scenery/6.jpg';\n\n// Cover 图 technology-internet\nexport const technologyInternetCoverImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/technology-internet/1.jpg';\nexport const technologyInternetCoverImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/technology-internet/2.jpg';\nexport const technologyInternetCoverImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/technology-internet/3.jpg';\nexport const technologyInternetCoverImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/technology-internet/4.jpg';\nexport const technologyInternetCoverImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/technology-internet/5.jpg';\nexport const technologyInternetCoverImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/technology-internet/6.jpg';\n\n// Cover 图 abstract-art-3d-rendering\nexport const abstractArt3dRenderingCoverImg1 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/abstract-art-3d-rendering/1.jpg';\nexport const abstractArt3dRenderingCoverImg2 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/abstract-art-3d-rendering/2.jpg';\nexport const abstractArt3dRenderingCoverImg3 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/abstract-art-3d-rendering/3.jpg';\nexport const abstractArt3dRenderingCoverImg4 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/abstract-art-3d-rendering/4.jpg';\nexport const abstractArt3dRenderingCoverImg5 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/abstract-art-3d-rendering/5.jpg';\nexport const abstractArt3dRenderingCoverImg6 =\n 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ylcylz_fsph_ryhs/ljhwZthlaukjlkulzlp/feisuda/cover/abstract-art-3d-rendering/6.jpg';\n"],"mappings":"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OAAOV,GAAAA;IACxB,CAAA;AACFW,oBAAgBhE,aAAAA;EAClB;AACA,SAAOA;AACT;AArBgB2C;AAuBT,IAAMsB,kBAAkBtB,mBAAAA;;;ACnG/B;;;;;;;;;;;;;;AACO,IAAMuB,aACX;AACK,IAAMC,aACX;AACK,IAAMC,aACX;AACK,IAAMC,aACX;AACK,IAAMC,aACX;AACK,IAAMC,aACX;AACK,IAAMC,aACX;AACK,IAAMC,aACX;AACK,IAAMC,aACX;AACK,IAAMC,cACX;AACK,IAAMC,cACX;;;ACtBF;;;;;;;;;;;;;;;;;;;;;;;;;;;AACO,IAAMC,iBACX;AACK,IAAMC,iBACX;AACK,IAAMC,iBACX;AACK,IAAMC,iBACX;AACK,IAAMC,iBACX;AACK,IAAMC,iBACX;AACK,IAAMC,iBACX;AACK,IAAMC,iBACX;AAGK,IAAMC,yBACX;AACK,IAAMC,yBACX;AACK,IAAMC,yBACX;AACK,IAAMC,yBACX;AACK,IAAMC,yBACX;AACK,IAAMC,yBACX;AACK,IAAMC,yBACX;AACK,IAAMC,yBACX;AAGK,IAAMC,uBACX;AACK,IAAMC,uBACX;AACK,IAAMC,uBACX;AACK,IAAMC,uBACX;AACK,IAAMC,uBACX;AACK,IAAMC,uBACX;AACK,IAAMC,uBACX;AACK,IAAMC,uBACX;;;ACpDF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACO,IAAMC,kBACX;AACK,IAAMC,kBACX;AACK,IAAMC,kBACX;AACK,IAAMC,kBACX;AACK,IAAMC,kBACX;AACK,IAAMC,kBACX;AAGK,IAAMC,wBACX;AACK,IAAMC,wBACX;AACK,IAAMC,wBACX;AACK,IAAMC,wBACX;AACK,IAAMC,wBACX;AACK,IAAMC,wBACX;AAGK,IAAMC,0BACX;AACK,IAAMC,0BACX;AACK,IAAMC,0BACX;AACK,IAAMC,0BACX;AACK,IAAMC,0BACX;AACK,IAAMC,0BACX;AAGK,IAAMC,mBACX;AACK,IAAMC,mBACX;AACK,IAAMC,mBACX;AACK,IAAMC,mBACX;AACK,IAAMC,mBACX;AACK,IAAMC,mBACX;AAGK,IAAMC,8BACX;AACK,IAAMC,8BACX;AACK,IAAMC,8BACX;AACK,IAAMC,8BACX;AACK,IAAMC,8BACX;AACK,IAAMC,8BACX;AAGK,IAAMC,kCACX;AACK,IAAMC,kCACX;AACK,IAAMC,kCACX;AACK,IAAMC,kCACX;AACK,IAAMC,kCACX;AACK,IAAMC,kCACX;","names":["NavLink","import_react","window","process","env","NODE_ENV","__REACT_DEVTOOLS_GLOBAL_HOOK__","renderers","Map","supportsFiber","inject","renderer","id","size","set","onCommitFiberRoot","onCommitFiberUnmount","hook","originalInject","bind","has","getCsrfToken","cookieName","cookies","document","cookie","split","name","value","decodeURIComponent","window","csrfToken","initAxiosConfig","axiosInstance","axios","interceptors","request","use","config","csrfToken","getCsrfToken","headers","window","location","pathname","error","Promise","reject","response","process","env","NODE_ENV","console","warn","method","toUpperCase","url","message","window","__FULLSTACK_RUNTIME_INITIALIZED__","initAxiosConfig","import_react","clsxWithTw","inputs","twMerge","clsx","isPreview","window","IS_MIAODA_PREVIEW","normalizeBasePath","basePath","replace","getWsPath","rawBasePath","process","env","CLIENT_BASE_PATH","normalizedBasePath","startsWith","basePathWithoutTrailingSlash","endsWith","slice","isSparkRuntime","_IS_Spark_RUNTIME","runtimeMode","Popover","props","Root","data-slot","PopoverTrigger","Trigger","PopoverContent","className","align","sideOffset","Portal","Content","clsxWithTw","getAppId","windowAppId","window","appId","isNewPathEnabled","basePath","process","env","CLIENT_BASE_PATH","test","getAppPublished","headers","window","token","MIAODA_BUILTIN_TTT","getCsrfToken","appId","getAppId","path","isNewPathEnabled","url","location","origin","response","fetch","method","credentials","res","json","code","status_code","data","console","error","undefined","initialInfo","pendingPromise","getInitialInfo","refresh","Promise","resolve","then","info","_bucket_id","app_runtime_extra","bucket","default_bucket_id","finally","getAppInfo","refresh","appInfo","window","_appInfo","undefined","isSparkRuntime","info","getInitialInfo","app_info","name","app_name","avatar","app_avatar","description","app_description","trim","useAppInfo","appInfo","setAppInfo","useState","useEffect","updateDomInfo","info","name","document","title","meta","querySelector","content","avatar","link","createElement","rel","head","appendChild","href","description","metaDom","handleMetaInfoChanged","refresh","getAppInfo","prev","undefined","onUpdate","e","detail","window","addEventListener","removeEventListener","appName","appLogo","import_react","getCurrentUserProfile","window","_userInfo","splitWorkspaceUrl","fullUrl","url","URL","pathParts","pathname","split","workspacesIndex","findIndex","part","Error","basePathParts","slice","workspace","baseUrl","origin","join","error","console","createDataLoomClient","url","pat","baseUrl","workspace","splitWorkspaceUrl","appId","getAppId","createClient","global","enableDataloomLog","process","env","NODE_ENV","requestRateLimit","undefined","brandName","onError","error","dataloomInstance","status","code","service","session","redirectToLogin","dataloom","pendingPromise","getDataloom","Promise","resolve","getInitialInfo","then","info","DATALOOM_CLIENT_URL","app_runtime_extra","DATALOOM_PAT","token","finally","getNameFromArray","nameArray","length","undefined","chineseName","find","item","language_code","text","getCompatibilityUserProfile","userInfo","getCurrentUserProfile","userName","name","userAvatar","avatar","useCurrentUserProfile","setUserInfo","useState","useEffect","cancelled","fetchAndSetUserInfo","dataloom","getDataloom","result","service","session","getUserInfo","info","data","user_info","newUserInfo","user_id","toString","email","image","large","process","env","NODE_ENV","console","log","handleMetaInfoChanged","isSparkRuntime","window","addEventListener","removeEventListener","import_react","MOBILE_BREAKPOINT","useIsMobile","isMobile","setIsMobile","React","useState","window","innerWidth","useEffect","handleResize","debouncedHandleResize","debounce","addEventListener","removeEventListener","cancel","import_react","useLogout","isLoading","setIsLoading","useState","handlerLogout","process","env","NODE_ENV","console","log","dataloom","getDataloom","service","session","signOut","error","React","Sheet","props","Root","data-slot","SheetTrigger","Trigger","SheetPortal","props","Portal","data-slot","SheetOverlay","className","Overlay","cn","SheetContent","children","side","Content","Component","HasClosedKey","getAppId","visible","setVisible","useState","window","localStorage","getItem","open","setOpen","isMobile","useIsMobile","userinfo","setUserinfo","isInternetVisible","setIsInternetVisible","showBadge","setShowBadge","badgeLoaded","setBadgeLoaded","timeoutRef","useRef","useEffect","appId","csrfHeaders","getCsrfToken","tenantInfoUrl","isNewPathEnabled","fetch","headers","then","res","json","data","tenant_info","is_internet_visible","catch","getPublishedUrl","badge","app_info","show_badge","finally","link","document","createElement","rel","as","href","head","appendChild","process","env","NODE_ENV","React","Sheet","onOpenChange","SheetTrigger","asChild","div","className","onClick","img","src","p","SheetContent","side","X","alt","name","e","stopPropagation","preventDefault","setTimeout","setItem","Popover","PopoverTrigger","onMouseEnter","clearTimeout","current","onMouseLeave","PopoverContent","style","boxShadow","align","sideOffset","data-custom-element","import_react","defaultQueryClient","getDefaultQueryClient","QueryClient","defaultOptions","queries","retry","refetchOnWindowFocus","mutations","QueryProvider","children","client","qc","React","QueryClientProvider","AppContainer","children","useAppInfo","React","Safety","QueryProvider","import_react","ActiveLink","forwardRef","to","onClick","className","style","children","rest","ref","currentHash","setCurrentHash","useState","window","location","hash","isHashRoute","startsWith","useEffect","handleHashChange","addEventListener","removeEventListener","isActive","React","NavLink","handleHashClick","e","defaultPrevented","preventDefault","targetId","slice","targetElement","document","getElementById","history","pushState","dispatchEvent","Event","scrollIntoView","behavior","computedClassName","isPending","isTransitioning","computedStyle","computedChildren","a","href","displayName","React","import_react_router_dom","NavLink","React","forwardRef","to","children","className","style","props","ref","isHashLink","startsWith","location","useLocation","navigate","useNavigate","handleClick","e","preventDefault","element","document","querySelector","scrollIntoView","behavior","isActive","hash","renderProps","isPending","isTransitioning","resolvedClassName","resolvedStyle","caseSensitive","end","replace","state","preventScrollReset","relative","viewTransition","restProps","a","href","onClick","OriginalNavLink","getElementById","window","scrollTo","top","displayName","import_react","import_react_router_dom","isInternalRoute","to","startsWith","isExternalLink","UniversalLink","React","forwardRef","props","ref","RouterLink","a","href","target","rel","getPrefix","appId","getAppId","namespace","getScopedKeys","prefix","keys","i","localStorage","length","key","startsWith","push","substring","scopedStorage","getItem","prefixedKey","setItem","value","removeItem","clear","keysToRemove","forEach","index","copyToClipboard","text","navigator","clipboard","window","isSecureContext","writeText","fallbackCopyToClipboard","error","textArea","document","createElement","value","style","position","left","top","setAttribute","body","appendChild","focus","select","successful","execCommand","removeChild","console","isIpad","_isIpad","test","navigator","userAgent","maxTouchPoints","Boolean","isMobile","isPhone","isIOS","ensureBasePath","pathname","basePath","startsWith","resolveAppUrl","path","normalizeBasePath","process","env","CLIENT_BASE_PATH","url","URL","origin","window","location","toString","normalizedPath","resolvedPath","getEnvPath","window","IS_MIAODA_PREVIEW","safeStringify","obj","seen","Set","JSON","stringify","_key","value","has","add","toString","Date","toISOString","Map","Object","fromEntries","Array","from","clear","import_axios","axiosInstance","showToast","message","duration","Promise","resolve","toast","document","createElement","iconSvg","iconWrapper","innerHTML","Object","assign","style","display","alignItems","marginRight","flexShrink","textWrapper","textContent","appendChild","position","top","left","transform","padding","backgroundColor","color","border","borderRadius","fontSize","lineHeight","zIndex","maxWidth","wordBreak","boxShadow","opacity","transition","body","requestAnimationFrame","setTimeout","removeChild","getAxiosForBackend","axios","create","baseURL","process","env","CLIENT_BASE_PATH","interceptors","response","use","err","config","meta","autoJumpToLogin","loginUrl","headers","then","window","location","href","reject","initAxiosConfig","axiosForBackend","avatarImg1","avatarImg2","avatarImg3","avatarImg4","avatarImg5","avatarImg6","avatarImg7","avatarImg8","avatarImg9","avatarImg10","avatarImg11","techBannerImg1","techBannerImg2","techBannerImg3","techBannerImg4","techBannerImg5","techBannerImg6","techBannerImg7","techBannerImg8","professionalBannerImg1","professionalBannerImg2","professionalBannerImg3","professionalBannerImg4","professionalBannerImg5","professionalBannerImg6","professionalBannerImg7","professionalBannerImg8","minimalismBannerImg1","minimalismBannerImg2","minimalismBannerImg3","minimalismBannerImg4","minimalismBannerImg5","minimalismBannerImg6","minimalismBannerImg7","minimalismBannerImg8","officeCoverImg1","officeCoverImg2","officeCoverImg3","officeCoverImg4","officeCoverImg5","officeCoverImg6","architectureCoverImg1","architectureCoverImg2","architectureCoverImg3","architectureCoverImg4","architectureCoverImg5","architectureCoverImg6","appealClothingCoverImg1","appealClothingCoverImg2","appealClothingCoverImg3","appealClothingCoverImg4","appealClothingCoverImg5","appealClothingCoverImg6","sceneryCoverImg1","sceneryCoverImg2","sceneryCoverImg3","sceneryCoverImg4","sceneryCoverImg5","sceneryCoverImg6","technologyInternetCoverImg1","technologyInternetCoverImg2","technologyInternetCoverImg3","technologyInternetCoverImg4","technologyInternetCoverImg5","technologyInternetCoverImg6","abstractArt3dRenderingCoverImg1","abstractArt3dRenderingCoverImg2","abstractArt3dRenderingCoverImg3","abstractArt3dRenderingCoverImg4","abstractArt3dRenderingCoverImg5","abstractArt3dRenderingCoverImg6"]}
|