{"version":3,"mappings":"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","names":["createChainedFunction","funcs","f","acc","args","MARGINS","getDefaultDimensionValue","dimension","elem","offset","value","margins","css","collapseStyles","EXITED","EXITING","ENTERING","ENTERED","Collapse","React","onEnter","onEntering","onEntered","onExit","onExiting","className","children","inProp","timeout","mountOnEnter","unmountOnExit","appear","getDimensionValue","props","ref","computedDimension","handleEnter","useMemo","handleEntering","scroll","handleEntered","handleExit","triggerBrowserReflow","handleExiting","_jsx","TransitionWrapper","transitionEndListener","getChildRef","state","innerProps","classNames","NavbarBrand","React.forwardRef","bsPrefix","as","useBootstrapPrefix","Component","NavbarCollapse","context","useContext","NavbarContext","NavbarToggle","label","onClick","onToggle","expanded","handleClick","useEventCallback","e","matchersByWindow","getMatcher","query","targetWindow","matchers","mql","useMediaQuery","matches","setMatches","useState","useEffect","handleChange","createBreakpointHook","breakpointValues","names","and","next","getNext","breakpoint","getMaxQuery","getMinQuery","useBreakpoint","breakpointOrMap","direction","window","breakpointMap","key","OffcanvasBody","transitionStyles","OffcanvasToggling","status","React.cloneElement","OffcanvasHeader","closeLabel","closeButton","AbstractModalHeader","DivStyledAsH5","divWithClassName","OffcanvasTitle","DialogTransition","BackdropTransition","Fade","Offcanvas","ariaLabelledby","placement","responsive","show","backdrop","keyboard","onEscapeKeyDown","onShow","onHide","container","autoFocus","enforceFocus","restoreFocus","restoreFocusOptions","onExited","backdropClassName","propsManager","renderStaticNode","modalManager","useRef","showOffcanvas","setShowOffcanvas","handleHide","hideResponsiveOffcanvas","modalContext","getModalManager","BootstrapModalManager","getSharedManager","node","handleExited","renderBackdrop","useCallback","backdropProps","renderDialog","dialogProps","_jsxs","_Fragment","ModalContext","BaseModal","Offcanvas$1","NavbarOffcanvas","NavbarText","Navbar","initialBsPrefix","expand","variant","bg","fixed","sticky","onSelect","collapseOnSelect","controlledProps","useUncontrolled","handleCollapse","expandClass","navbarContext","SelectableContext","BootstrapNavbar","getPersonalContentHref","section","username","hostname","UserInfo","isMobile","t","useTranslation","user","loading","useAuth","canUploadVideos","useCanUploadVideos","canAccessWallet","usePermissions","embedded","useEmbedded","unreadCount","setUnreadCount","showPermissionModal","setShowPermissionModal","isImpersonating","setIsImpersonating","personalHostname","fetchUnreadCount","response","api","error","fetchImpersonateStatus","interval","handleLogout","handleStopImpersonate","handleCreateClick","appPath","jsx","Spinner","loginUrl","appendCurrentChannel","Button","jsxs","UserAvatar","Fragment","Modal","Dropdown","STORAGE_KEY","CHOICE_KEY","DEFAULT_VARIANT","CONTENT_LOCALE_EVENT","PENDING_CLASS","CJK_RE","SKIP_TAGS","TEXT_ATTRIBUTES","ATTRIBUTE_SELECTOR","attr","NO_CONVERT_SELECTOR","convertToTraditional","converterPromise","observer","activeVariant","variantRequest","sessionChoice","originalTextByNode","originalAttrsByElement","pendingWrites","isValidVariant","readStored","stored","appVariant","locale","target","legacyChoice","getChineseVariant","rememberChineseVariantChoice","followContentLocale","detail","importOpenccConverter","importConverter","loadConverter","mod","isSkipped","parent","collectTextNodes","root","nodes","walker","writeNodeValue","applyToTextNode","refreshOriginal","original","applyToAttributes","element","record","applyToRoot","el","handleMutations","mutations","mutation","expected","added","startObserver","stopObserver","setDocumentLanguage","revealDocument","setChineseVariant","request","shown","showChineseVariant","onShown","subscribeToContentLocale","onVariant","follow","event","LanguageToggle","setVariant","choose","showSidebarToggle","shouldShowToggle","searchQuery","setSearchQuery","handleSearch","useSearch","toggleSidebar","useSidebar","showMobileUserMenu","setShowMobileUserMenu","trackProductNavigation","targetProduct","trackEvent","Container","Form","navItemsConfig","Sidebar","externalShow","externalOnHide","currentPath","setCurrentPath","isAuthenticated","language","changeLanguage","sidebarOpen","closeSidebar","stripAppPath","isActiveLink","href","NavItem","icon","labelKey","requiresAuth","isActive","iconClass","returnUrl","Nav","SidebarContent","item","index","NavbarWrapper","I18nProvider","SidebarWrapper","FollowingUsersProvider","initializeToastProvider","render"],"ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14],"sources":["../../../node_modules/.pnpm/react-bootstrap@2.10.10_@types+react@19.1.8_react-dom@19.1.0_react@19.1.0/node_modules/react-bootstrap/esm/createChainedFunction.js","../../../node_modules/.pnpm/react-bootstrap@2.10.10_@types+react@19.1.8_react-dom@19.1.0_react@19.1.0/node_modules/react-bootstrap/esm/Collapse.js","../../../node_modules/.pnpm/react-bootstrap@2.10.10_@types+react@19.1.8_react-dom@19.1.0_react@19.1.0/node_modules/react-bootstrap/esm/NavbarBrand.js","../../../node_modules/.pnpm/react-bootstrap@2.10.10_@types+react@19.1.8_react-dom@19.1.0_react@19.1.0/node_modules/react-bootstrap/esm/NavbarCollapse.js","../../../node_modules/.pnpm/react-bootstrap@2.10.10_@types+react@19.1.8_react-dom@19.1.0_react@19.1.0/node_modules/react-bootstrap/esm/NavbarToggle.js","../../../node_modules/.pnpm/@restart+hooks@0.4.16_react@19.1.0/node_modules/@restart/hooks/esm/useMediaQuery.js","../../../node_modules/.pnpm/@restart+hooks@0.4.16_react@19.1.0/node_modules/@restart/hooks/esm/useBreakpoint.js","../../../node_modules/.pnpm/react-bootstrap@2.10.10_@types+react@19.1.8_react-dom@19.1.0_react@19.1.0/node_modules/react-bootstrap/esm/OffcanvasBody.js","../../../node_modules/.pnpm/react-bootstrap@2.10.10_@types+react@19.1.8_react-dom@19.1.0_react@19.1.0/node_modules/react-bootstrap/esm/OffcanvasToggling.js","../../../node_modules/.pnpm/react-bootstrap@2.10.10_@types+react@19.1.8_react-dom@19.1.0_react@19.1.0/node_modules/react-bootstrap/esm/OffcanvasHeader.js","../../../node_modules/.pnpm/react-bootstrap@2.10.10_@types+react@19.1.8_react-dom@19.1.0_react@19.1.0/node_modules/react-bootstrap/esm/OffcanvasTitle.js","../../../node_modules/.pnpm/react-bootstrap@2.10.10_@types+react@19.1.8_react-dom@19.1.0_react@19.1.0/node_modules/react-bootstrap/esm/Offcanvas.js","../../../node_modules/.pnpm/react-bootstrap@2.10.10_@types+react@19.1.8_react-dom@19.1.0_react@19.1.0/node_modules/react-bootstrap/esm/NavbarOffcanvas.js","../../../node_modules/.pnpm/react-bootstrap@2.10.10_@types+react@19.1.8_react-dom@19.1.0_react@19.1.0/node_modules/react-bootstrap/esm/NavbarText.js","../../../node_modules/.pnpm/react-bootstrap@2.10.10_@types+react@19.1.8_react-dom@19.1.0_react@19.1.0/node_modules/react-bootstrap/esm/Navbar.js","../src/pages/common/userinfoRoutes.ts","../src/pages/common/userinfo.tsx","../src/libs/chineseVariant.ts","../src/pages/common/LanguageToggle.tsx","../src/pages/common/navbar.tsx","../src/pages/common/sidebar.tsx","../src/pages/common/index.tsx"],"sourcesContent":["/**\n * Safe chained function\n *\n * Will only create a new function if needed,\n * otherwise will pass back existing functions or null.\n *\n * @param {function} functions to chain\n * @returns {function|null}\n */\nfunction createChainedFunction(...funcs) {\n  return funcs.filter(f => f != null).reduce((acc, f) => {\n    if (typeof f !== 'function') {\n      throw new Error('Invalid Argument Type, must only provide functions, undefined, or null.');\n    }\n    if (acc === null) return f;\n    return function chainedFunction(...args) {\n      // @ts-expect-error ignore \"this\" error\n      acc.apply(this, args);\n      // @ts-expect-error ignore \"this\" error\n      f.apply(this, args);\n    };\n  }, null);\n}\nexport default createChainedFunction;","import classNames from 'classnames';\nimport css from 'dom-helpers/css';\nimport React, { useMemo } from 'react';\nimport { ENTERED, ENTERING, EXITED, EXITING } from 'react-transition-group/Transition';\nimport { getChildRef } from '@restart/ui/utils';\nimport transitionEndListener from './transitionEndListener';\nimport createChainedFunction from './createChainedFunction';\nimport triggerBrowserReflow from './triggerBrowserReflow';\nimport TransitionWrapper from './TransitionWrapper';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst MARGINS = {\n  height: ['marginTop', 'marginBottom'],\n  width: ['marginLeft', 'marginRight']\n};\nfunction getDefaultDimensionValue(dimension, elem) {\n  const offset = `offset${dimension[0].toUpperCase()}${dimension.slice(1)}`;\n  const value = elem[offset];\n  const margins = MARGINS[dimension];\n  return value +\n  // @ts-expect-error TODO\n  parseInt(css(elem, margins[0]), 10) +\n  // @ts-expect-error TODO\n  parseInt(css(elem, margins[1]), 10);\n}\nconst collapseStyles = {\n  [EXITED]: 'collapse',\n  [EXITING]: 'collapsing',\n  [ENTERING]: 'collapsing',\n  [ENTERED]: 'collapse show'\n};\nconst Collapse = /*#__PURE__*/React.forwardRef(({\n  onEnter,\n  onEntering,\n  onEntered,\n  onExit,\n  onExiting,\n  className,\n  children,\n  dimension = 'height',\n  in: inProp = false,\n  timeout = 300,\n  mountOnEnter = false,\n  unmountOnExit = false,\n  appear = false,\n  getDimensionValue = getDefaultDimensionValue,\n  ...props\n}, ref) => {\n  /* Compute dimension */\n  const computedDimension = typeof dimension === 'function' ? dimension() : dimension;\n\n  /* -- Expanding -- */\n  const handleEnter = useMemo(() => createChainedFunction(elem => {\n    elem.style[computedDimension] = '0';\n  }, onEnter), [computedDimension, onEnter]);\n  const handleEntering = useMemo(() => createChainedFunction(elem => {\n    const scroll = `scroll${computedDimension[0].toUpperCase()}${computedDimension.slice(1)}`;\n    elem.style[computedDimension] = `${elem[scroll]}px`;\n  }, onEntering), [computedDimension, onEntering]);\n  const handleEntered = useMemo(() => createChainedFunction(elem => {\n    elem.style[computedDimension] = null;\n  }, onEntered), [computedDimension, onEntered]);\n\n  /* -- Collapsing -- */\n  const handleExit = useMemo(() => createChainedFunction(elem => {\n    elem.style[computedDimension] = `${getDimensionValue(computedDimension, elem)}px`;\n    triggerBrowserReflow(elem);\n  }, onExit), [onExit, getDimensionValue, computedDimension]);\n  const handleExiting = useMemo(() => createChainedFunction(elem => {\n    elem.style[computedDimension] = null;\n  }, onExiting), [computedDimension, onExiting]);\n  return /*#__PURE__*/_jsx(TransitionWrapper, {\n    ref: ref,\n    addEndListener: transitionEndListener,\n    ...props,\n    \"aria-expanded\": props.role ? inProp : null,\n    onEnter: handleEnter,\n    onEntering: handleEntering,\n    onEntered: handleEntered,\n    onExit: handleExit,\n    onExiting: handleExiting,\n    childRef: getChildRef(children),\n    in: inProp,\n    timeout: timeout,\n    mountOnEnter: mountOnEnter,\n    unmountOnExit: unmountOnExit,\n    appear: appear,\n    children: (state, innerProps) => /*#__PURE__*/React.cloneElement(children, {\n      ...innerProps,\n      className: classNames(className, children.props.className, collapseStyles[state], computedDimension === 'width' && 'collapse-horizontal')\n    })\n  });\n});\nCollapse.displayName = 'Collapse';\nexport default Collapse;","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst NavbarBrand = /*#__PURE__*/React.forwardRef(({\n  bsPrefix,\n  className,\n  as,\n  ...props\n}, ref) => {\n  bsPrefix = useBootstrapPrefix(bsPrefix, 'navbar-brand');\n  const Component = as || (props.href ? 'a' : 'span');\n  return /*#__PURE__*/_jsx(Component, {\n    ...props,\n    ref: ref,\n    className: classNames(className, bsPrefix)\n  });\n});\nNavbarBrand.displayName = 'NavbarBrand';\nexport default NavbarBrand;","\"use client\";\n\nimport * as React from 'react';\nimport { useContext } from 'react';\nimport Collapse from './Collapse';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport NavbarContext from './NavbarContext';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst NavbarCollapse = /*#__PURE__*/React.forwardRef(({\n  children,\n  bsPrefix,\n  ...props\n}, ref) => {\n  bsPrefix = useBootstrapPrefix(bsPrefix, 'navbar-collapse');\n  const context = useContext(NavbarContext);\n  return /*#__PURE__*/_jsx(Collapse, {\n    in: !!(context && context.expanded),\n    ...props,\n    children: /*#__PURE__*/_jsx(\"div\", {\n      ref: ref,\n      className: bsPrefix,\n      children: children\n    })\n  });\n});\nNavbarCollapse.displayName = 'NavbarCollapse';\nexport default NavbarCollapse;","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useContext } from 'react';\nimport useEventCallback from '@restart/hooks/useEventCallback';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport NavbarContext from './NavbarContext';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst NavbarToggle = /*#__PURE__*/React.forwardRef(({\n  bsPrefix,\n  className,\n  children,\n  label = 'Toggle navigation',\n  // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n  as: Component = 'button',\n  onClick,\n  ...props\n}, ref) => {\n  bsPrefix = useBootstrapPrefix(bsPrefix, 'navbar-toggler');\n  const {\n    onToggle,\n    expanded\n  } = useContext(NavbarContext) || {};\n  const handleClick = useEventCallback(e => {\n    if (onClick) onClick(e);\n    if (onToggle) onToggle();\n  });\n  if (Component === 'button') {\n    props.type = 'button';\n  }\n  return /*#__PURE__*/_jsx(Component, {\n    ...props,\n    ref: ref,\n    onClick: handleClick,\n    \"aria-label\": label,\n    className: classNames(className, bsPrefix, !expanded && 'collapsed'),\n    children: children || /*#__PURE__*/_jsx(\"span\", {\n      className: `${bsPrefix}-icon`\n    })\n  });\n});\nNavbarToggle.displayName = 'NavbarToggle';\nexport default NavbarToggle;","import useEffect from './useIsomorphicEffect';\nimport { useState } from 'react';\nconst matchersByWindow = new WeakMap();\nconst getMatcher = (query, targetWindow) => {\n  if (!query || !targetWindow) return undefined;\n  const matchers = matchersByWindow.get(targetWindow) || new Map();\n  matchersByWindow.set(targetWindow, matchers);\n  let mql = matchers.get(query);\n  if (!mql) {\n    mql = targetWindow.matchMedia(query);\n    mql.refCount = 0;\n    matchers.set(mql.media, mql);\n  }\n  return mql;\n};\n/**\n * Match a media query and get updates as the match changes. The media string is\n * passed directly to `window.matchMedia` and run as a Layout Effect, so initial\n * matches are returned before the browser has a chance to paint.\n *\n * ```tsx\n * function Page() {\n *   const isWide = useMediaQuery('min-width: 1000px')\n *\n *   return isWide ? \"very wide\" : 'not so wide'\n * }\n * ```\n *\n * Media query lists are also reused globally, hook calls for the same query\n * will only create a matcher once under the hood.\n *\n * @param query A media query\n * @param targetWindow The window to match against, uses the globally available one as a default.\n */\nexport default function useMediaQuery(query, targetWindow = typeof window === 'undefined' ? undefined : window) {\n  const mql = getMatcher(query, targetWindow);\n  const [matches, setMatches] = useState(() => mql ? mql.matches : false);\n  useEffect(() => {\n    let mql = getMatcher(query, targetWindow);\n    if (!mql) {\n      return setMatches(false);\n    }\n    let matchers = matchersByWindow.get(targetWindow);\n    const handleChange = () => {\n      setMatches(mql.matches);\n    };\n    mql.refCount++;\n    mql.addListener(handleChange);\n    handleChange();\n    return () => {\n      mql.removeListener(handleChange);\n      mql.refCount--;\n      if (mql.refCount <= 0) {\n        matchers == null ? void 0 : matchers.delete(mql.media);\n      }\n      mql = undefined;\n    };\n  }, [query]);\n  return matches;\n}","import useMediaQuery from './useMediaQuery';\nimport { useMemo } from 'react';\n/**\n * Create a responsive hook we a set of breakpoint names and widths.\n * You can use any valid css units as well as a numbers (for pixels).\n *\n * **NOTE:** The object key order is important! it's assumed to be in order from smallest to largest\n *\n * ```ts\n * const useBreakpoint = createBreakpointHook({\n *  xs: 0,\n *  sm: 576,\n *  md: 768,\n *  lg: 992,\n *  xl: 1200,\n * })\n * ```\n *\n * **Watch out!** using string values will sometimes construct media queries using css `calc()` which\n * is NOT supported in media queries by all browsers at the moment. use numbers for\n * the widest range of browser support.\n *\n * @param breakpointValues A object hash of names to breakpoint dimensions\n */\nexport function createBreakpointHook(breakpointValues) {\n  const names = Object.keys(breakpointValues);\n  function and(query, next) {\n    if (query === next) {\n      return next;\n    }\n    return query ? `${query} and ${next}` : next;\n  }\n  function getNext(breakpoint) {\n    return names[Math.min(names.indexOf(breakpoint) + 1, names.length - 1)];\n  }\n  function getMaxQuery(breakpoint) {\n    const next = getNext(breakpoint);\n    let value = breakpointValues[next];\n    if (typeof value === 'number') value = `${value - 0.2}px`;else value = `calc(${value} - 0.2px)`;\n    return `(max-width: ${value})`;\n  }\n  function getMinQuery(breakpoint) {\n    let value = breakpointValues[breakpoint];\n    if (typeof value === 'number') {\n      value = `${value}px`;\n    }\n    return `(min-width: ${value})`;\n  }\n\n  /**\n   * Match a set of breakpoints\n   *\n   * ```tsx\n   * const MidSizeOnly = () => {\n   *   const isMid = useBreakpoint({ lg: 'down', sm: 'up' });\n   *\n   *   if (isMid) return <div>On a Reasonable sized Screen!</div>\n   *   return null;\n   * }\n   * ```\n   * @param breakpointMap An object map of breakpoints and directions, queries are constructed using \"and\" to join\n   * breakpoints together\n   * @param window Optionally specify the target window to match against (useful when rendering into iframes)\n   */\n\n  /**\n   * Match a single breakpoint exactly, up, or down.\n   *\n   * ```tsx\n   * const PhoneOnly = () => {\n   *   const isSmall = useBreakpoint('sm', 'down');\n   *\n   *   if (isSmall) return <div>On a Small Screen!</div>\n   *   return null;\n   * }\n   * ```\n   *\n   * @param breakpoint The breakpoint key\n   * @param direction A direction 'up' for a max, 'down' for min, true to match only the breakpoint\n   * @param window Optionally specify the target window to match against (useful when rendering into iframes)\n   */\n\n  function useBreakpoint(breakpointOrMap, direction, window) {\n    let breakpointMap;\n    if (typeof breakpointOrMap === 'object') {\n      breakpointMap = breakpointOrMap;\n      window = direction;\n      direction = true;\n    } else {\n      direction = direction || true;\n      breakpointMap = {\n        [breakpointOrMap]: direction\n      };\n    }\n    let query = useMemo(() => Object.entries(breakpointMap).reduce((query, [key, direction]) => {\n      if (direction === 'up' || direction === true) {\n        query = and(query, getMinQuery(key));\n      }\n      if (direction === 'down' || direction === true) {\n        query = and(query, getMaxQuery(key));\n      }\n      return query;\n    }, ''), [JSON.stringify(breakpointMap)]);\n    return useMediaQuery(query, window);\n  }\n  return useBreakpoint;\n}\nconst useBreakpoint = createBreakpointHook({\n  xs: 0,\n  sm: 576,\n  md: 768,\n  lg: 992,\n  xl: 1200,\n  xxl: 1400\n});\nexport default useBreakpoint;","\"use client\";\n\nimport * as React from 'react';\nimport classNames from 'classnames';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst OffcanvasBody = /*#__PURE__*/React.forwardRef(({\n  className,\n  bsPrefix,\n  as: Component = 'div',\n  ...props\n}, ref) => {\n  bsPrefix = useBootstrapPrefix(bsPrefix, 'offcanvas-body');\n  return /*#__PURE__*/_jsx(Component, {\n    ref: ref,\n    className: classNames(className, bsPrefix),\n    ...props\n  });\n});\nOffcanvasBody.displayName = 'OffcanvasBody';\nexport default OffcanvasBody;","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { ENTERED, ENTERING, EXITING } from 'react-transition-group/Transition';\nimport { getChildRef } from '@restart/ui/utils';\nimport transitionEndListener from './transitionEndListener';\nimport TransitionWrapper from './TransitionWrapper';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst transitionStyles = {\n  [ENTERING]: 'show',\n  [ENTERED]: 'show'\n};\nconst OffcanvasToggling = /*#__PURE__*/React.forwardRef(({\n  bsPrefix,\n  className,\n  children,\n  in: inProp = false,\n  mountOnEnter = false,\n  unmountOnExit = false,\n  appear = false,\n  ...props\n}, ref) => {\n  bsPrefix = useBootstrapPrefix(bsPrefix, 'offcanvas');\n  return /*#__PURE__*/_jsx(TransitionWrapper, {\n    ref: ref,\n    addEndListener: transitionEndListener,\n    in: inProp,\n    mountOnEnter: mountOnEnter,\n    unmountOnExit: unmountOnExit,\n    appear: appear,\n    ...props,\n    childRef: getChildRef(children),\n    children: (status, innerProps) => /*#__PURE__*/React.cloneElement(children, {\n      ...innerProps,\n      className: classNames(className, children.props.className, (status === ENTERING || status === EXITING) && `${bsPrefix}-toggling`, transitionStyles[status])\n    })\n  });\n});\nOffcanvasToggling.displayName = 'OffcanvasToggling';\nexport default OffcanvasToggling;","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport AbstractModalHeader from './AbstractModalHeader';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst OffcanvasHeader = /*#__PURE__*/React.forwardRef(({\n  bsPrefix,\n  className,\n  closeLabel = 'Close',\n  closeButton = false,\n  ...props\n}, ref) => {\n  bsPrefix = useBootstrapPrefix(bsPrefix, 'offcanvas-header');\n  return /*#__PURE__*/_jsx(AbstractModalHeader, {\n    ref: ref,\n    ...props,\n    className: classNames(className, bsPrefix),\n    closeLabel: closeLabel,\n    closeButton: closeButton\n  });\n});\nOffcanvasHeader.displayName = 'OffcanvasHeader';\nexport default OffcanvasHeader;","\"use client\";\n\nimport * as React from 'react';\nimport classNames from 'classnames';\nimport divWithClassName from './divWithClassName';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst DivStyledAsH5 = divWithClassName('h5');\nconst OffcanvasTitle = /*#__PURE__*/React.forwardRef(({\n  className,\n  bsPrefix,\n  as: Component = DivStyledAsH5,\n  ...props\n}, ref) => {\n  bsPrefix = useBootstrapPrefix(bsPrefix, 'offcanvas-title');\n  return /*#__PURE__*/_jsx(Component, {\n    ref: ref,\n    className: classNames(className, bsPrefix),\n    ...props\n  });\n});\nOffcanvasTitle.displayName = 'OffcanvasTitle';\nexport default OffcanvasTitle;","\"use client\";\n\nimport classNames from 'classnames';\nimport useBreakpoint from '@restart/hooks/useBreakpoint';\nimport useEventCallback from '@restart/hooks/useEventCallback';\nimport * as React from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport BaseModal from '@restart/ui/Modal';\nimport Fade from './Fade';\nimport OffcanvasBody from './OffcanvasBody';\nimport OffcanvasToggling from './OffcanvasToggling';\nimport ModalContext from './ModalContext';\nimport OffcanvasHeader from './OffcanvasHeader';\nimport OffcanvasTitle from './OffcanvasTitle';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport BootstrapModalManager, { getSharedManager } from './BootstrapModalManager';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nimport { Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { jsxs as _jsxs } from \"react/jsx-runtime\";\nfunction DialogTransition(props) {\n  return /*#__PURE__*/_jsx(OffcanvasToggling, {\n    ...props\n  });\n}\nfunction BackdropTransition(props) {\n  return /*#__PURE__*/_jsx(Fade, {\n    ...props\n  });\n}\nconst Offcanvas = /*#__PURE__*/React.forwardRef(({\n  bsPrefix,\n  className,\n  children,\n  'aria-labelledby': ariaLabelledby,\n  placement = 'start',\n  responsive,\n  /* BaseModal props */\n\n  show = false,\n  backdrop = true,\n  keyboard = true,\n  scroll = false,\n  onEscapeKeyDown,\n  onShow,\n  onHide,\n  container,\n  autoFocus = true,\n  enforceFocus = true,\n  restoreFocus = true,\n  restoreFocusOptions,\n  onEntered,\n  onExit,\n  onExiting,\n  onEnter,\n  onEntering,\n  onExited,\n  backdropClassName,\n  manager: propsManager,\n  renderStaticNode = false,\n  ...props\n}, ref) => {\n  const modalManager = useRef();\n  bsPrefix = useBootstrapPrefix(bsPrefix, 'offcanvas');\n  const [showOffcanvas, setShowOffcanvas] = useState(false);\n  const handleHide = useEventCallback(onHide);\n  const hideResponsiveOffcanvas = useBreakpoint(responsive || 'xs', 'up');\n  useEffect(() => {\n    // Handles the case where screen is resized while the responsive\n    // offcanvas is shown. If `responsive` not provided, just use `show`.\n    setShowOffcanvas(responsive ? show && !hideResponsiveOffcanvas : show);\n  }, [show, responsive, hideResponsiveOffcanvas]);\n  const modalContext = useMemo(() => ({\n    onHide: handleHide\n  }), [handleHide]);\n  function getModalManager() {\n    if (propsManager) return propsManager;\n    if (scroll) {\n      // Have to use a different modal manager since the shared\n      // one handles overflow.\n      if (!modalManager.current) modalManager.current = new BootstrapModalManager({\n        handleContainerOverflow: false\n      });\n      return modalManager.current;\n    }\n    return getSharedManager();\n  }\n  const handleEnter = (node, ...args) => {\n    if (node) node.style.visibility = 'visible';\n    onEnter == null || onEnter(node, ...args);\n  };\n  const handleExited = (node, ...args) => {\n    if (node) node.style.visibility = '';\n    onExited == null || onExited(...args);\n  };\n  const renderBackdrop = useCallback(backdropProps => /*#__PURE__*/_jsx(\"div\", {\n    ...backdropProps,\n    className: classNames(`${bsPrefix}-backdrop`, backdropClassName)\n  }), [backdropClassName, bsPrefix]);\n  const renderDialog = dialogProps => /*#__PURE__*/_jsx(\"div\", {\n    ...dialogProps,\n    ...props,\n    className: classNames(className, responsive ? `${bsPrefix}-${responsive}` : bsPrefix, `${bsPrefix}-${placement}`),\n    \"aria-labelledby\": ariaLabelledby,\n    children: children\n  });\n  return /*#__PURE__*/_jsxs(_Fragment, {\n    children: [!showOffcanvas && (responsive || renderStaticNode) && renderDialog({}), /*#__PURE__*/_jsx(ModalContext.Provider, {\n      value: modalContext,\n      children: /*#__PURE__*/_jsx(BaseModal, {\n        show: showOffcanvas,\n        ref: ref,\n        backdrop: backdrop,\n        container: container,\n        keyboard: keyboard,\n        autoFocus: autoFocus,\n        enforceFocus: enforceFocus && !scroll,\n        restoreFocus: restoreFocus,\n        restoreFocusOptions: restoreFocusOptions,\n        onEscapeKeyDown: onEscapeKeyDown,\n        onShow: onShow,\n        onHide: handleHide,\n        onEnter: handleEnter,\n        onEntering: onEntering,\n        onEntered: onEntered,\n        onExit: onExit,\n        onExiting: onExiting,\n        onExited: handleExited,\n        manager: getModalManager(),\n        transition: DialogTransition,\n        backdropTransition: BackdropTransition,\n        renderBackdrop: renderBackdrop,\n        renderDialog: renderDialog\n      })\n    })]\n  });\n});\nOffcanvas.displayName = 'Offcanvas';\nexport default Object.assign(Offcanvas, {\n  Body: OffcanvasBody,\n  Header: OffcanvasHeader,\n  Title: OffcanvasTitle\n});","\"use client\";\n\nimport * as React from 'react';\nimport { useContext } from 'react';\nimport useEventCallback from '@restart/hooks/useEventCallback';\nimport Offcanvas from './Offcanvas';\nimport NavbarContext from './NavbarContext';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst NavbarOffcanvas = /*#__PURE__*/React.forwardRef(({\n  onHide,\n  ...props\n}, ref) => {\n  const context = useContext(NavbarContext);\n  const handleHide = useEventCallback(() => {\n    context == null || context.onToggle == null || context.onToggle();\n    onHide == null || onHide();\n  });\n  return /*#__PURE__*/_jsx(Offcanvas, {\n    ref: ref,\n    show: !!(context != null && context.expanded),\n    ...props,\n    renderStaticNode: true,\n    onHide: handleHide\n  });\n});\nNavbarOffcanvas.displayName = 'NavbarOffcanvas';\nexport default NavbarOffcanvas;","\"use client\";\n\nimport * as React from 'react';\nimport classNames from 'classnames';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst NavbarText = /*#__PURE__*/React.forwardRef(({\n  className,\n  bsPrefix,\n  as: Component = 'span',\n  ...props\n}, ref) => {\n  bsPrefix = useBootstrapPrefix(bsPrefix, 'navbar-text');\n  return /*#__PURE__*/_jsx(Component, {\n    ref: ref,\n    className: classNames(className, bsPrefix),\n    ...props\n  });\n});\nNavbarText.displayName = 'NavbarText';\nexport default NavbarText;","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useCallback, useMemo } from 'react';\nimport SelectableContext from '@restart/ui/SelectableContext';\nimport { useUncontrolled } from 'uncontrollable';\nimport NavbarBrand from './NavbarBrand';\nimport NavbarCollapse from './NavbarCollapse';\nimport NavbarToggle from './NavbarToggle';\nimport NavbarOffcanvas from './NavbarOffcanvas';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport NavbarContext from './NavbarContext';\nimport NavbarText from './NavbarText';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst Navbar = /*#__PURE__*/React.forwardRef((props, ref) => {\n  const {\n    bsPrefix: initialBsPrefix,\n    expand = true,\n    variant = 'light',\n    bg,\n    fixed,\n    sticky,\n    className,\n    // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n    as: Component = 'nav',\n    expanded,\n    onToggle,\n    onSelect,\n    collapseOnSelect = false,\n    ...controlledProps\n  } = useUncontrolled(props, {\n    expanded: 'onToggle'\n  });\n  const bsPrefix = useBootstrapPrefix(initialBsPrefix, 'navbar');\n  const handleCollapse = useCallback((...args) => {\n    onSelect == null || onSelect(...args);\n    if (collapseOnSelect && expanded) {\n      onToggle == null || onToggle(false);\n    }\n  }, [onSelect, collapseOnSelect, expanded, onToggle]);\n\n  // will result in some false positives but that seems better\n  // than false negatives. strict `undefined` check allows explicit\n  // \"nulling\" of the role if the user really doesn't want one\n  if (controlledProps.role === undefined && Component !== 'nav') {\n    controlledProps.role = 'navigation';\n  }\n  let expandClass = `${bsPrefix}-expand`;\n  if (typeof expand === 'string') expandClass = `${expandClass}-${expand}`;\n  const navbarContext = useMemo(() => ({\n    onToggle: () => onToggle == null ? void 0 : onToggle(!expanded),\n    bsPrefix,\n    expanded: !!expanded,\n    expand\n  }), [bsPrefix, expanded, expand, onToggle]);\n  return /*#__PURE__*/_jsx(NavbarContext.Provider, {\n    value: navbarContext,\n    children: /*#__PURE__*/_jsx(SelectableContext.Provider, {\n      value: handleCollapse,\n      children: /*#__PURE__*/_jsx(Component, {\n        ref: ref,\n        ...controlledProps,\n        className: classNames(className, bsPrefix, expand && expandClass, variant && `${bsPrefix}-${variant}`, bg && `bg-${bg}`, sticky && `sticky-${sticky}`, fixed && `fixed-${fixed}`)\n      })\n    })\n  });\n});\nNavbar.displayName = 'Navbar';\nexport default Object.assign(Navbar, {\n  Brand: NavbarBrand,\n  Collapse: NavbarCollapse,\n  Offcanvas: NavbarOffcanvas,\n  Text: NavbarText,\n  Toggle: NavbarToggle\n});","export type PersonalContentSection = 'favorites' | 'likes' | 'history';\n\nexport function getPersonalContentHref(\n    section: PersonalContentSection,\n    username: string,\n    hostname: string\n): string {\n    if (hostname.toLowerCase() === 'yuanhui.buddhachat.online') {\n        return `/library?section=${section}&content=videos`;\n    }\n\n    if (section === 'favorites') return '/starred';\n    if (section === 'likes') return `/user/${username}?tab=likes`;\n    return '/history';\n}\n","import { useState, useEffect } from 'react';\nimport { Button, Spinner, Dropdown, Modal } from 'react-bootstrap';\nimport {\n    useCanUploadVideos,\n    useAuth,\n    api,\n    usePermissions,\n    useEmbedded,\n    appPath,\n} from '../../libs';\nimport { UserAvatar } from '../../components';\nimport { useTranslation } from '../../libs/i18n';\nimport { appendCurrentChannel } from '../../libs/url';\nimport { getPersonalContentHref } from './userinfoRoutes';\n\ninterface UserInfoProps {\n    isMobile?: boolean;\n}\n\nexport function UserInfo({ isMobile = false }: UserInfoProps) {\n    const { t } = useTranslation();\n    const { user, isLoading: loading } = useAuth();\n    const canUploadVideos = useCanUploadVideos();\n    const { canAccessWallet } = usePermissions();\n    const embedded = useEmbedded();\n    const [unreadCount, setUnreadCount] = useState(0);\n    const [showPermissionModal, setShowPermissionModal] = useState(false);\n    const [isImpersonating, setIsImpersonating] = useState(false);\n    const personalHostname =\n        typeof window === 'undefined' ? '' : window.location.hostname;\n\n    // 获取未读通知数量和 impersonate 状态\n    useEffect(() => {\n        const fetchUnreadCount = async () => {\n            if (!user) return;\n\n            try {\n                const response = await api.get(\n                    '/api/notifications/unread-count'\n                );\n                setUnreadCount(response.data.count || 0);\n            } catch (error) {\n                console.error(\n                    'Failed to fetch unread notifications count:',\n                    error\n                );\n            }\n        };\n\n        const fetchImpersonateStatus = async () => {\n            if (!user) {\n                setIsImpersonating(false);\n                return;\n            }\n\n            try {\n                const response = await api.get<{\n                    success: boolean;\n                    user?: unknown;\n                    isImpersonating?: boolean;\n                    impersonate?: {\n                        originalUserId: number;\n                        targetUserId: number;\n                        startedAt: number;\n                    };\n                }>('/api/auth/user');\n                setIsImpersonating(response.data?.isImpersonating || false);\n            } catch (error) {\n                console.error('Failed to fetch impersonate status:', error);\n                setIsImpersonating(false);\n            }\n        };\n\n        fetchUnreadCount();\n        fetchImpersonateStatus();\n\n        const interval = setInterval(fetchUnreadCount, 3000);\n\n        return () => clearInterval(interval);\n    }, [user]);\n\n    const handleLogout = async () => {\n        try {\n            await api.post('/api/auth/logout');\n            window.location.reload();\n        } catch (error) {\n            console.error('Logout failed:', error);\n        }\n    };\n\n    const handleStopImpersonate = async () => {\n        try {\n            await api.post('/api/auth/stop-impersonate');\n            window.location.reload();\n        } catch (error) {\n            console.error('Stop impersonate failed:', error);\n        }\n    };\n\n    const handleCreateClick = (e: React.MouseEvent) => {\n        e.preventDefault();\n        if (canUploadVideos) {\n            window.location.href = appPath('/upload');\n        } else {\n            setShowPermissionModal(true);\n        }\n    };\n\n    if (loading) {\n        return (\n            <div\n                className={\n                    isMobile ? 'd-flex justify-content-center p-3' : 'd-flex'\n                }\n            >\n                <Spinner animation=\"border\" size=\"sm\" className=\"me-2\" />\n            </div>\n        );\n    }\n\n    if (!user) {\n        const loginUrl = appPath(\n            `/auth/login?returnUrl=${encodeURIComponent(\n                appendCurrentChannel(\n                    window.location.pathname + window.location.search\n                )\n            )}`\n        );\n\n        if (isMobile) {\n            return (\n                <div className=\"p-3\">\n                    <div className=\"d-grid\">\n                        <Button variant=\"dark\" href={loginUrl}>\n                            {t('ui.button.login')}\n                        </Button>\n                    </div>\n                </div>\n            );\n        }\n        return <Button href={loginUrl}>{t('ui.button.login')}</Button>;\n    }\n\n    if (isMobile) {\n        return (\n            <div className=\"p-3\">\n                {/* 用户信息区域 */}\n                <div className=\"d-flex align-items-center mb-3 pb-3 border-bottom\">\n                    <UserAvatar\n                        username={user.username}\n                        displayName={user.displayName}\n                        avatarUrls={user.avatarUrls}\n                        size={48}\n                        className=\"me-3\"\n                    />\n                    <div>\n                        <div className=\"fw-semibold\">\n                            {user.displayName || user.username}\n                        </div>\n                        <div className=\"text-muted small\">\n                            {t('ui.user.viewProfile')}\n                        </div>\n                    </div>\n                </div>\n\n                {/* 菜单项 */}\n                <div className=\"d-grid gap-1\">\n                    {!embedded && (\n                        <Button\n                            variant=\"light\"\n                            className=\"d-flex align-items-center justify-content-start\"\n                            onClick={handleCreateClick}\n                        >\n                            <i className=\"bi bi-plus-lg me-3\"></i>\n                            {t('ui.button.createVideo')}\n                        </Button>\n                    )}\n                    <Button\n                        variant=\"light\"\n                        className=\"d-flex align-items-center justify-content-between\"\n                        href={appPath('/notifications')}\n                    >\n                        <span>\n                            <i className=\"bi bi-bell me-3\"></i>\n                            {t('ui.nav.notifications')}\n                        </span>\n                        {unreadCount > 0 && (\n                            <span className=\"p-1 bg-danger rounded-circle\"></span>\n                        )}\n                    </Button>\n                    <Button\n                        variant=\"light\"\n                        className=\"d-flex align-items-center justify-content-start\"\n                        href={appPath(`/user/${user.username}`)}\n                    >\n                        <i className=\"bi bi-person me-3\"></i>\n                        {t('ui.user.profile')}\n                    </Button>\n                    <Button\n                        variant=\"light\"\n                        className=\"d-flex align-items-center justify-content-start\"\n                        href={appPath(\n                            getPersonalContentHref(\n                                'favorites',\n                                user.username,\n                                personalHostname\n                            )\n                        )}\n                    >\n                        <i className=\"bi bi-bookmark me-3\"></i>\n                        {t('ui.nav.myLibrary')}\n                    </Button>\n                    <Button\n                        variant=\"light\"\n                        className=\"d-flex align-items-center justify-content-start\"\n                        href={appPath(\n                            getPersonalContentHref(\n                                'likes',\n                                user.username,\n                                personalHostname\n                            )\n                        )}\n                    >\n                        <i className=\"bi bi-hand-thumbs-up me-3\"></i>\n                        {t('ui.nav.likedVideos')}\n                    </Button>\n                    <Button\n                        variant=\"light\"\n                        className=\"d-flex align-items-center justify-content-start\"\n                        href={appPath(\n                            getPersonalContentHref(\n                                'history',\n                                user.username,\n                                personalHostname\n                            )\n                        )}\n                    >\n                        <i className=\"bi bi-clock me-3\"></i>\n                        {t('ui.nav.history')}\n                    </Button>\n                    <Button\n                        variant=\"light\"\n                        className=\"d-flex align-items-center justify-content-start\"\n                        href={appPath('/settings')}\n                    >\n                        <i className=\"bi bi-gear me-3\"></i>\n                        {t('ui.user.settings')}\n                    </Button>\n                    {canAccessWallet && !embedded && (\n                        <Button\n                            variant=\"light\"\n                            className=\"d-flex align-items-center justify-content-start\"\n                            href={appPath('/wallet')}\n                        >\n                            <i className=\"bi bi-wallet me-3\"></i>\n                            {t('ui.nav.wallet')}\n                        </Button>\n                    )}\n                    {isImpersonating && (\n                        <>\n                            <hr className=\"my-2\" />\n                            <Button\n                                variant=\"light\"\n                                className=\"d-flex align-items-center justify-content-start text-warning\"\n                                onClick={handleStopImpersonate}\n                            >\n                                <i className=\"bi bi-person-x me-3\"></i>\n                                {t('ui.button.stopImpersonate')}\n                            </Button>\n                        </>\n                    )}\n                    <hr className=\"my-2\" />\n                    <Button\n                        variant=\"light\"\n                        className=\"d-flex align-items-center justify-content-start text-danger\"\n                        onClick={handleLogout}\n                    >\n                        <i className=\"bi bi-box-arrow-right me-3\"></i>\n                        {t('ui.button.logout')}\n                    </Button>\n                </div>\n\n                {/* 权限提示模态框 */}\n                <Modal\n                    show={showPermissionModal}\n                    onHide={() => setShowPermissionModal(false)}\n                    centered\n                >\n                    <Modal.Header closeButton>\n                        <Modal.Title as=\"h5\">\n                            {t('ui.button.createVideo')}\n                        </Modal.Title>\n                    </Modal.Header>\n                    <Modal.Body>\n                        <p>{t('ui.button.noCreatePermission')}</p>\n                    </Modal.Body>\n                    <Modal.Footer>\n                        <Button\n                            variant=\"primary\"\n                            onClick={() => setShowPermissionModal(false)}\n                        >\n                            {t('ui.common.close')}\n                        </Button>\n                    </Modal.Footer>\n                </Modal>\n            </div>\n        );\n    }\n\n    return (\n        <>\n            <div className=\"d-flex align-items-center gap-1\">\n                {/* Create 按钮 - 始终显示 */}\n                {!embedded && (\n                    <Button\n                        variant=\"link\"\n                        className=\"link-secondary text-decoration-none d-flex align-items-center\"\n                        onClick={handleCreateClick}\n                    >\n                        <i className=\"bi bi-plus-lg me-1\"></i>\n                        {t('ui.button.createVideo')}\n                    </Button>\n                )}\n\n                {/* 通知铃铛 */}\n                <Button\n                    variant=\"link\"\n                    className=\"position-relative py-0\"\n                    title={t('ui.nav.notifications')}\n                    style={{ color: '#666' }}\n                    href={appPath('/notifications')}\n                >\n                    <i\n                        className=\"bi bi-bell-fill\"\n                        style={{ fontSize: '1.5rem' }}\n                    ></i>\n                    {unreadCount > 0 && (\n                        <span className=\"position-absolute top-0 mt-2 ms-n1 translate-middle p-2 bg-danger border border-light rounded-circle\">\n                            <span className=\"visually-hidden\">\n                                {t('ui.notifications.newNotification')}\n                            </span>\n                        </span>\n                    )}\n                </Button>\n\n                {/* 用户头像下拉菜单 */}\n                <Dropdown align=\"end\">\n                    <Dropdown.Toggle\n                        variant=\"link\"\n                        className=\"p-0 border-0 bg-transparent dropdown-toggle-no-arrow\"\n                        title={user.displayName || user.username}\n                    >\n                        <UserAvatar\n                            username={user.username}\n                            displayName={user.displayName}\n                            avatarUrls={user.avatarUrls}\n                            size={38}\n                        />\n                    </Dropdown.Toggle>\n                    <Dropdown.Menu>\n                        <Dropdown.Item href={appPath(`/user/${user.username}`)}>\n                            {t('ui.user.profile')}\n                        </Dropdown.Item>\n                        <Dropdown.Item\n                            href={appPath(\n                                getPersonalContentHref(\n                                    'favorites',\n                                    user.username,\n                                    personalHostname\n                                )\n                            )}\n                        >\n                            {t('ui.nav.myLibrary')}\n                        </Dropdown.Item>\n                        <Dropdown.Item\n                            href={appPath(\n                                getPersonalContentHref(\n                                    'likes',\n                                    user.username,\n                                    personalHostname\n                                )\n                            )}\n                        >\n                            {t('ui.nav.likedVideos')}\n                        </Dropdown.Item>\n                        <Dropdown.Item\n                            href={appPath(\n                                getPersonalContentHref(\n                                    'history',\n                                    user.username,\n                                    personalHostname\n                                )\n                            )}\n                        >\n                            {t('ui.nav.history')}\n                        </Dropdown.Item>\n                        <Dropdown.Item href={appPath('/settings')}>\n                            {t('ui.user.settings')}\n                        </Dropdown.Item>\n                        {canAccessWallet && !embedded && (\n                            <Dropdown.Item href={appPath('/wallet')}>\n                                {t('ui.nav.wallet')}\n                            </Dropdown.Item>\n                        )}\n\n                        <Dropdown.Divider />\n                        {isImpersonating && (\n                            <>\n                                <Dropdown.Item onClick={handleStopImpersonate}>\n                                    {t('ui.button.stopImpersonate')}\n                                </Dropdown.Item>\n                            </>\n                        )}\n                        <Dropdown.Item onClick={handleLogout}>\n                            {t('ui.button.logout')}\n                        </Dropdown.Item>\n                    </Dropdown.Menu>\n                </Dropdown>\n            </div>\n\n            {/* 权限提示模态框 */}\n            <Modal\n                show={showPermissionModal}\n                onHide={() => setShowPermissionModal(false)}\n                centered\n            >\n                <Modal.Header closeButton>\n                    <Modal.Title as=\"h5\">\n                        {t('ui.button.createVideo')}\n                    </Modal.Title>\n                </Modal.Header>\n                <Modal.Body>\n                    <p>{t('ui.button.noCreatePermission')}</p>\n                </Modal.Body>\n                <Modal.Footer>\n                    <Button\n                        variant=\"primary\"\n                        onClick={() => setShowPermissionModal(false)}\n                    >\n                        {t('ui.common.close')}\n                    </Button>\n                </Modal.Footer>\n            </Modal>\n        </>\n    );\n}\n","// Site-wide Simplified -> Traditional Chinese conversion with a persisted\n// user preference. Source content is Simplified; \"hans\" mode simply restores\n// the original text nodes/attributes, so no lossy round-trip conversion is\n// ever needed.\n\nexport type ChineseVariant = 'hant' | 'hans'\n\ntype ContentLocale = { version?: unknown; targetLocale?: unknown }\n\ndeclare global {\n    interface Window {\n        // Set by the BuddhaChat App before page scripts run (contentLocaleBridge.ts).\n        __BUDDHACHAT_CONTENT_LOCALE__?: ContentLocale\n    }\n}\n\nconst STORAGE_KEY = 'buddhachat:chinese-variant'\n// Written only when the viewer taps 简/繁; STORAGE_KEY is also written for the default.\nconst CHOICE_KEY = 'buddhachat:chinese-variant-choice'\n// Outside the App the site keeps its long-standing 繁 default.\nconst DEFAULT_VARIANT: ChineseVariant = 'hant'\nexport const CONTENT_LOCALE_EVENT = 'buddhachat:content-locale'\n// Set by the pre-paint guard in base.pug so a 繁 page never shows its 简 source first.\nconst PENDING_CLASS = 'zh-variant-pending'\nconst CJK_RE = /[\\u4e00-\\u9fff]/\nconst SKIP_TAGS = new Set(['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'IFRAME'])\nconst TEXT_ATTRIBUTES = ['placeholder', 'title', 'alt', 'aria-label']\nconst ATTRIBUTE_SELECTOR = TEXT_ATTRIBUTES.map((attr) => `[${attr}]`).join(',')\nconst NO_CONVERT_SELECTOR = '[data-no-convert]'\n\ntype ConverterFn = (input: string) => string\n\nlet convertToTraditional: ConverterFn | null = null\nlet converterPromise: Promise<ConverterFn> | null = null\nlet observer: MutationObserver | null = null\nlet activeVariant: ChineseVariant | null = null\nlet variantRequest = 0\nlet sessionChoice: ChineseVariant | null = null\n\nconst originalTextByNode = new WeakMap<Text, string>()\nconst originalAttrsByElement = new WeakMap<Element, Record<string, string>>()\nconst pendingWrites = new Map<Text, string>()\n\nfunction isValidVariant(variant: string | null): variant is ChineseVariant {\n    return variant === 'hant' || variant === 'hans'\n}\n\nfunction readStored(key: string): ChineseVariant | null {\n    try {\n        const stored = window.localStorage.getItem(key)\n        return isValidVariant(stored) ? stored : null\n    } catch {\n        // localStorage may be unavailable (private mode); fall through.\n        return null\n    }\n}\n\n// Inside the BuddhaChat App the page follows the App's content language;\n// only Traditional Chinese readers start in 繁体.\nfunction appVariant(): ChineseVariant | null {\n    const locale = typeof window !== 'undefined' ? window.__BUDDHACHAT_CONTENT_LOCALE__ : null\n    const target = locale && locale.version === 1 ? locale.targetLocale : null\n    if (typeof target !== 'string' || !target) return null\n    return target === 'zh-Hant' ? 'hant' : 'hans'\n}\n\n// The default was always 繁, so a stored legacy 简 can only have come from a tap.\nfunction legacyChoice(): ChineseVariant | null {\n    return readStored(STORAGE_KEY) === 'hans' ? 'hans' : null\n}\n\n// Keep this order in sync with the pre-paint guard in packages/web/src/views/layouts/base.pug.\nexport function getChineseVariant(): ChineseVariant {\n    return (\n        sessionChoice ??\n        readStored(CHOICE_KEY) ??\n        legacyChoice() ??\n        appVariant() ??\n        readStored(STORAGE_KEY) ??\n        DEFAULT_VARIANT\n    )\n}\n\n// The viewer's own 简/繁 tap; it outranks the App language from then on.\nexport function rememberChineseVariantChoice(variant: ChineseVariant) {\n    if (!isValidVariant(variant)) return\n    try {\n        window.localStorage.setItem(CHOICE_KEY, variant)\n    } catch {\n        // Without storage, keep the tap in memory so a later App language event cannot undo it.\n        sessionChoice = variant\n    }\n}\n\n// Adopts a late App language announcement; returns the variant the page should now show.\nexport function followContentLocale(detail: unknown): ChineseVariant {\n    const locale = detail as ContentLocale | null\n    if (locale && typeof locale === 'object' && locale.version === 1) {\n        window.__BUDDHACHAT_CONTENT_LOCALE__ = locale\n    }\n    return getChineseVariant()\n}\n\ntype ConverterModule = { Converter(options: { from: string; to: string }): unknown }\nconst importOpenccConverter = () => import('opencc-js/cn2t') as Promise<ConverterModule>\nlet importConverter: () => Promise<ConverterModule> = importOpenccConverter\n\n// Tests only: swap the converter import (e.g. to simulate a failed chunk download).\nexport function setChineseConverterLoaderForTests(loader?: () => Promise<ConverterModule>) {\n    importConverter = loader ?? importOpenccConverter\n    convertToTraditional = null\n    converterPromise = null\n}\n\nfunction loadConverter(): Promise<ConverterFn> {\n    if (convertToTraditional) return Promise.resolve(convertToTraditional)\n    if (!converterPromise) {\n        converterPromise = importConverter()\n            .then((mod) => {\n                convertToTraditional = mod.Converter({\n                    from: 'cn',\n                    to: 't',\n                }) as ConverterFn\n                return convertToTraditional\n            })\n            .catch((error) => {\n                converterPromise = null\n                throw error\n            })\n    }\n    return converterPromise\n}\n\nfunction isSkipped(node: Node): boolean {\n    const parent = node.parentElement\n    if (!parent || SKIP_TAGS.has(parent.tagName)) return true\n    return Boolean(parent.closest(NO_CONVERT_SELECTOR))\n}\n\nfunction collectTextNodes(root: Node): Text[] {\n    const nodes: Text[] = []\n    const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {\n        acceptNode(node) {\n            if (!node.nodeValue || !CJK_RE.test(node.nodeValue)) {\n                return NodeFilter.FILTER_REJECT\n            }\n            if (isSkipped(node)) return NodeFilter.FILTER_REJECT\n            return NodeFilter.FILTER_ACCEPT\n        },\n    })\n    while (walker.nextNode()) nodes.push(walker.currentNode as Text)\n    return nodes\n}\n\nfunction writeNodeValue(node: Text, value: string) {\n    if (node.nodeValue === value) return\n    pendingWrites.set(node, value)\n    node.nodeValue = value\n}\n\nfunction applyToTextNode(node: Text, variant: ChineseVariant, refreshOriginal = false) {\n    if (refreshOriginal || !originalTextByNode.has(node)) {\n        originalTextByNode.set(node, node.nodeValue ?? '')\n    }\n    const original = originalTextByNode.get(node) ?? ''\n    const next =\n        variant === 'hant' && convertToTraditional ? convertToTraditional(original) : original\n    writeNodeValue(node, next)\n}\n\nfunction applyToAttributes(element: Element, variant: ChineseVariant) {\n    for (const attr of TEXT_ATTRIBUTES) {\n        const value = element.getAttribute(attr)\n        if (!value || !CJK_RE.test(value)) continue\n        let record = originalAttrsByElement.get(element)\n        if (!record) {\n            record = {}\n            originalAttrsByElement.set(element, record)\n        }\n        if (!(attr in record)) record[attr] = value\n        const next =\n            variant === 'hant' && convertToTraditional\n                ? convertToTraditional(record[attr])\n                : record[attr]\n        if (value !== next) element.setAttribute(attr, next)\n    }\n}\n\nfunction applyToRoot(root: Node, variant: ChineseVariant) {\n    for (const node of collectTextNodes(root)) {\n        applyToTextNode(node, variant)\n    }\n    if (root.nodeType === Node.ELEMENT_NODE) {\n        const element = root as Element\n        if (!element.closest(NO_CONVERT_SELECTOR)) {\n            applyToAttributes(element, variant)\n            for (const el of element.querySelectorAll(ATTRIBUTE_SELECTOR)) {\n                if (!el.closest(NO_CONVERT_SELECTOR)) applyToAttributes(el, variant)\n            }\n        }\n    }\n}\n\nfunction handleMutations(mutations: MutationRecord[]) {\n    if (activeVariant !== 'hant' || !convertToTraditional) return\n    for (const mutation of mutations) {\n        if (mutation.type === 'characterData') {\n            const node = mutation.target as Text\n            const expected = pendingWrites.get(node)\n            if (expected !== undefined) {\n                pendingWrites.delete(node)\n                if (node.nodeValue === expected) continue\n            }\n            // External update (e.g. React re-render): adopt the new text as\n            // the original, then convert it.\n            if (node.nodeValue && CJK_RE.test(node.nodeValue) && !isSkipped(node)) {\n                applyToTextNode(node, 'hant', true)\n            } else {\n                originalTextByNode.delete(node)\n            }\n            continue\n        }\n        for (const added of Array.from(mutation.addedNodes)) {\n            if (added.nodeType === Node.TEXT_NODE) {\n                if (added.nodeValue && CJK_RE.test(added.nodeValue) && !isSkipped(added)) {\n                    applyToTextNode(added as Text, 'hant', true)\n                }\n            } else if (added.nodeType === Node.ELEMENT_NODE) {\n                applyToRoot(added, 'hant')\n            }\n        }\n    }\n}\n\nfunction startObserver() {\n    if (observer || typeof MutationObserver === 'undefined') return\n    observer = new MutationObserver(handleMutations)\n    observer.observe(document.body, {\n        subtree: true,\n        childList: true,\n        characterData: true,\n    })\n}\n\nfunction stopObserver() {\n    observer?.disconnect()\n    observer = null\n}\n\nfunction setDocumentLanguage(variant: ChineseVariant) {\n    document.documentElement.setAttribute('lang', variant === 'hant' ? 'zh-Hant' : 'zh-Hans')\n}\n\nfunction revealDocument() {\n    document.documentElement.classList?.remove(PENDING_CLASS)\n}\n\n// Applies the variant to the whole document and keeps it applied to future\n// DOM changes while traditional mode is active.\nexport async function setChineseVariant(variant: ChineseVariant): Promise<ChineseVariant> {\n    if (!isValidVariant(variant)) return getChineseVariant()\n    // Inside the App an applied variant may only mirror the App language; the legacy key\n    // must keep meaning \"the web default or a tap\" (see legacyChoice).\n    if (appVariant() === null) {\n        try {\n            window.localStorage.setItem(STORAGE_KEY, variant)\n        } catch {\n            // Non-persistent environments still get the in-memory switch.\n        }\n    }\n    setDocumentLanguage(variant)\n    const request = ++variantRequest\n\n    if (variant === 'hant') {\n        try {\n            await loadConverter()\n        } catch {\n            if (request !== variantRequest) return variant\n            // The page is still showing its 简 source: say so, and show it rather than stay hidden.\n            const shown = activeVariant ?? 'hans'\n            setDocumentLanguage(shown)\n            revealDocument()\n            return shown\n        }\n        // A later switch (a tap or the App language) must not be overtaken by a slow converter.\n        if (request !== variantRequest) return variant\n        applyToRoot(document.body, 'hant')\n        activeVariant = 'hant'\n        startObserver()\n    } else {\n        stopObserver()\n        activeVariant = 'hans'\n        applyToRoot(document.body, 'hans')\n    }\n    revealDocument()\n    return variant\n}\n\n// Applies the variant and reports back when the page could not show it (converter failed),\n// so the 简/繁 switch reflects what the reader actually sees.\nexport async function showChineseVariant(\n    variant: ChineseVariant,\n    onShown: (shown: ChineseVariant) => void,\n): Promise<ChineseVariant> {\n    const shown = await setChineseVariant(variant)\n    if (shown !== variant) onShown(shown)\n    return shown\n}\n\n// Follows App content-language announcements made after the page booted.\nexport function subscribeToContentLocale(onVariant: (variant: ChineseVariant) => void): () => void {\n    const follow = (event: Event) => onVariant(followContentLocale((event as CustomEvent).detail))\n    window.addEventListener(CONTENT_LOCALE_EVENT, follow)\n    return () => window.removeEventListener(CONTENT_LOCALE_EVENT, follow)\n}\n","import { useEffect, useState } from 'react';\nimport {\n    getChineseVariant,\n    rememberChineseVariantChoice,\n    showChineseVariant,\n    subscribeToContentLocale,\n    type ChineseVariant,\n} from '../../libs/chineseVariant';\n\n// Compact 简/繁 switch pinned to the top-right corner of every page.\n// The labels stay untouched by the site-wide converter via data-no-convert.\nexport function LanguageToggle() {\n    const [variant, setVariant] = useState<ChineseVariant>(() => getChineseVariant());\n\n    // The App may announce (or change) its content language after the page booted.\n    useEffect(() => subscribeToContentLocale(setVariant), []);\n\n    useEffect(() => {\n        // If 繁 cannot be shown (converter failed), the switch falls back to what is on screen.\n        void showChineseVariant(variant, setVariant);\n    }, [variant]);\n\n    const choose = (next: ChineseVariant) => {\n        rememberChineseVariantChoice(next);\n        setVariant(next);\n    };\n\n    return (\n        <div className=\"language-toggle\" data-no-convert role=\"group\" aria-label=\"简体繁体切换\">\n            <button\n                type=\"button\"\n                className={variant === 'hans' ? 'is-active' : ''}\n                aria-pressed={variant === 'hans'}\n                onClick={() => choose('hans')}\n            >\n                简\n            </button>\n            <button\n                type=\"button\"\n                className={variant === 'hant' ? 'is-active' : ''}\n                aria-pressed={variant === 'hant'}\n                onClick={() => choose('hant')}\n            >\n                繁\n            </button>\n        </div>\n    );\n}\n","import React, { useState } from 'react';\nimport { Navbar as BootstrapNavbar, Form, Container } from 'react-bootstrap';\nimport { useSidebar, useSearch } from './useLayout';\nimport { UserInfo } from './userinfo';\nimport { useTranslation } from '../../libs/i18n';\nimport { trackEvent } from '../../libs/analytics';\nimport { appPath } from '../../libs/url';\nimport { LanguageToggle } from './LanguageToggle';\n\ninterface NavbarProps {\n    showSidebarToggle?: boolean | string;\n}\n\nexport function Navbar({ showSidebarToggle = false }: NavbarProps) {\n    const { t } = useTranslation();\n    // 处理从 dataset 传来的字符串值\n    const shouldShowToggle =\n        showSidebarToggle === true || showSidebarToggle === 'true';\n\n    // 使用优化的 hooks 进行状态管理\n    const { searchQuery, setSearchQuery, handleSearch } = useSearch();\n    const { toggleSidebar } = useSidebar();\n\n    const [showMobileUserMenu, setShowMobileUserMenu] = useState(false);\n    const trackProductNavigation = (targetProduct: string) => {\n        trackEvent('nav_click', {\n            targetProduct,\n            placement: 'desktop_product_nav',\n        });\n    };\n\n    return (\n        <>\n            <Container fluid className=\"px-0\">\n                {/* 汉堡包菜单按钮（移动端）- 只在有侧边栏时显示 */}\n                {shouldShowToggle && (\n                    <BootstrapNavbar.Toggle\n                        className=\"d-lg-none p-2 border-0\"\n                        onClick={toggleSidebar}\n                        aria-controls=\"sidebar\"\n                        aria-label={t('ui.common.toggleSidebar')}\n                    />\n                )}\n\n                {/* Logo 区域 */}\n                <BootstrapNavbar.Brand\n                    href={appPath('/')}\n                    className=\"master-brand py-0 m-0 d-flex align-items-center\"\n                >\n                    <span className=\"master-brand-mark\" aria-hidden=\"true\">\n                        <i className=\"bi bi-flower1\"></i>\n                    </span>\n                    <div className=\"master-brand-copy\">\n                        <span className=\"master-brand-name\">\n                            {t('ui.brand.name')}\n                        </span>\n                    </div>\n                </BootstrapNavbar.Brand>\n\n                <nav\n                    className=\"master-product-nav d-none d-xl-flex\"\n                    aria-label=\"Buddha Chat 产品\"\n                >\n                    <a\n                        href=\"https://www.buddhachat.online\"\n                        onClick={() => trackProductNavigation('official')}\n                    >\n                        官网\n                    </a>\n                    <a\n                        aria-current=\"page\"\n                        className=\"active\"\n                        href={appPath('/')}\n                        onClick={() => trackProductNavigation('zentube')}\n                    >\n                        视频\n                    </a>\n                    <a\n                        href=\"https://www.buddhachat.online/sutra\"\n                        onClick={() => trackProductNavigation('sutra')}\n                    >\n                        读经\n                    </a>\n                    <a\n                        href=\"https://www.buddhachat.online/music\"\n                        onClick={() => trackProductNavigation('music')}\n                    >\n                        音乐\n                    </a>\n                </nav>\n\n                {/* 搜索栏区域 */}\n                <div className=\"master-navbar-search d-none d-lg-block\">\n                    <Form onSubmit={handleSearch}>\n                        <div className=\"position-relative\">\n                            <i\n                                className=\"bi bi-search position-absolute\"\n                                style={{\n                                    left: '16px',\n                                    top: '50%',\n                                    transform: 'translateY(-50%)',\n                                    color: 'var(--master-ink-soft)',\n                                    zIndex: 10,\n                                    pointerEvents: 'none',\n                                }}\n                            />\n                            <Form.Control\n                                type=\"search\"\n                                placeholder={t('ui.nav.search')}\n                                aria-label={t('ui.nav.search')}\n                                value={searchQuery}\n                                onChange={e => setSearchQuery(e.target.value)}\n                                className=\"border\"\n                                style={{\n                                    padding: '10px 18px 10px 48px',\n                                    boxShadow: 'none',\n                                    borderColor: 'var(--master-line)',\n                                }}\n                            />\n                        </div>\n                    </Form>\n                </div>\n\n                <div className=\"master-language-action\">\n                    <LanguageToggle />\n                </div>\n\n                {/* 移动端右侧区域 */}\n                <div className=\"master-mobile-actions d-lg-none d-flex align-items-center\">\n                    <a\n                        className=\"btn btn-link p-2\"\n                        href={appPath('/search')}\n                        aria-label={t('ui.nav.search')}\n                    >\n                        <i className=\"bi bi-search\"></i>\n                    </a>\n                    <button\n                        className=\"btn btn-link p-2\"\n                        onClick={() =>\n                            setShowMobileUserMenu(!showMobileUserMenu)\n                        }\n                        aria-controls=\"master-mobile-user-menu\"\n                        aria-expanded={showMobileUserMenu}\n                        aria-label={t('ui.common.toggleUserMenu')}\n                    >\n                        <i className=\"bi bi-person-circle\"></i>\n                    </button>\n                </div>\n\n                {/* 右侧功能区域 */}\n                <div className=\"master-navbar-actions d-none d-lg-flex align-items-center justify-content-end\">\n                    <UserInfo />\n                </div>\n            </Container>\n\n            {/* 移动端用户菜单 */}\n            {showMobileUserMenu && (\n                <div\n                    id=\"master-mobile-user-menu\"\n                    className=\"w-100 d-lg-none border-top bg-white\"\n                >\n                    <Container fluid className=\"p-0\">\n                        <UserInfo isMobile={true} />\n                    </Container>\n                </div>\n            )}\n        </>\n    );\n}\n","import React, { useEffect, useState } from 'react';\nimport { Nav, Offcanvas, Dropdown } from 'react-bootstrap';\n\nimport { appPath, stripAppPath, useAuth, useTranslation } from '../../libs';\nimport { useSidebar } from './useLayout';\n\nimport './sidebar.scss';\n\n// 导航项配置 - 使用 i18n key\ninterface NavigationItemConfig {\n    href: string;\n    icon: string;\n    labelKey: string;\n    requiresAuth?: boolean;\n}\n\nconst navItemsConfig: NavigationItemConfig[] = [\n    {\n        href: '/',\n        icon: 'bi-house-door',\n        labelKey: 'ui.nav.home',\n        requiresAuth: false,\n    },\n    {\n        href: '/#teachers',\n        icon: 'bi-people',\n        labelKey: 'ui.nav.teachers',\n        requiresAuth: false,\n    },\n    {\n        href: '/following',\n        icon: 'bi-person-plus',\n        labelKey: 'ui.nav.following',\n        requiresAuth: true,\n    },\n    {\n        href: '/starred',\n        icon: 'bi-bookmark',\n        labelKey: 'ui.nav.myLibrary',\n        requiresAuth: true,\n    },\n    {\n        href: '/history',\n        icon: 'bi-clock',\n        labelKey: 'ui.nav.history',\n        requiresAuth: true,\n    },\n];\n\ninterface SidebarProps {\n    show?: boolean;\n    onHide?: () => void;\n}\n\nexport function Sidebar({\n    show: externalShow,\n    onHide: externalOnHide,\n}: SidebarProps = {}) {\n    const [currentPath, setCurrentPath] = useState('');\n    const { isAuthenticated } = useAuth();\n    const { t, language, changeLanguage } = useTranslation();\n\n    // 使用优化的 hooks - 只订阅侧边栏状态\n    const { sidebarOpen, closeSidebar } = useSidebar();\n\n    useEffect(() => {\n        setCurrentPath(stripAppPath(window.location.pathname));\n    }, []);\n\n    const handleHide = () => {\n        closeSidebar();\n        externalOnHide?.();\n    };\n\n    // 优先使用外部传入的 show，否则使用 hook 的状态\n    const show = externalShow !== undefined ? externalShow : sidebarOpen;\n\n    const isActiveLink = (href: string): boolean => {\n        if (href === '/') {\n            return currentPath === '/';\n        }\n        return currentPath.startsWith(href);\n    };\n\n    const NavItem: React.FC<NavigationItemConfig> = ({\n        href,\n        icon,\n        labelKey,\n        requiresAuth = false,\n    }) => {\n        const isActive = isActiveLink(href);\n        // active 状态下使用 fill 版本的图标\n        const iconClass = isActive ? icon.replace('-fill', '') + '-fill' : icon;\n\n        const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n            if (requiresAuth && !isAuthenticated) {\n                e.preventDefault();\n                // 保存当前要访问的页面，登录后可以重定向回来\n                const returnUrl = encodeURIComponent(appPath(href));\n                window.location.href = appPath(\n                    `/auth/login?returnUrl=${returnUrl}`\n                );\n            }\n        };\n\n        return (\n            <Nav.Item>\n                <Nav.Link\n                    href={appPath(href)}\n                    active={isActive}\n                    className=\"d-flex align-items-center link-body-emphasis\"\n                    onClick={handleClick}\n                >\n                    <i\n                        className={`bi ${iconClass} me-3`}\n                        style={{ fontSize: '20px' }}\n                    ></i>\n                    {t(labelKey)}\n                </Nav.Link>\n            </Nav.Item>\n        );\n    };\n\n    const SidebarContent = () => (\n        <div className=\"d-flex flex-column h-100\">\n            {/* Main Content Area */}\n            <div className=\"master-sidebar-main flex-grow-1\">\n                <Nav as=\"nav\" variant=\"pills\" className=\"flex-column pt-3 px-3\">\n                    {/* 所有导航项 */}\n                    {navItemsConfig.map((item, index) => (\n                        <NavItem key={index} {...item} />\n                    ))}\n\n                    <hr />\n                </Nav>\n            </div>\n\n            {/* Footer Section */}\n            <footer className=\"sidebar-footer px-3 py-3\">\n                <div className=\"master-sidebar-quote\">\n                    <p>{t('ui.nav.sidebarQuote')}</p>\n                    <span>{t('ui.nav.sidebarQuoteSource')}</span>\n                </div>\n                <div className=\"footer-links d-flex flex-wrap gap-2 mb-2\">\n                    <a\n                        href={appPath('/about')}\n                        className=\"text-muted text-decoration-none \"\n                    >\n                        {t('ui.footer.about')}\n                    </a>\n                    <a\n                        href={appPath('/terms')}\n                        className=\"text-muted text-decoration-none \"\n                    >\n                        {t('ui.footer.terms')}\n                    </a>\n                    <a\n                        href={appPath('/privacy')}\n                        className=\"text-muted text-decoration-none \"\n                    >\n                        {t('ui.footer.privacy')}\n                    </a>\n                    {/* Language Selector */}\n                    <div className=\"language-selector d-flex align-items-center\">\n                        <Dropdown>\n                            <Dropdown.Toggle\n                                aria-haspopup=\"menu\"\n                                variant=\"link\"\n                                className=\"border-0 bg-transparent text-muted p-0 d-flex align-items-center text-decoration-none text-small\"\n                                style={{ boxShadow: 'none' }}\n                            >\n                                <span className=\"me-auto\">\n                                    {language === 'en_US'\n                                        ? t('ui.common.english')\n                                        : t('ui.common.chinese')}\n                                </span>\n                                <i className=\"bi bi-chevron-expand ms-1\"></i>\n                            </Dropdown.Toggle>\n                            <Dropdown.Menu role=\"menu\">\n                                <Dropdown.Item\n                                    role=\"menuitem\"\n                                    onClick={() => changeLanguage('en_US')}\n                                    active={language === 'en_US'}\n                                >\n                                    English\n                                </Dropdown.Item>\n                                <Dropdown.Item\n                                    role=\"menuitem\"\n                                    onClick={() => changeLanguage('zh_CN')}\n                                    active={language === 'zh_CN'}\n                                >\n                                    中文\n                                </Dropdown.Item>\n                            </Dropdown.Menu>\n                        </Dropdown>\n                    </div>\n                </div>\n\n                {/* Copyright */}\n                <div\n                    className=\"copyright text-muted\"\n                    style={{ fontSize: '14px' }}\n                >\n                    {t('ui.footer.copyright', { year: '2025' })}\n                </div>\n            </footer>\n        </div>\n    );\n\n    return (\n        <>\n            {/* 桌面端侧边栏 */}\n            <SidebarContent />\n\n            {/* 移动端 Offcanvas 侧边栏 */}\n            <Offcanvas\n                show={show}\n                onHide={handleHide}\n                placement=\"start\"\n                className=\"d-lg-none\"\n            >\n                <Offcanvas.Header closeButton>\n                    <Offcanvas.Title>\n                        <span style={{ fontSize: '24px', fontWeight: 'bold' }}>\n                            {t('ui.brand.name')}\n                        </span>\n                    </Offcanvas.Title>\n                </Offcanvas.Header>\n                <Offcanvas.Body className=\"p-0\">\n                    <SidebarContent />\n                </Offcanvas.Body>\n            </Offcanvas>\n        </>\n    );\n}\n","import './styles.scss';\nimport { render, initializeToastProvider } from '../../libs';\nimport { Navbar } from './navbar';\nimport { Sidebar } from './sidebar';\nimport { I18nProvider } from '../../libs/i18n';\nimport { FollowingUsersProvider } from '../../libs/useFollowingUsers';\n\nfunction NavbarWrapper() {\n    // 从 DOM 元素读取 showSidebarToggle 属性\n    const navbarMount = document.getElementById('navbar-mount');\n    const showSidebarToggle =\n        navbarMount?.getAttribute('data-show-sidebar-toggle') === 'true';\n\n    return (\n        <I18nProvider>\n            <Navbar showSidebarToggle={showSidebarToggle} />\n        </I18nProvider>\n    );\n}\n\nfunction SidebarWrapper() {\n    return (\n        <I18nProvider>\n            <FollowingUsersProvider>\n                <Sidebar />\n            </FollowingUsersProvider>\n        </I18nProvider>\n    );\n}\n\n// 初始化全局 ToastProvider\ninitializeToastProvider();\n\n// 渲染公共组件（大师专属页不输出 #navbar-mount，此时跳过全局导航）\nif (document.getElementById('navbar-mount')) {\n    render('navbar-mount', NavbarWrapper);\n}\n\n// 只有在有 sidebar-mount 元素时才渲染侧边栏\nif (document.getElementById('sidebar-mount')) {\n    render('sidebar-mount', SidebarWrapper);\n}\n"],"file":"common-FTG1vrNU.mjs"}