@netless/fastboard-ui 1.0.0-canary.7 → 1.0.0-canary.9

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@netless/fastboard-ui",
3
- "version": "1.0.0-canary.7",
3
+ "version": "1.0.0-canary.9",
4
4
  "description": "The front-end of @netless/fastboard-core.",
5
5
  "main": "dist/index.js",
6
6
  "svelte": "dist/index.svelte.mjs",
@@ -13,14 +13,14 @@
13
13
  ],
14
14
  "repository": "netless-io/fastboard",
15
15
  "peerDependencies": {
16
- "@netless/fastboard-core": "1.0.0-canary.7"
16
+ "@netless/fastboard-core": "1.0.0-canary.9"
17
17
  },
18
18
  "dependencies": {
19
19
  "tippy.js": "^6.3.7"
20
20
  },
21
21
  "devDependencies": {
22
22
  "@netless/esbuild-plugin-inline-sass": "0.1.0",
23
- "@netless/fastboard-core": "1.0.0-canary.7"
23
+ "@netless/fastboard-core": "1.0.0-canary.9"
24
24
  },
25
25
  "scripts": {
26
26
  "cleanup": "rimraf dist",
@@ -10,7 +10,7 @@ export const scrollTop: SvelteAction<Writable<number>> = function (node, value)
10
10
 
11
11
  function on_scroll() {
12
12
  clearTimeout(timer);
13
- timer = setTimeout(() => value.set(node.scrollTop), 200);
13
+ timer = window.setTimeout(() => value.set(node.scrollTop), 200);
14
14
  }
15
15
 
16
16
  node.addEventListener("scroll", on_scroll);
@@ -0,0 +1,10 @@
1
+ <script lang="ts">
2
+ import type { Theme } from "../../typings";
3
+
4
+ export let theme: Theme = "light";
5
+ export let active = false;
6
+ </script>
7
+
8
+ <svg fill="none" viewBox="0 0 24 24" class="fastboard-icon {theme}" class:is-active={active}>
9
+ <path stroke="#5D6066" stroke-width="1.25" d="M4 4c16 0 0 16 16 16" class="fastboard-icon-stroke-color" />
10
+ </svg>
@@ -0,0 +1,16 @@
1
+ <script lang="ts">
2
+ import type { Theme } from "../../typings";
3
+
4
+ export let theme: Theme = "light";
5
+ export let active = false;
6
+ </script>
7
+
8
+ <svg fill="none" viewBox="0 0 24 24" class="fastboard-icon {theme}" class:is-active={active}>
9
+ <path
10
+ stroke="#5D6066"
11
+ stroke-dasharray="1.25 1.25"
12
+ stroke-width="1.25"
13
+ d="M4 4c16 0 0 16 16 16"
14
+ class="fastboard-icon-stroke-color"
15
+ />
16
+ </svg>
@@ -46,6 +46,8 @@ import WhiteboardAdd from "./WhiteboardAdd.svelte";
46
46
  import Play from "./Play.svelte";
47
47
  import Pause from "./Pause.svelte";
48
48
  import Loading from "./Loading.svelte";
49
+ import Curve from "./Curve.svelte";
50
+ import CurveDashed from "./CurveDashed.svelte";
49
51
 
50
52
  const Icons = {
51
53
  Apps,
@@ -93,6 +95,8 @@ const Icons = {
93
95
  Play,
94
96
  Pause,
95
97
  Loading,
98
+ Curve,
99
+ CurveDashed,
96
100
  };
97
101
 
98
102
  export default Icons;
@@ -25,6 +25,7 @@
25
25
  $: computed_height = clamp($container_height, extra_height, $scroll_height + extra_height);
26
26
  $: scrollable = $scroll_height + extra_height > $container_height;
27
27
 
28
+ $: hide_dotted = config.pencil?.dotted === false;
28
29
  $: hide_apps = config.apps?.enable === false;
29
30
  $: eraser_type = config.eraser?.behavior || "both";
30
31
  </script>
@@ -39,6 +40,7 @@
39
40
  {scroll_height}
40
41
  {computed_height}
41
42
  {scrollable}
43
+ {hide_dotted}
42
44
  {hide_apps}
43
45
  {eraser_type}
44
46
  />
@@ -3,6 +3,9 @@ import type { Theme, Language } from "../../typings";
3
3
  import { SvelteComponentTyped } from "svelte";
4
4
 
5
5
  export declare interface ToolbarConfig {
6
+ pencil?: {
7
+ dotted?: boolean;
8
+ };
6
9
  apps?: {
7
10
  enable?: boolean;
8
11
  };
@@ -28,6 +28,7 @@
28
28
  export let scroll_height: Writable<number>;
29
29
  export let computed_height = 0;
30
30
  export let scrollable = false;
31
+ export let hide_dotted = false;
31
32
  export let hide_apps = false;
32
33
  export let eraser_type: "delete" | "pencil" | "both" = "both";
33
34
 
@@ -58,6 +59,7 @@
58
59
  };
59
60
  $: memberState = app?.memberState;
60
61
  $: appliance = $memberState?.currentApplianceName;
62
+ $: dotted = $memberState?.dottedLine;
61
63
  $: shape = $memberState?.shapeType;
62
64
  $: status = app?.appsStatus;
63
65
 
@@ -94,6 +96,12 @@
94
96
  function text() {
95
97
  app?.setAppliance("text");
96
98
  }
99
+ function set_dotted() {
100
+ app?.toggleDottedLine(true);
101
+ }
102
+ function unset_dotted() {
103
+ app?.toggleDottedLine(false);
104
+ }
97
105
  function select_last_shape() {
98
106
  if (applianceShapes.includes(last_shape as Appliance)) {
99
107
  app?.setAppliance(last_shape as Appliance);
@@ -251,6 +259,31 @@
251
259
 
252
260
  <div class="{name}-panel-wrapper" style="display:none">
253
261
  <div class="{name}-panel pencil" bind:this={pencil_panel}>
262
+ {#if !hide_dotted}
263
+ <div class="{name}-panel-btns">
264
+ <Button
265
+ class="pencil"
266
+ active={appliance === "pencil" && !dotted}
267
+ {...btn_props}
268
+ on:click={unset_dotted}
269
+ placement="top"
270
+ content={t.solid}
271
+ >
272
+ <Icons.Curve {theme} active={appliance === "pencil" && !dotted} />
273
+ </Button>
274
+ <Button
275
+ class="pencil"
276
+ active={appliance === "pencil" && dotted}
277
+ {...btn_props}
278
+ on:click={set_dotted}
279
+ placement="top"
280
+ content={t.dashed}
281
+ >
282
+ <Icons.CurveDashed {theme} active={appliance === "pencil" && dotted} />
283
+ </Button>
284
+ </div>
285
+ <div class="{name}-panel-divider" />
286
+ {/if}
254
287
  <StrokeWidth {app} {theme} {disabled} />
255
288
  <div class="{name}-panel-divider" />
256
289
  <StrokeColor {app} {theme} {disabled} />
@@ -65,6 +65,7 @@
65
65
  }
66
66
  </script>
67
67
 
68
+ <!-- svelte-ignore a11y-click-events-have-key-events -->
68
69
  <div class="fastboard-toolbar-shapes {theme}" on:click={set_appliance_or_shape}>
69
70
  {#each shapes as key (key)}
70
71
  {@const is_selected = appliance === "shape" ? shape === key : appliance === key}
@@ -39,7 +39,6 @@
39
39
  class="{name}-track {theme}"
40
40
  class:grabbing
41
41
  type="range"
42
- role="slider"
43
42
  {disabled}
44
43
  {min}
45
44
  {max}
@@ -25,6 +25,7 @@
25
25
  }
26
26
  </script>
27
27
 
28
+ <!-- svelte-ignore a11y-click-events-have-key-events -->
28
29
  <div class="fastboard-toolbar-colors {theme}" on:click={set_stroke_color}>
29
30
  {#each colorKeys as key (key)}
30
31
  <button
@@ -25,6 +25,7 @@
25
25
  }
26
26
  </script>
27
27
 
28
+ <!-- svelte-ignore a11y-click-events-have-key-events -->
28
29
  <div class="fastboard-toolbar-colors {theme}" on:click={set_stroke_color}>
29
30
  {#each colorKeys as key (key)}
30
31
  <button
@@ -24,7 +24,7 @@ export const shapes = [
24
24
  "speechBalloon",
25
25
  ] as const;
26
26
 
27
- export type Shape = typeof shapes[number];
27
+ export type Shape = (typeof shapes)[number];
28
28
 
29
29
  export const applianceShapes = shapes.slice(0, 4) as Appliance[];
30
30
 
@@ -52,7 +52,7 @@ export const shapesIconActive: Record<Shape, any> = {
52
52
 
53
53
  export const erasers = ["eraser", "pencilEraser"] as const;
54
54
 
55
- export type Eraser = typeof erasers[number];
55
+ export type Eraser = (typeof erasers)[number];
56
56
 
57
57
  export const eraserIcon: Record<Eraser, any> = {
58
58
  eraser: Icons.Eraser,
@@ -65,7 +65,17 @@ export const eraserIconActive: Record<Eraser, any> = {
65
65
  };
66
66
 
67
67
  export const i18n: I18nData<
68
- "clicker" | "selector" | "pencil" | "pencilEraser" | "text" | "shapes" | "eraser" | "clear" | "apps"
68
+ | "clicker"
69
+ | "selector"
70
+ | "pencil"
71
+ | "pencilEraser"
72
+ | "text"
73
+ | "shapes"
74
+ | "eraser"
75
+ | "clear"
76
+ | "apps"
77
+ | "solid"
78
+ | "dashed"
69
79
  > = {
70
80
  en: {
71
81
  clicker: "clicker",
@@ -77,6 +87,8 @@ export const i18n: I18nData<
77
87
  shapes: "shapes",
78
88
  clear: "clear",
79
89
  apps: "apps",
90
+ solid: "solid",
91
+ dashed: "dashed",
80
92
  },
81
93
  "zh-CN": {
82
94
  clicker: "点击",
@@ -88,6 +100,8 @@ export const i18n: I18nData<
88
100
  shapes: "形状",
89
101
  clear: "清屏",
90
102
  apps: "Apps",
103
+ solid: "实线",
104
+ dashed: "虚线",
91
105
  },
92
106
  };
93
107
 
@@ -55,7 +55,7 @@
55
55
  let type: IconType;
56
56
  $: type = disabled ? "disable" : "normal";
57
57
 
58
- $: camera = app?.baseCamera;
58
+ $: camera = app?.camera;
59
59
  $: scale = $camera?.scale ?? 1;
60
60
  $: plus_disabled = disabled || next_scale(scale, 1) <= scale;
61
61
  $: minus_disabled = disabled || next_scale(scale, -1) >= scale;
@@ -1 +0,0 @@
1
- {"version":3,"sources":["sass:./style.scss"],"sourcesContent":[".tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;white-space:normal;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:\"\";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1}.tippy-box[data-theme~=light]{color:#26323d;box-shadow:0 0 20px 4px #9aa1b126,0 4px 80px -8px #24282f40,0 4px 4px -2px #5b5e6926;background-color:#fff}.tippy-box[data-theme~=light][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=light][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff}.tippy-box[data-theme~=light][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=light][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff}.tippy-box[data-theme~=light]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=light]>.tippy-svg-arrow{fill:#fff}.fastboard-icon.light .fastboard-icon-stroke-color{stroke:var(--fastboard-color, #5d6066)}.fastboard-icon.light .fastboard-icon-fill-color{fill:var(--fastboard-color, #5d6066)}.fastboard-icon.light.is-active .fastboard-icon-stroke-color{stroke:var(--fastboard-active-color, #3381ff)}.fastboard-icon.light.is-active .fastboard-icon-fill-color{fill:var(--fastboard-active-color, #3381ff)}.fastboard-icon.dark .fastboard-icon-stroke-color{stroke:var(--fastboard-color, #7b7e84)}.fastboard-icon.dark .fastboard-icon-fill-color{fill:var(--fastboard-color, #7b7e84)}.fastboard-icon.dark.is-active .fastboard-icon-stroke-color{stroke:var(--fastboard-active-color, #2867cc)}.fastboard-icon.dark.is-active .fastboard-icon-fill-color{fill:var(--fastboard-active-color, #2867cc)}.fastboard-redo-undo{box-sizing:border-box;display:inline-flex;align-items:center;gap:4px;padding:4px;border:1px solid;border-radius:4px;font-size:14px;font-family:system-ui;pointer-events:auto;backdrop-filter:blur(5px);-webkit-backdrop-filter:blur(5px)}.fastboard-redo-undo *{box-sizing:inherit}.fastboard-redo-undo.light{color:var(--fastboard-color, #5d6066);background-color:var(--fastboard-bg-color, rgba(255, 255, 255, .9));border-color:var(--fastboard-border-color, #e5e8f0)}.fastboard-redo-undo.dark{color:var(--fastboard-color, #7b7e84);background-color:var(--fastboard-bg-color, rgba(20, 24, 30, .9));border-color:var(--fastboard-border-color, #383b42)}.fastboard-redo-undo-btn{appearance:none;cursor:pointer;margin:0;border:0;padding:0;width:24px;height:24px;background-color:#0000;border-radius:4px;font-size:0;line-height:1;flex-shrink:0}.fastboard-redo-undo-btn svg,.fastboard-redo-undo-btn img{width:100%;height:100%;pointer-events:none}.fastboard-redo-undo-btn:disabled{opacity:.5;cursor:not-allowed}.fastboard-redo-undo-btn.light:not(:disabled):hover{background-color:var(--fastboard-hover-bg-color, #ebf2ff)}.fastboard-redo-undo-btn.light:not(:disabled).is-active{background-color:var(--fastboard-active-bg-color, #ebf2ff)}.fastboard-redo-undo-btn.dark:not(:disabled):hover{background-color:var(--fastboard-hover-bg-color, #383b42)}.fastboard-redo-undo-btn.dark:not(:disabled).is-active{background-color:var(--fastboard-active-bg-color, #383b42)}.fastboard-zoom-control{box-sizing:border-box;display:inline-flex;align-items:center;gap:4px;padding:4px;border:1px solid;border-radius:4px;font-size:14px;font-family:system-ui;pointer-events:auto;backdrop-filter:blur(5px);-webkit-backdrop-filter:blur(5px)}.fastboard-zoom-control *{box-sizing:inherit}.fastboard-zoom-control.light{color:var(--fastboard-color, #5d6066);background-color:var(--fastboard-bg-color, rgba(255, 255, 255, .9));border-color:var(--fastboard-border-color, #e5e8f0)}.fastboard-zoom-control.dark{color:var(--fastboard-color, #7b7e84);background-color:var(--fastboard-bg-color, rgba(20, 24, 30, .9));border-color:var(--fastboard-border-color, #383b42)}.fastboard-zoom-control-btn{appearance:none;cursor:pointer;margin:0;border:0;padding:0;width:24px;height:24px;background-color:#0000;border-radius:4px;font-size:0;line-height:1;flex-shrink:0}.fastboard-zoom-control-btn svg,.fastboard-zoom-control-btn img{width:100%;height:100%;pointer-events:none}.fastboard-zoom-control-btn:disabled{opacity:.5;cursor:not-allowed}.fastboard-zoom-control-btn.light:not(:disabled):hover{background-color:var(--fastboard-hover-bg-color, #ebf2ff)}.fastboard-zoom-control-btn.light:not(:disabled).is-active{background-color:var(--fastboard-active-bg-color, #ebf2ff)}.fastboard-zoom-control-btn.dark:not(:disabled):hover{background-color:var(--fastboard-hover-bg-color, #383b42)}.fastboard-zoom-control-btn.dark:not(:disabled).is-active{background-color:var(--fastboard-active-bg-color, #383b42)}.fastboard-zoom-control-text{font-variant-numeric:tabular-nums}.fastboard-page-control{box-sizing:border-box;display:inline-flex;align-items:center;gap:4px;padding:4px;border:1px solid;border-radius:4px;font-size:14px;font-family:system-ui;pointer-events:auto;backdrop-filter:blur(5px);-webkit-backdrop-filter:blur(5px)}.fastboard-page-control *{box-sizing:inherit}.fastboard-page-control.light{color:var(--fastboard-color, #5d6066);background-color:var(--fastboard-bg-color, rgba(255, 255, 255, .9));border-color:var(--fastboard-border-color, #e5e8f0)}.fastboard-page-control.dark{color:var(--fastboard-color, #7b7e84);background-color:var(--fastboard-bg-color, rgba(20, 24, 30, .9));border-color:var(--fastboard-border-color, #383b42)}.fastboard-page-control-btn{appearance:none;cursor:pointer;margin:0;border:0;padding:0;width:24px;height:24px;background-color:#0000;border-radius:4px;font-size:0;line-height:1;flex-shrink:0}.fastboard-page-control-btn svg,.fastboard-page-control-btn img{width:100%;height:100%;pointer-events:none}.fastboard-page-control-btn:disabled{opacity:.5;cursor:not-allowed}.fastboard-page-control-btn.light:not(:disabled):hover{background-color:var(--fastboard-hover-bg-color, #ebf2ff)}.fastboard-page-control-btn.light:not(:disabled).is-active{background-color:var(--fastboard-active-bg-color, #ebf2ff)}.fastboard-page-control-btn.dark:not(:disabled):hover{background-color:var(--fastboard-hover-bg-color, #383b42)}.fastboard-page-control-btn.dark:not(:disabled).is-active{background-color:var(--fastboard-active-bg-color, #383b42)}.fastboard-page-control-text{font-variant-numeric:tabular-nums}.fastboard-player-control{box-sizing:border-box;display:inline-flex;align-items:center;gap:4px;padding:4px;border:1px solid;border-radius:4px;font-size:14px;font-family:system-ui;pointer-events:auto;backdrop-filter:blur(5px);-webkit-backdrop-filter:blur(5px);width:100%}.fastboard-player-control *{box-sizing:inherit}.fastboard-player-control.light{color:var(--fastboard-color, #5d6066);background-color:var(--fastboard-bg-color, rgba(255, 255, 255, .9));border-color:var(--fastboard-border-color, #e5e8f0)}.fastboard-player-control.dark{color:var(--fastboard-color, #7b7e84);background-color:var(--fastboard-bg-color, rgba(20, 24, 30, .9));border-color:var(--fastboard-border-color, #383b42)}.fastboard-player-control-btn{appearance:none;cursor:pointer;margin:0;border:0;padding:0;width:24px;height:24px;background-color:#0000;border-radius:4px;font-size:0;line-height:1;flex-shrink:0;display:inline}.fastboard-player-control-btn svg,.fastboard-player-control-btn img{width:100%;height:100%;pointer-events:none}.fastboard-player-control-btn:disabled{opacity:.5;cursor:not-allowed}.fastboard-player-control-btn.light:not(:disabled):hover{background-color:var(--fastboard-hover-bg-color, #ebf2ff)}.fastboard-player-control-btn.light:not(:disabled).is-active{background-color:var(--fastboard-active-bg-color, #ebf2ff)}.fastboard-player-control-btn.dark:not(:disabled):hover{background-color:var(--fastboard-hover-bg-color, #383b42)}.fastboard-player-control-btn.dark:not(:disabled).is-active{background-color:var(--fastboard-active-bg-color, #383b42)}.fastboard-player-control-btn.loading svg,.fastboard-player-control-btn.loading img{animation:fastboard-player-control-rotate .5s linear infinite}@keyframes fastboard-player-control-rotate{to{transform:rotate(360deg)}}.fastboard-player-control-btn.speed{width:auto;padding:4px;text-align:right;font-size:14px;font-variant-numeric:tabular-nums}.fastboard-player-control-btn.is-active.light{color:var(--fastboard-active-color, #3381ff)}.fastboard-player-control-btn.is-active.dark{color:var(--fastboard-active-color, #2867cc)}.fastboard-player-control-speed-text,.fastboard-player-control-progress{font-size:14px;font-variant-numeric:tabular-nums;line-height:16px}.fastboard-player-control-progress{display:inline-flex;align-items:center}.fastboard-player-control-panel.speed{display:flex;flex-direction:column}.fastboard-toolbar{height:100%;display:flex;align-items:center;position:relative;left:0;transition:left .5s cubic-bezier(.34,1.56,.64,1);pointer-events:none}.fastboard-toolbar.collapsed{left:-100%}.fastboard-toolbar-handler{position:absolute;left:100%;width:17px;font-size:0;border-radius:3px;cursor:pointer;pointer-events:auto}.fastboard-toolbar-handler:focus-visible{outline:2px solid -webkit-focus-ring-color}.fastboard-toolbar-handler input[type=checkbox]{position:absolute;top:0;left:0;appearance:none;margin:0;width:100%;height:100%;cursor:pointer;opacity:0;z-index:-1}.fastboard-toolbar-handler svg{opacity:0;transition:opacity .5s 1s;pointer-events:none}.fastboard-toolbar-handler.light .fastboard-toolbar-handler-bg-color{fill:var(--fastboard-bg-color, rgba(255, 255, 255, .9))}.fastboard-toolbar-handler.light .fastboard-toolbar-handler-border-color{stroke:var(--fastboard-border-color, #e5e8f0)}.fastboard-toolbar-handler.light .fastboard-toolbar-handler-image-stroke-color{stroke:var(--fastboard-color, #5d6066)}.fastboard-toolbar-handler.light .fastboard-toolbar-handler-image-fill-color{fill:var(--fastboard-color, #5d6066)}.fastboard-toolbar-handler.dark .fastboard-toolbar-handler-bg-color{fill:var(--fastboard-bg-color, rgba(20, 24, 30, .9))}.fastboard-toolbar-handler.dark .fastboard-toolbar-handler-border-color{stroke:var(--fastboard-border-color, #383b42)}.fastboard-toolbar-handler.dark .fastboard-toolbar-handler-image-stroke-color{stroke:var(--fastboard-color, #7b7e84)}.fastboard-toolbar-handler.dark .fastboard-toolbar-handler-image-fill-color{fill:var(--fastboard-color, #7b7e84)}.fastboard-toolbar:hover .fastboard-toolbar-handler svg,.fastboard-toolbar.collapsed .fastboard-toolbar-handler svg{opacity:1;transition:opacity .2s}.fastboard-toolbar-btn{appearance:none;cursor:pointer;margin:0;border:0;padding:4px;width:32px;height:32px;background-color:#0000;border-radius:8px;font-size:0;line-height:1;flex-shrink:0}.fastboard-toolbar-btn svg,.fastboard-toolbar-btn img{width:100%;height:100%;pointer-events:none}.fastboard-toolbar-btn:disabled{opacity:.5;cursor:not-allowed}.fastboard-toolbar-btn.light:not(:disabled):hover{background-color:var(--fastboard-hover-bg-color, #ebf2ff)}.fastboard-toolbar-btn.light:not(:disabled).is-active{background-color:var(--fastboard-active-bg-color, #ebf2ff)}.fastboard-toolbar-btn.dark:not(:disabled):hover{background-color:var(--fastboard-hover-bg-color, #383b42)}.fastboard-toolbar-btn.dark:not(:disabled).is-active{background-color:var(--fastboard-active-bg-color, #383b42)}.fastboard-slider{box-sizing:border-box;position:relative;width:100%;height:100%;display:flex;align-items:center}.fastboard-slider *{box-sizing:inherit}.fastboard-slider-track{appearance:none;background:rgba(0,0,0,0);border:0;border-radius:26px;flex:1;display:block;height:19px;margin:0;width:0;min-width:0;padding:0;transition:box-shadow .3s ease;cursor:pointer;touch-action:manipulation}.fastboard-slider-track::-webkit-slider-runnable-track{border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;user-select:none;background-color:#80808040;-webkit-user-select:none;background-image:linear-gradient(to right,currentColor var(--value, 0%),transparent var(--value, 0%))}.fastboard-slider-track::-webkit-slider-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px #23292f26,0 0 0 1px #23292f33;width:13px;height:13px;position:relative;transition:all .2s ease;cursor:grab;appearance:none;margin-top:-4px}.fastboard-slider-track::-moz-range-track{border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;user-select:none;background-color:#80808040;-webkit-user-select:none}.fastboard-slider-track::-moz-range-thumb{appearance:none;background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px #23292f26,0 0 0 1px #23292f33;width:13px;height:13px;position:relative;transition:all .2s ease;cursor:grab}.fastboard-slider-track::-moz-range-progress{background:currentColor;border-radius:2.5px;height:5px}.fastboard-slider-track::-ms-track{border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;user-select:none;background-color:#80808040;-webkit-user-select:none;color:#0000}.fastboard-slider-track::-ms-thumb{appearance:none;background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px #23292f26,0 0 0 1px #23292f33;width:13px;height:13px;position:relative;transition:all .2s ease;cursor:grab;margin-top:0}.fastboard-slider-track::-ms-tooltip{display:none}.fastboard-slider-track::-moz-focus-outer{border:0}.fastboard-slider-track.grabbing::-webkit-slider-thumb{cursor:grabbing}.fastboard-slider-track.light{color:var(--fastboard-active-color, #3381ff)}.fastboard-slider-track.dark{color:var(--fastboard-active-color, #2867cc)}.fastboard-toolbar-contents{box-sizing:border-box;display:inline-flex;align-items:center;gap:4px;border:1px solid;border-radius:4px;font-size:14px;font-family:system-ui;pointer-events:auto;backdrop-filter:blur(5px);-webkit-backdrop-filter:blur(5px);padding:2px 0;gap:0;flex-direction:column}.fastboard-toolbar-contents *{box-sizing:inherit}.fastboard-toolbar-contents.light{color:var(--fastboard-color, #5d6066);background-color:var(--fastboard-bg-color, rgba(255, 255, 255, .9));border-color:var(--fastboard-border-color, #e5e8f0)}.fastboard-toolbar-contents.dark{color:var(--fastboard-color, #7b7e84);background-color:var(--fastboard-bg-color, rgba(20, 24, 30, .9));border-color:var(--fastboard-border-color, #383b42)}.fastboard-toolbar-contents>.fastboard-toolbar-btn{margin:2px 4px}.fastboard-toolbar-btn-interactive{position:relative}.fastboard-toolbar-triangle{width:0px;height:0px;border-bottom:3px solid;border-left:3px solid rgba(0,0,0,0);position:absolute;bottom:0;right:0}.fastboard-toolbar-btn:focus+.fastboard-toolbar-triangle{opacity:0}.fastboard-toolbar-scrollable{padding:2px 4px;overflow:hidden;display:flex;flex-direction:column;gap:0}.fastboard-toolbar-tooltip{display:inline-flex;align-items:center;gap:4px}.fastboard-toolbar-hotkey{display:inline-flex;margin-right:-4px;width:24px;height:24px;align-items:center;justify-content:center;background-color:#ffffff1a;border-radius:4px}.fastboard-toolbar-panel-wrapper{display:none}.fastboard-toolbar-panel{display:flex;flex-direction:column}.fastboard-toolbar-panel-divider{height:.5px;width:100%;margin:4px 0;background-color:#ffffff26}.fastboard-toolbar-slider.pencil-eraser-size{width:136px}.fastboard-toolbar-colors,.fastboard-toolbar-shapes{display:grid;align-self:center;grid-template:repeat(2,1fr)/repeat(4,1fr);align-items:center;justify-items:center;gap:4px}.fastboard-toolbar-shape-btn,.fastboard-toolbar-color-btn{width:24px;height:24px;padding:0;display:inline-flex;align-items:center;justify-content:center}.fastboard-toolbar-color-btn{border:1px solid rgba(0,0,0,0)}.fastboard-toolbar-color-btn.light.is-active{border-color:var(--fastboard-active-color, #3381ff)}.fastboard-toolbar-color-btn.dark.is-active{border-color:var(--fastboard-active-color, #2867cc)}.fastboard-toolbar-color-item{display:inline-block;width:16px;height:16px;border-radius:4px;pointer-events:none}.fastboard-toolbar-panel.apps{display:grid;grid-template-columns:repeat(min(var(--n, 3),3),minmax(max-content,1fr));gap:4px}.fastboard-toolbar-app-btn{margin:0;border:0;border-radius:2px;padding:4px 6px;background-color:#0000;display:inline-flex;flex-direction:column;align-items:center;gap:4px;font-size:0}.fastboard-toolbar-app-btn:disabled{opacity:.8}.fastboard-toolbar-app-btn-icon{width:32px;height:32px;pointer-events:none}.fastboard-toolbar-app-btn-text{font-size:14px;line-height:1;max-width:100%;overflow:hidden;text-overflow:ellipsis}.fastboard-toolbar-app-btn.is-loading{cursor:progress}.fastboard-toolbar-app-btn.is-failed{cursor:not-allowed;opacity:.5}.fastboard-toolbar-app-btn:not(:disabled,.is-loading,.is-failed):hover.light{cursor:pointer;background-color:var(--fastboard-hover-bg-color, #ebf2ff)}.fastboard-toolbar-app-btn-text.light{color:var(--fastboard-color, #5d6066)}.fastboard-toolbar-app-btn:not(:disabled,.is-loading,.is-failed):hover.dark{cursor:pointer;background-color:var(--fastboard-hover-bg-color, #383b42)}.fastboard-toolbar-app-btn-text.dark{color:var(--fastboard-color, #7b7e84)}.fastboard-root{position:relative;width:100%;height:100%;overflow:hidden}.fastboard-view{position:absolute;top:0;left:0;width:100%;height:100%}.fastboard-left{display:flex;align-items:center;position:absolute;bottom:50px;top:8px;left:0;z-index:200;pointer-events:none}.fastboard-left .fastboard-toolbar{padding-left:8px}.fastboard-bottom-left,.fastboard-bottom,.fastboard-bottom-right{display:flex;gap:10px;position:absolute;bottom:8px;left:8px;z-index:200;pointer-events:none}.fastboard-bottom-right{left:auto;right:8px}.fastboard-bottom{right:8px}.fastboard-left.hidden *,.fastboard-bottom.hidden *,.fastboard-bottom-left.hidden *,.fastboard-bottom-right.hidden *{opacity:0;pointer-events:none}.fastboard-tip{font-family:inherit;color:#d5d9e0;background-color:#03060d}.fastboard-tip[data-placement^=right]>.tippy-arrow:before{top:4px;border-width:4px;border-right-color:#03060d}.fastboard-tip[data-placement^=top]>.tippy-arrow:before{left:4px;border-width:4px;border-top-color:#03060d}.fastboard-panel .tippy-content{padding:8px}.netless-whiteboard:focus-visible{outline:none}"],"mappings":"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","names":[]}