@netless/fastboard-react 0.2.12 → 0.2.13-canary.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +3 -3
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -6
- package/src/vanilla/index.tsx +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/internal/helpers.ts","../src/internal/hooks.ts","../src/behaviors/style.ts","../src/components/hooks.ts","../src/components/RedoUndo/hooks.ts","../src/components/RedoUndo/RedoUndo.tsx","../src/i18n/index.ts","../src/icons/index.tsx","../src/icons/Redo.tsx","../src/theme.ts","../src/icons/Undo.tsx","../src/components/ZoomControl/hooks.ts","../src/components/ZoomControl/ZoomControl.tsx","../src/icons/Minus.tsx","../src/icons/Plus.tsx","../src/icons/Reset.tsx","../src/components/PageControl/hooks.ts","../src/components/PageControl/PageControl.tsx","../src/icons/Left.tsx","../src/icons/Right.tsx","../src/icons/WhiteboardAdd.tsx","../src/components/Toolbar/hooks.ts","../src/components/Toolbar/const.ts","../src/components/Toolbar/icons/index.ts","../src/components/Toolbar/icons/Apps.tsx","../src/components/Toolbar/icons/Arrow.tsx","../src/components/Toolbar/icons/Circle.tsx","../src/components/Toolbar/icons/Clean.tsx","../src/components/Toolbar/icons/Clicker.tsx","../src/components/Toolbar/icons/Collapse.tsx","../src/components/Toolbar/icons/Diamond.tsx","../src/components/Toolbar/icons/Down.tsx","../src/components/Toolbar/icons/Eraser.tsx","../src/components/Toolbar/icons/Expand.tsx","../src/components/Toolbar/icons/Line.tsx","../src/components/Toolbar/icons/Pencil.tsx","../src/components/Toolbar/icons/Rectangle.tsx","../src/components/Toolbar/icons/Selector.tsx","../src/components/Toolbar/icons/SpeechBalloon.tsx","../src/components/Toolbar/icons/Star.tsx","../src/components/Toolbar/icons/Text.tsx","../src/components/Toolbar/icons/Triangle.tsx","../src/components/Toolbar/icons/Up.tsx","../src/components/Toolbar/Toolbar.tsx","../src/components/Toolbar/Content.tsx","../src/components/Toolbar/components/ApplianceButtons.tsx","../src/components/Toolbar/components/Button.tsx","../src/components/Toolbar/components/AppsButton.tsx","../src/components/Toolbar/icons/Loading.tsx","../src/components/Toolbar/components/PencilButton.tsx","../src/components/Toolbar/components/ColorBox.tsx","../src/components/Toolbar/components/CutLine.tsx","../src/components/Toolbar/components/Slider.tsx","../src/components/Toolbar/components/ShapesButton.tsx","../src/components/Toolbar/components/TextButton.tsx","../src/components/Toolbar/components/UpDownButtons.tsx","../src/components/PlayerControl/hooks.ts","../src/components/PlayerControl/PlayerControl.tsx","../src/components/PlayerControl/components/Button.tsx","../src/components/PlayerControl/icons/index.ts","../src/components/PlayerControl/icons/Loading.tsx","../src/components/PlayerControl/icons/Pause.tsx","../src/components/PlayerControl/icons/Play.tsx","../src/components/Fastboard.tsx","../src/components/tippy-util.ts","../src/components/ReplayFastboard.tsx","../src/vanilla/index.tsx"],"sourcesContent":["import \"./behaviors/style\";\n\nexport * from \"./typings\";\nexport * from \"./components/hooks\";\nexport * from \"./components/RedoUndo\";\nexport * from \"./components/ZoomControl\";\nexport * from \"./components/PageControl\";\nexport * from \"./components/Toolbar\";\nexport * from \"./components/PlayerControl\";\nexport * from \"./components/Fastboard\";\nexport * from \"./components/ReplayFastboard\";\nexport * from \"./vanilla\";\n","export function noop() {\n return;\n}\n\nexport function applyStyles(css: string) {\n const el = document.createElement(\"style\");\n el.appendChild(document.createTextNode(css));\n document.head.appendChild(el);\n return el;\n}\n\nexport function clamp(value: number, min: number, max: number) {\n return value < min ? min : value > max ? max : value;\n}\n\nexport function isEqualArray<T>(a: T[], b: T[]) {\n return a.length === b.length && a.every((e, i) => e === b[i]);\n}\n\nexport const defaultHotKeys = {\n changeToSelector: \"s\",\n changeToLaserPointer: \"z\",\n changeToPencil: \"p\",\n changeToRectangle: \"r\",\n changeToEllipse: \"c\",\n changeToEraser: \"e\",\n changeToText: \"t\",\n changeToStraight: \"l\",\n changeToArrow: \"a\",\n changeToHand: \"h\",\n};\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport function useLastValue<T>(value: T) {\n const ref = useRef<T>(value);\n useEffect(() => {\n ref.current = value;\n }, [value]);\n return ref.current;\n}\n\nexport function useAsyncValue<T>(fn: () => Promise<T>) {\n const [value, setValue] = useState<T | null>(null);\n useEffect(() => {\n fn().then(setValue);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n return value;\n}\n\nexport function useForceUpdate() {\n const [, forceUpdate] = useState({});\n return useCallback(() => forceUpdate({}), []);\n}\n","import { applyStyles } from \"../internal\";\nimport style from \"../style.scss?inline\";\n\napplyStyles(style);\n","import type { FastboardApp, FastboardReadable } from \"@netless/fastboard-core\";\nimport type { Theme } from \"../typings\";\n\nimport { BuiltinApps } from \"@netless/window-manager\";\nimport { createContext, useContext, useEffect, useState } from \"react\";\n\nexport const FastboardAppContext = /* @__PURE__ */ createContext<FastboardApp | null>(null);\n\nexport const ThemeContext = /* @__PURE__ */ createContext<Theme>(\"light\");\n\nexport function useTheme(userTheme?: Theme | null) {\n const themeFromContext = useContext(ThemeContext);\n return userTheme || themeFromContext;\n}\n\nexport function useFastboardApp() {\n const app = useContext(FastboardAppContext);\n if (!app) {\n throw new Error(\"useFastboardApp() can only be called inside of <Fastboard>\");\n }\n return app;\n}\n\nexport function useFastboardValue<T>(val: FastboardReadable<T>) {\n const [value, setValue] = useState(val.value);\n useEffect(() => val.subscribe(setValue), [val]);\n return value;\n}\n\nexport function useWritable() {\n return useFastboardValue(useFastboardApp().writable);\n}\n\nexport function useBoxState() {\n return useFastboardValue(useFastboardApp().boxState);\n}\n\nexport function useFocusedApp() {\n return useFastboardValue(useFastboardApp().focusedApp);\n}\n\nexport function useMaximized() {\n return useBoxState() === \"maximized\";\n}\n\nconst AppsShouldShowToolbar = /* @__PURE__ */ (() => [BuiltinApps.DocsViewer, \"Slide\"])();\n\nexport function useHideControls() {\n const writable = useWritable();\n const maximized = useMaximized();\n const focusedApp = useFocusedApp();\n\n if (!writable) {\n return true;\n }\n\n if (maximized) {\n if (AppsShouldShowToolbar.some(kind => focusedApp?.includes(kind))) {\n return \"toolbar-only\";\n } else {\n return true;\n }\n }\n\n return false;\n}\n","import { useCallback } from \"react\";\nimport { useFastboardApp, useFastboardValue } from \"../hooks\";\n\nexport function useRedoUndo() {\n const app = useFastboardApp();\n const undoSteps = useFastboardValue(app.canUndoSteps);\n const redoSteps = useFastboardValue(app.canRedoSteps);\n\n const undo = useCallback(() => {\n app.undo();\n }, [app]);\n\n const redo = useCallback(() => {\n app.redo();\n }, [app]);\n\n return { redoSteps, undoSteps, redo, undo };\n}\n","import type { CommonProps, GenericIcon } from \"../../typings\";\n\nimport Tippy from \"@tippyjs/react\";\nimport clsx from \"clsx\";\nimport React from \"react\";\n\nimport { useTranslation } from \"../../i18n\";\nimport { Icon } from \"../../icons\";\nimport { Redo } from \"../../icons/Redo\";\nimport { Undo } from \"../../icons/Undo\";\nimport { TopOffset } from \"../../theme\";\nimport { useTheme, useWritable } from \"../hooks\";\nimport { useRedoUndo } from \"./hooks\";\n\nexport const name = \"fastboard-redo-undo\";\n\nexport type RedoUndoProps = CommonProps & GenericIcon<\"undo\" | \"redo\">;\n\nexport function RedoUndo({ theme, undoIcon, undoIconDisable, redoIcon, redoIconDisable }: RedoUndoProps) {\n theme = useTheme(theme);\n const { t } = useTranslation();\n\n const writable = useWritable();\n const { redoSteps, undoSteps, redo, undo } = useRedoUndo();\n\n const disabled = !writable;\n\n return (\n <div className={clsx(name, theme)}>\n <Tippy\n className=\"fastboard-tip\"\n content={t(\"undo\")}\n theme={theme}\n disabled={disabled}\n placement=\"top\"\n delay={[1000, 400]}\n duration={300}\n offset={TopOffset}\n >\n <button\n className={clsx(`${name}-btn`, \"undo\", theme)}\n disabled={disabled || undoSteps === 0}\n onClick={undo}\n >\n <Icon\n fallback={<Undo theme={theme} />}\n src={undoSteps === 0 ? undoIconDisable : undoIcon}\n alt=\"[undo]\"\n />\n </button>\n </Tippy>\n <Tippy\n className=\"fastboard-tip\"\n content={t(\"redo\")}\n theme={theme}\n disabled={disabled}\n placement=\"top\"\n delay={[1000, 400]}\n duration={300}\n offset={TopOffset}\n >\n <button\n className={clsx(`${name}-btn`, \"redo\", theme)}\n disabled={disabled || redoSteps === 0}\n onClick={redo}\n >\n <Icon\n fallback={<Redo theme={theme} />}\n src={redoSteps === 0 ? redoIconDisable : redoIcon}\n alt=\"[redo]\"\n />\n </button>\n </Tippy>\n </div>\n );\n}\n","import type { i18n } from \"i18next\";\nimport type { Language } from \"../typings\";\n\nimport { createContext, useContext, useMemo } from \"react\";\nimport i18next from \"i18next\";\nimport en from \"./en.json\";\nimport zhCN from \"./zh-CN.json\";\n\nexport interface CreateI18nParams {\n language?: Language;\n}\n\nexport const createI18n = async ({\n language = (navigator.language as Language) || \"zh-CN\",\n}: CreateI18nParams = {}) => {\n await i18next.init({\n lng: language,\n resources: { en, \"zh-CN\": zhCN },\n });\n return i18next;\n};\n\nexport const I18nContext = /* @__PURE__ */ createContext<i18n | null>(null);\n\nexport function useTranslation() {\n const i18n = useContext(I18nContext);\n const t = useMemo(() => (i18n ? i18n.getFixedT(null, [\"translation\"]) : (id: string) => id), [i18n]);\n return { t, i18n };\n}\n","import React from \"react\";\n\nexport interface IconPropsWithFallback {\n fallback: React.ReactElement;\n src?: string;\n alt?: string;\n}\n\nexport function Icon({ fallback, src, alt = \"[icon]\" }: IconPropsWithFallback) {\n return src ? <img src={src} alt={alt} title={alt} /> : fallback;\n}\n","import type { IconProps } from \"../typings\";\n\nimport React from \"react\";\nimport { themes } from \"../theme\";\n\nexport function Redo({ theme = \"light\", active }: IconProps) {\n const config = themes[theme];\n const stroke = active ? config.activeColor : config.color;\n\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M19 9.625H9v-1.25h10v1.25ZM5.625 13v6h-1.25v-6h1.25ZM9 9.625A3.375 3.375 0 0 0 5.625 13h-1.25A4.625 4.625 0 0 1 9 8.375v1.25Z\"\n fill={stroke}\n />\n <path d=\"m15 5 4 4-4 4\" stroke={stroke} strokeLinejoin=\"round\" strokeWidth=\"1.25\" />\n </svg>\n );\n}\n","import type { IconProps } from \"./typings\";\n\nexport interface ThemeConfig {\n color: string;\n activeColor: string;\n backgroundColor: string;\n hoverBackgroundColor: string;\n}\n\nexport const light: ThemeConfig = {\n color: \"#5D5D5D\",\n activeColor: \"#3381FF\",\n backgroundColor: \"#fff\",\n hoverBackgroundColor: \"rgba(51, 129, 255, 0.1)\",\n};\n\nexport const dark: ThemeConfig = {\n ...light,\n color: \"#eee\",\n backgroundColor: \"#111\",\n};\n\nexport const themes = { light, dark };\n\nexport const getStroke = (props: IconProps) => {\n let config;\n if (props.theme) {\n config = themes[props.theme];\n } else {\n config = themes.light;\n }\n return props.active ? config.activeColor : config.color;\n};\n\nexport const TopOffset = [0, 11] as [number, number];\nexport const RightOffset = [0, 11] as [number, number];\n","import type { IconProps } from \"../typings\";\n\nimport React from \"react\";\nimport { themes } from \"../theme\";\n\nexport function Undo({ theme = \"light\", active }: IconProps) {\n const config = themes[theme];\n const stroke = active ? config.activeColor : config.color;\n\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M5 9.625h10v-1.25H5v1.25ZM18.375 13v6h1.25v-6h-1.25ZM15 9.625A3.375 3.375 0 0 1 18.375 13h1.25A4.625 4.625 0 0 0 15 8.375v1.25Z\"\n fill={stroke}\n />\n <path d=\"M9 5 5 9l4 4\" stroke={stroke} strokeLinejoin=\"round\" strokeWidth=\"1.25\" />\n </svg>\n );\n}\n","import { useCallback } from \"react\";\n\nimport { clamp } from \"../../internal\";\nimport { useFastboardApp, useFastboardValue } from \"../hooks\";\n\nexport const ScalePoints: readonly number[] = [\n 0.3, 0.4096000000000002, 0.5120000000000001, 0.6400000000000001, 0.8, 1, 1.26, 1.5876000000000001, 2.000376,\n 2.5204737600000002, 3,\n];\n\nfunction nextScale(scale: number, delta: 1 | -1) {\n const { length } = ScalePoints;\n const last = length - 1;\n if (scale < ScalePoints[0]) return ScalePoints[0];\n if (scale > ScalePoints[last]) return ScalePoints[last];\n for (let i = 0; i < length; ++i) {\n const curr = ScalePoints[i];\n const prev = i === 0 ? -Infinity : (ScalePoints[i - 1] + curr) / 2;\n const next = i === last ? Infinity : (ScalePoints[i + 1] + curr) / 2;\n if (prev <= scale && scale <= next) return ScalePoints[clamp(i + delta, 0, last)];\n }\n return 1;\n}\n\nexport function useZoomControl() {\n const app = useFastboardApp();\n const scale = useFastboardValue(app.camera).scale || 1;\n\n const resetCamera = useCallback(() => {\n app.moveCamera({ scale: 1, centerX: 0, centerY: 0 });\n }, [app]);\n\n const zoomIn = useCallback(() => {\n app.moveCamera({\n scale: nextScale(scale, 1),\n centerX: 0,\n centerY: 0,\n });\n }, [app, scale]);\n\n const zoomOut = useCallback(() => {\n app.moveCamera({\n scale: nextScale(scale, -1),\n centerX: 0,\n centerY: 0,\n });\n }, [app, scale]);\n\n return { scale, resetCamera, zoomIn, zoomOut };\n}\n","import type { CommonProps, GenericIcon } from \"../../typings\";\n\nimport Tippy from \"@tippyjs/react\";\nimport clsx from \"clsx\";\nimport React from \"react\";\n\nimport { useTranslation } from \"../../i18n\";\nimport { Icon } from \"../../icons\";\nimport { Minus } from \"../../icons/Minus\";\nimport { Plus } from \"../../icons/Plus\";\nimport { Reset } from \"../../icons/Reset\";\nimport { TopOffset } from \"../../theme\";\nimport { useTheme, useWritable } from \"../hooks\";\nimport { useZoomControl } from \"./hooks\";\n\nexport const name = \"fastboard-zoom-control\";\n\nexport type ZoomControlProps = CommonProps & GenericIcon<\"reset\" | \"minus\" | \"plus\">;\n\nexport function ZoomControl({\n theme,\n resetIcon,\n resetIconDisable,\n minusIcon,\n minusIconDisable,\n plusIcon,\n plusIconDisable,\n}: ZoomControlProps) {\n theme = useTheme(theme);\n const { t } = useTranslation();\n\n const writable = useWritable();\n const { scale, resetCamera, zoomIn, zoomOut } = useZoomControl();\n\n const disabled = !writable;\n\n return (\n <div className={clsx(name, theme)}>\n {/* <span className={clsx(`${name}-cut-line`, theme)} /> */}\n <Tippy\n className=\"fastboard-tip\"\n content={t(\"zoomOut\")}\n theme={theme}\n disabled={disabled}\n placement=\"top\"\n delay={[1000, 400]}\n duration={300}\n offset={TopOffset}\n >\n <button className={clsx(`${name}-btn`, \"minus\", theme)} disabled={disabled} onClick={zoomOut}>\n <Icon\n fallback={<Minus theme={theme} />}\n src={disabled ? minusIconDisable : minusIcon}\n alt=\"[minus]\"\n />\n </button>\n </Tippy>\n <span className={clsx(`${name}-text`, theme)}>\n <span className={clsx(`${name}-scale`, theme)}>{Math.ceil(scale * 100)}</span>\n <span className={clsx(`${name}-percent`, theme)}>%</span>\n </span>\n <Tippy\n className=\"fastboard-tip\"\n content={t(\"zoomIn\")}\n theme={theme}\n disabled={disabled}\n placement=\"top\"\n delay={[1000, 400]}\n duration={300}\n offset={TopOffset}\n >\n <button className={clsx(`${name}-btn`, \"plus\", theme)} disabled={disabled} onClick={zoomIn}>\n <Icon fallback={<Plus theme={theme} />} src={disabled ? plusIconDisable : plusIcon} alt=\"[plus]\" />\n </button>\n </Tippy>\n <Tippy\n className=\"fastboard-tip\"\n content={t(\"reset\")}\n theme={theme}\n disabled={disabled}\n placement=\"top\"\n delay={[1000, 400]}\n duration={300}\n offset={TopOffset}\n >\n <button className={clsx(`${name}-btn`, \"reset\", theme)} disabled={disabled} onClick={resetCamera}>\n <Icon\n fallback={<Reset theme={theme} />}\n src={disabled ? resetIconDisable : resetIcon}\n alt=\"[reset]\"\n />\n </button>\n </Tippy>\n </div>\n );\n}\n","import type { IconProps } from \"../typings\";\n\nimport React from \"react\";\nimport { themes } from \"../theme\";\n\nexport function Minus({ theme = \"light\", active }: IconProps) {\n const config = themes[theme];\n const stroke = active ? config.activeColor : config.color;\n\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M5 12h14\" stroke={stroke} strokeLinejoin=\"round\" strokeWidth=\"1.25\" />\n </svg>\n );\n}\n","import type { IconProps } from \"../typings\";\n\nimport React from \"react\";\nimport { themes } from \"../theme\";\n\nexport function Plus({ theme = \"light\", active }: IconProps) {\n const config = themes[theme];\n const stroke = active ? config.activeColor : config.color;\n\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M5 12h14m-7-7v14\" stroke={stroke} strokeLinejoin=\"round\" strokeWidth=\"1.25\" />\n </svg>\n );\n}\n","import type { IconProps } from \"../typings\";\n\nimport React from \"react\";\nimport { themes } from \"../theme\";\n\nexport function Reset({ theme = \"light\", active }: IconProps) {\n const config = themes[theme];\n const stroke = active ? config.activeColor : config.color;\n\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"12\" cy=\"12\" fill={stroke} r=\"2\" />\n <path d=\"M12 3v4m0 10v4m9-9h-4M7 12H3\" stroke={stroke} strokeLinejoin=\"round\" strokeWidth=\"1.25\" />\n <circle cx=\"12\" cy=\"12\" r=\"7\" stroke={stroke} strokeLinejoin=\"round\" strokeWidth=\"1.25\" />\n </svg>\n );\n}\n","import { useCallback } from \"react\";\nimport { useFastboardApp, useFastboardValue } from \"../hooks\";\n\nexport function usePageControl() {\n const app = useFastboardApp();\n const pageIndex = useFastboardValue(app.sceneIndex);\n const pageCount = useFastboardValue(app.sceneLength);\n\n const addPage = useCallback(async () => {\n await app.manager.switchMainViewToWriter();\n app.room.putScenes(app.manager.mainViewSceneDir, [{}], pageIndex + 1);\n await app.manager.setMainViewSceneIndex(pageIndex + 1);\n }, [app, pageIndex]);\n\n const prevPage = useCallback(async () => {\n await app.manager.setMainViewSceneIndex(pageIndex - 1);\n }, [app, pageIndex]);\n\n const nextPage = useCallback(async () => {\n await app.manager.setMainViewSceneIndex(pageIndex + 1);\n }, [app, pageIndex]);\n\n return { pageIndex, pageCount, prevPage, nextPage, addPage };\n}\n","import type { CommonProps, GenericIcon } from \"../../typings\";\n\nimport Tippy from \"@tippyjs/react\";\nimport clsx from \"clsx\";\nimport React from \"react\";\n\nimport { useTranslation } from \"../../i18n\";\nimport { Icon } from \"../../icons\";\nimport { Left } from \"../../icons/Left\";\nimport { Right } from \"../../icons/Right\";\nimport { WhiteboardAdd } from \"../../icons/WhiteboardAdd\";\nimport { TopOffset } from \"../../theme\";\nimport { useTheme, useWritable } from \"../hooks\";\nimport { usePageControl } from \"./hooks\";\n\nexport const name = \"fastboard-page-control\";\n\nexport type PageControlProps = CommonProps & GenericIcon<\"add\" | \"prev\" | \"next\">;\n\nexport function PageControl({\n theme,\n addIcon,\n addIconDisable,\n prevIcon,\n prevIconDisable,\n nextIcon,\n nextIconDisable,\n}: PageControlProps) {\n theme = useTheme(theme);\n const { t } = useTranslation();\n\n const writable = useWritable();\n const { pageIndex, pageCount, ...actions } = usePageControl();\n\n const disabled = !writable;\n\n return (\n <div className={clsx(name, theme)}>\n {/* <span className={clsx(`${name}-cut-line`, theme)} />{\" \"} */}\n <Tippy\n className=\"fastboard-tip\"\n content={t(\"prevPage\")}\n theme={theme}\n disabled={disabled}\n placement=\"top\"\n delay={[1000, 400]}\n duration={300}\n offset={TopOffset}\n >\n <button\n className={clsx(`${name}-btn`, \"prev\", theme)}\n disabled={disabled || pageIndex === 0}\n onClick={actions.prevPage}\n >\n <Icon fallback={<Left theme={theme} />} src={disabled ? prevIconDisable : prevIcon} alt=\"[prev]\" />\n </button>\n </Tippy>\n <span className={clsx(`${name}-text`, theme)}>\n <span className={clsx(`${name}-page`, theme)}>{pageCount === 0 ? \"\\u2026\" : pageIndex + 1}</span>\n <span className={clsx(`${name}-slash`, theme)}>/</span>\n <span className={clsx(`${name}-page-count`, theme)}>{pageCount}</span>\n </span>\n <Tippy\n className=\"fastboard-tip\"\n content={t(\"nextPage\")}\n theme={theme}\n disabled={disabled}\n placement=\"top\"\n delay={[1000, 400]}\n duration={300}\n offset={TopOffset}\n >\n <button\n className={clsx(`${name}-btn`, \"next\", theme)}\n disabled={disabled || pageIndex === pageCount - 1}\n onClick={actions.nextPage}\n >\n <Icon fallback={<Right theme={theme} />} src={disabled ? nextIconDisable : nextIcon} alt=\"[next]\" />\n </button>\n </Tippy>\n <Tippy\n className=\"fastboard-tip\"\n content={t(\"addPage\")}\n theme={theme}\n disabled={disabled}\n placement=\"top\"\n delay={[1000, 400]}\n duration={300}\n offset={TopOffset}\n >\n <button className={clsx(`${name}-btn`, \"add\", theme)} disabled={disabled} onClick={actions.addPage}>\n <Icon\n fallback={<WhiteboardAdd theme={theme} />}\n src={disabled ? addIconDisable : addIcon}\n alt=\"[add]\"\n />\n </button>\n </Tippy>\n </div>\n );\n}\n","import type { IconProps } from \"../typings\";\n\nimport React from \"react\";\nimport { themes } from \"../theme\";\n\nexport function Left({ theme = \"light\", active }: IconProps) {\n const config = themes[theme];\n const stroke = active ? config.activeColor : config.color;\n\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"m14 8-2 2-2 2 2 2 2 2\" stroke={stroke} strokeLinejoin=\"round\" strokeWidth=\"1.25\" />\n </svg>\n );\n}\n","import type { IconProps } from \"../typings\";\n\nimport React from \"react\";\nimport { themes } from \"../theme\";\n\nexport function Right({ theme = \"light\", active }: IconProps) {\n const config = themes[theme];\n const stroke = active ? config.activeColor : config.color;\n\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"m10 8 2 2 2 2-2 2-2 2\" stroke={stroke} strokeLinejoin=\"round\" strokeWidth=\"1.25\" />\n </svg>\n );\n}\n","import type { IconProps } from \"../typings\";\n\nimport React from \"react\";\nimport { themes } from \"../theme\";\n\nexport function WhiteboardAdd({ theme = \"light\", active }: IconProps) {\n const config = themes[theme];\n const stroke = active ? config.activeColor : config.color;\n\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M4 20h16M4 6h16\" stroke={stroke} strokeLinejoin=\"round\" strokeWidth=\"1.25\" />\n <rect\n height=\"10\"\n rx=\"1\"\n stroke={stroke}\n strokeLinejoin=\"round\"\n strokeWidth=\"1.25\"\n width=\"14\"\n x=\"5\"\n y=\"8\"\n />\n <path d=\"M12 4v2m-3 7h6m-3-3v6\" stroke={stroke} strokeLinejoin=\"round\" strokeWidth=\"1.25\" />\n </svg>\n );\n}\n","import type { ApplianceNames, Color, MemberState, ShapeType } from \"white-web-sdk\";\nimport type { AppsStatus } from \"@netless/fastboard-core\";\n\nimport { useCallback, useState } from \"react\";\n\nimport { noop } from \"../../internal\";\nimport { useFastboardApp, useFastboardValue, useWritable } from \"../hooks\";\nimport { ShapesMap } from \"./const\";\n\nexport type UnifiedShape = keyof typeof ShapesMap;\n\nexport interface ToolbarHook {\n readonly writable: boolean;\n readonly memberState: MemberState | undefined;\n readonly lastShape: UnifiedShape;\n readonly appsStatus: AppsStatus;\n cleanCurrentScene(): void;\n setAppliance(appliance: ApplianceNames, shape?: ShapeType): void;\n setStrokeWidth(width: number): void;\n setStrokeColor(color: Color): void;\n}\n\nexport function useRoomState() {\n return useFastboardValue(useFastboardApp().memberState);\n}\n\nexport function useAppsStatus() {\n return useFastboardValue(useFastboardApp().appsStatus);\n}\n\nexport function useToolbar(): ToolbarHook {\n const app = useFastboardApp();\n const writable = useWritable();\n const memberState = useRoomState();\n const appsStatus = useAppsStatus();\n const [lastShape, setLastShape] = useState<UnifiedShape>(\"rectangle\" as ApplianceNames.rectangle);\n\n const cleanCurrentScene = useCallback(() => {\n app.cleanCurrentScene();\n }, [app]);\n\n const setAppliance = useCallback(\n (appliance: ApplianceNames, shape?: ShapeType) => {\n app.setAppliance(appliance, shape);\n if (shape) {\n setLastShape(shape);\n } else if (appliance in ShapesMap) {\n setLastShape(appliance as UnifiedShape);\n }\n },\n [app]\n );\n\n const setStrokeWidth = useCallback(\n (strokeWidth: number) => {\n app.setStrokeWidth(strokeWidth);\n },\n [app]\n );\n\n const setStrokeColor = useCallback(\n (strokeColor: Color) => {\n app.setStrokeColor(strokeColor);\n },\n [app]\n );\n\n return {\n writable,\n memberState,\n lastShape,\n appsStatus,\n cleanCurrentScene,\n setAppliance,\n setStrokeWidth,\n setStrokeColor,\n };\n}\n\nexport const EmptyToolbarHook: ToolbarHook = {\n writable: false,\n memberState: undefined,\n lastShape: \"rectangle\" as ApplianceNames.rectangle,\n appsStatus: {},\n cleanCurrentScene: noop,\n setAppliance: noop,\n setStrokeWidth: noop,\n setStrokeColor: noop,\n};\n","import { ApplianceNames, ShapeType } from \"white-web-sdk\";\nimport { Icons } from \"./icons\";\n\nexport const ShapesMap = {\n [ApplianceNames.rectangle]: Icons.Rectangle,\n [ApplianceNames.ellipse]: Icons.Circle,\n [ApplianceNames.straight]: Icons.Line,\n [ApplianceNames.arrow]: Icons.Arrow,\n [ShapeType.Pentagram]: Icons.Star,\n [ShapeType.Rhombus]: Icons.Diamond,\n [ShapeType.Triangle]: Icons.Triangle,\n [ShapeType.SpeechBalloon]: Icons.SpeechBalloon,\n} as const;\n\nexport const ApplianceShapes = [\n ApplianceNames.rectangle,\n ApplianceNames.ellipse,\n ApplianceNames.straight,\n ApplianceNames.arrow,\n] as const;\n\nexport const Shapes = [\n ShapeType.Pentagram,\n ShapeType.Rhombus,\n ShapeType.Triangle,\n ShapeType.SpeechBalloon,\n] as const;\n\nexport const ItemHeight = 32 + 4;\nexport const ItemsCount = 8;\nexport const MaxHeight = ItemHeight * ItemsCount - 4;\nexport const MinHeight = ItemHeight * 2 - 4;\n","import { memo } from \"react\";\nimport { Apps } from \"./Apps\";\nimport { Arrow } from \"./Arrow\";\nimport { Circle } from \"./Circle\";\nimport { Clean } from \"./Clean\";\nimport { Clicker } from \"./Clicker\";\nimport { Collapse } from \"./Collapse\";\nimport { Diamond } from \"./Diamond\";\nimport { Down } from \"./Down\";\nimport { Eraser } from \"./Eraser\";\nimport { Expand } from \"./Expand\";\nimport { Line } from \"./Line\";\nimport { Pencil } from \"./Pencil\";\nimport { Rectangle } from \"./Rectangle\";\nimport { Selector } from \"./Selector\";\nimport { SpeechBalloon } from \"./SpeechBalloon\";\nimport { Star } from \"./Star\";\nimport { Text } from \"./Text\";\nimport { Triangle } from \"./Triangle\";\nimport { Up } from \"./Up\";\n\nexport const Icons = {\n Clicker: memo(Clicker),\n Collapse: memo(Collapse),\n Eraser: memo(Eraser),\n Expand: memo(Expand),\n Pencil: memo(Pencil),\n Selector: memo(Selector),\n Rectangle: memo(Rectangle),\n Text: memo(Text),\n Apps: memo(Apps),\n Clean: memo(Clean),\n Circle: memo(Circle),\n Line: memo(Line),\n Arrow: memo(Arrow),\n Star: memo(Star),\n Diamond: memo(Diamond),\n SpeechBalloon: memo(SpeechBalloon),\n Triangle: memo(Triangle),\n Up: memo(Up),\n Down: memo(Down),\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Apps = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <g fill={stroke}>\n <path d=\"M17.667 4.5h-3.334c-1.012 0-1.833.82-1.833 1.833V11.5h5.167c1.012 0 1.833-.82 1.833-1.833V6.333c0-1.012-.82-1.833-1.833-1.833Zm-3.334 1h3.334c.46 0 .833.373.833.833v3.334l-.006.104a.833.833 0 0 1-.827.729H13.5V6.333c0-.46.373-.833.833-.833Z\" />\n <path d=\"M6.333 19.5A1.833 1.833 0 0 1 4.5 17.667v-3.334c0-.525.221-1 .576-1.334a1.822 1.822 0 0 1-.576-1.332V8.333c0-1.012.82-1.833 1.833-1.833H10A1.5 1.5 0 0 1 11.5 8v4.5h4.167c.962 0 1.75.74 1.827 1.683l.006.15v3.334c0 1.012-.82 1.833-1.833 1.833Zm4.167-6H6.333a.833.833 0 0 0-.827.729l-.006.104v3.334c0 .46.373.833.833.833H10.5v-5Zm5.167 0H11.5v5h4.167c.46 0 .833-.373.833-.833v-3.334a.833.833 0 0 0-.833-.833ZM10 7.5H6.333a.833.833 0 0 0-.833.833v3.334c0 .46.373.833.833.833H10.5V8a.5.5 0 0 0-.41-.492L10 7.5Z\" />\n </g>\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Arrow = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path fill={stroke} d=\"M19 5v6l-2.647-2.646L5.99 18.718l-.708-.708L15.645 7.646 13 5h6Z\" />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Circle = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <rect width=\"15\" height=\"15\" x=\"4.5\" y=\"4.5\" fill=\"none\" stroke={stroke} rx=\"7.5\" />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Clean = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path\n fill={stroke}\n d=\"M9.754 11.99c0 1.856-.711 3.62-1.96 4.951l-.151.155h1.403l.855-.853h.707l.853.853h2.635l.094-.064a6.237 6.237 0 0 0 2.559-4.781l.005-.26h1a7.237 7.237 0 0 1-2.994 5.862l-.229.16-.277.083h-3l-.353-.146-.647-.647-.646.647-.354.146h-3l-.286-.91.214-.148a6.237 6.237 0 0 0 2.567-4.787l.005-.26h1Zm4.772-6.502v2l.35.039a2.98 2.98 0 0 1 2.644 2.78l.006.181h-8a2.98 2.98 0 0 1 2.65-2.961l.35-.039v-2h2Z\"\n />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Clicker = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <g fill=\"none\">\n <path d=\"M0 0h24v24H0z\" />\n <path\n fill={stroke}\n d=\"m7 5.072 10.33 7.892-4.879.549 3.232 5.598-.866.5-3.233-5.597-2.914 3.95L7 5.072Z\"\n />\n </g>\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Collapse = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path fill=\"none\" stroke={stroke} d=\"m8 10-2 2 2 2m10-8H6m12 12H6m12-4h-8m8-4h-8\" />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Diamond = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path fill=\"none\" stroke={stroke} d=\"M4.222 12 12 4.222 19.778 12 12 19.778z\" />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Down = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path fill=\"none\" stroke={stroke} d=\"m16 13-2 2-2 2-2-2-2-2m8-6-2 2-2 2-2-2-2-2\" />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Eraser = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path\n fill={stroke}\n d=\"m14.333 5.183.165.007c.494.037.978.245 1.356.623l2.333 2.333a2.15 2.15 0 0 1 0 3.04l-5.833 5.834a3.8 3.8 0 0 1-5.374 0l-1.167-1.166a2.15 2.15 0 0 1 0-3.04l7-7c.42-.42.97-.63 1.52-.63ZM11.52 8.52l-4.999 5a1.15 1.15 0 0 0 0 1.626l1.167 1.167a2.8 2.8 0 0 0 3.96 0l3.832-3.833-3.96-3.96Z\"\n />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Expand = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path fill=\"none\" stroke={stroke} d=\"m16 10 2 2-2 2M6 6h12M6 18h12M6 14h8m-8-4h8\" />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Line = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path fill={stroke} d=\"m18.01 5.282.708.708L5.99 18.718l-.708-.708z\" />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Pencil = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path\n fill={stroke}\n d=\"m17.497 4.84.116.105 1.442 1.442a1.52 1.52 0 0 1 .104 2.034l-.104.116L8.733 18.858l-4.347.756.756-4.347L15.463 4.945a1.52 1.52 0 0 1 2.034-.104ZM5.967 16.349l-.353 2.037 2.037-.354-1.683-1.683Zm8.407-8.901-7.946 7.946 2.178 2.178 7.946-7.946-2.178-2.178Zm-.728 2.2.708.707-5 5-.708-.708 5-5Zm2.596-4.055-.072.06-1.09 1.088 2.179 2.178 1.089-1.088a.52.52 0 0 0 .105-.584l-.045-.08-.06-.072-1.442-1.442a.52.52 0 0 0-.664-.06Z\"\n />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Rectangle = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path fill=\"none\" stroke={stroke} d=\"M5.5 5.5h13v13h-13z\" />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Selector = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path fill={stroke} d=\"m12 12 8 2.667-3.556 1.777L14.667 20 12 12Zm3-8v7.5h-1V5H5v9h6.5v1H4V4h11Z\" />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const SpeechBalloon = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path\n fill=\"none\"\n stroke={stroke}\n d=\"M17 4.5c.414 0 .79.168 1.06.44.272.27.44.646.44 1.06v9c0 .414-.168.79-.44 1.06a1.49 1.49 0 0 1-1.06.44h-4.207l-2.715 2.715-1.81-2.715H7a1.49 1.49 0 0 1-1.06-.44A1.495 1.495 0 0 1 5.5 15V6c0-.414.168-.79.44-1.06A1.49 1.49 0 0 1 7 4.5Z\"\n />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Star = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path\n fill=\"none\"\n stroke={stroke}\n d=\"m12 3.523 1.993 5.734 6.07.123-4.838 3.668 1.758 5.81L12 15.391l-4.983 3.467 1.758-5.81L3.938 9.38l6.069-.123L12 3.523Z\"\n />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Text = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path fill={stroke} d=\"M18.5 5.5V8h-1V6.5H13v11h2v1H9v-1h2v-11H6.5V8h-1V5.5h13Z\" />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Triangle = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path fill=\"none\" stroke={stroke} d=\"M12 6.008 19.138 18.5H4.862L12 6.008Z\" />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Up = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path fill=\"none\" stroke={stroke} d=\"m16 11-2-2-2-2-2 2-2 2m8 6-2-2-2-2-2 2-2 2\" />\n </svg>\n );\n};\n","import type { CommonProps, GenericIcon, Theme } from \"../../typings\";\nimport type { ToolbarHook } from \"./hooks\";\n\nimport clsx from \"clsx\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport React, { createContext, useState } from \"react\";\n\nimport expandPNG from \"./components/assets/expanded.png\";\n\nimport { Icon } from \"../../icons\";\nimport { useTheme } from \"../hooks\";\nimport { Content } from \"./Content\";\nimport { EmptyToolbarHook, useToolbar } from \"./hooks\";\n\nexport type ToolbarProps = CommonProps & {\n icons?: GenericIcon<\n | \"clicker\"\n | \"selector\"\n | \"pencil\"\n | \"eraser\"\n | \"clean\"\n | \"expand\"\n | \"collapse\"\n | \"up\"\n | \"down\"\n | \"text\"\n | \"apps\"\n >;\n};\n\ntype ToolbarContextType = ToolbarHook & {\n theme: Theme;\n icons?: ToolbarProps[\"icons\"];\n};\n\nexport const ToolbarContext = createContext<ToolbarContextType>({\n theme: \"light\",\n ...EmptyToolbarHook,\n});\n\nexport const name = \"fastboard-toolbar\";\n\nexport function Toolbar({ theme, icons }: ToolbarProps) {\n theme = useTheme(theme);\n\n const hook = useToolbar();\n const [expanded, setExpanded] = useState(true);\n const [pointerEvents, setPointerEvents] = useState<\"auto\" | \"none\">(\"auto\");\n const disabled = !hook.writable;\n\n return (\n <ToolbarContext.Provider value={{ theme, icons, ...hook }}>\n <AnimatePresence>\n {expanded ? (\n <motion.div\n key=\"toolbar\"\n className={clsx(name, theme)}\n initial={{ x: -100 }}\n animate={{ x: 0, transition: { duration: 0.5 } }}\n exit={{ x: -100, transition: { duration: 0.5 } }}\n onAnimationStart={() => setPointerEvents(\"none\")}\n onAnimationComplete={() => setPointerEvents(\"auto\")}\n style={{ pointerEvents }}\n >\n <Content onCollapse={() => setExpanded(false)} />\n </motion.div>\n ) : (\n <motion.div\n className={clsx(`${name}-expand-btn`, theme)}\n key=\"expand\"\n onClick={() => setExpanded(true)}\n initial={{ x: -100 }}\n animate={{ x: 0, transition: { duration: 0.5 } }}\n >\n <Icon\n fallback={<img draggable={false} src={expandPNG} className={clsx(`${name}-mask-btn`, theme)} />}\n src={disabled ? icons?.expandIconDisable : icons?.expandIcon}\n />\n </motion.div>\n )}\n </AnimatePresence>\n </ToolbarContext.Provider>\n );\n}\n","import clsx from \"clsx\";\nimport React, { useCallback, useContext, useEffect, useRef, useState } from \"react\";\nimport { Icon } from \"../../icons\";\n\nimport { clamp } from \"../../internal\";\nimport { CleanButton, ClickerButton, EraserButton, SelectorButton } from \"./components/ApplianceButtons\";\nimport { AppsButton } from \"./components/AppsButton\";\nimport { PencilButton } from \"./components/PencilButton\";\nimport { ShapesButton } from \"./components/ShapesButton\";\nimport { TextButton } from \"./components/TextButton\";\nimport { DownButton, UpButton } from \"./components/UpDownButtons\";\nimport { ItemHeight, ItemsCount, MaxHeight, MinHeight } from \"./const\";\nimport { name, ToolbarContext } from \"./Toolbar\";\n\nimport collapsePNG from \"./components/assets/collapsed.png\";\n\nexport interface ContextProps {\n onCollapse: () => void;\n}\n\nexport function Content({ onCollapse }: ContextProps) {\n const { theme, icons, writable } = useContext(ToolbarContext);\n const ref = useRef<HTMLDivElement>(null);\n const [scrollTop, setScrollTop] = useState(0);\n const [parentHeight, setParentHeight] = useState(0);\n const disabled = !writable;\n\n const needScroll = parentHeight < ItemHeight * ItemsCount + 48;\n const sectionHeight = clamp(parentHeight - 48 * (needScroll ? 3 : 1), MinHeight, MaxHeight);\n const scrollBuffer = Math.max(parentHeight - sectionHeight - 1, 0);\n const disableScrollUp = scrollTop === 0;\n const disableScrollDown = scrollTop === scrollBuffer;\n\n const scrollTo = useCallback(\n (height: number) => {\n setScrollTop(clamp(scrollTop + height, 0, scrollBuffer));\n },\n [scrollBuffer, scrollTop]\n );\n\n useEffect(() => {\n if (ref.current) {\n ref.current.scrollTop = scrollTop;\n }\n }, [scrollTop]);\n\n useEffect(() => {\n const container = ref.current?.parentElement?.parentElement;\n if (container) {\n const { paddingTop, paddingBottom } = getComputedStyle(container);\n const padding = parseInt(paddingTop) + parseInt(paddingBottom) || 0;\n const resizeObserver = new ResizeObserver(() => {\n setParentHeight(container.getBoundingClientRect().height - padding);\n });\n resizeObserver.observe(container);\n return () => resizeObserver.disconnect();\n }\n }, []);\n\n return (\n <>\n {needScroll && <UpButton scrollTo={scrollTo} disabled={disableScrollUp} />}\n <div\n ref={ref}\n className={clsx(`${name}-section`)}\n style={{\n height: `${sectionHeight}px`,\n overflow: needScroll ? \"hidden\" : \"visible\",\n }}\n >\n <ClickerButton />\n <SelectorButton />\n <PencilButton />\n <TextButton />\n <ShapesButton />\n <EraserButton />\n <CleanButton />\n <AppsButton />\n </div>\n {needScroll && <DownButton scrollTo={scrollTo} disabled={disableScrollDown} />}\n <div className={clsx(\"fastboard-toolbar-mask\", theme)} onClick={onCollapse}>\n <Icon\n fallback={<img draggable={false} className={clsx(`${name}-mask-btn`, theme)} src={collapsePNG} />}\n src={disabled ? icons?.expandIconDisable : icons?.expandIcon}\n />\n </div>\n </>\n );\n}\n","import type { HotKey } from \"white-web-sdk\";\n\nimport React, { useCallback, useContext } from \"react\";\nimport { ApplianceNames } from \"white-web-sdk\";\n\nimport { useTranslation } from \"../../../i18n\";\nimport { Icon } from \"../../../icons\";\nimport { defaultHotKeys } from \"../../../internal\";\nimport { useFastboardApp } from \"../../hooks\";\nimport { Icons } from \"../icons\";\nimport { ToolbarContext } from \"../Toolbar\";\nimport { Button } from \"./Button\";\n\nexport function renderToolTip(text: string | undefined, hotkey?: HotKey) {\n if (!(typeof hotkey === \"string\")) return text;\n return (\n <span className=\"fastboard-toolbar-tooltip\">\n <span>{text}</span>\n <span className=\"fastboard-toolbar-hotkey\">{hotkey.toUpperCase()}</span>\n </span>\n );\n}\n\nexport function ClickerButton() {\n const app = useFastboardApp();\n const { t } = useTranslation();\n const { theme, icons, writable, setAppliance, memberState } = useContext(ToolbarContext);\n\n const changeAppliance = useCallback(() => setAppliance(ApplianceNames.clicker), [setAppliance]);\n\n const shortcut = app.hotKeys?.changeToClick;\n const appliance = memberState?.currentApplianceName;\n const active = appliance === ApplianceNames.clicker;\n const disabled = !writable;\n\n return (\n <Button content={renderToolTip(t(\"clicker\"), shortcut)} onClick={changeAppliance} active={active}>\n <Icon\n fallback={<Icons.Clicker theme={theme} active={active} />}\n src={disabled ? icons?.clickerIconDisable : icons?.clickerIcon}\n alt=\"[clicker]\"\n />\n </Button>\n );\n}\n\nexport function SelectorButton() {\n const app = useFastboardApp();\n const { t } = useTranslation();\n const { theme, icons, writable, setAppliance, memberState } = useContext(ToolbarContext);\n\n const changeAppliance = useCallback(() => setAppliance(ApplianceNames.selector), [setAppliance]);\n\n const appliance = memberState?.currentApplianceName;\n const active = appliance === ApplianceNames.selector;\n const disabled = !writable;\n const shortcut = (app.hotKeys || defaultHotKeys).changeToSelector;\n\n return (\n <Button content={renderToolTip(t(\"selector\"), shortcut)} onClick={changeAppliance} active={active}>\n <Icon\n fallback={<Icons.Selector theme={theme} active={active} />}\n src={disabled ? icons?.selectorIconDisable : icons?.selectorIcon}\n alt=\"[selector]\"\n />\n </Button>\n );\n}\n\nexport function EraserButton() {\n const app = useFastboardApp();\n const { t } = useTranslation();\n const { theme, icons, writable, setAppliance, memberState } = useContext(ToolbarContext);\n\n const changeAppliance = useCallback(() => setAppliance(ApplianceNames.eraser), [setAppliance]);\n\n const appliance = memberState?.currentApplianceName;\n const active = appliance === ApplianceNames.eraser;\n const disabled = !writable;\n const shortcut = (app?.hotKeys || defaultHotKeys).changeToEraser;\n\n return (\n <Button content={renderToolTip(t(\"eraser\"), shortcut)} onClick={changeAppliance} active={active}>\n <Icon\n fallback={<Icons.Eraser theme={theme} active={active} />}\n src={disabled ? icons?.eraserIconDisable : icons?.eraserIcon}\n alt=\"[eraser]\"\n />\n </Button>\n );\n}\n\nexport function CleanButton() {\n const { t } = useTranslation();\n const { theme, icons, writable, cleanCurrentScene } = useContext(ToolbarContext);\n\n const disabled = !writable;\n\n return (\n <Button content={t(\"clean\")} onClick={cleanCurrentScene}>\n <Icon\n fallback={<Icons.Clean theme={theme} />}\n src={disabled ? icons?.cleanIconDisable : icons?.cleanIcon}\n alt=\"[clean]\"\n />\n </Button>\n );\n}\n","import type { PropsWithChildren } from \"react\";\n\nimport clsx from \"clsx\";\nimport React, { forwardRef, useContext } from \"react\";\nimport Tippy from \"@tippyjs/react\";\n\nimport { RightOffset } from \"../../../theme\";\nimport { ToolbarContext } from \"../Toolbar\";\n\ntype ButtonProps = PropsWithChildren<{\n content: React.ReactNode;\n disabled?: boolean;\n active?: boolean;\n onClick?: () => void;\n interactive?: boolean;\n placement?: \"top\" | \"right\"; // not using tippy.js's placement to satisfy dts\n}>;\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>((props, ref) => {\n const { content, disabled, active, onClick, interactive, placement = \"right\", children } = props;\n const { writable, theme } = useContext(ToolbarContext);\n\n return (\n <Tippy\n className=\"fastboard-tip\"\n content={content}\n interactive={interactive}\n theme={theme}\n disabled={disabled || !writable}\n placement={placement}\n offset={placement.includes(\"right\") ? RightOffset : undefined}\n delay={[1000, 400]}\n duration={300}\n >\n <button\n ref={ref}\n className={clsx(\"fastboard-toolbar-btn\", theme, { active })}\n onClick={onClick}\n disabled={disabled || !writable}\n >\n {children}\n </button>\n </Tippy>\n );\n});\n","import clsx from \"clsx\";\nimport Tippy from \"@tippyjs/react\";\nimport React, { useContext } from \"react\";\n\nimport vscodePNG from \"./assets/vscode.png\";\nimport geogebraPNG from \"./assets/geogebra.png\";\nimport countdownPNG from \"./assets/countdown.png\";\n\nimport { Icon } from \"../../../icons\";\nimport { RightOffset } from \"../../../theme\";\nimport { Icons } from \"../icons\";\nimport { ToolbarContext } from \"../Toolbar\";\nimport { Button } from \"./Button\";\nimport { useFastboardApp } from \"../../hooks\";\nimport { Loading } from \"../icons/Loading\";\n\nexport interface AppsButtonProps {\n content?: React.ReactNode;\n onClick?: () => void;\n}\n\nexport function AppsButton({ content, onClick }: AppsButtonProps) {\n const { theme, icons, writable } = useContext(ToolbarContext);\n\n const disabled = !writable;\n\n const button = (\n <Button content=\"Apps\" onClick={onClick}>\n <Icon\n fallback={<Icons.Apps theme={theme} />}\n src={disabled ? icons?.appsIconDisable : icons?.appsIcon}\n alt=\"[apps]\"\n />\n </Button>\n );\n\n return content === false ? (\n button\n ) : (\n <span className=\"fastboard-toolbar-btn-interactive\">\n <Tippy\n className=\"fastboard-tip\"\n content={renderAppsButtonContent(content)}\n theme={theme}\n placement=\"right-end\"\n trigger=\"click\"\n offset={RightOffset}\n arrow={false}\n interactive\n >\n {button}\n </Tippy>\n </span>\n );\n}\n\nfunction renderAppsButtonContent(content?: React.ReactNode) {\n return (\n <div className=\"fastboard-toolbar-panel apps\">\n <div className=\"fastboard-toolbar-apps\">{content || <DefaultApps />}</div>\n </div>\n );\n}\n\nfunction DefaultApps() {\n const app = useFastboardApp();\n const { appsStatus } = useContext(ToolbarContext);\n\n return (\n <>\n <AppIcon\n title=\"Code Editor\"\n src={vscodePNG}\n alt=\"[code editor]\"\n appStatus={appsStatus[\"Monaco\"]}\n onClick={app?.insertCodeEditor.bind(app)}\n />\n <AppIcon\n title=\"GeoGebra\"\n src={geogebraPNG}\n alt=\"[geogebra]\"\n appStatus={appsStatus[\"GeoGebra\"]}\n onClick={app?.insertGeoGebra.bind(app)}\n />\n <AppIcon\n title=\"Countdown\"\n src={countdownPNG}\n alt=\"[countdown]\"\n appStatus={appsStatus[\"Countdown\"]}\n onClick={app?.insertCountdown.bind(app)}\n />\n </>\n );\n}\n\ninterface AppIconProps {\n title: string;\n src: string;\n alt: string;\n appStatus?: {\n status: \"idle\" | \"loading\" | \"failed\";\n reason?: string | undefined;\n };\n onClick?: () => void;\n}\n\nfunction AppIcon({ title, src, alt, appStatus, onClick }: AppIconProps) {\n const { theme } = useContext(ToolbarContext);\n const { status = \"idle\", reason } = appStatus || {};\n const loading = status === \"loading\";\n const failed = status === \"failed\";\n const unifiedTitle = loading ? \"loading\" : failed ? reason : title;\n\n return (\n <div className=\"fastboard-toolbar-app-icon-wrapper\">\n <span\n className={clsx(\"fastboard-toolbar-app-icon\", {\n \"fastboard-toolbar-app-is-loading\": loading,\n \"fastboard-toolbar-app-is-failed\": failed,\n })}\n >\n <Button disabled={failed || loading} placement=\"top\" content={unifiedTitle} onClick={onClick}>\n <img src={src} alt={alt} title={unifiedTitle} />\n </Button>\n <span className=\"fastboard-toolbar-app-icon-text\">{title}</span>\n </span>\n {loading && (\n <span className=\"fastboard-toolbar-app-icon-mask\">\n <Loading theme={theme} />\n </span>\n )}\n </div>\n );\n}\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Loading = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path fill={stroke} d=\"M12 4V2A10 10 0 0 0 2 12h2a8 8 0 0 1 8-8Z\"></path>\n </svg>\n );\n};\n","import Tippy from \"@tippyjs/react\";\nimport React, { useCallback, useContext } from \"react\";\nimport { ApplianceNames } from \"white-web-sdk\";\n\nimport { useTranslation } from \"../../../i18n\";\nimport { Icon } from \"../../../icons\";\nimport { defaultHotKeys } from \"../../../internal\";\nimport { RightOffset } from \"../../../theme\";\nimport { useFastboardApp } from \"../../hooks\";\nimport { Icons } from \"../icons\";\nimport { ToolbarContext } from \"../Toolbar\";\nimport { renderToolTip } from \"./ApplianceButtons\";\nimport { Button } from \"./Button\";\nimport { ColorBox } from \"./ColorBox\";\nimport { CutLine } from \"./CutLine\";\nimport { Slider } from \"./Slider\";\n\nexport function PencilButton() {\n const app = useFastboardApp();\n const { t } = useTranslation();\n\n const { theme, icons, writable, setAppliance, memberState } = useContext(ToolbarContext);\n\n const changeAppliance = useCallback(() => {\n setAppliance(ApplianceNames.pencil);\n }, [setAppliance]);\n\n const appliance = memberState?.currentApplianceName;\n const active = appliance === ApplianceNames.pencil;\n const disabled = !writable;\n const shortcut = (app?.hotKeys || defaultHotKeys).changeToPencil;\n\n return (\n <span className=\"fastboard-toolbar-btn-interactive\">\n <Tippy\n className=\"fastboard-tip\"\n content={renderPencilButtonContent()}\n theme={theme}\n placement=\"right-start\"\n trigger=\"click\"\n offset={RightOffset}\n arrow={false}\n interactive\n >\n <Button content={renderToolTip(t(\"pencil\"), shortcut)} active={active} onClick={changeAppliance}>\n <Icon\n fallback={<Icons.Pencil theme={theme} active={active} />}\n src={disabled ? icons?.pencilIconDisable : icons?.pencilIcon}\n alt=\"[pencil]\"\n />\n <span className=\"fastboard-toolbar-triangle\" />\n </Button>\n </Tippy>\n </span>\n );\n}\n\nfunction renderPencilButtonContent() {\n return (\n <div className=\"fastboard-toolbar-panel pencil\">\n <Slider />\n <CutLine />\n <ColorBox />\n </div>\n );\n}\n","import type { Color } from \"white-web-sdk\";\n\nimport clsx from \"clsx\";\nimport React, { useContext } from \"react\";\n\nimport { isEqualArray } from \"../../../internal\";\nimport { ToolbarContext } from \"../Toolbar\";\n\nconst colors: Record<string, Color> = {\n \"#E02020\": [224, 32, 32],\n \"#F7B500\": [247, 181, 0],\n \"#6DD400\": [109, 212, 0],\n \"#32C5FF\": [50, 197, 255],\n \"#0091FF\": [0, 145, 255],\n \"#6236FF\": [98, 54, 255],\n \"#B620E0\": [182, 32, 224],\n \"#6D7278\": [109, 114, 120],\n};\n\nconst colorKeys = Object.keys(colors);\n\nexport function ColorBox() {\n const { theme, memberState, setStrokeColor, writable } = useContext(ToolbarContext);\n\n const strokeColor = memberState?.strokeColor;\n const disabled = !writable;\n\n return (\n <div className={clsx(\"fastboard-toolbar-color-box\", theme)}>\n {colorKeys.map((key: string) => (\n <div\n key={key}\n className={clsx(\"fastboard-toolbar-color-item\", theme)}\n onClick={() => setStrokeColor(colors[key])}\n >\n <div\n className={clsx(\"fastboard-toolbar-color-border\", theme, {\n active: strokeColor && isEqualArray(strokeColor, colors[key]),\n })}\n >\n <button\n className={clsx(\"fastboard-toolbar-color-btn\")}\n style={{ background: key }}\n disabled={disabled}\n onClick={ev => {\n ev.stopPropagation();\n setStrokeColor(colors[key]);\n }}\n />\n </div>\n </div>\n ))}\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport React, { useContext } from \"react\";\nimport { ToolbarContext, name } from \"../Toolbar\";\n\nexport function CutLine() {\n const { theme } = useContext(ToolbarContext);\n return <span className={clsx(`${name}-cut-line`, theme)} />;\n}\n","import clsx from \"clsx\";\nimport RcSlider from \"rc-slider\";\nimport React, { useContext } from \"react\";\n\nimport { themes } from \"../../../theme\";\nimport { ToolbarContext } from \"../Toolbar\";\n\nexport function Slider() {\n const { theme, writable, memberState, setStrokeWidth } = useContext(ToolbarContext);\n const { activeColor } = themes[theme];\n\n const strokeWidth = memberState?.strokeWidth || 0;\n\n return (\n <RcSlider\n disabled={!writable}\n className={clsx(\"fastboard-toolbar-slider\", theme)}\n trackStyle={{ background: activeColor }}\n handleStyle={{ border: `1px solid ${activeColor}` }}\n value={strokeWidth}\n onChange={setStrokeWidth}\n min={1}\n max={32}\n />\n );\n}\n","import type { ShapeType } from \"white-web-sdk\";\nimport type { IconProps } from \"../../../typings\";\n\nimport Tippy from \"@tippyjs/react\";\nimport React, { useCallback, useContext } from \"react\";\nimport { ApplianceNames } from \"white-web-sdk\";\n\nimport { useTranslation } from \"../../../i18n\";\nimport { RightOffset } from \"../../../theme\";\nimport { ApplianceShapes, Shapes, ShapesMap } from \"../const\";\nimport { ToolbarContext } from \"../Toolbar\";\nimport { Button } from \"./Button\";\nimport { ColorBox } from \"./ColorBox\";\nimport { CutLine } from \"./CutLine\";\nimport { Slider } from \"./Slider\";\n\nconst ShapeTypes = new Set([...ApplianceShapes, ...Shapes]);\n\nexport function ShapesButton() {\n const { t } = useTranslation();\n const { writable, theme, memberState, lastShape, setAppliance } = useContext(ToolbarContext);\n\n const appliance = memberState?.currentApplianceName;\n const shape = memberState?.shapeType;\n\n const key = (appliance === ApplianceNames.shape ? shape : appliance) as keyof typeof ShapesMap;\n\n const active = ShapeTypes.has(key);\n\n const CurrentIcon = ShapesMap[lastShape];\n\n const onClick = useCallback(() => {\n if ((ApplianceShapes as readonly ApplianceNames[]).includes(lastShape as ApplianceNames)) {\n setAppliance(lastShape as ApplianceNames);\n } else if (Shapes.includes(lastShape as ShapeType)) {\n setAppliance(ApplianceNames.shape, lastShape as ShapeType);\n }\n }, [lastShape, setAppliance]);\n\n return (\n <span className=\"fastboard-toolbar-btn-interactive\">\n <Tippy\n className=\"fastboard-tip\"\n content={renderShapesButtonContent()}\n theme={theme}\n placement=\"right-start\"\n trigger=\"click\"\n offset={RightOffset}\n arrow={false}\n interactive\n >\n <Button content={t(\"shape\")} active={active} disabled={!writable} onClick={onClick}>\n <CurrentIcon theme={theme} active={active} />\n <span className=\"fastboard-toolbar-triangle\" />\n </Button>\n </Tippy>\n </span>\n );\n}\n\nfunction renderShapesButtonContent() {\n return (\n <div className=\"fastboard-toolbar-panel shapes\">\n <ShapesBox />\n <CutLine />\n <Slider />\n <CutLine />\n <ColorBox />\n </div>\n );\n}\n\nexport function ShapesBox() {\n const { t } = useTranslation();\n\n return (\n <div className=\"fastboard-toolbar-shapes\">\n {ApplianceShapes.map(Appliance => (\n <ApplianceShapeButton\n key={Appliance}\n content={t(Appliance)}\n Appliance={Appliance}\n Icon={ShapesMap[Appliance]}\n />\n ))}\n {Shapes.map(shape => (\n <ShapeShapeButton key={shape} content={t(shape)} shape={shape} Icon={ShapesMap[shape]} />\n ))}\n </div>\n );\n}\n\ninterface ApplianceShapeButtonProps {\n content?: string;\n Appliance: ApplianceNames;\n Icon: React.ComponentType<IconProps>;\n}\n\nfunction ApplianceShapeButton({ content, Appliance, Icon }: ApplianceShapeButtonProps) {\n const { theme, writable, setAppliance, memberState } = useContext(ToolbarContext);\n\n const current = memberState?.currentApplianceName;\n const disabled = !writable;\n\n return (\n <Button content={content} disabled={disabled} placement=\"top\" onClick={() => setAppliance(Appliance)}>\n <Icon theme={theme} active={current === Appliance} />\n </Button>\n );\n}\n\ninterface ShapeShapeButtonProps {\n content?: string;\n shape: ShapeType;\n Icon: React.ComponentType<IconProps>;\n}\n\nfunction ShapeShapeButton({ content, shape, Icon }: ShapeShapeButtonProps) {\n const { theme, writable, setAppliance, memberState } = useContext(ToolbarContext);\n\n const appliance = memberState?.currentApplianceName;\n const current = appliance === ApplianceNames.shape && memberState?.shapeType;\n const disabled = !writable;\n\n return (\n <Button\n content={content}\n disabled={disabled}\n placement=\"top\"\n onClick={() => setAppliance(ApplianceNames.shape, shape)}\n >\n <Icon theme={theme} active={current === shape} />\n </Button>\n );\n}\n","import Tippy from \"@tippyjs/react\";\nimport React, { useCallback, useContext } from \"react\";\nimport { ApplianceNames } from \"white-web-sdk\";\n\nimport { useTranslation } from \"../../../i18n\";\nimport { Icon } from \"../../../icons\";\nimport { defaultHotKeys } from \"../../../internal\";\nimport { RightOffset } from \"../../../theme\";\nimport { useFastboardApp } from \"../../hooks\";\nimport { Icons } from \"../icons\";\nimport { ToolbarContext } from \"../Toolbar\";\nimport { renderToolTip } from \"./ApplianceButtons\";\nimport { Button } from \"./Button\";\nimport { ColorBox } from \"./ColorBox\";\n\nexport function TextButton() {\n const app = useFastboardApp();\n const { t } = useTranslation();\n\n const { theme, icons, writable, setAppliance, memberState } = useContext(ToolbarContext);\n\n const changeAppliance = useCallback(() => {\n setAppliance(ApplianceNames.text);\n }, [setAppliance]);\n\n const appliance = memberState?.currentApplianceName;\n const active = appliance === ApplianceNames.text;\n const disabled = !writable;\n const shortcut = (app?.hotKeys || defaultHotKeys).changeToText;\n\n return (\n <span className=\"fastboard-toolbar-btn-interactive\">\n <Tippy\n className=\"fastboard-tip\"\n content={renderTextButtonContent()}\n theme={theme}\n placement=\"right-start\"\n trigger=\"click\"\n offset={RightOffset}\n arrow={false}\n interactive\n >\n <Button content={renderToolTip(t(\"text\"), shortcut)} active={active} onClick={changeAppliance}>\n <Icon\n fallback={<Icons.Text theme={theme} active={active} />}\n src={disabled ? icons?.textIconDisable : icons?.textIcon}\n alt=\"[text]\"\n />\n <span className=\"fastboard-toolbar-triangle\" />\n </Button>\n </Tippy>\n </span>\n );\n}\n\nfunction renderTextButtonContent() {\n return (\n <div className=\"fastboard-toolbar-panel text\">\n <ColorBox />\n </div>\n );\n}\n","import React, { useCallback, useContext } from \"react\";\n\nimport { Icon } from \"../../../icons\";\nimport { Icons } from \"../icons\";\nimport { Button } from \"./Button\";\nimport { CutLine } from \"./CutLine\";\nimport { ToolbarContext } from \"../Toolbar\";\nimport { ItemHeight } from \"../const\";\n\nexport interface UpButtonProps {\n disabled: boolean;\n scrollTo: (height: number) => void;\n}\n\nexport function UpButton({ disabled, scrollTo }: UpButtonProps) {\n const { theme, icons } = useContext(ToolbarContext);\n const scrollUp = useCallback(() => scrollTo(-ItemHeight), [scrollTo]);\n\n return (\n <>\n <Button content=\"Up\" disabled={disabled} onClick={scrollUp}>\n <Icon\n fallback={<Icons.Up theme={theme} />}\n src={disabled ? icons?.upIconDisable : icons?.upIcon}\n alt=\"[up]\"\n />\n </Button>\n <CutLine />\n </>\n );\n}\n\nexport function DownButton({ disabled, scrollTo }: UpButtonProps) {\n const { theme, icons } = useContext(ToolbarContext);\n const scrollDown = useCallback(() => scrollTo(ItemHeight), [scrollTo]);\n\n return (\n <>\n <CutLine />\n <Button content=\"Down\" disabled={disabled} onClick={scrollDown}>\n <Icon\n fallback={<Icons.Down theme={theme} />}\n src={disabled ? icons?.downIconDisable : icons?.downIcon}\n alt=\"[down]\"\n />\n </Button>\n </>\n );\n}\n","import type { DependencyList } from \"react\";\nimport type { Player } from \"white-web-sdk\";\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { PlayerPhase } from \"white-web-sdk\";\nimport { useLastValue } from \"../../internal/hooks\";\n\nconst EMPTY_ARRAY: DependencyList = [];\n\nfunction useForceUpdate() {\n const [, forceUpdate_] = useState({});\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useCallback(() => forceUpdate_({}), EMPTY_ARRAY);\n}\n\nexport function usePlayerControl(player?: Player | null) {\n const togglePlay = useCallback(() => {\n if (player) {\n switch (player.phase) {\n case PlayerPhase.WaitingFirstFrame:\n case PlayerPhase.Pause:\n case PlayerPhase.Ended: {\n player.play();\n break;\n }\n case PlayerPhase.Playing: {\n player.pause();\n break;\n }\n }\n }\n }, [player]);\n\n const seekToProgressTime = useCallback(\n (time: number) => {\n if (player) {\n player.seekToProgressTime(time);\n }\n },\n [player]\n );\n\n const lastPlayer = useLastValue(player);\n\n const forceUpdate = useForceUpdate();\n\n const setSpeed = useCallback(\n (speed: number) => {\n if (player) {\n player.playbackSpeed = speed;\n forceUpdate();\n }\n },\n [forceUpdate, player]\n );\n\n useEffect(() => {\n if (!lastPlayer && player) {\n forceUpdate();\n }\n }, [forceUpdate, lastPlayer, player]);\n\n useEffect(() => {\n if (player) {\n player.callbacks.on(\"onPhaseChanged\", forceUpdate);\n player.callbacks.on(\"onProgressTimeChanged\", forceUpdate);\n return () => {\n player.callbacks.off(\"onPhaseChanged\", forceUpdate);\n player.callbacks.off(\"onProgressTimeChanged\", forceUpdate);\n };\n }\n }, [forceUpdate, player]);\n\n const phase = player ? player.phase : PlayerPhase.WaitingFirstFrame;\n const currentTime = player ? player.progressTime : 0;\n const totalTime = player ? player.timeDuration : 0;\n const speed = player ? player.playbackSpeed : 1;\n\n return {\n phase,\n currentTime,\n totalTime,\n speed,\n setSpeed,\n togglePlay,\n seekToProgressTime,\n };\n}\n","import type { FastboardPlayer } from \"@netless/fastboard-core\";\nimport type { CommonProps, GenericIcon } from \"../../typings\";\n\nimport Tippy from \"@tippyjs/react\";\nimport clsx from \"clsx\";\nimport RcSlider from \"rc-slider\";\nimport React, { useEffect, useState } from \"react\";\nimport { PlayerPhase } from \"white-web-sdk\";\n\nimport { useTranslation } from \"../../i18n\";\nimport { Icon } from \"../../icons\";\nimport { themes, TopOffset } from \"../../theme\";\nimport { useTheme } from \"../hooks\";\nimport { Button } from \"./components/Button\";\nimport { usePlayerControl } from \"./hooks\";\nimport { Icons } from \"./icons\";\n\nexport type PlayerControlProps = {\n autoHide?: boolean;\n player?: FastboardPlayer;\n} & Omit<CommonProps, \"room\"> &\n GenericIcon<\"play\" | \"pause\" | \"loading\">;\n\nexport const name = \"fastboard-player-control\";\n\nexport function PlayerControl({ theme, autoHide = false, player: player_, ...icons }: PlayerControlProps) {\n theme = useTheme(theme);\n const { t } = useTranslation();\n\n const [currentTime, setCurrentTime] = useState(0);\n const player = usePlayerControl(player_?.player);\n\n useEffect(() => {\n setCurrentTime(player.currentTime);\n }, [player.currentTime]);\n\n useEffect(() => {\n if (player.currentTime !== currentTime) {\n player.seekToProgressTime(currentTime);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [currentTime]);\n\n const isLoading = player.phase === PlayerPhase.WaitingFirstFrame || player.phase === PlayerPhase.Buffering;\n const isPlaying = player.phase === PlayerPhase.Playing;\n\n const { activeColor } = themes[theme];\n\n return (\n <div className={clsx(name, theme, { \"auto-hide\": autoHide })}>\n <button\n className={clsx(`${name}-btn`, isLoading ? \"loading\" : isPlaying ? \"pause\" : \"play\", theme)}\n disabled={isLoading}\n onClick={player.togglePlay}\n >\n <Icon\n fallback={\n isLoading ? (\n <Icons.Loading theme={theme} />\n ) : isPlaying ? (\n <Icons.Pause theme={theme} />\n ) : (\n <Icons.Play theme={theme} />\n )\n }\n src={isLoading ? icons.loadingIcon : isPlaying ? icons.pauseIcon : icons.playIcon}\n alt={isLoading ? \"[loading]\" : isPlaying ? \"[pause]\" : \"[play]\"}\n />\n </button>\n <span className={clsx(`${name}-slider`, { loading: isLoading }, theme)}>\n <RcSlider\n disabled={isLoading}\n trackStyle={{ background: activeColor }}\n handleStyle={{ border: `1px solid ${activeColor}` }}\n value={currentTime}\n onChange={setCurrentTime}\n min={0}\n max={player.totalTime}\n step={100}\n />\n </span>\n <span className={clsx(`${name}-current`, theme)}>{renderTime(player.currentTime)}</span>\n <span className={clsx(`${name}-slash`, theme)}>/</span>\n <span className={clsx(`${name}-total`, theme)}>{renderTime(player.totalTime)}</span>\n <span className={`${name}-btn-interactive`}>\n <Tippy\n className=\"fastboard-tip\"\n content={renderSpeeds(player)}\n theme={theme}\n placement=\"top-end\"\n trigger=\"click\"\n offset={TopOffset}\n arrow={false}\n interactive\n >\n <Button content={t(\"speed\")} theme={theme} disabled={isLoading}>\n <span className={clsx(`${name}-speed-text`, theme)}>{player.speed}x</span>\n </Button>\n </Tippy>\n </span>\n </div>\n );\n}\n\nfunction renderTime(ms: number) {\n let seconds = ms / 1000;\n const minutes = Math.floor(seconds / 60);\n seconds = Math.floor(seconds) % 60;\n\n return `${String(minutes).padStart(2, \"0\")}` + `:${String(seconds).padStart(2, \"0\")}`;\n}\n\nconst Speeds = [2.0, 1.5, 1.25, 1.0, 0.75, 0.5];\n\nfunction renderSpeeds({ speed: current, setSpeed }: { speed: number; setSpeed: (speed: number) => void }) {\n return (\n <div className={clsx(`${name}-panel`, \"speed\")}>\n {Speeds.map(speed => (\n <button\n className={clsx(`${name}-btn`, \"speed\", {\n active: speed === current,\n })}\n key={speed}\n onClick={() => setSpeed(speed)}\n >\n {speed}x\n </button>\n ))}\n </div>\n );\n}\n","import type { Theme } from \"../../../typings\";\n\nimport clsx from \"clsx\";\nimport React, { forwardRef, type PropsWithChildren } from \"react\";\nimport Tippy from \"@tippyjs/react\";\n\nimport { TopOffset } from \"../../../theme\";\n\ntype ButtonProps = PropsWithChildren<{\n theme: Theme;\n content: React.ReactNode;\n disabled?: boolean;\n active?: boolean;\n onClick?: () => void;\n interactive?: boolean;\n placement?: \"top\" | \"right\"; // not using tippy.js's placement to satisfy dts\n}>;\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>((props, ref) => {\n const { theme, content, disabled, active, onClick, interactive, placement = \"top\", children } = props;\n\n return (\n <Tippy\n className=\"fastboard-tip\"\n content={content}\n interactive={interactive}\n theme={theme}\n disabled={disabled}\n placement={placement}\n offset={TopOffset}\n delay={[1000, 400]}\n duration={300}\n >\n <button\n ref={ref}\n className={clsx(\"fastboard-player-control-btn\", theme, { active })}\n onClick={onClick}\n disabled={disabled}\n >\n {children}\n </button>\n </Tippy>\n );\n});\n","import { memo } from \"react\";\nimport { Loading } from \"./Loading\";\nimport { Pause } from \"./Pause\";\nimport { Play } from \"./Play\";\n\nexport const Icons = {\n Play: memo(Play),\n Pause: memo(Pause),\n Loading: memo(Loading),\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Loading = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path d=\"M12 4V2A10 10 0 0 0 2 12h2a8 8 0 0 1 8-8z\" fill={stroke}></path>\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Pause = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path d=\"M14 19h4V5h-4M6 19h4V5H6v14z\" fill={stroke}></path>\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Play = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path d=\"M8 5.14v14l11-7l-11-7z\" fill={stroke}></path>\n </svg>\n );\n};\n","import type { FastboardApp } from \"@netless/fastboard-core\";\nimport type { ForwardedRef } from \"react\";\nimport type { Language, Theme } from \"../typings\";\n\nimport React, { forwardRef, useCallback, useEffect } from \"react\";\nimport { createI18n, I18nContext } from \"../i18n\";\nimport { useAsyncValue, useForceUpdate } from \"../internal\";\nimport { FastboardAppContext, ThemeContext, useFastboardApp, useHideControls } from \"./hooks\";\nimport { PageControl } from \"./PageControl\";\nimport { RedoUndo } from \"./RedoUndo\";\nimport { Toolbar } from \"./Toolbar\";\nimport { ZoomControl } from \"./ZoomControl\";\nimport { hideAll } from \"./tippy-util\";\n\nexport interface FastboardProps {\n app?: FastboardApp | null;\n theme?: Theme;\n layout?: { Toolbar?: boolean; RedoUndo?: boolean; ZoomControl?: boolean; PageControl?: boolean };\n language?: Language;\n}\n\nexport type DivProps = React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>;\nexport type WithForwardedRef<T = HTMLDivElement> = { forwardedRef: ForwardedRef<T> };\n\nexport const Fastboard = /* @__PURE__ */ forwardRef<HTMLDivElement, FastboardProps & DivProps>(\n function Fastboard({ app, theme, layout, language, ...restProps }, ref) {\n if (!app) {\n return <div className=\"fastboard-root\" ref={ref} {...restProps} />;\n }\n\n return (\n <FastboardAppContext.Provider value={app}>\n <FastboardInternal forwardedRef={ref} {...{ theme, layout, language }} {...restProps} />\n </FastboardAppContext.Provider>\n );\n }\n);\n\nfunction FastboardInternal({\n forwardedRef,\n language,\n layout = {},\n theme = \"light\",\n children,\n ...restProps\n}: Omit<FastboardProps, \"app\"> & DivProps & WithForwardedRef) {\n const app = useFastboardApp();\n const forceUpdate = useForceUpdate();\n const i18n = useAsyncValue(() => createI18n({ language }));\n\n useEffect(() => {\n if (i18n) i18n.changeLanguage(language);\n forceUpdate();\n }, [forceUpdate, i18n, language]);\n\n useEffect(() => {\n app.manager.setPrefersColorScheme(theme);\n }, [app, theme]);\n\n const useWhiteboard = useCallback(\n (container: HTMLDivElement | null) => {\n if (container && app) app.bindContainer(container);\n },\n [app]\n );\n\n const hideControls = useHideControls();\n const showControls = !hideControls;\n\n const {\n Toolbar: toolbar = showControls || hideControls === \"toolbar-only\",\n RedoUndo: redo_undo = showControls,\n ZoomControl: zoom_control = showControls,\n PageControl: page_control = showControls,\n } = layout;\n\n return (\n <ThemeContext.Provider value={theme}>\n <I18nContext.Provider value={i18n}>\n <div {...restProps} className=\"fastboard-root\" ref={forwardedRef}>\n <div className=\"fastboard-view\" ref={useWhiteboard} onTouchStartCapture={hideAll} />\n {children ? (\n children\n ) : (\n <>\n {toolbar && (\n <div className=\"fastboard-left\">\n <Toolbar />\n </div>\n )}\n {(redo_undo || zoom_control) && (\n <div className=\"fastboard-bottom-left\">\n {redo_undo && <RedoUndo />}\n {zoom_control && <ZoomControl />}\n </div>\n )}\n {page_control && (\n <div className=\"fastboard-bottom-right\">\n <PageControl />\n </div>\n )}\n </>\n )}\n </div>\n </I18nContext.Provider>\n </ThemeContext.Provider>\n );\n}\n","import type { Instance } from \"tippy.js\";\n\nexport function hideAll() {\n Array.from(document.querySelectorAll(\"[data-tippy-root]\")).forEach(e => {\n const instance = (e as unknown as { _tippy?: Instance })._tippy;\n if (instance) instance.hide();\n });\n}\n","import type { FastboardPlayer } from \"@netless/fastboard-core\";\nimport type { DivProps } from \"./Fastboard\";\nimport type { Theme } from \"../typings\";\n\nimport React, { forwardRef, useCallback } from \"react\";\nimport { PlayerControl } from \"./PlayerControl\";\n\nexport interface ReplayFastboardProps {\n player?: FastboardPlayer | null;\n theme?: Theme;\n autoHideControl?: boolean;\n}\n\nexport const ReplayFastboard = /* @__PURE__ */ forwardRef<HTMLDivElement, ReplayFastboardProps & DivProps>(\n function ReplayFastboard({ player, theme = \"light\", autoHideControl = false, ...restProps }, ref) {\n const useWhiteboard = useCallback(\n (container: HTMLDivElement | null) => {\n if (container && player) player.bindContainer(container);\n },\n [player]\n );\n\n if (!player) {\n return <div className=\"fastboard-root\" ref={ref} {...restProps} />;\n }\n\n return (\n <div className=\"fastboard-root\" ref={ref} {...restProps}>\n <div className=\"fastboard-view\" ref={useWhiteboard} />\n <div className=\"fastboard-bottom\">\n <PlayerControl player={player} theme={theme} autoHide={autoHideControl} />\n </div>\n </div>\n );\n }\n);\n","import type { FastboardApp } from \"@netless/fastboard-core\";\nimport type { DivProps, FastboardProps } from \"../components/Fastboard\";\n\nimport React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { Fastboard } from \"../components/Fastboard\";\n\nexport type MountProps = Omit<FastboardProps & DivProps, \"ref\">;\n\n/**\n * Mount fastboard app to some dom, returns the disposer, which will unmount the app.\n * @example\n * let app = await createFastboard({ ...config })\n * const { update, destroy } = mount(app, document.getElementById(\"whiteboard\"))\n * update({ theme: 'dark' })\n * destroy()\n */\nexport function mount(app: FastboardApp, dom: HTMLElement, props: MountProps) {\n ReactDOM.render(<Fastboard app={app} {...props} />, dom);\n return {\n update(props: MountProps) {\n ReactDOM.render(<Fastboard app={app} {...props} />, dom);\n },\n destroy() {\n ReactDOM.unmountComponentAtNode(dom);\n },\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/internal/helpers.ts","../src/internal/hooks.ts","../src/behaviors/style.ts","../src/components/hooks.ts","../src/components/RedoUndo/hooks.ts","../src/components/RedoUndo/RedoUndo.tsx","../src/i18n/index.ts","../src/icons/index.tsx","../src/icons/Redo.tsx","../src/theme.ts","../src/icons/Undo.tsx","../src/components/ZoomControl/hooks.ts","../src/components/ZoomControl/ZoomControl.tsx","../src/icons/Minus.tsx","../src/icons/Plus.tsx","../src/icons/Reset.tsx","../src/components/PageControl/hooks.ts","../src/components/PageControl/PageControl.tsx","../src/icons/Left.tsx","../src/icons/Right.tsx","../src/icons/WhiteboardAdd.tsx","../src/components/Toolbar/hooks.ts","../src/components/Toolbar/const.ts","../src/components/Toolbar/icons/index.ts","../src/components/Toolbar/icons/Apps.tsx","../src/components/Toolbar/icons/Arrow.tsx","../src/components/Toolbar/icons/Circle.tsx","../src/components/Toolbar/icons/Clean.tsx","../src/components/Toolbar/icons/Clicker.tsx","../src/components/Toolbar/icons/Collapse.tsx","../src/components/Toolbar/icons/Diamond.tsx","../src/components/Toolbar/icons/Down.tsx","../src/components/Toolbar/icons/Eraser.tsx","../src/components/Toolbar/icons/Expand.tsx","../src/components/Toolbar/icons/Line.tsx","../src/components/Toolbar/icons/Pencil.tsx","../src/components/Toolbar/icons/Rectangle.tsx","../src/components/Toolbar/icons/Selector.tsx","../src/components/Toolbar/icons/SpeechBalloon.tsx","../src/components/Toolbar/icons/Star.tsx","../src/components/Toolbar/icons/Text.tsx","../src/components/Toolbar/icons/Triangle.tsx","../src/components/Toolbar/icons/Up.tsx","../src/components/Toolbar/Toolbar.tsx","../src/components/Toolbar/Content.tsx","../src/components/Toolbar/components/ApplianceButtons.tsx","../src/components/Toolbar/components/Button.tsx","../src/components/Toolbar/components/AppsButton.tsx","../src/components/Toolbar/icons/Loading.tsx","../src/components/Toolbar/components/PencilButton.tsx","../src/components/Toolbar/components/ColorBox.tsx","../src/components/Toolbar/components/CutLine.tsx","../src/components/Toolbar/components/Slider.tsx","../src/components/Toolbar/components/ShapesButton.tsx","../src/components/Toolbar/components/TextButton.tsx","../src/components/Toolbar/components/UpDownButtons.tsx","../src/components/PlayerControl/hooks.ts","../src/components/PlayerControl/PlayerControl.tsx","../src/components/PlayerControl/components/Button.tsx","../src/components/PlayerControl/icons/index.ts","../src/components/PlayerControl/icons/Loading.tsx","../src/components/PlayerControl/icons/Pause.tsx","../src/components/PlayerControl/icons/Play.tsx","../src/components/Fastboard.tsx","../src/components/tippy-util.ts","../src/components/ReplayFastboard.tsx","../src/vanilla/index.tsx"],"sourcesContent":["import \"./behaviors/style\";\n\nexport * from \"./typings\";\nexport * from \"./components/hooks\";\nexport * from \"./components/RedoUndo\";\nexport * from \"./components/ZoomControl\";\nexport * from \"./components/PageControl\";\nexport * from \"./components/Toolbar\";\nexport * from \"./components/PlayerControl\";\nexport * from \"./components/Fastboard\";\nexport * from \"./components/ReplayFastboard\";\nexport * from \"./vanilla\";\n","export function noop() {\n return;\n}\n\nexport function applyStyles(css: string) {\n const el = document.createElement(\"style\");\n el.appendChild(document.createTextNode(css));\n document.head.appendChild(el);\n return el;\n}\n\nexport function clamp(value: number, min: number, max: number) {\n return value < min ? min : value > max ? max : value;\n}\n\nexport function isEqualArray<T>(a: T[], b: T[]) {\n return a.length === b.length && a.every((e, i) => e === b[i]);\n}\n\nexport const defaultHotKeys = {\n changeToSelector: \"s\",\n changeToLaserPointer: \"z\",\n changeToPencil: \"p\",\n changeToRectangle: \"r\",\n changeToEllipse: \"c\",\n changeToEraser: \"e\",\n changeToText: \"t\",\n changeToStraight: \"l\",\n changeToArrow: \"a\",\n changeToHand: \"h\",\n};\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport function useLastValue<T>(value: T) {\n const ref = useRef<T>(value);\n useEffect(() => {\n ref.current = value;\n }, [value]);\n return ref.current;\n}\n\nexport function useAsyncValue<T>(fn: () => Promise<T>) {\n const [value, setValue] = useState<T | null>(null);\n useEffect(() => {\n fn().then(setValue);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n return value;\n}\n\nexport function useForceUpdate() {\n const [, forceUpdate] = useState({});\n return useCallback(() => forceUpdate({}), []);\n}\n","import { applyStyles } from \"../internal\";\nimport style from \"../style.scss?inline\";\n\napplyStyles(style);\n","import type { FastboardApp, FastboardReadable } from \"@netless/fastboard-core\";\nimport type { Theme } from \"../typings\";\n\nimport { BuiltinApps } from \"@netless/window-manager\";\nimport { createContext, useContext, useEffect, useState } from \"react\";\n\nexport const FastboardAppContext = /* @__PURE__ */ createContext<FastboardApp | null>(null);\n\nexport const ThemeContext = /* @__PURE__ */ createContext<Theme>(\"light\");\n\nexport function useTheme(userTheme?: Theme | null) {\n const themeFromContext = useContext(ThemeContext);\n return userTheme || themeFromContext;\n}\n\nexport function useFastboardApp() {\n const app = useContext(FastboardAppContext);\n if (!app) {\n throw new Error(\"useFastboardApp() can only be called inside of <Fastboard>\");\n }\n return app;\n}\n\nexport function useFastboardValue<T>(val: FastboardReadable<T>) {\n const [value, setValue] = useState(val.value);\n useEffect(() => val.subscribe(setValue), [val]);\n return value;\n}\n\nexport function useWritable() {\n return useFastboardValue(useFastboardApp().writable);\n}\n\nexport function useBoxState() {\n return useFastboardValue(useFastboardApp().boxState);\n}\n\nexport function useFocusedApp() {\n return useFastboardValue(useFastboardApp().focusedApp);\n}\n\nexport function useMaximized() {\n return useBoxState() === \"maximized\";\n}\n\nconst AppsShouldShowToolbar = /* @__PURE__ */ (() => [BuiltinApps.DocsViewer, \"Slide\"])();\n\nexport function useHideControls() {\n const writable = useWritable();\n const maximized = useMaximized();\n const focusedApp = useFocusedApp();\n\n if (!writable) {\n return true;\n }\n\n if (maximized) {\n if (AppsShouldShowToolbar.some(kind => focusedApp?.includes(kind))) {\n return \"toolbar-only\";\n } else {\n return true;\n }\n }\n\n return false;\n}\n","import { useCallback } from \"react\";\nimport { useFastboardApp, useFastboardValue } from \"../hooks\";\n\nexport function useRedoUndo() {\n const app = useFastboardApp();\n const undoSteps = useFastboardValue(app.canUndoSteps);\n const redoSteps = useFastboardValue(app.canRedoSteps);\n\n const undo = useCallback(() => {\n app.undo();\n }, [app]);\n\n const redo = useCallback(() => {\n app.redo();\n }, [app]);\n\n return { redoSteps, undoSteps, redo, undo };\n}\n","import type { CommonProps, GenericIcon } from \"../../typings\";\n\nimport Tippy from \"@tippyjs/react\";\nimport clsx from \"clsx\";\nimport React from \"react\";\n\nimport { useTranslation } from \"../../i18n\";\nimport { Icon } from \"../../icons\";\nimport { Redo } from \"../../icons/Redo\";\nimport { Undo } from \"../../icons/Undo\";\nimport { TopOffset } from \"../../theme\";\nimport { useTheme, useWritable } from \"../hooks\";\nimport { useRedoUndo } from \"./hooks\";\n\nexport const name = \"fastboard-redo-undo\";\n\nexport type RedoUndoProps = CommonProps & GenericIcon<\"undo\" | \"redo\">;\n\nexport function RedoUndo({ theme, undoIcon, undoIconDisable, redoIcon, redoIconDisable }: RedoUndoProps) {\n theme = useTheme(theme);\n const { t } = useTranslation();\n\n const writable = useWritable();\n const { redoSteps, undoSteps, redo, undo } = useRedoUndo();\n\n const disabled = !writable;\n\n return (\n <div className={clsx(name, theme)}>\n <Tippy\n className=\"fastboard-tip\"\n content={t(\"undo\")}\n theme={theme}\n disabled={disabled}\n placement=\"top\"\n delay={[1000, 400]}\n duration={300}\n offset={TopOffset}\n >\n <button\n className={clsx(`${name}-btn`, \"undo\", theme)}\n disabled={disabled || undoSteps === 0}\n onClick={undo}\n >\n <Icon\n fallback={<Undo theme={theme} />}\n src={undoSteps === 0 ? undoIconDisable : undoIcon}\n alt=\"[undo]\"\n />\n </button>\n </Tippy>\n <Tippy\n className=\"fastboard-tip\"\n content={t(\"redo\")}\n theme={theme}\n disabled={disabled}\n placement=\"top\"\n delay={[1000, 400]}\n duration={300}\n offset={TopOffset}\n >\n <button\n className={clsx(`${name}-btn`, \"redo\", theme)}\n disabled={disabled || redoSteps === 0}\n onClick={redo}\n >\n <Icon\n fallback={<Redo theme={theme} />}\n src={redoSteps === 0 ? redoIconDisable : redoIcon}\n alt=\"[redo]\"\n />\n </button>\n </Tippy>\n </div>\n );\n}\n","import type { i18n } from \"i18next\";\nimport type { Language } from \"../typings\";\n\nimport { createContext, useContext, useMemo } from \"react\";\nimport i18next from \"i18next\";\nimport en from \"./en.json\";\nimport zhCN from \"./zh-CN.json\";\n\nexport interface CreateI18nParams {\n language?: Language;\n}\n\nexport const createI18n = async ({\n language = (navigator.language as Language) || \"zh-CN\",\n}: CreateI18nParams = {}) => {\n await i18next.init({\n lng: language,\n resources: { en, \"zh-CN\": zhCN },\n });\n return i18next;\n};\n\nexport const I18nContext = /* @__PURE__ */ createContext<i18n | null>(null);\n\nexport function useTranslation() {\n const i18n = useContext(I18nContext);\n const t = useMemo(() => (i18n ? i18n.getFixedT(null, [\"translation\"]) : (id: string) => id), [i18n]);\n return { t, i18n };\n}\n","import React from \"react\";\n\nexport interface IconPropsWithFallback {\n fallback: React.ReactElement;\n src?: string;\n alt?: string;\n}\n\nexport function Icon({ fallback, src, alt = \"[icon]\" }: IconPropsWithFallback) {\n return src ? <img src={src} alt={alt} title={alt} /> : fallback;\n}\n","import type { IconProps } from \"../typings\";\n\nimport React from \"react\";\nimport { themes } from \"../theme\";\n\nexport function Redo({ theme = \"light\", active }: IconProps) {\n const config = themes[theme];\n const stroke = active ? config.activeColor : config.color;\n\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M19 9.625H9v-1.25h10v1.25ZM5.625 13v6h-1.25v-6h1.25ZM9 9.625A3.375 3.375 0 0 0 5.625 13h-1.25A4.625 4.625 0 0 1 9 8.375v1.25Z\"\n fill={stroke}\n />\n <path d=\"m15 5 4 4-4 4\" stroke={stroke} strokeLinejoin=\"round\" strokeWidth=\"1.25\" />\n </svg>\n );\n}\n","import type { IconProps } from \"./typings\";\n\nexport interface ThemeConfig {\n color: string;\n activeColor: string;\n backgroundColor: string;\n hoverBackgroundColor: string;\n}\n\nexport const light: ThemeConfig = {\n color: \"#5D5D5D\",\n activeColor: \"#3381FF\",\n backgroundColor: \"#fff\",\n hoverBackgroundColor: \"rgba(51, 129, 255, 0.1)\",\n};\n\nexport const dark: ThemeConfig = {\n ...light,\n color: \"#eee\",\n backgroundColor: \"#111\",\n};\n\nexport const themes = { light, dark };\n\nexport const getStroke = (props: IconProps) => {\n let config;\n if (props.theme) {\n config = themes[props.theme];\n } else {\n config = themes.light;\n }\n return props.active ? config.activeColor : config.color;\n};\n\nexport const TopOffset = [0, 11] as [number, number];\nexport const RightOffset = [0, 11] as [number, number];\n","import type { IconProps } from \"../typings\";\n\nimport React from \"react\";\nimport { themes } from \"../theme\";\n\nexport function Undo({ theme = \"light\", active }: IconProps) {\n const config = themes[theme];\n const stroke = active ? config.activeColor : config.color;\n\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M5 9.625h10v-1.25H5v1.25ZM18.375 13v6h1.25v-6h-1.25ZM15 9.625A3.375 3.375 0 0 1 18.375 13h1.25A4.625 4.625 0 0 0 15 8.375v1.25Z\"\n fill={stroke}\n />\n <path d=\"M9 5 5 9l4 4\" stroke={stroke} strokeLinejoin=\"round\" strokeWidth=\"1.25\" />\n </svg>\n );\n}\n","import { useCallback } from \"react\";\n\nimport { clamp } from \"../../internal\";\nimport { useFastboardApp, useFastboardValue } from \"../hooks\";\n\nexport const ScalePoints: readonly number[] = [\n 0.3, 0.4096000000000002, 0.5120000000000001, 0.6400000000000001, 0.8, 1, 1.26, 1.5876000000000001, 2.000376,\n 2.5204737600000002, 3,\n];\n\nfunction nextScale(scale: number, delta: 1 | -1) {\n const { length } = ScalePoints;\n const last = length - 1;\n if (scale < ScalePoints[0]) return ScalePoints[0];\n if (scale > ScalePoints[last]) return ScalePoints[last];\n for (let i = 0; i < length; ++i) {\n const curr = ScalePoints[i];\n const prev = i === 0 ? -Infinity : (ScalePoints[i - 1] + curr) / 2;\n const next = i === last ? Infinity : (ScalePoints[i + 1] + curr) / 2;\n if (prev <= scale && scale <= next) return ScalePoints[clamp(i + delta, 0, last)];\n }\n return 1;\n}\n\nexport function useZoomControl() {\n const app = useFastboardApp();\n const scale = useFastboardValue(app.camera).scale || 1;\n\n const resetCamera = useCallback(() => {\n app.moveCamera({ scale: 1, centerX: 0, centerY: 0 });\n }, [app]);\n\n const zoomIn = useCallback(() => {\n app.moveCamera({\n scale: nextScale(scale, 1),\n centerX: 0,\n centerY: 0,\n });\n }, [app, scale]);\n\n const zoomOut = useCallback(() => {\n app.moveCamera({\n scale: nextScale(scale, -1),\n centerX: 0,\n centerY: 0,\n });\n }, [app, scale]);\n\n return { scale, resetCamera, zoomIn, zoomOut };\n}\n","import type { CommonProps, GenericIcon } from \"../../typings\";\n\nimport Tippy from \"@tippyjs/react\";\nimport clsx from \"clsx\";\nimport React from \"react\";\n\nimport { useTranslation } from \"../../i18n\";\nimport { Icon } from \"../../icons\";\nimport { Minus } from \"../../icons/Minus\";\nimport { Plus } from \"../../icons/Plus\";\nimport { Reset } from \"../../icons/Reset\";\nimport { TopOffset } from \"../../theme\";\nimport { useTheme, useWritable } from \"../hooks\";\nimport { useZoomControl } from \"./hooks\";\n\nexport const name = \"fastboard-zoom-control\";\n\nexport type ZoomControlProps = CommonProps & GenericIcon<\"reset\" | \"minus\" | \"plus\">;\n\nexport function ZoomControl({\n theme,\n resetIcon,\n resetIconDisable,\n minusIcon,\n minusIconDisable,\n plusIcon,\n plusIconDisable,\n}: ZoomControlProps) {\n theme = useTheme(theme);\n const { t } = useTranslation();\n\n const writable = useWritable();\n const { scale, resetCamera, zoomIn, zoomOut } = useZoomControl();\n\n const disabled = !writable;\n\n return (\n <div className={clsx(name, theme)}>\n {/* <span className={clsx(`${name}-cut-line`, theme)} /> */}\n <Tippy\n className=\"fastboard-tip\"\n content={t(\"zoomOut\")}\n theme={theme}\n disabled={disabled}\n placement=\"top\"\n delay={[1000, 400]}\n duration={300}\n offset={TopOffset}\n >\n <button className={clsx(`${name}-btn`, \"minus\", theme)} disabled={disabled} onClick={zoomOut}>\n <Icon\n fallback={<Minus theme={theme} />}\n src={disabled ? minusIconDisable : minusIcon}\n alt=\"[minus]\"\n />\n </button>\n </Tippy>\n <span className={clsx(`${name}-text`, theme)}>\n <span className={clsx(`${name}-scale`, theme)}>{Math.ceil(scale * 100)}</span>\n <span className={clsx(`${name}-percent`, theme)}>%</span>\n </span>\n <Tippy\n className=\"fastboard-tip\"\n content={t(\"zoomIn\")}\n theme={theme}\n disabled={disabled}\n placement=\"top\"\n delay={[1000, 400]}\n duration={300}\n offset={TopOffset}\n >\n <button className={clsx(`${name}-btn`, \"plus\", theme)} disabled={disabled} onClick={zoomIn}>\n <Icon fallback={<Plus theme={theme} />} src={disabled ? plusIconDisable : plusIcon} alt=\"[plus]\" />\n </button>\n </Tippy>\n <Tippy\n className=\"fastboard-tip\"\n content={t(\"reset\")}\n theme={theme}\n disabled={disabled}\n placement=\"top\"\n delay={[1000, 400]}\n duration={300}\n offset={TopOffset}\n >\n <button className={clsx(`${name}-btn`, \"reset\", theme)} disabled={disabled} onClick={resetCamera}>\n <Icon\n fallback={<Reset theme={theme} />}\n src={disabled ? resetIconDisable : resetIcon}\n alt=\"[reset]\"\n />\n </button>\n </Tippy>\n </div>\n );\n}\n","import type { IconProps } from \"../typings\";\n\nimport React from \"react\";\nimport { themes } from \"../theme\";\n\nexport function Minus({ theme = \"light\", active }: IconProps) {\n const config = themes[theme];\n const stroke = active ? config.activeColor : config.color;\n\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M5 12h14\" stroke={stroke} strokeLinejoin=\"round\" strokeWidth=\"1.25\" />\n </svg>\n );\n}\n","import type { IconProps } from \"../typings\";\n\nimport React from \"react\";\nimport { themes } from \"../theme\";\n\nexport function Plus({ theme = \"light\", active }: IconProps) {\n const config = themes[theme];\n const stroke = active ? config.activeColor : config.color;\n\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M5 12h14m-7-7v14\" stroke={stroke} strokeLinejoin=\"round\" strokeWidth=\"1.25\" />\n </svg>\n );\n}\n","import type { IconProps } from \"../typings\";\n\nimport React from \"react\";\nimport { themes } from \"../theme\";\n\nexport function Reset({ theme = \"light\", active }: IconProps) {\n const config = themes[theme];\n const stroke = active ? config.activeColor : config.color;\n\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"12\" cy=\"12\" fill={stroke} r=\"2\" />\n <path d=\"M12 3v4m0 10v4m9-9h-4M7 12H3\" stroke={stroke} strokeLinejoin=\"round\" strokeWidth=\"1.25\" />\n <circle cx=\"12\" cy=\"12\" r=\"7\" stroke={stroke} strokeLinejoin=\"round\" strokeWidth=\"1.25\" />\n </svg>\n );\n}\n","import { useCallback } from \"react\";\nimport { useFastboardApp, useFastboardValue } from \"../hooks\";\n\nexport function usePageControl() {\n const app = useFastboardApp();\n const pageIndex = useFastboardValue(app.sceneIndex);\n const pageCount = useFastboardValue(app.sceneLength);\n\n const addPage = useCallback(async () => {\n await app.manager.switchMainViewToWriter();\n app.room.putScenes(app.manager.mainViewSceneDir, [{}], pageIndex + 1);\n await app.manager.setMainViewSceneIndex(pageIndex + 1);\n }, [app, pageIndex]);\n\n const prevPage = useCallback(async () => {\n await app.manager.setMainViewSceneIndex(pageIndex - 1);\n }, [app, pageIndex]);\n\n const nextPage = useCallback(async () => {\n await app.manager.setMainViewSceneIndex(pageIndex + 1);\n }, [app, pageIndex]);\n\n return { pageIndex, pageCount, prevPage, nextPage, addPage };\n}\n","import type { CommonProps, GenericIcon } from \"../../typings\";\n\nimport Tippy from \"@tippyjs/react\";\nimport clsx from \"clsx\";\nimport React from \"react\";\n\nimport { useTranslation } from \"../../i18n\";\nimport { Icon } from \"../../icons\";\nimport { Left } from \"../../icons/Left\";\nimport { Right } from \"../../icons/Right\";\nimport { WhiteboardAdd } from \"../../icons/WhiteboardAdd\";\nimport { TopOffset } from \"../../theme\";\nimport { useTheme, useWritable } from \"../hooks\";\nimport { usePageControl } from \"./hooks\";\n\nexport const name = \"fastboard-page-control\";\n\nexport type PageControlProps = CommonProps & GenericIcon<\"add\" | \"prev\" | \"next\">;\n\nexport function PageControl({\n theme,\n addIcon,\n addIconDisable,\n prevIcon,\n prevIconDisable,\n nextIcon,\n nextIconDisable,\n}: PageControlProps) {\n theme = useTheme(theme);\n const { t } = useTranslation();\n\n const writable = useWritable();\n const { pageIndex, pageCount, ...actions } = usePageControl();\n\n const disabled = !writable;\n\n return (\n <div className={clsx(name, theme)}>\n {/* <span className={clsx(`${name}-cut-line`, theme)} />{\" \"} */}\n <Tippy\n className=\"fastboard-tip\"\n content={t(\"prevPage\")}\n theme={theme}\n disabled={disabled}\n placement=\"top\"\n delay={[1000, 400]}\n duration={300}\n offset={TopOffset}\n >\n <button\n className={clsx(`${name}-btn`, \"prev\", theme)}\n disabled={disabled || pageIndex === 0}\n onClick={actions.prevPage}\n >\n <Icon fallback={<Left theme={theme} />} src={disabled ? prevIconDisable : prevIcon} alt=\"[prev]\" />\n </button>\n </Tippy>\n <span className={clsx(`${name}-text`, theme)}>\n <span className={clsx(`${name}-page`, theme)}>{pageCount === 0 ? \"\\u2026\" : pageIndex + 1}</span>\n <span className={clsx(`${name}-slash`, theme)}>/</span>\n <span className={clsx(`${name}-page-count`, theme)}>{pageCount}</span>\n </span>\n <Tippy\n className=\"fastboard-tip\"\n content={t(\"nextPage\")}\n theme={theme}\n disabled={disabled}\n placement=\"top\"\n delay={[1000, 400]}\n duration={300}\n offset={TopOffset}\n >\n <button\n className={clsx(`${name}-btn`, \"next\", theme)}\n disabled={disabled || pageIndex === pageCount - 1}\n onClick={actions.nextPage}\n >\n <Icon fallback={<Right theme={theme} />} src={disabled ? nextIconDisable : nextIcon} alt=\"[next]\" />\n </button>\n </Tippy>\n <Tippy\n className=\"fastboard-tip\"\n content={t(\"addPage\")}\n theme={theme}\n disabled={disabled}\n placement=\"top\"\n delay={[1000, 400]}\n duration={300}\n offset={TopOffset}\n >\n <button className={clsx(`${name}-btn`, \"add\", theme)} disabled={disabled} onClick={actions.addPage}>\n <Icon\n fallback={<WhiteboardAdd theme={theme} />}\n src={disabled ? addIconDisable : addIcon}\n alt=\"[add]\"\n />\n </button>\n </Tippy>\n </div>\n );\n}\n","import type { IconProps } from \"../typings\";\n\nimport React from \"react\";\nimport { themes } from \"../theme\";\n\nexport function Left({ theme = \"light\", active }: IconProps) {\n const config = themes[theme];\n const stroke = active ? config.activeColor : config.color;\n\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"m14 8-2 2-2 2 2 2 2 2\" stroke={stroke} strokeLinejoin=\"round\" strokeWidth=\"1.25\" />\n </svg>\n );\n}\n","import type { IconProps } from \"../typings\";\n\nimport React from \"react\";\nimport { themes } from \"../theme\";\n\nexport function Right({ theme = \"light\", active }: IconProps) {\n const config = themes[theme];\n const stroke = active ? config.activeColor : config.color;\n\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"m10 8 2 2 2 2-2 2-2 2\" stroke={stroke} strokeLinejoin=\"round\" strokeWidth=\"1.25\" />\n </svg>\n );\n}\n","import type { IconProps } from \"../typings\";\n\nimport React from \"react\";\nimport { themes } from \"../theme\";\n\nexport function WhiteboardAdd({ theme = \"light\", active }: IconProps) {\n const config = themes[theme];\n const stroke = active ? config.activeColor : config.color;\n\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M4 20h16M4 6h16\" stroke={stroke} strokeLinejoin=\"round\" strokeWidth=\"1.25\" />\n <rect\n height=\"10\"\n rx=\"1\"\n stroke={stroke}\n strokeLinejoin=\"round\"\n strokeWidth=\"1.25\"\n width=\"14\"\n x=\"5\"\n y=\"8\"\n />\n <path d=\"M12 4v2m-3 7h6m-3-3v6\" stroke={stroke} strokeLinejoin=\"round\" strokeWidth=\"1.25\" />\n </svg>\n );\n}\n","import type { ApplianceNames, Color, MemberState, ShapeType } from \"white-web-sdk\";\nimport type { AppsStatus } from \"@netless/fastboard-core\";\n\nimport { useCallback, useState } from \"react\";\n\nimport { noop } from \"../../internal\";\nimport { useFastboardApp, useFastboardValue, useWritable } from \"../hooks\";\nimport { ShapesMap } from \"./const\";\n\nexport type UnifiedShape = keyof typeof ShapesMap;\n\nexport interface ToolbarHook {\n readonly writable: boolean;\n readonly memberState: MemberState | undefined;\n readonly lastShape: UnifiedShape;\n readonly appsStatus: AppsStatus;\n cleanCurrentScene(): void;\n setAppliance(appliance: ApplianceNames, shape?: ShapeType): void;\n setStrokeWidth(width: number): void;\n setStrokeColor(color: Color): void;\n}\n\nexport function useRoomState() {\n return useFastboardValue(useFastboardApp().memberState);\n}\n\nexport function useAppsStatus() {\n return useFastboardValue(useFastboardApp().appsStatus);\n}\n\nexport function useToolbar(): ToolbarHook {\n const app = useFastboardApp();\n const writable = useWritable();\n const memberState = useRoomState();\n const appsStatus = useAppsStatus();\n const [lastShape, setLastShape] = useState<UnifiedShape>(\"rectangle\" as ApplianceNames.rectangle);\n\n const cleanCurrentScene = useCallback(() => {\n app.cleanCurrentScene();\n }, [app]);\n\n const setAppliance = useCallback(\n (appliance: ApplianceNames, shape?: ShapeType) => {\n app.setAppliance(appliance, shape);\n if (shape) {\n setLastShape(shape);\n } else if (appliance in ShapesMap) {\n setLastShape(appliance as UnifiedShape);\n }\n },\n [app]\n );\n\n const setStrokeWidth = useCallback(\n (strokeWidth: number) => {\n app.setStrokeWidth(strokeWidth);\n },\n [app]\n );\n\n const setStrokeColor = useCallback(\n (strokeColor: Color) => {\n app.setStrokeColor(strokeColor);\n },\n [app]\n );\n\n return {\n writable,\n memberState,\n lastShape,\n appsStatus,\n cleanCurrentScene,\n setAppliance,\n setStrokeWidth,\n setStrokeColor,\n };\n}\n\nexport const EmptyToolbarHook: ToolbarHook = {\n writable: false,\n memberState: undefined,\n lastShape: \"rectangle\" as ApplianceNames.rectangle,\n appsStatus: {},\n cleanCurrentScene: noop,\n setAppliance: noop,\n setStrokeWidth: noop,\n setStrokeColor: noop,\n};\n","import { ApplianceNames, ShapeType } from \"white-web-sdk\";\nimport { Icons } from \"./icons\";\n\nexport const ShapesMap = {\n [ApplianceNames.rectangle]: Icons.Rectangle,\n [ApplianceNames.ellipse]: Icons.Circle,\n [ApplianceNames.straight]: Icons.Line,\n [ApplianceNames.arrow]: Icons.Arrow,\n [ShapeType.Pentagram]: Icons.Star,\n [ShapeType.Rhombus]: Icons.Diamond,\n [ShapeType.Triangle]: Icons.Triangle,\n [ShapeType.SpeechBalloon]: Icons.SpeechBalloon,\n} as const;\n\nexport const ApplianceShapes = [\n ApplianceNames.rectangle,\n ApplianceNames.ellipse,\n ApplianceNames.straight,\n ApplianceNames.arrow,\n] as const;\n\nexport const Shapes = [\n ShapeType.Pentagram,\n ShapeType.Rhombus,\n ShapeType.Triangle,\n ShapeType.SpeechBalloon,\n] as const;\n\nexport const ItemHeight = 32 + 4;\nexport const ItemsCount = 8;\nexport const MaxHeight = ItemHeight * ItemsCount - 4;\nexport const MinHeight = ItemHeight * 2 - 4;\n","import { memo } from \"react\";\nimport { Apps } from \"./Apps\";\nimport { Arrow } from \"./Arrow\";\nimport { Circle } from \"./Circle\";\nimport { Clean } from \"./Clean\";\nimport { Clicker } from \"./Clicker\";\nimport { Collapse } from \"./Collapse\";\nimport { Diamond } from \"./Diamond\";\nimport { Down } from \"./Down\";\nimport { Eraser } from \"./Eraser\";\nimport { Expand } from \"./Expand\";\nimport { Line } from \"./Line\";\nimport { Pencil } from \"./Pencil\";\nimport { Rectangle } from \"./Rectangle\";\nimport { Selector } from \"./Selector\";\nimport { SpeechBalloon } from \"./SpeechBalloon\";\nimport { Star } from \"./Star\";\nimport { Text } from \"./Text\";\nimport { Triangle } from \"./Triangle\";\nimport { Up } from \"./Up\";\n\nexport const Icons = {\n Clicker: memo(Clicker),\n Collapse: memo(Collapse),\n Eraser: memo(Eraser),\n Expand: memo(Expand),\n Pencil: memo(Pencil),\n Selector: memo(Selector),\n Rectangle: memo(Rectangle),\n Text: memo(Text),\n Apps: memo(Apps),\n Clean: memo(Clean),\n Circle: memo(Circle),\n Line: memo(Line),\n Arrow: memo(Arrow),\n Star: memo(Star),\n Diamond: memo(Diamond),\n SpeechBalloon: memo(SpeechBalloon),\n Triangle: memo(Triangle),\n Up: memo(Up),\n Down: memo(Down),\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Apps = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <g fill={stroke}>\n <path d=\"M17.667 4.5h-3.334c-1.012 0-1.833.82-1.833 1.833V11.5h5.167c1.012 0 1.833-.82 1.833-1.833V6.333c0-1.012-.82-1.833-1.833-1.833Zm-3.334 1h3.334c.46 0 .833.373.833.833v3.334l-.006.104a.833.833 0 0 1-.827.729H13.5V6.333c0-.46.373-.833.833-.833Z\" />\n <path d=\"M6.333 19.5A1.833 1.833 0 0 1 4.5 17.667v-3.334c0-.525.221-1 .576-1.334a1.822 1.822 0 0 1-.576-1.332V8.333c0-1.012.82-1.833 1.833-1.833H10A1.5 1.5 0 0 1 11.5 8v4.5h4.167c.962 0 1.75.74 1.827 1.683l.006.15v3.334c0 1.012-.82 1.833-1.833 1.833Zm4.167-6H6.333a.833.833 0 0 0-.827.729l-.006.104v3.334c0 .46.373.833.833.833H10.5v-5Zm5.167 0H11.5v5h4.167c.46 0 .833-.373.833-.833v-3.334a.833.833 0 0 0-.833-.833ZM10 7.5H6.333a.833.833 0 0 0-.833.833v3.334c0 .46.373.833.833.833H10.5V8a.5.5 0 0 0-.41-.492L10 7.5Z\" />\n </g>\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Arrow = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path fill={stroke} d=\"M19 5v6l-2.647-2.646L5.99 18.718l-.708-.708L15.645 7.646 13 5h6Z\" />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Circle = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <rect width=\"15\" height=\"15\" x=\"4.5\" y=\"4.5\" fill=\"none\" stroke={stroke} rx=\"7.5\" />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Clean = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path\n fill={stroke}\n d=\"M9.754 11.99c0 1.856-.711 3.62-1.96 4.951l-.151.155h1.403l.855-.853h.707l.853.853h2.635l.094-.064a6.237 6.237 0 0 0 2.559-4.781l.005-.26h1a7.237 7.237 0 0 1-2.994 5.862l-.229.16-.277.083h-3l-.353-.146-.647-.647-.646.647-.354.146h-3l-.286-.91.214-.148a6.237 6.237 0 0 0 2.567-4.787l.005-.26h1Zm4.772-6.502v2l.35.039a2.98 2.98 0 0 1 2.644 2.78l.006.181h-8a2.98 2.98 0 0 1 2.65-2.961l.35-.039v-2h2Z\"\n />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Clicker = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <g fill=\"none\">\n <path d=\"M0 0h24v24H0z\" />\n <path\n fill={stroke}\n d=\"m7 5.072 10.33 7.892-4.879.549 3.232 5.598-.866.5-3.233-5.597-2.914 3.95L7 5.072Z\"\n />\n </g>\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Collapse = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path fill=\"none\" stroke={stroke} d=\"m8 10-2 2 2 2m10-8H6m12 12H6m12-4h-8m8-4h-8\" />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Diamond = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path fill=\"none\" stroke={stroke} d=\"M4.222 12 12 4.222 19.778 12 12 19.778z\" />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Down = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path fill=\"none\" stroke={stroke} d=\"m16 13-2 2-2 2-2-2-2-2m8-6-2 2-2 2-2-2-2-2\" />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Eraser = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path\n fill={stroke}\n d=\"m14.333 5.183.165.007c.494.037.978.245 1.356.623l2.333 2.333a2.15 2.15 0 0 1 0 3.04l-5.833 5.834a3.8 3.8 0 0 1-5.374 0l-1.167-1.166a2.15 2.15 0 0 1 0-3.04l7-7c.42-.42.97-.63 1.52-.63ZM11.52 8.52l-4.999 5a1.15 1.15 0 0 0 0 1.626l1.167 1.167a2.8 2.8 0 0 0 3.96 0l3.832-3.833-3.96-3.96Z\"\n />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Expand = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path fill=\"none\" stroke={stroke} d=\"m16 10 2 2-2 2M6 6h12M6 18h12M6 14h8m-8-4h8\" />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Line = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path fill={stroke} d=\"m18.01 5.282.708.708L5.99 18.718l-.708-.708z\" />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Pencil = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path\n fill={stroke}\n d=\"m17.497 4.84.116.105 1.442 1.442a1.52 1.52 0 0 1 .104 2.034l-.104.116L8.733 18.858l-4.347.756.756-4.347L15.463 4.945a1.52 1.52 0 0 1 2.034-.104ZM5.967 16.349l-.353 2.037 2.037-.354-1.683-1.683Zm8.407-8.901-7.946 7.946 2.178 2.178 7.946-7.946-2.178-2.178Zm-.728 2.2.708.707-5 5-.708-.708 5-5Zm2.596-4.055-.072.06-1.09 1.088 2.179 2.178 1.089-1.088a.52.52 0 0 0 .105-.584l-.045-.08-.06-.072-1.442-1.442a.52.52 0 0 0-.664-.06Z\"\n />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Rectangle = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path fill=\"none\" stroke={stroke} d=\"M5.5 5.5h13v13h-13z\" />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Selector = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path fill={stroke} d=\"m12 12 8 2.667-3.556 1.777L14.667 20 12 12Zm3-8v7.5h-1V5H5v9h6.5v1H4V4h11Z\" />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const SpeechBalloon = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path\n fill=\"none\"\n stroke={stroke}\n d=\"M17 4.5c.414 0 .79.168 1.06.44.272.27.44.646.44 1.06v9c0 .414-.168.79-.44 1.06a1.49 1.49 0 0 1-1.06.44h-4.207l-2.715 2.715-1.81-2.715H7a1.49 1.49 0 0 1-1.06-.44A1.495 1.495 0 0 1 5.5 15V6c0-.414.168-.79.44-1.06A1.49 1.49 0 0 1 7 4.5Z\"\n />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Star = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path\n fill=\"none\"\n stroke={stroke}\n d=\"m12 3.523 1.993 5.734 6.07.123-4.838 3.668 1.758 5.81L12 15.391l-4.983 3.467 1.758-5.81L3.938 9.38l6.069-.123L12 3.523Z\"\n />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Text = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path fill={stroke} d=\"M18.5 5.5V8h-1V6.5H13v11h2v1H9v-1h2v-11H6.5V8h-1V5.5h13Z\" />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Triangle = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path fill=\"none\" stroke={stroke} d=\"M12 6.008 19.138 18.5H4.862L12 6.008Z\" />\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Up = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path fill=\"none\" stroke={stroke} d=\"m16 11-2-2-2-2-2 2-2 2m8 6-2-2-2-2-2 2-2 2\" />\n </svg>\n );\n};\n","import type { CommonProps, GenericIcon, Theme } from \"../../typings\";\nimport type { ToolbarHook } from \"./hooks\";\n\nimport clsx from \"clsx\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport React, { createContext, useState } from \"react\";\n\nimport expandPNG from \"./components/assets/expanded.png\";\n\nimport { Icon } from \"../../icons\";\nimport { useTheme } from \"../hooks\";\nimport { Content } from \"./Content\";\nimport { EmptyToolbarHook, useToolbar } from \"./hooks\";\n\nexport type ToolbarProps = CommonProps & {\n icons?: GenericIcon<\n | \"clicker\"\n | \"selector\"\n | \"pencil\"\n | \"eraser\"\n | \"clean\"\n | \"expand\"\n | \"collapse\"\n | \"up\"\n | \"down\"\n | \"text\"\n | \"apps\"\n >;\n};\n\ntype ToolbarContextType = ToolbarHook & {\n theme: Theme;\n icons?: ToolbarProps[\"icons\"];\n};\n\nexport const ToolbarContext = createContext<ToolbarContextType>({\n theme: \"light\",\n ...EmptyToolbarHook,\n});\n\nexport const name = \"fastboard-toolbar\";\n\nexport function Toolbar({ theme, icons }: ToolbarProps) {\n theme = useTheme(theme);\n\n const hook = useToolbar();\n const [expanded, setExpanded] = useState(true);\n const [pointerEvents, setPointerEvents] = useState<\"auto\" | \"none\">(\"auto\");\n const disabled = !hook.writable;\n\n return (\n <ToolbarContext.Provider value={{ theme, icons, ...hook }}>\n <AnimatePresence>\n {expanded ? (\n <motion.div\n key=\"toolbar\"\n className={clsx(name, theme)}\n initial={{ x: -100 }}\n animate={{ x: 0, transition: { duration: 0.5 } }}\n exit={{ x: -100, transition: { duration: 0.5 } }}\n onAnimationStart={() => setPointerEvents(\"none\")}\n onAnimationComplete={() => setPointerEvents(\"auto\")}\n style={{ pointerEvents }}\n >\n <Content onCollapse={() => setExpanded(false)} />\n </motion.div>\n ) : (\n <motion.div\n className={clsx(`${name}-expand-btn`, theme)}\n key=\"expand\"\n onClick={() => setExpanded(true)}\n initial={{ x: -100 }}\n animate={{ x: 0, transition: { duration: 0.5 } }}\n >\n <Icon\n fallback={<img draggable={false} src={expandPNG} className={clsx(`${name}-mask-btn`, theme)} />}\n src={disabled ? icons?.expandIconDisable : icons?.expandIcon}\n />\n </motion.div>\n )}\n </AnimatePresence>\n </ToolbarContext.Provider>\n );\n}\n","import clsx from \"clsx\";\nimport React, { useCallback, useContext, useEffect, useRef, useState } from \"react\";\nimport { Icon } from \"../../icons\";\n\nimport { clamp } from \"../../internal\";\nimport { CleanButton, ClickerButton, EraserButton, SelectorButton } from \"./components/ApplianceButtons\";\nimport { AppsButton } from \"./components/AppsButton\";\nimport { PencilButton } from \"./components/PencilButton\";\nimport { ShapesButton } from \"./components/ShapesButton\";\nimport { TextButton } from \"./components/TextButton\";\nimport { DownButton, UpButton } from \"./components/UpDownButtons\";\nimport { ItemHeight, ItemsCount, MaxHeight, MinHeight } from \"./const\";\nimport { name, ToolbarContext } from \"./Toolbar\";\n\nimport collapsePNG from \"./components/assets/collapsed.png\";\n\nexport interface ContextProps {\n onCollapse: () => void;\n}\n\nexport function Content({ onCollapse }: ContextProps) {\n const { theme, icons, writable } = useContext(ToolbarContext);\n const ref = useRef<HTMLDivElement>(null);\n const [scrollTop, setScrollTop] = useState(0);\n const [parentHeight, setParentHeight] = useState(0);\n const disabled = !writable;\n\n const needScroll = parentHeight < ItemHeight * ItemsCount + 48;\n const sectionHeight = clamp(parentHeight - 48 * (needScroll ? 3 : 1), MinHeight, MaxHeight);\n const scrollBuffer = Math.max(parentHeight - sectionHeight - 1, 0);\n const disableScrollUp = scrollTop === 0;\n const disableScrollDown = scrollTop === scrollBuffer;\n\n const scrollTo = useCallback(\n (height: number) => {\n setScrollTop(clamp(scrollTop + height, 0, scrollBuffer));\n },\n [scrollBuffer, scrollTop]\n );\n\n useEffect(() => {\n if (ref.current) {\n ref.current.scrollTop = scrollTop;\n }\n }, [scrollTop]);\n\n useEffect(() => {\n const container = ref.current?.parentElement?.parentElement;\n if (container) {\n const { paddingTop, paddingBottom } = getComputedStyle(container);\n const padding = parseInt(paddingTop) + parseInt(paddingBottom) || 0;\n const resizeObserver = new ResizeObserver(() => {\n setParentHeight(container.getBoundingClientRect().height - padding);\n });\n resizeObserver.observe(container);\n return () => resizeObserver.disconnect();\n }\n }, []);\n\n return (\n <>\n {needScroll && <UpButton scrollTo={scrollTo} disabled={disableScrollUp} />}\n <div\n ref={ref}\n className={clsx(`${name}-section`)}\n style={{\n height: `${sectionHeight}px`,\n overflow: needScroll ? \"hidden\" : \"visible\",\n }}\n >\n <ClickerButton />\n <SelectorButton />\n <PencilButton />\n <TextButton />\n <ShapesButton />\n <EraserButton />\n <CleanButton />\n <AppsButton />\n </div>\n {needScroll && <DownButton scrollTo={scrollTo} disabled={disableScrollDown} />}\n <div className={clsx(\"fastboard-toolbar-mask\", theme)} onClick={onCollapse}>\n <Icon\n fallback={<img draggable={false} className={clsx(`${name}-mask-btn`, theme)} src={collapsePNG} />}\n src={disabled ? icons?.expandIconDisable : icons?.expandIcon}\n />\n </div>\n </>\n );\n}\n","import type { HotKey } from \"white-web-sdk\";\n\nimport React, { useCallback, useContext } from \"react\";\nimport { ApplianceNames } from \"white-web-sdk\";\n\nimport { useTranslation } from \"../../../i18n\";\nimport { Icon } from \"../../../icons\";\nimport { defaultHotKeys } from \"../../../internal\";\nimport { useFastboardApp } from \"../../hooks\";\nimport { Icons } from \"../icons\";\nimport { ToolbarContext } from \"../Toolbar\";\nimport { Button } from \"./Button\";\n\nexport function renderToolTip(text: string | undefined, hotkey?: HotKey) {\n if (!(typeof hotkey === \"string\")) return text;\n return (\n <span className=\"fastboard-toolbar-tooltip\">\n <span>{text}</span>\n <span className=\"fastboard-toolbar-hotkey\">{hotkey.toUpperCase()}</span>\n </span>\n );\n}\n\nexport function ClickerButton() {\n const app = useFastboardApp();\n const { t } = useTranslation();\n const { theme, icons, writable, setAppliance, memberState } = useContext(ToolbarContext);\n\n const changeAppliance = useCallback(() => setAppliance(ApplianceNames.clicker), [setAppliance]);\n\n const shortcut = app.hotKeys?.changeToClick;\n const appliance = memberState?.currentApplianceName;\n const active = appliance === ApplianceNames.clicker;\n const disabled = !writable;\n\n return (\n <Button content={renderToolTip(t(\"clicker\"), shortcut)} onClick={changeAppliance} active={active}>\n <Icon\n fallback={<Icons.Clicker theme={theme} active={active} />}\n src={disabled ? icons?.clickerIconDisable : icons?.clickerIcon}\n alt=\"[clicker]\"\n />\n </Button>\n );\n}\n\nexport function SelectorButton() {\n const app = useFastboardApp();\n const { t } = useTranslation();\n const { theme, icons, writable, setAppliance, memberState } = useContext(ToolbarContext);\n\n const changeAppliance = useCallback(() => setAppliance(ApplianceNames.selector), [setAppliance]);\n\n const appliance = memberState?.currentApplianceName;\n const active = appliance === ApplianceNames.selector;\n const disabled = !writable;\n const shortcut = (app.hotKeys || defaultHotKeys).changeToSelector;\n\n return (\n <Button content={renderToolTip(t(\"selector\"), shortcut)} onClick={changeAppliance} active={active}>\n <Icon\n fallback={<Icons.Selector theme={theme} active={active} />}\n src={disabled ? icons?.selectorIconDisable : icons?.selectorIcon}\n alt=\"[selector]\"\n />\n </Button>\n );\n}\n\nexport function EraserButton() {\n const app = useFastboardApp();\n const { t } = useTranslation();\n const { theme, icons, writable, setAppliance, memberState } = useContext(ToolbarContext);\n\n const changeAppliance = useCallback(() => setAppliance(ApplianceNames.eraser), [setAppliance]);\n\n const appliance = memberState?.currentApplianceName;\n const active = appliance === ApplianceNames.eraser;\n const disabled = !writable;\n const shortcut = (app?.hotKeys || defaultHotKeys).changeToEraser;\n\n return (\n <Button content={renderToolTip(t(\"eraser\"), shortcut)} onClick={changeAppliance} active={active}>\n <Icon\n fallback={<Icons.Eraser theme={theme} active={active} />}\n src={disabled ? icons?.eraserIconDisable : icons?.eraserIcon}\n alt=\"[eraser]\"\n />\n </Button>\n );\n}\n\nexport function CleanButton() {\n const { t } = useTranslation();\n const { theme, icons, writable, cleanCurrentScene } = useContext(ToolbarContext);\n\n const disabled = !writable;\n\n return (\n <Button content={t(\"clean\")} onClick={cleanCurrentScene}>\n <Icon\n fallback={<Icons.Clean theme={theme} />}\n src={disabled ? icons?.cleanIconDisable : icons?.cleanIcon}\n alt=\"[clean]\"\n />\n </Button>\n );\n}\n","import type { PropsWithChildren } from \"react\";\n\nimport clsx from \"clsx\";\nimport React, { forwardRef, useContext } from \"react\";\nimport Tippy from \"@tippyjs/react\";\n\nimport { RightOffset } from \"../../../theme\";\nimport { ToolbarContext } from \"../Toolbar\";\n\ntype ButtonProps = PropsWithChildren<{\n content: React.ReactNode;\n disabled?: boolean;\n active?: boolean;\n onClick?: () => void;\n interactive?: boolean;\n placement?: \"top\" | \"right\"; // not using tippy.js's placement to satisfy dts\n}>;\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>((props, ref) => {\n const { content, disabled, active, onClick, interactive, placement = \"right\", children } = props;\n const { writable, theme } = useContext(ToolbarContext);\n\n return (\n <Tippy\n className=\"fastboard-tip\"\n content={content}\n interactive={interactive}\n theme={theme}\n disabled={disabled || !writable}\n placement={placement}\n offset={placement.includes(\"right\") ? RightOffset : undefined}\n delay={[1000, 400]}\n duration={300}\n >\n <button\n ref={ref}\n className={clsx(\"fastboard-toolbar-btn\", theme, { active })}\n onClick={onClick}\n disabled={disabled || !writable}\n >\n {children}\n </button>\n </Tippy>\n );\n});\n","import clsx from \"clsx\";\nimport Tippy from \"@tippyjs/react\";\nimport React, { useContext } from \"react\";\n\nimport vscodePNG from \"./assets/vscode.png\";\nimport geogebraPNG from \"./assets/geogebra.png\";\nimport countdownPNG from \"./assets/countdown.png\";\n\nimport { Icon } from \"../../../icons\";\nimport { RightOffset } from \"../../../theme\";\nimport { Icons } from \"../icons\";\nimport { ToolbarContext } from \"../Toolbar\";\nimport { Button } from \"./Button\";\nimport { useFastboardApp } from \"../../hooks\";\nimport { Loading } from \"../icons/Loading\";\n\nexport interface AppsButtonProps {\n content?: React.ReactNode;\n onClick?: () => void;\n}\n\nexport function AppsButton({ content, onClick }: AppsButtonProps) {\n const { theme, icons, writable } = useContext(ToolbarContext);\n\n const disabled = !writable;\n\n const button = (\n <Button content=\"Apps\" onClick={onClick}>\n <Icon\n fallback={<Icons.Apps theme={theme} />}\n src={disabled ? icons?.appsIconDisable : icons?.appsIcon}\n alt=\"[apps]\"\n />\n </Button>\n );\n\n return content === false ? (\n button\n ) : (\n <span className=\"fastboard-toolbar-btn-interactive\">\n <Tippy\n className=\"fastboard-tip\"\n content={renderAppsButtonContent(content)}\n theme={theme}\n placement=\"right-end\"\n trigger=\"click\"\n offset={RightOffset}\n arrow={false}\n interactive\n >\n {button}\n </Tippy>\n </span>\n );\n}\n\nfunction renderAppsButtonContent(content?: React.ReactNode) {\n return (\n <div className=\"fastboard-toolbar-panel apps\">\n <div className=\"fastboard-toolbar-apps\">{content || <DefaultApps />}</div>\n </div>\n );\n}\n\nfunction DefaultApps() {\n const app = useFastboardApp();\n const { appsStatus } = useContext(ToolbarContext);\n\n return (\n <>\n <AppIcon\n title=\"Code Editor\"\n src={vscodePNG}\n alt=\"[code editor]\"\n appStatus={appsStatus[\"Monaco\"]}\n onClick={app?.insertCodeEditor.bind(app)}\n />\n <AppIcon\n title=\"GeoGebra\"\n src={geogebraPNG}\n alt=\"[geogebra]\"\n appStatus={appsStatus[\"GeoGebra\"]}\n onClick={app?.insertGeoGebra.bind(app)}\n />\n <AppIcon\n title=\"Countdown\"\n src={countdownPNG}\n alt=\"[countdown]\"\n appStatus={appsStatus[\"Countdown\"]}\n onClick={app?.insertCountdown.bind(app)}\n />\n </>\n );\n}\n\ninterface AppIconProps {\n title: string;\n src: string;\n alt: string;\n appStatus?: {\n status: \"idle\" | \"loading\" | \"failed\";\n reason?: string | undefined;\n };\n onClick?: () => void;\n}\n\nfunction AppIcon({ title, src, alt, appStatus, onClick }: AppIconProps) {\n const { theme } = useContext(ToolbarContext);\n const { status = \"idle\", reason } = appStatus || {};\n const loading = status === \"loading\";\n const failed = status === \"failed\";\n const unifiedTitle = loading ? \"loading\" : failed ? reason : title;\n\n return (\n <div className=\"fastboard-toolbar-app-icon-wrapper\">\n <span\n className={clsx(\"fastboard-toolbar-app-icon\", {\n \"fastboard-toolbar-app-is-loading\": loading,\n \"fastboard-toolbar-app-is-failed\": failed,\n })}\n >\n <Button disabled={failed || loading} placement=\"top\" content={unifiedTitle} onClick={onClick}>\n <img src={src} alt={alt} title={unifiedTitle} />\n </Button>\n <span className=\"fastboard-toolbar-app-icon-text\">{title}</span>\n </span>\n {loading && (\n <span className=\"fastboard-toolbar-app-icon-mask\">\n <Loading theme={theme} />\n </span>\n )}\n </div>\n );\n}\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Loading = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path fill={stroke} d=\"M12 4V2A10 10 0 0 0 2 12h2a8 8 0 0 1 8-8Z\"></path>\n </svg>\n );\n};\n","import Tippy from \"@tippyjs/react\";\nimport React, { useCallback, useContext } from \"react\";\nimport { ApplianceNames } from \"white-web-sdk\";\n\nimport { useTranslation } from \"../../../i18n\";\nimport { Icon } from \"../../../icons\";\nimport { defaultHotKeys } from \"../../../internal\";\nimport { RightOffset } from \"../../../theme\";\nimport { useFastboardApp } from \"../../hooks\";\nimport { Icons } from \"../icons\";\nimport { ToolbarContext } from \"../Toolbar\";\nimport { renderToolTip } from \"./ApplianceButtons\";\nimport { Button } from \"./Button\";\nimport { ColorBox } from \"./ColorBox\";\nimport { CutLine } from \"./CutLine\";\nimport { Slider } from \"./Slider\";\n\nexport function PencilButton() {\n const app = useFastboardApp();\n const { t } = useTranslation();\n\n const { theme, icons, writable, setAppliance, memberState } = useContext(ToolbarContext);\n\n const changeAppliance = useCallback(() => {\n setAppliance(ApplianceNames.pencil);\n }, [setAppliance]);\n\n const appliance = memberState?.currentApplianceName;\n const active = appliance === ApplianceNames.pencil;\n const disabled = !writable;\n const shortcut = (app?.hotKeys || defaultHotKeys).changeToPencil;\n\n return (\n <span className=\"fastboard-toolbar-btn-interactive\">\n <Tippy\n className=\"fastboard-tip\"\n content={renderPencilButtonContent()}\n theme={theme}\n placement=\"right-start\"\n trigger=\"click\"\n offset={RightOffset}\n arrow={false}\n interactive\n >\n <Button content={renderToolTip(t(\"pencil\"), shortcut)} active={active} onClick={changeAppliance}>\n <Icon\n fallback={<Icons.Pencil theme={theme} active={active} />}\n src={disabled ? icons?.pencilIconDisable : icons?.pencilIcon}\n alt=\"[pencil]\"\n />\n <span className=\"fastboard-toolbar-triangle\" />\n </Button>\n </Tippy>\n </span>\n );\n}\n\nfunction renderPencilButtonContent() {\n return (\n <div className=\"fastboard-toolbar-panel pencil\">\n <Slider />\n <CutLine />\n <ColorBox />\n </div>\n );\n}\n","import type { Color } from \"white-web-sdk\";\n\nimport clsx from \"clsx\";\nimport React, { useContext } from \"react\";\n\nimport { isEqualArray } from \"../../../internal\";\nimport { ToolbarContext } from \"../Toolbar\";\n\nconst colors: Record<string, Color> = {\n \"#E02020\": [224, 32, 32],\n \"#F7B500\": [247, 181, 0],\n \"#6DD400\": [109, 212, 0],\n \"#32C5FF\": [50, 197, 255],\n \"#0091FF\": [0, 145, 255],\n \"#6236FF\": [98, 54, 255],\n \"#B620E0\": [182, 32, 224],\n \"#6D7278\": [109, 114, 120],\n};\n\nconst colorKeys = Object.keys(colors);\n\nexport function ColorBox() {\n const { theme, memberState, setStrokeColor, writable } = useContext(ToolbarContext);\n\n const strokeColor = memberState?.strokeColor;\n const disabled = !writable;\n\n return (\n <div className={clsx(\"fastboard-toolbar-color-box\", theme)}>\n {colorKeys.map((key: string) => (\n <div\n key={key}\n className={clsx(\"fastboard-toolbar-color-item\", theme)}\n onClick={() => setStrokeColor(colors[key])}\n >\n <div\n className={clsx(\"fastboard-toolbar-color-border\", theme, {\n active: strokeColor && isEqualArray(strokeColor, colors[key]),\n })}\n >\n <button\n className={clsx(\"fastboard-toolbar-color-btn\")}\n style={{ background: key }}\n disabled={disabled}\n onClick={ev => {\n ev.stopPropagation();\n setStrokeColor(colors[key]);\n }}\n />\n </div>\n </div>\n ))}\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport React, { useContext } from \"react\";\nimport { ToolbarContext, name } from \"../Toolbar\";\n\nexport function CutLine() {\n const { theme } = useContext(ToolbarContext);\n return <span className={clsx(`${name}-cut-line`, theme)} />;\n}\n","import clsx from \"clsx\";\nimport RcSlider from \"rc-slider\";\nimport React, { useContext } from \"react\";\n\nimport { themes } from \"../../../theme\";\nimport { ToolbarContext } from \"../Toolbar\";\n\nexport function Slider() {\n const { theme, writable, memberState, setStrokeWidth } = useContext(ToolbarContext);\n const { activeColor } = themes[theme];\n\n const strokeWidth = memberState?.strokeWidth || 0;\n\n return (\n <RcSlider\n disabled={!writable}\n className={clsx(\"fastboard-toolbar-slider\", theme)}\n trackStyle={{ background: activeColor }}\n handleStyle={{ border: `1px solid ${activeColor}` }}\n value={strokeWidth}\n onChange={setStrokeWidth}\n min={1}\n max={32}\n />\n );\n}\n","import type { ShapeType } from \"white-web-sdk\";\nimport type { IconProps } from \"../../../typings\";\n\nimport Tippy from \"@tippyjs/react\";\nimport React, { useCallback, useContext } from \"react\";\nimport { ApplianceNames } from \"white-web-sdk\";\n\nimport { useTranslation } from \"../../../i18n\";\nimport { RightOffset } from \"../../../theme\";\nimport { ApplianceShapes, Shapes, ShapesMap } from \"../const\";\nimport { ToolbarContext } from \"../Toolbar\";\nimport { Button } from \"./Button\";\nimport { ColorBox } from \"./ColorBox\";\nimport { CutLine } from \"./CutLine\";\nimport { Slider } from \"./Slider\";\n\nconst ShapeTypes = new Set([...ApplianceShapes, ...Shapes]);\n\nexport function ShapesButton() {\n const { t } = useTranslation();\n const { writable, theme, memberState, lastShape, setAppliance } = useContext(ToolbarContext);\n\n const appliance = memberState?.currentApplianceName;\n const shape = memberState?.shapeType;\n\n const key = (appliance === ApplianceNames.shape ? shape : appliance) as keyof typeof ShapesMap;\n\n const active = ShapeTypes.has(key);\n\n const CurrentIcon = ShapesMap[lastShape];\n\n const onClick = useCallback(() => {\n if ((ApplianceShapes as readonly ApplianceNames[]).includes(lastShape as ApplianceNames)) {\n setAppliance(lastShape as ApplianceNames);\n } else if (Shapes.includes(lastShape as ShapeType)) {\n setAppliance(ApplianceNames.shape, lastShape as ShapeType);\n }\n }, [lastShape, setAppliance]);\n\n return (\n <span className=\"fastboard-toolbar-btn-interactive\">\n <Tippy\n className=\"fastboard-tip\"\n content={renderShapesButtonContent()}\n theme={theme}\n placement=\"right-start\"\n trigger=\"click\"\n offset={RightOffset}\n arrow={false}\n interactive\n >\n <Button content={t(\"shape\")} active={active} disabled={!writable} onClick={onClick}>\n <CurrentIcon theme={theme} active={active} />\n <span className=\"fastboard-toolbar-triangle\" />\n </Button>\n </Tippy>\n </span>\n );\n}\n\nfunction renderShapesButtonContent() {\n return (\n <div className=\"fastboard-toolbar-panel shapes\">\n <ShapesBox />\n <CutLine />\n <Slider />\n <CutLine />\n <ColorBox />\n </div>\n );\n}\n\nexport function ShapesBox() {\n const { t } = useTranslation();\n\n return (\n <div className=\"fastboard-toolbar-shapes\">\n {ApplianceShapes.map(Appliance => (\n <ApplianceShapeButton\n key={Appliance}\n content={t(Appliance)}\n Appliance={Appliance}\n Icon={ShapesMap[Appliance]}\n />\n ))}\n {Shapes.map(shape => (\n <ShapeShapeButton key={shape} content={t(shape)} shape={shape} Icon={ShapesMap[shape]} />\n ))}\n </div>\n );\n}\n\ninterface ApplianceShapeButtonProps {\n content?: string;\n Appliance: ApplianceNames;\n Icon: React.ComponentType<IconProps>;\n}\n\nfunction ApplianceShapeButton({ content, Appliance, Icon }: ApplianceShapeButtonProps) {\n const { theme, writable, setAppliance, memberState } = useContext(ToolbarContext);\n\n const current = memberState?.currentApplianceName;\n const disabled = !writable;\n\n return (\n <Button content={content} disabled={disabled} placement=\"top\" onClick={() => setAppliance(Appliance)}>\n <Icon theme={theme} active={current === Appliance} />\n </Button>\n );\n}\n\ninterface ShapeShapeButtonProps {\n content?: string;\n shape: ShapeType;\n Icon: React.ComponentType<IconProps>;\n}\n\nfunction ShapeShapeButton({ content, shape, Icon }: ShapeShapeButtonProps) {\n const { theme, writable, setAppliance, memberState } = useContext(ToolbarContext);\n\n const appliance = memberState?.currentApplianceName;\n const current = appliance === ApplianceNames.shape && memberState?.shapeType;\n const disabled = !writable;\n\n return (\n <Button\n content={content}\n disabled={disabled}\n placement=\"top\"\n onClick={() => setAppliance(ApplianceNames.shape, shape)}\n >\n <Icon theme={theme} active={current === shape} />\n </Button>\n );\n}\n","import Tippy from \"@tippyjs/react\";\nimport React, { useCallback, useContext } from \"react\";\nimport { ApplianceNames } from \"white-web-sdk\";\n\nimport { useTranslation } from \"../../../i18n\";\nimport { Icon } from \"../../../icons\";\nimport { defaultHotKeys } from \"../../../internal\";\nimport { RightOffset } from \"../../../theme\";\nimport { useFastboardApp } from \"../../hooks\";\nimport { Icons } from \"../icons\";\nimport { ToolbarContext } from \"../Toolbar\";\nimport { renderToolTip } from \"./ApplianceButtons\";\nimport { Button } from \"./Button\";\nimport { ColorBox } from \"./ColorBox\";\n\nexport function TextButton() {\n const app = useFastboardApp();\n const { t } = useTranslation();\n\n const { theme, icons, writable, setAppliance, memberState } = useContext(ToolbarContext);\n\n const changeAppliance = useCallback(() => {\n setAppliance(ApplianceNames.text);\n }, [setAppliance]);\n\n const appliance = memberState?.currentApplianceName;\n const active = appliance === ApplianceNames.text;\n const disabled = !writable;\n const shortcut = (app?.hotKeys || defaultHotKeys).changeToText;\n\n return (\n <span className=\"fastboard-toolbar-btn-interactive\">\n <Tippy\n className=\"fastboard-tip\"\n content={renderTextButtonContent()}\n theme={theme}\n placement=\"right-start\"\n trigger=\"click\"\n offset={RightOffset}\n arrow={false}\n interactive\n >\n <Button content={renderToolTip(t(\"text\"), shortcut)} active={active} onClick={changeAppliance}>\n <Icon\n fallback={<Icons.Text theme={theme} active={active} />}\n src={disabled ? icons?.textIconDisable : icons?.textIcon}\n alt=\"[text]\"\n />\n <span className=\"fastboard-toolbar-triangle\" />\n </Button>\n </Tippy>\n </span>\n );\n}\n\nfunction renderTextButtonContent() {\n return (\n <div className=\"fastboard-toolbar-panel text\">\n <ColorBox />\n </div>\n );\n}\n","import React, { useCallback, useContext } from \"react\";\n\nimport { Icon } from \"../../../icons\";\nimport { Icons } from \"../icons\";\nimport { Button } from \"./Button\";\nimport { CutLine } from \"./CutLine\";\nimport { ToolbarContext } from \"../Toolbar\";\nimport { ItemHeight } from \"../const\";\n\nexport interface UpButtonProps {\n disabled: boolean;\n scrollTo: (height: number) => void;\n}\n\nexport function UpButton({ disabled, scrollTo }: UpButtonProps) {\n const { theme, icons } = useContext(ToolbarContext);\n const scrollUp = useCallback(() => scrollTo(-ItemHeight), [scrollTo]);\n\n return (\n <>\n <Button content=\"Up\" disabled={disabled} onClick={scrollUp}>\n <Icon\n fallback={<Icons.Up theme={theme} />}\n src={disabled ? icons?.upIconDisable : icons?.upIcon}\n alt=\"[up]\"\n />\n </Button>\n <CutLine />\n </>\n );\n}\n\nexport function DownButton({ disabled, scrollTo }: UpButtonProps) {\n const { theme, icons } = useContext(ToolbarContext);\n const scrollDown = useCallback(() => scrollTo(ItemHeight), [scrollTo]);\n\n return (\n <>\n <CutLine />\n <Button content=\"Down\" disabled={disabled} onClick={scrollDown}>\n <Icon\n fallback={<Icons.Down theme={theme} />}\n src={disabled ? icons?.downIconDisable : icons?.downIcon}\n alt=\"[down]\"\n />\n </Button>\n </>\n );\n}\n","import type { DependencyList } from \"react\";\nimport type { Player } from \"white-web-sdk\";\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { PlayerPhase } from \"white-web-sdk\";\nimport { useLastValue } from \"../../internal/hooks\";\n\nconst EMPTY_ARRAY: DependencyList = [];\n\nfunction useForceUpdate() {\n const [, forceUpdate_] = useState({});\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useCallback(() => forceUpdate_({}), EMPTY_ARRAY);\n}\n\nexport function usePlayerControl(player?: Player | null) {\n const togglePlay = useCallback(() => {\n if (player) {\n switch (player.phase) {\n case PlayerPhase.WaitingFirstFrame:\n case PlayerPhase.Pause:\n case PlayerPhase.Ended: {\n player.play();\n break;\n }\n case PlayerPhase.Playing: {\n player.pause();\n break;\n }\n }\n }\n }, [player]);\n\n const seekToProgressTime = useCallback(\n (time: number) => {\n if (player) {\n player.seekToProgressTime(time);\n }\n },\n [player]\n );\n\n const lastPlayer = useLastValue(player);\n\n const forceUpdate = useForceUpdate();\n\n const setSpeed = useCallback(\n (speed: number) => {\n if (player) {\n player.playbackSpeed = speed;\n forceUpdate();\n }\n },\n [forceUpdate, player]\n );\n\n useEffect(() => {\n if (!lastPlayer && player) {\n forceUpdate();\n }\n }, [forceUpdate, lastPlayer, player]);\n\n useEffect(() => {\n if (player) {\n player.callbacks.on(\"onPhaseChanged\", forceUpdate);\n player.callbacks.on(\"onProgressTimeChanged\", forceUpdate);\n return () => {\n player.callbacks.off(\"onPhaseChanged\", forceUpdate);\n player.callbacks.off(\"onProgressTimeChanged\", forceUpdate);\n };\n }\n }, [forceUpdate, player]);\n\n const phase = player ? player.phase : PlayerPhase.WaitingFirstFrame;\n const currentTime = player ? player.progressTime : 0;\n const totalTime = player ? player.timeDuration : 0;\n const speed = player ? player.playbackSpeed : 1;\n\n return {\n phase,\n currentTime,\n totalTime,\n speed,\n setSpeed,\n togglePlay,\n seekToProgressTime,\n };\n}\n","import type { FastboardPlayer } from \"@netless/fastboard-core\";\nimport type { CommonProps, GenericIcon } from \"../../typings\";\n\nimport Tippy from \"@tippyjs/react\";\nimport clsx from \"clsx\";\nimport RcSlider from \"rc-slider\";\nimport React, { useEffect, useState } from \"react\";\nimport { PlayerPhase } from \"white-web-sdk\";\n\nimport { useTranslation } from \"../../i18n\";\nimport { Icon } from \"../../icons\";\nimport { themes, TopOffset } from \"../../theme\";\nimport { useTheme } from \"../hooks\";\nimport { Button } from \"./components/Button\";\nimport { usePlayerControl } from \"./hooks\";\nimport { Icons } from \"./icons\";\n\nexport type PlayerControlProps = {\n autoHide?: boolean;\n player?: FastboardPlayer;\n} & Omit<CommonProps, \"room\"> &\n GenericIcon<\"play\" | \"pause\" | \"loading\">;\n\nexport const name = \"fastboard-player-control\";\n\nexport function PlayerControl({ theme, autoHide = false, player: player_, ...icons }: PlayerControlProps) {\n theme = useTheme(theme);\n const { t } = useTranslation();\n\n const [currentTime, setCurrentTime] = useState(0);\n const player = usePlayerControl(player_?.player);\n\n useEffect(() => {\n setCurrentTime(player.currentTime);\n }, [player.currentTime]);\n\n useEffect(() => {\n if (player.currentTime !== currentTime) {\n player.seekToProgressTime(currentTime);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [currentTime]);\n\n const isLoading = player.phase === PlayerPhase.WaitingFirstFrame || player.phase === PlayerPhase.Buffering;\n const isPlaying = player.phase === PlayerPhase.Playing;\n\n const { activeColor } = themes[theme];\n\n return (\n <div className={clsx(name, theme, { \"auto-hide\": autoHide })}>\n <button\n className={clsx(`${name}-btn`, isLoading ? \"loading\" : isPlaying ? \"pause\" : \"play\", theme)}\n disabled={isLoading}\n onClick={player.togglePlay}\n >\n <Icon\n fallback={\n isLoading ? (\n <Icons.Loading theme={theme} />\n ) : isPlaying ? (\n <Icons.Pause theme={theme} />\n ) : (\n <Icons.Play theme={theme} />\n )\n }\n src={isLoading ? icons.loadingIcon : isPlaying ? icons.pauseIcon : icons.playIcon}\n alt={isLoading ? \"[loading]\" : isPlaying ? \"[pause]\" : \"[play]\"}\n />\n </button>\n <span className={clsx(`${name}-slider`, { loading: isLoading }, theme)}>\n <RcSlider\n disabled={isLoading}\n trackStyle={{ background: activeColor }}\n handleStyle={{ border: `1px solid ${activeColor}` }}\n value={currentTime}\n onChange={setCurrentTime}\n min={0}\n max={player.totalTime}\n step={100}\n />\n </span>\n <span className={clsx(`${name}-current`, theme)}>{renderTime(player.currentTime)}</span>\n <span className={clsx(`${name}-slash`, theme)}>/</span>\n <span className={clsx(`${name}-total`, theme)}>{renderTime(player.totalTime)}</span>\n <span className={`${name}-btn-interactive`}>\n <Tippy\n className=\"fastboard-tip\"\n content={renderSpeeds(player)}\n theme={theme}\n placement=\"top-end\"\n trigger=\"click\"\n offset={TopOffset}\n arrow={false}\n interactive\n >\n <Button content={t(\"speed\")} theme={theme} disabled={isLoading}>\n <span className={clsx(`${name}-speed-text`, theme)}>{player.speed}x</span>\n </Button>\n </Tippy>\n </span>\n </div>\n );\n}\n\nfunction renderTime(ms: number) {\n let seconds = ms / 1000;\n const minutes = Math.floor(seconds / 60);\n seconds = Math.floor(seconds) % 60;\n\n return `${String(minutes).padStart(2, \"0\")}` + `:${String(seconds).padStart(2, \"0\")}`;\n}\n\nconst Speeds = [2.0, 1.5, 1.25, 1.0, 0.75, 0.5];\n\nfunction renderSpeeds({ speed: current, setSpeed }: { speed: number; setSpeed: (speed: number) => void }) {\n return (\n <div className={clsx(`${name}-panel`, \"speed\")}>\n {Speeds.map(speed => (\n <button\n className={clsx(`${name}-btn`, \"speed\", {\n active: speed === current,\n })}\n key={speed}\n onClick={() => setSpeed(speed)}\n >\n {speed}x\n </button>\n ))}\n </div>\n );\n}\n","import type { Theme } from \"../../../typings\";\n\nimport clsx from \"clsx\";\nimport React, { forwardRef, type PropsWithChildren } from \"react\";\nimport Tippy from \"@tippyjs/react\";\n\nimport { TopOffset } from \"../../../theme\";\n\ntype ButtonProps = PropsWithChildren<{\n theme: Theme;\n content: React.ReactNode;\n disabled?: boolean;\n active?: boolean;\n onClick?: () => void;\n interactive?: boolean;\n placement?: \"top\" | \"right\"; // not using tippy.js's placement to satisfy dts\n}>;\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>((props, ref) => {\n const { theme, content, disabled, active, onClick, interactive, placement = \"top\", children } = props;\n\n return (\n <Tippy\n className=\"fastboard-tip\"\n content={content}\n interactive={interactive}\n theme={theme}\n disabled={disabled}\n placement={placement}\n offset={TopOffset}\n delay={[1000, 400]}\n duration={300}\n >\n <button\n ref={ref}\n className={clsx(\"fastboard-player-control-btn\", theme, { active })}\n onClick={onClick}\n disabled={disabled}\n >\n {children}\n </button>\n </Tippy>\n );\n});\n","import { memo } from \"react\";\nimport { Loading } from \"./Loading\";\nimport { Pause } from \"./Pause\";\nimport { Play } from \"./Play\";\n\nexport const Icons = {\n Play: memo(Play),\n Pause: memo(Pause),\n Loading: memo(Loading),\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Loading = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path d=\"M12 4V2A10 10 0 0 0 2 12h2a8 8 0 0 1 8-8z\" fill={stroke}></path>\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Pause = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path d=\"M14 19h4V5h-4M6 19h4V5H6v14z\" fill={stroke}></path>\n </svg>\n );\n};\n","import type { IconProps } from \"../../../typings\";\n\nimport React from \"react\";\nimport { getStroke } from \"../../../theme\";\n\nexport const Play = (props: IconProps) => {\n const stroke = getStroke(props);\n return (\n <svg viewBox=\"0 0 24 24\">\n <path d=\"M8 5.14v14l11-7l-11-7z\" fill={stroke}></path>\n </svg>\n );\n};\n","import type { FastboardApp } from \"@netless/fastboard-core\";\nimport type { ForwardedRef } from \"react\";\nimport type { Language, Theme } from \"../typings\";\n\nimport React, { forwardRef, useCallback, useEffect } from \"react\";\nimport { createI18n, I18nContext } from \"../i18n\";\nimport { useAsyncValue, useForceUpdate } from \"../internal\";\nimport { FastboardAppContext, ThemeContext, useFastboardApp, useHideControls } from \"./hooks\";\nimport { PageControl } from \"./PageControl\";\nimport { RedoUndo } from \"./RedoUndo\";\nimport { Toolbar } from \"./Toolbar\";\nimport { ZoomControl } from \"./ZoomControl\";\nimport { hideAll } from \"./tippy-util\";\n\nexport interface FastboardProps {\n app?: FastboardApp | null;\n theme?: Theme;\n layout?: { Toolbar?: boolean; RedoUndo?: boolean; ZoomControl?: boolean; PageControl?: boolean };\n language?: Language;\n}\n\nexport type DivProps = React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>;\nexport type WithForwardedRef<T = HTMLDivElement> = { forwardedRef: ForwardedRef<T> };\n\nexport const Fastboard = /* @__PURE__ */ forwardRef<HTMLDivElement, FastboardProps & DivProps>(\n function Fastboard({ app, theme, layout, language, ...restProps }, ref) {\n if (!app) {\n return <div className=\"fastboard-root\" ref={ref} {...restProps} />;\n }\n\n return (\n <FastboardAppContext.Provider value={app}>\n <FastboardInternal forwardedRef={ref} {...{ theme, layout, language }} {...restProps} />\n </FastboardAppContext.Provider>\n );\n }\n);\n\nfunction FastboardInternal({\n forwardedRef,\n language,\n layout = {},\n theme = \"light\",\n children,\n ...restProps\n}: Omit<FastboardProps, \"app\"> & DivProps & WithForwardedRef) {\n const app = useFastboardApp();\n const forceUpdate = useForceUpdate();\n const i18n = useAsyncValue(() => createI18n({ language }));\n\n useEffect(() => {\n if (i18n) i18n.changeLanguage(language);\n forceUpdate();\n }, [forceUpdate, i18n, language]);\n\n useEffect(() => {\n app.manager.setPrefersColorScheme(theme);\n }, [app, theme]);\n\n const useWhiteboard = useCallback(\n (container: HTMLDivElement | null) => {\n if (container && app) app.bindContainer(container);\n },\n [app]\n );\n\n const hideControls = useHideControls();\n const showControls = !hideControls;\n\n const {\n Toolbar: toolbar = showControls || hideControls === \"toolbar-only\",\n RedoUndo: redo_undo = showControls,\n ZoomControl: zoom_control = showControls,\n PageControl: page_control = showControls,\n } = layout;\n\n return (\n <ThemeContext.Provider value={theme}>\n <I18nContext.Provider value={i18n}>\n <div {...restProps} className=\"fastboard-root\" ref={forwardedRef}>\n <div className=\"fastboard-view\" ref={useWhiteboard} onTouchStartCapture={hideAll} />\n {children ? (\n children\n ) : (\n <>\n {toolbar && (\n <div className=\"fastboard-left\">\n <Toolbar />\n </div>\n )}\n {(redo_undo || zoom_control) && (\n <div className=\"fastboard-bottom-left\">\n {redo_undo && <RedoUndo />}\n {zoom_control && <ZoomControl />}\n </div>\n )}\n {page_control && (\n <div className=\"fastboard-bottom-right\">\n <PageControl />\n </div>\n )}\n </>\n )}\n </div>\n </I18nContext.Provider>\n </ThemeContext.Provider>\n );\n}\n","import type { Instance } from \"tippy.js\";\n\nexport function hideAll() {\n Array.from(document.querySelectorAll(\"[data-tippy-root]\")).forEach(e => {\n const instance = (e as unknown as { _tippy?: Instance })._tippy;\n if (instance) instance.hide();\n });\n}\n","import type { FastboardPlayer } from \"@netless/fastboard-core\";\nimport type { DivProps } from \"./Fastboard\";\nimport type { Theme } from \"../typings\";\n\nimport React, { forwardRef, useCallback } from \"react\";\nimport { PlayerControl } from \"./PlayerControl\";\n\nexport interface ReplayFastboardProps {\n player?: FastboardPlayer | null;\n theme?: Theme;\n autoHideControl?: boolean;\n}\n\nexport const ReplayFastboard = /* @__PURE__ */ forwardRef<HTMLDivElement, ReplayFastboardProps & DivProps>(\n function ReplayFastboard({ player, theme = \"light\", autoHideControl = false, ...restProps }, ref) {\n const useWhiteboard = useCallback(\n (container: HTMLDivElement | null) => {\n if (container && player) player.bindContainer(container);\n },\n [player]\n );\n\n if (!player) {\n return <div className=\"fastboard-root\" ref={ref} {...restProps} />;\n }\n\n return (\n <div className=\"fastboard-root\" ref={ref} {...restProps}>\n <div className=\"fastboard-view\" ref={useWhiteboard} />\n <div className=\"fastboard-bottom\">\n <PlayerControl player={player} theme={theme} autoHide={autoHideControl} />\n </div>\n </div>\n );\n }\n);\n","import type { FastboardApp } from \"@netless/fastboard-core\";\nimport type { DivProps, FastboardProps } from \"../components/Fastboard\";\n\nimport React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { Fastboard } from \"../components/Fastboard\";\n\nexport type MountProps = Omit<FastboardProps & DivProps, \"ref\">;\n\n/**\n * Mount fastboard app to some dom, returns the updater and disposer.\n * @example\n * let app = await createFastboard({ ...config })\n * const { update, destroy } = mount(app, document.getElementById(\"whiteboard\"))\n * update({ theme: 'dark' })\n * destroy()\n */\nexport function mount(app: FastboardApp, dom: HTMLElement, props: MountProps = {}) {\n ReactDOM.render(<Fastboard app={app} {...props} />, dom);\n return {\n update(props: MountProps = {}) {\n ReactDOM.render(<Fastboard app={app} {...props} />, dom);\n },\n destroy() {\n ReactDOM.unmountComponentAtNode(dom);\n },\n };\n}\n"],"mappings":"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","names":[]}
|